{"version":3,"file":"ngx-psalm-notation.mjs","sources":["../../../projects/ngx-psalm-notation/src/lib/psalm-notation/notation-service/symbol/note-pitch.ts","../../../projects/ngx-psalm-notation/src/lib/psalm-notation/notation-service/default-values.ts","../../../projects/ngx-psalm-notation/src/lib/psalm-notation/notation-service/canvas/drawing-objects/drawing-lyrics.ts","../../../projects/ngx-psalm-notation/src/lib/psalm-notation/notation-service/canvas/svg-objects.ts","../../../projects/ngx-psalm-notation/src/lib/psalm-notation/notation-service/canvas/drawing-objects/drawing-halfbarline.ts","../../../projects/ngx-psalm-notation/src/lib/psalm-notation/notation-service/symbol/attached-object.ts","../../../projects/ngx-psalm-notation/src/lib/psalm-notation/notation-service/staff/staff.ts","../../../projects/ngx-psalm-notation/src/lib/psalm-notation/notation-service/canvas/drawing-helpers.ts","../../../projects/ngx-psalm-notation/src/lib/psalm-notation/notation-service/canvas/drawing-objects/drawing-brackets.ts","../../../projects/ngx-psalm-notation/src/lib/psalm-notation/notation-service/canvas/drawing-objects/drawing-accent.ts","../../../projects/ngx-psalm-notation/src/lib/psalm-notation/notation-service/canvas/drawing-objects/drawing-accidental.ts","../../../projects/ngx-psalm-notation/src/lib/psalm-notation/notation-service/canvas/drawing.ts","../../../projects/ngx-psalm-notation/src/lib/psalm-notation/notation-service/canvas/notation-canvas.ts","../../../projects/ngx-psalm-notation/src/lib/psalm-notation/notation-service/symbol/symbol.ts","../../../projects/ngx-psalm-notation/src/lib/psalm-notation/psalm-text/terminal-groups.ts","../../../projects/ngx-psalm-notation/src/lib/psalm-notation/psalm-text/hyphenation.service.ts","../../../projects/ngx-psalm-notation/src/lib/psalm-notation/melody-service/psalm-melody-interface.ts","../../../projects/ngx-psalm-notation/src/lib/psalm-notation/melody-service/melody.service.ts","../../../projects/ngx-psalm-notation/src/lib/psalm-notation/psalm-text/psalm-text.service.ts","../../../projects/ngx-psalm-notation/src/lib/psalm-notation/notation-service/notation.service.ts","../../../projects/ngx-psalm-notation/src/lib/psalm-notation/psalm-verse/psalm-verse.component.ts","../../../projects/ngx-psalm-notation/src/lib/psalm-notation/psalm-verse/psalm-verse.component.html","../../../projects/ngx-psalm-notation/src/lib/ngx-psalm-notation.module.ts","../../../projects/ngx-psalm-notation/src/public-api.ts","../../../projects/ngx-psalm-notation/src/ngx-psalm-notation.ts"],"sourcesContent":["\r\ninterface Pitch {\r\n  prefix: string;\r\n  accidental: '#' | 'b' | '';\r\n  octave: number;\r\n  isValid: boolean;\r\n}\r\n\r\n/**\r\n * Parses a pitch string.\r\n * NB! Supports only single accidentals!\r\n *\r\n * a##, ebb, bb and b# are not allowed\r\n *\r\n * @param pitch string\r\n */\r\n\r\nexport const parsePitch = (pitch: string): Pitch => {\r\n  const re = /^([cCdDeEfFgGaAbBhH])([#b]?)(\\d?)$/;\r\n  const match = pitch.match(re);\r\n\r\n  const invalidPitch: Pitch = { isValid: false, prefix: '', accidental: '', octave: 0 };\r\n\r\n  if (match) {\r\n    let prefix = match[1];\r\n    let accidental = (match[2] || '') as Pitch['accidental'];\r\n    let octave = match[3] ? Number(match[3]) : 0;\r\n    if (prefix.match(/[CDEFGABH]/)) {\r\n      prefix = prefix.toLowerCase();\r\n      octave -= (octave * 2 + 1);\r\n    }\r\n\r\n    if (prefix === 'b' && accidental === '') {\r\n      prefix = 'h';\r\n      accidental = 'b';\r\n    }\r\n\r\n    return prefix !== 'b' || accidental === '' ? {\r\n      prefix,\r\n      accidental,\r\n      octave,\r\n      isValid: true\r\n    } : invalidPitch;\r\n  } else {\r\n    return invalidPitch;\r\n  }\r\n};\r\n\r\n/**\r\n * Scientific pitch is needed to position notes on staff.\r\n * 0 represents c1, 1 is c#1, 2 is d etc.\r\n * -1 is h0, -2 is b0...\r\n */\r\nexport const getScientificPitch = (pitch: string): number | undefined => {\r\n  const parsedPitch = parsePitch(pitch);\r\n  const pitchMapping: Record<string, number> = {\r\n    c: 0,\r\n    d: 2,\r\n    e: 4,\r\n    f: 5,\r\n    g: 7,\r\n    a: 9,\r\n    h: 11\r\n  };\r\n\r\n  if (parsedPitch.isValid) {\r\n    const basePitch = pitchMapping[parsedPitch.prefix] + (parsedPitch.octave - 1) * 12;\r\n    if (parsedPitch.accidental) {\r\n      return parsedPitch.accidental === '#' ? basePitch + 1 : basePitch - 1;\r\n    } else {\r\n      return basePitch;\r\n    }\r\n  } else {\r\n    return undefined;\r\n  }\r\n};\r\n\r\ntype supportedClef = 'g';\r\n/**\r\n * Returns staff position:\r\n * 0 is middle staffline, positive numbers are above and negative numbers below\r\n *\r\n * NB! Supports only g clef\r\n * @param pitch string\r\n */\r\nexport const getStaffPosition = (pitch: string, clef: supportedClef = 'g'): number | undefined => {\r\n  const pitchMapping: Record<string, number> = {\r\n    c: -6,\r\n    d: -5,\r\n    e: -4,\r\n    f: -3,\r\n    g: -2,\r\n    a: -1,\r\n    h: 0\r\n  };\r\n  const parsedPitch: Pitch = parsePitch(pitch);\r\n  if (parsedPitch.isValid) {\r\n    return pitchMapping[parsedPitch.prefix] + (parsedPitch.octave - 1) * 7;\r\n  } else {\r\n    return undefined;\r\n  }\r\n};\r\n\r\n\r\n","export const notationDefaultValues = {\r\n  staff: {\r\n    initialClef: 'G',\r\n    scale: 1,\r\n    xPos: 5,\r\n    yPos: 5,\r\n    width: 500,\r\n    firstNotePosition: 70,\r\n    minimumAutomaticScale: 0.9\r\n  },\r\n  system: {\r\n      numberOfStaffs: 1,\r\n      scale: 1,\r\n      spacing: 50,\r\n      xPos: 5,\r\n      yPos: 20,\r\n      width: 500\r\n  },\r\n  lyricsSizeFactor: 0.6,\r\n  staffLineSpacing: 10,\r\n  noteSpacing: 25,\r\n  accidentalSpacing: 14,\r\n  displaceNotes: 12,\r\n  selectedColor: '#FF3333'\r\n};\r\n","import { getStaffPosition } from './../../symbol/note-pitch';\r\nimport { notationDefaultValues } from './../../default-values';\r\nimport { Staff } from './../../staff/staff';\r\nimport { fabric } from 'fabric';\r\nimport { scan } from 'rxjs/operators';\r\n\r\ntype drawLyricsOptions = {\r\n  staff: Staff,\r\n  cursorPosition: number,\r\n  notePitch: string,\r\n  text: string\r\n};\r\n\r\ntype returnValue = {\r\n  textObject: fabric.Object,\r\n  width: number\r\n};\r\n\r\nexport const drawLyrics = (options: drawLyricsOptions ): returnValue => {\r\n  const { staff, cursorPosition, notePitch, text = '' } = options;\r\n\r\n  const notePosition = getStaffPosition(notePitch);\r\n  const lyricsRelativePositionInStaffLines = notePosition < -5 ? -1 * (notePosition - -6) : 0;\r\n\r\n  const textObject = new fabric.Text(text);\r\n\r\n  textObject.set({\r\n    left: staff.xPos + cursorPosition,\r\n    top: staff.yPos + staff.getLineSpacing() * (5 + lyricsRelativePositionInStaffLines)\r\n  });\r\n\r\n  const scaleFactor = notationDefaultValues.lyricsSizeFactor * staff.scale;\r\n  textObject.scale(scaleFactor);\r\n  const width = textObject.width * scaleFactor + 10 * scaleFactor;\r\n  return { textObject, width };\r\n};\r\n","type SVGObject = {\r\n  path: string;\r\n  scaleFactor: number;\r\n  translateX: number;\r\n  translateY: number;\r\n  extraSpacing?: number;\r\n};\r\n\r\nenum SVGObjectName {\r\n  trebleClef = 'trebleClef',\r\n  quarterNoteWithoutStem = 'quarterNoteWithoutStem',\r\n  breveNote = 'breveNote',\r\n  sharp = 'sharp',\r\n  flat = 'flat',\r\n  accent = 'accent',\r\n  leftBracket = 'leftBracket',\r\n  rightBracket = 'rightBracket',\r\n  halfBarline = 'halfBarline'\r\n}\r\n\r\nexport const SVGObjects: {[ key in SVGObjectName ]: SVGObject} = {\r\n  trebleClef: {\r\n    path: 'M40 15 c0.305 3.1263-2.019 5.6563-4.0772 7.7014-0.9349 0.897-0.155 0.148-0.6437 0.594-0.1022-0.479-0.2986-1.731-0.2802-2.11 0.1304-2.6939 2.3198-6.5875 4.2381-8.0236 0.309 0.5767 0.563 0.6231 0.763 1.8382zm0.651 16.142c-1.232-0.906-2.85-1.144-4.3336-0.885-0.1913-1.255-0.3827-2.51-0.574-3.764 2.3506-2.329 4.9066-5.0322 5.0406-8.5394 0.059-2.232-0.276-4.6714-1.678-6.4836-1.7004 0.12823-2.8995 2.156-3.8019 3.4165-1.4889 2.6705-1.1414 5.9169-0.57 8.7965-0.8094 0.952-1.9296 1.743-2.7274 2.734-2.3561 2.308-4.4085 5.43-4.0046 8.878 0.18332 3.334 2.5894 6.434 5.8702 7.227 1.2457 0.315 2.5639 0.346 3.8241 0.099 0.2199 2.25 1.0266 4.629 0.0925 6.813-0.7007 1.598-2.7875 3.004-4.3325 2.192-0.5994-0.316-0.1137-0.051-0.478-0.252 1.0698-0.257 1.9996-1.036 2.26-1.565 0.8378-1.464-0.3998-3.639-2.1554-3.358-2.262 0.046-3.1904 3.14-1.7356 4.685 1.3468 1.52 3.833 1.312 5.4301 0.318 1.8125-1.18 2.0395-3.544 1.8325-5.562-0.07-0.678-0.403-2.67-0.444-3.387 0.697-0.249 0.209-0.059 1.193-0.449 2.66-1.053 4.357-4.259 3.594-7.122-0.318-1.469-1.044-2.914-2.302-3.792zm0.561 5.757c0.214 1.991-1.053 4.321-3.079 4.96-0.136-0.795-0.172-1.011-0.2626-1.475-0.4822-2.46-0.744-4.987-1.116-7.481 1.6246-0.168 3.4576 0.543 4.0226 2.184 0.244 0.577 0.343 1.197 0.435 1.812zm-5.1486 5.196c-2.5441 0.141-4.9995-1.595-5.6343-4.081-0.749-2.153-0.5283-4.63 0.8207-6.504 1.1151-1.702 2.6065-3.105 4.0286-4.543 0.183 1.127 0.366 2.254 0.549 3.382-2.9906 0.782-5.0046 4.725-3.215 7.451 0.5324 0.764 1.9765 2.223 2.7655 1.634-1.102-0.683-2.0033-1.859-1.8095-3.227-0.0821-1.282 1.3699-2.911 2.6513-3.198 0.4384 2.869 0.9413 6.073 1.3797 8.943-0.5054 0.1-1.0211 0.143-1.536 0.143z',\r\n    scaleFactor: 1.5,\r\n    translateX: 0,\r\n    translateY: -7\r\n  },\r\n  quarterNoteWithoutStem: {\r\n    path: 'M 303.13715,299.65106 C 299.74131,301.47103 297.93187,304.76561 299.04493,307.24402 C 300.23219,309.88766 304.31194,310.63374 308.15151,308.90939 C 311.99107,307.18503 314.14367,303.63999 312.95641,300.99636 C 311.76914,298.35272 307.6894,297.60664 303.84983,299.33099 C 303.60986,299.43876 303.36355,299.52973 303.13715,299.65106 z',\r\n    scaleFactor: 0.74,\r\n\r\n    // these values represent a first note in the staff (disregarding clef) and pitch 'h'\r\n    translateX: 5,\r\n    translateY: 21.5\r\n  },\r\n  breveNote: {\r\n    path: 'm -211,56 l 3,0 0,30 -3,0 0,-30 z m 8,0 3,0 0,12.417297 2.57505,-3.060272 c 6.43413,-7.646532 25.13123,-8.008376 32.94651,-0.637613 L -161,68 l 0,-12 3,0 0,30 -3,0 0,-11.889604 -2.57505,3.06027 c -2.88837,3.43264 -10.27853,6.09318 -16.92495,6.09318 -6.64642,0 -14.03658,-2.66054 -16.92495,-6.09318 L -200,74.110396 -200,86 l -3,0 0,-30 z m 29.60224,22.748146 c 3.05854,-4.66792 0.13433,-13.916407 -5.16332,-16.330174 -7.77978,-3.544708 -12.54851,2.495846 -9.30827,11.790804 2.2412,6.42911 11.35935,9.28925 14.47159,4.53937 z M -153,56 l 3,0 0,30 -3,0 0,-30 z',\r\n    scaleFactor: 0.4,\r\n\r\n    // these values represent a first note in the staff (disregarding clef) and pitch 'h'\r\n\r\n    translateX: 5,\r\n    translateY: 35.5,\r\n    extraSpacing: 7\r\n  },\r\n  sharp: {\r\n    path: 'M 0,0 L 0,15 -10,20 -10,24 0,20 0,37 -10,42 -10,46 0,41 0,52 4,52 4,38 20,31 20,27 4,34 4,0 z M 4,14 L 20,8 20,0 24,0 24,6 32,3 32,7 24,10 24,25 32,22 32,26 24,29 24,50 20,50 20,12 4,18 z',\r\n    scaleFactor: 0.3,\r\n    translateX: -3,\r\n    translateY: -7,\r\n    extraSpacing: 20\r\n  },\r\n  flat: {\r\n    path: 'M 57.445251,40.671504 l 0,-10 -1, 0 0, 18 1, 0 C 57.42373,41.058873 57.352283,40.98018 57.369912,41.277989 C 65.938334,37.415178 60.880132,45.693376 57.427317,46.840699 C 57.452424,47.931068 57.44525,47.644129 57.158311,48.476253 C 66.579473,46.815776 67.947773,35.066263 57.445251,40.671504 z ',\r\n    scaleFactor: 1,\r\n    translateX: -4,\r\n    translateY: -12.5,\r\n    extraSpacing: 15\r\n  },\r\n  accent: {\r\n    path: 'M 0,0 L 0,13 2,13 5,0 0,0 z',\r\n    scaleFactor: 0.65,\r\n    translateX: -1,\r\n    translateY: -8\r\n  },\r\n  leftBracket: {\r\n    path: 'M 0,0 L -5,0 -5,15 0,15 0,14 -4,14 -4,1 0,1 z',\r\n    scaleFactor: 1,\r\n    translateX: -9.5,\r\n    translateY: -7.7,\r\n    extraSpacing: 5\r\n  },\r\n  rightBracket: {\r\n    path: 'M 0,0 L 5,0 5,15 0,15 0,14 4,14 4,1 0,1 z',\r\n    scaleFactor: 1,\r\n    translateX: 7,\r\n    translateY: -7.7,\r\n    extraSpacing: 5\r\n  },\r\n  halfBarline: {\r\n    path: 'M 0,0 L 0,10 1,10 1,0 z',\r\n    scaleFactor: 1.5,\r\n    translateX: 5,\r\n    translateY: 0,\r\n    extraSpacing: 20\r\n  }\r\n};\r\n","import { Staff } from './../../staff/staff';\r\nimport { SVGObjects } from './../svg-objects';\r\nimport { fabric } from 'fabric';\r\n\r\ntype arguments = {\r\n  staff: Staff,\r\n  cursorPosition: number\r\n};\r\n\r\ntype returnValue = {\r\n  halfBarlinePath: fabric.Path\r\n};\r\n\r\nexport const drawHalfBarline = (options: arguments): returnValue => {\r\n\r\n  const { staff, cursorPosition } = options;\r\n  const halfBarlineObject = SVGObjects.halfBarline;\r\n  const halfBarlinePath = new fabric.Path(halfBarlineObject.path);\r\n\r\n  let left = cursorPosition + staff.xPos;\r\n  let top = staff.yPos;\r\n  left += halfBarlineObject.translateX * staff.scale;\r\n  top += halfBarlineObject.translateY * staff.scale;\r\n  halfBarlinePath.set({ left, top });\r\n  halfBarlinePath.scale(halfBarlineObject.scaleFactor * staff.scale);\r\n\r\n  return { halfBarlinePath };\r\n};\r\n","\r\nexport enum ATTACHED_OBJECT_TYPE {\r\n  accidental,\r\n  accent,\r\n  brackets,\r\n  lyrics\r\n}\r\n\r\n/**\r\n * Base class for object that is attached to a note: accidental, accent, etc.\r\n */\r\nexport class AttachedObject {\r\n  constructor(public attachedObjectType: ATTACHED_OBJECT_TYPE) {}\r\n}\r\n\r\nexport class Accidental extends AttachedObject {\r\n\r\n  constructor(public modifier: 'sharp' | 'flat') {\r\n    super(ATTACHED_OBJECT_TYPE.accidental);\r\n  }\r\n}\r\n\r\nexport class Accent extends AttachedObject {\r\n  constructor() {\r\n    super(ATTACHED_OBJECT_TYPE.accent);\r\n  }\r\n}\r\n\r\nexport class Brackets extends AttachedObject {\r\n  constructor() {\r\n    super(ATTACHED_OBJECT_TYPE.brackets);\r\n  }\r\n}\r\n\r\nexport class LyricsObject extends AttachedObject {\r\n  constructor(public text: string) {\r\n    super(ATTACHED_OBJECT_TYPE.lyrics);\r\n  }\r\n}\r\n","import { Accidental } from './../symbol/attached-object';\r\nimport { parsePitch } from './../symbol/note-pitch';\r\nimport { AttachedObject } from '../symbol/attached-object';\r\nimport { notationDefaultValues } from './../default-values';\r\nimport { Note } from './../symbol/symbol';\r\n\r\ntype staffObjectType = 'note' | 'accidental' | 'halfBarline';\r\n\r\nexport class StaffObject {\r\n\r\n  xPos: number;\r\n  yPos: number;\r\n  attachedObjects: AttachedObject[] = [];\r\n\r\n  constructor(public type: staffObjectType) {}\r\n\r\n  setPosition: (x: number, y: number) => void = (x, y) => {\r\n    this.xPos = x;\r\n    this.yPos = y;\r\n  }\r\n\r\n  attachObject(attachment: AttachedObject): StaffObject {\r\n    this.attachedObjects.push(attachment);\r\n    return this;\r\n  }\r\n\r\n}\r\n\r\nexport class StaffNote extends StaffObject {\r\n\r\n  constructor(public note: Note) {\r\n    super('note');\r\n    const accidental = parsePitch(note.pitch).accidental;\r\n    if (accidental) {\r\n      this.attachObject(new Accidental(accidental === '#' ? 'sharp' : 'flat'));\r\n    }\r\n  }\r\n\r\n}\r\n\r\nexport class HalfBarline extends StaffObject {\r\n  constructor() {\r\n    super('halfBarline');\r\n  }\r\n}\r\n\r\nexport class Staff {\r\n\r\n  xPos: number = notationDefaultValues.staff.xPos;\r\n  yPos: number = notationDefaultValues.staff.yPos;\r\n  width: number = notationDefaultValues.staff.width;\r\n  scale: number = notationDefaultValues.staff.scale;\r\n  objects: StaffObject[] = [];\r\n\r\n  constructor(\r\n    // readonly parentCanvas: fabric.StaticCanvas\r\n    ) {}\r\n\r\n  setPosition(x: number, y: number): Staff {\r\n    this.xPos = x;\r\n    this.yPos = y;\r\n    return this;\r\n  }\r\n\r\n  setDimensions(width: number, scale: number): Staff {\r\n    this.width = width;\r\n    this.scale = scale;\r\n    return this;\r\n  }\r\n\r\n  getLineSpacing(): number {\r\n    return notationDefaultValues.staffLineSpacing * this.scale;\r\n  }\r\n\r\n  addObject(obj: StaffObject): void {\r\n    this.objects.push(obj);\r\n  }\r\n\r\n}\r\n","import { SVGObjects } from './svg-objects';\r\nimport { getStaffPosition } from './../symbol/note-pitch';\r\nimport { Staff, StaffObject, StaffNote, HalfBarline } from './../staff/staff';\r\n\r\nexport interface LedgerLine {\r\n  xPos: number;\r\n  yPos: number;\r\n  width: number;\r\n}\r\n\r\ntype getPositionOptions = { scaledCursorPosition: number, pitch: string, staff: Staff };\r\ntype positionReturnValue = { xPos: number, yPos: number };\r\n\r\nconst getPosition = (\r\n    options: getPositionOptions,\r\n    additionalOptions: {\r\n      staffLineValue: number,\r\n      shiftRight?: number\r\n    }\r\n  ): positionReturnValue => {\r\n    const { staff, pitch } = options;\r\n    const shiftRight = additionalOptions.shiftRight || 0;\r\n    const { staffLineValue } = additionalOptions;\r\n    return {\r\n      xPos: staff.xPos + options.scaledCursorPosition + shiftRight * staff.scale,\r\n      yPos: staff.yPos + (staffLineValue - getStaffPosition(pitch)) * staff.getLineSpacing() / 2\r\n    };\r\n  };\r\n\r\nclass DrawingHelpers {\r\n\r\n  /**\r\n   * Helper method to determine how much to move cursor\r\n   * @param renderedObject object that was just drawn\r\n   */\r\n  calculateCursorMovement(staff: Staff, renderedObject: StaffObject): number {\r\n    const defaults = {\r\n      quarterNote: 20,\r\n      brevis: 30,\r\n      halfBarline: SVGObjects.halfBarline.extraSpacing\r\n    };\r\n    const scale = staff.scale;\r\n\r\n    if (renderedObject instanceof StaffNote) {\r\n      return renderedObject.note.duration === 'quarterNote' ?\r\n        defaults.quarterNote * scale :\r\n        defaults.brevis * scale;\r\n    }\r\n\r\n    if (renderedObject instanceof HalfBarline) {\r\n      return defaults.halfBarline * scale;\r\n    }\r\n\r\n    return 0;\r\n  }\r\n\r\n  /**\r\n   *\r\n   * @param options.xDelta needed to shift the ledger lines if there's an accidental -- is absolute\r\n   */\r\n  getNecessaryLedgerLines(options: {\r\n    staff: Staff,\r\n    renderedNote: StaffNote,\r\n    cursorPosition: number,\r\n    xDelta: number\r\n  }): LedgerLine[] {\r\n\r\n    const { staff, renderedNote, cursorPosition } = options;\r\n\r\n    const getStartingPositions = (where: 'above' | 'below'): { xPos: number, yPos: number } => {\r\n      const xPosDelta = renderedNote.note.duration === 'brevis' ? 0.5 * staff.scale : -1.1 * staff.scale;\r\n      const xPos = staff.xPos + cursorPosition + xPosDelta + options.xDelta;\r\n      const yPos = where === 'below' ?\r\n        staff.yPos + staff.getLineSpacing() * 5 :\r\n        staff.yPos - staff.getLineSpacing();\r\n      return { xPos, yPos };\r\n    };\r\n\r\n    const getLedgerLineYPosition = (startingPosition: number, quantifier: number): number => {\r\n      return startingPosition + staff.getLineSpacing() * quantifier;\r\n    };\r\n\r\n    const getLedgerLineWidth = (): number => renderedNote.note.duration === 'quarterNote' ?\r\n      20 * staff.scale :\r\n      26 * staff.scale;\r\n\r\n    const addLedgerLinesBelowStaff = (numberOfLines: number): LedgerLine[] => {\r\n      const { xPos, yPos: startingYPos } = getStartingPositions('below');\r\n      const lines = [];\r\n      for (let i = 0; i < numberOfLines; i++) {\r\n        lines.push({\r\n          xPos,\r\n          yPos: getLedgerLineYPosition(startingYPos, i),\r\n          width: getLedgerLineWidth()\r\n        } as LedgerLine);\r\n      }\r\n      return lines;\r\n    };\r\n\r\n    const addLedgerLinesAboveStaff = (numberOfLines: number): LedgerLine[] => {\r\n      const { xPos, yPos: startingYPos } = getStartingPositions('above');\r\n      const lines = [];\r\n      for (let i = 0; i < numberOfLines; i++) {\r\n        lines.push({\r\n          xPos,\r\n          yPos: getLedgerLineYPosition(startingYPos, -1 * i),\r\n          width: getLedgerLineWidth()\r\n        } as LedgerLine);\r\n      }\r\n      return lines;\r\n    };\r\n\r\n    const staffPosition = getStaffPosition(options.renderedNote.note.pitch);\r\n    if (staffPosition < -5) {\r\n      return addLedgerLinesBelowStaff(Math.floor((-4 - staffPosition) / 2));\r\n    } else {\r\n      return staffPosition < 6 ? [] : addLedgerLinesAboveStaff(Math.floor((staffPosition - 4) / 2));\r\n    }\r\n  }\r\n\r\n  /**\r\n   *\r\n   * @param options.scaledCursorPosition with scale factor, not staff position accounted for\r\n   */\r\n  getAccidentalPosition(options: getPositionOptions): positionReturnValue {\r\n    return getPosition(options, { staffLineValue: 4 });\r\n  }\r\n\r\n  getAccentPosition(options: getPositionOptions): positionReturnValue {\r\n    return getPosition(options, { staffLineValue: 2 });\r\n  }\r\n\r\n  getLeftBracketPosition(options: getPositionOptions): positionReturnValue {\r\n    return getPosition(options, { staffLineValue: 4 });\r\n  }\r\n\r\n  getRightBracketPosition(options: getPositionOptions): positionReturnValue {\r\n    return getPosition(\r\n      options,\r\n      {\r\n        staffLineValue: 4,\r\n        shiftRight: SVGObjects.leftBracket.extraSpacing\r\n      }\r\n    );\r\n  }\r\n\r\n}\r\n\r\nexport const drawingHelpers = new DrawingHelpers();\r\n","import { parsePitch } from './../../symbol/note-pitch';\r\nimport { Staff } from '../../staff/staff';\r\nimport { drawingHelpers } from '../drawing-helpers';\r\nimport { SVGObjects } from '../svg-objects';\r\nimport { fabric } from 'fabric';\r\n\r\ntype arguments = {\r\n  staff: Staff,\r\n  cursorPosition: number,\r\n  notePitch: string,\r\n  /** fabric.Path of the already drawn note */\r\n  notePath: fabric.Path\r\n};\r\n\r\ntype returnValue = {\r\n  leftBracketPath: fabric.Path,\r\n  rightBracketPath: fabric.Path,\r\n  extraCursorMovement: number;\r\n};\r\n\r\nexport const drawBrackets = (options: arguments): returnValue => {\r\n\r\n  const { staff, notePitch: pitch, cursorPosition, notePath } = options;\r\n\r\n  const objects = { leftBracket: SVGObjects.leftBracket, rightBracket: SVGObjects.rightBracket };\r\n  const leftBracketPath = new fabric.Path(objects.leftBracket.path);\r\n  const rightBracketPath = new fabric.Path(objects.rightBracket.path);\r\n  const accidental = parsePitch(pitch).accidental;\r\n  const rightBracketShiftX = accidental ?\r\n    accidental === '#' ?\r\n      SVGObjects.sharp.extraSpacing * staff.scale :\r\n      SVGObjects.flat.extraSpacing * staff.scale :\r\n    0;\r\n\r\n  const positions: { [key: string]: { left: number, top: number }} = {};\r\n\r\n  const setPosition = (positionKey: string) => {\r\n    const positionFunction = positionKey === 'left' ?\r\n      drawingHelpers.getLeftBracketPosition : drawingHelpers.getRightBracketPosition;\r\n    const result = positionFunction({\r\n      scaledCursorPosition: cursorPosition + staff.xPos,\r\n      pitch,\r\n      staff\r\n    });\r\n    positions[positionKey] = { left: result.xPos, top: result.yPos };\r\n  };\r\n\r\n  setPosition('left');\r\n  setPosition('right');\r\n\r\n  // let { xPos: left, yPos: top } = drawingHelpers.getAccidentalPosition({\r\n  //\r\n  //   pitch,\r\n  //   staff\r\n  //   });\r\n\r\n  positions.left.left += objects.leftBracket.translateX * staff.scale;\r\n  positions.left.top += objects.leftBracket.translateY * staff.scale;\r\n\r\n  positions.right.left += objects.rightBracket.translateX * staff.scale + rightBracketShiftX;\r\n  positions.right.top += objects.rightBracket.translateY * staff.scale;\r\n\r\n  leftBracketPath.set({ left: positions.left.left, top: positions.left.top });\r\n  leftBracketPath.scale(objects.leftBracket.scaleFactor * staff.scale);\r\n\r\n  rightBracketPath.set({ left: positions.right.left, top: positions.right.top });\r\n  rightBracketPath.scale(objects.rightBracket.scaleFactor * staff.scale);\r\n\r\n  // after positioning the accidental, the note must be shifted\r\n  const notePositionDelta = objects.leftBracket.extraSpacing * staff.scale;\r\n  notePath.set({\r\n    left: notePath.left + notePositionDelta\r\n  });\r\n  const extraCursorMovement = objects.leftBracket.extraSpacing * staff.scale +\r\n    objects.rightBracket.extraSpacing * staff.scale;\r\n\r\n  return { leftBracketPath, rightBracketPath, extraCursorMovement };\r\n};\r\n","import { parsePitch } from './../../symbol/note-pitch';\r\nimport { Staff } from './../../staff/staff';\r\nimport { drawingHelpers } from './../drawing-helpers';\r\nimport { SVGObjects } from './../svg-objects';\r\nimport { fabric } from 'fabric';\r\n\r\ntype arguments = {\r\n  staff: Staff,\r\n  cursorPosition: number,\r\n  notePitch: string\r\n};\r\n\r\ntype returnValue = {\r\n  accentPath: fabric.Path,\r\n  extraCursorMovement: number;\r\n};\r\n\r\nexport const drawAccent = (options: arguments): returnValue => {\r\n\r\n  const { staff, notePitch: pitch, cursorPosition } = options;\r\n  const accentObject = SVGObjects.accent;\r\n  const accentPath = new fabric.Path(accentObject.path);\r\n  const accidental = parsePitch(pitch).accidental;\r\n  const shiftX = accidental ?\r\n    accidental === '#' ? SVGObjects.sharp.extraSpacing : SVGObjects.flat.extraSpacing :\r\n    0;\r\n\r\n  let { xPos: left, yPos: top } = drawingHelpers.getAccentPosition({\r\n    scaledCursorPosition: cursorPosition + staff.xPos,\r\n    pitch,\r\n    staff\r\n    });\r\n  left += accentObject.translateX * staff.scale + shiftX * staff.scale;\r\n  top += accentObject.translateY * staff.scale;\r\n  accentPath.set({ left, top });\r\n  accentPath.scale(accentObject.scaleFactor * staff.scale);\r\n\r\n  return { accentPath, extraCursorMovement: 0 };\r\n};\r\n","import { Accidental } from './../../symbol/attached-object';\r\nimport { Staff } from './../../staff/staff';\r\nimport { drawingHelpers } from './../drawing-helpers';\r\nimport { SVGObjects } from './../svg-objects';\r\nimport { fabric } from 'fabric';\r\n\r\ntype arguments = {\r\n  staff: Staff,\r\n  accidental: Accidental,\r\n  cursorPosition: number,\r\n  notePitch: string,\r\n  /** fabric.Path of the already drawn note */\r\n  notePath: fabric.Path\r\n};\r\n\r\ntype returnValue = {\r\n  accidentalPath: fabric.Path,\r\n  extraCursorMovement: number;\r\n};\r\n\r\nexport const drawAccidental = (options: arguments): returnValue => {\r\n\r\n  const { staff, accidental, notePitch: pitch, cursorPosition, notePath } = options;\r\n  const accidentalObject: typeof SVGObjects.sharp = accidental.modifier === 'sharp' ?\r\n    SVGObjects.sharp : SVGObjects.flat;\r\n  const accidentalPath = new fabric.Path(accidentalObject.path);\r\n  let { xPos: left, yPos: top } = drawingHelpers.getAccidentalPosition({\r\n    scaledCursorPosition: cursorPosition + staff.xPos,\r\n    pitch,\r\n    staff\r\n    });\r\n  left += accidentalObject.translateX * staff.scale;\r\n  top += accidentalObject.translateY * staff.scale;\r\n  accidentalPath.set({ left, top });\r\n  accidentalPath.scale(accidentalObject.scaleFactor * staff.scale);\r\n\r\n  // after positioning the accidental, the note must be shifted\r\n  const notePositionDelta = accidentalObject.extraSpacing * staff.scale;\r\n  notePath.set({\r\n    left: notePath.left + notePositionDelta\r\n  });\r\n\r\n  return { accidentalPath, extraCursorMovement: notePositionDelta };\r\n};\r\n","import { drawLyrics } from './drawing-objects/drawing-lyrics';\r\nimport { drawHalfBarline } from './drawing-objects/drawing-halfbarline';\r\nimport { drawBrackets } from './drawing-objects/drawing-brackets';\r\nimport { drawAccent } from './drawing-objects/drawing-accent';\r\nimport { Accidental, Accent, Brackets, LyricsObject } from './../symbol/attached-object';\r\nimport { getStaffPosition } from './../symbol/note-pitch';\r\nimport { drawingHelpers, LedgerLine } from './drawing-helpers';\r\nimport { Note } from './../symbol/symbol';\r\nimport { SVGObjects } from './svg-objects';\r\nimport { Staff, StaffNote, HalfBarline } from './../staff/staff';\r\nimport { fabric } from 'fabric';\r\nimport { drawAccidental } from './drawing-objects/drawing-accidental';\r\n\r\nconst setPathProperties = (staff: Staff, object: typeof SVGObjects.breveNote): fabric.Path => {\r\n  const path = new fabric.Path(object.path);\r\n  const totalScaleFactor = object.scaleFactor * staff.scale;\r\n  path.set({\r\n    fill: 'black',\r\n    stroke: 'black',\r\n    left: staff.xPos + object.translateX * totalScaleFactor,\r\n    top: staff.yPos + object.translateY * totalScaleFactor\r\n  });\r\n  path.scale(totalScaleFactor);\r\n  return path;\r\n};\r\n\r\ntype drawingResult = {\r\n  fabricObjects: fabric.Object[],\r\n  ledgerLines: LedgerLine[],\r\n  finalCursorPosition: number;\r\n};\r\n\r\nclass Drawing {\r\n\r\n  drawStaffLines(staff: Staff): fabric.Line[] {\r\n    const lineSpacing = staff.getLineSpacing();\r\n    const { xPos: x, yPos: y } = staff;\r\n    const lines: fabric.Line[] = [];\r\n    for (let i = 0; i < 5; i++) {\r\n      const line = new fabric.Line(\r\n        [ x, y + i * lineSpacing, x + staff.width, y + i * lineSpacing],\r\n        { stroke: '#000000' });\r\n      lines.push(line);\r\n    }\r\n    return lines;\r\n  }\r\n\r\n  drawClef(staff: Staff): fabric.Path {\r\n    const clef = SVGObjects.trebleClef;\r\n    return setPathProperties(staff, clef);\r\n  }\r\n\r\n  private drawNote(staff: Staff, note: Note): fabric.Path {\r\n    const noteObject = note.duration === 'quarterNote' ? SVGObjects.quarterNoteWithoutStem : SVGObjects.breveNote;\r\n    return setPathProperties(staff, noteObject);\r\n  }\r\n\r\n  /**\r\n   * Draws all objects that have been added to a staff.\r\n   */\r\n  drawObjects(staff: Staff, initialCursorPosition: number): drawingResult {\r\n    const fabricObjects: fabric.Object[] = [];\r\n    let ledgerLines: LedgerLine[] = [];\r\n\r\n    let cursorPosition = initialCursorPosition * staff.scale;\r\n\r\n    // traverse staff objects\r\n    staff.objects.forEach(staffObject => {\r\n\r\n      let extraCursorMovement = 0;\r\n      let lyricsWidth = 0;\r\n\r\n      // draw note\r\n      if (staffObject instanceof StaffNote) {\r\n        const notePath = this.drawNote(staff, staffObject.note);\r\n        const notePitch = staffObject.note.pitch;\r\n        const lineSpacing = staff.getLineSpacing();\r\n        /** needed if there's an accidental of parentheses */\r\n\r\n        // set note location according to pitch and cursor position\r\n        // must add to existing values (when the note is drawn, it is located in default position)\r\n        notePath.set({\r\n          left: notePath.left + cursorPosition,\r\n          top: notePath.top + getStaffPosition(notePitch) * -1 * lineSpacing / 2\r\n        });\r\n\r\n        staffObject.attachedObjects.forEach(attachment => {\r\n\r\n          // add accidentals\r\n          if (attachment instanceof Accidental) {\r\n\r\n            const accidentalDrawingResult = drawAccidental(\r\n              { staff, accidental: attachment, notePitch, cursorPosition, notePath }\r\n            );\r\n            fabricObjects.push(accidentalDrawingResult.accidentalPath);\r\n            extraCursorMovement += accidentalDrawingResult.extraCursorMovement;\r\n          }\r\n\r\n          // add accent\r\n          if (attachment instanceof Accent) {\r\n            fabricObjects.push(drawAccent({ staff, notePitch, cursorPosition }).accentPath);\r\n          }\r\n\r\n          // add brackets\r\n          if (attachment instanceof Brackets) {\r\n            const brackets = drawBrackets({ staff, notePitch, cursorPosition, notePath });\r\n            fabricObjects.push(brackets.leftBracketPath);\r\n            fabricObjects.push(brackets.rightBracketPath);\r\n            extraCursorMovement += brackets.extraCursorMovement;\r\n          }\r\n\r\n          // add lyrics\r\n          if (attachment instanceof LyricsObject) {\r\n            const lyrics = drawLyrics({ staff, cursorPosition, notePitch, text: attachment.text });\r\n            fabricObjects.push(lyrics.textObject);\r\n            lyricsWidth = lyrics.width;\r\n          }\r\n\r\n        });\r\n\r\n        // get ledger lines\r\n        ledgerLines = ledgerLines.concat(...drawingHelpers.getNecessaryLedgerLines({\r\n          staff,\r\n          renderedNote: staffObject,\r\n          cursorPosition,\r\n          xDelta: extraCursorMovement || 0\r\n        }));\r\n\r\n        fabricObjects.push(notePath);\r\n\r\n      }\r\n\r\n      // draw halfbarline\r\n      if (staffObject instanceof HalfBarline) {\r\n        const halfBarline = drawHalfBarline({ staff, cursorPosition });\r\n        fabricObjects.push(halfBarline.halfBarlinePath);\r\n      }\r\n\r\n      // move the cursor\r\n      const baseCursorMovement = drawingHelpers.calculateCursorMovement(staff, staffObject) + extraCursorMovement;\r\n      cursorPosition += baseCursorMovement > lyricsWidth ? baseCursorMovement : lyricsWidth;\r\n    });\r\n    return { fabricObjects, ledgerLines, finalCursorPosition: cursorPosition };\r\n  }\r\n}\r\n\r\nexport const drawing = new Drawing();\r\n","import { LedgerLine } from './drawing-helpers';\r\nimport { Staff } from './../staff/staff';\r\nimport { fabric } from 'fabric';\r\nimport { drawing } from './drawing';\r\n\r\nexport class NotationCanvas {\r\n\r\n  canvas: fabric.StaticCanvas;\r\n\r\n  currentWidth: number;\r\n\r\n  constructor(elem: HTMLCanvasElement) {\r\n    this.canvas = new fabric.StaticCanvas(elem);\r\n  }\r\n\r\n  clear(): void {\r\n    this.canvas.clear();\r\n  }\r\n\r\n  setDimensions(width: number, height: number ): void {\r\n    this.canvas.setDimensions({ width, height });\r\n    this.currentWidth = width;\r\n  }\r\n\r\n  getWidth(): number {\r\n    return this.currentWidth;\r\n  }\r\n\r\n  renderSystem(staff: Staff): void {\r\n\r\n    const addObjects = (arg: fabric.Object | fabric.Object[]) => {\r\n      if (arg instanceof fabric.Object) {\r\n        this.canvas.add(arg);\r\n      } else {\r\n        arg.forEach(object => this.canvas.add(object));\r\n      }\r\n    };\r\n\r\n    const addLedgerLines = (lines: LedgerLine[]): void => {\r\n      lines.forEach(line => this.canvas.add(new fabric.Line(\r\n        [ line.xPos, line.yPos, line.xPos + line.width, line.yPos ],\r\n        { stroke: 'black' }\r\n      )));\r\n    };\r\n\r\n    addObjects(drawing.drawStaffLines(staff));\r\n    addObjects(drawing.drawClef(staff));\r\n    const { fabricObjects, ledgerLines, finalCursorPosition } = drawing.drawObjects(staff, 30);\r\n    if (finalCursorPosition < staff.width ) {\r\n      addObjects(fabricObjects);\r\n      addLedgerLines(ledgerLines);\r\n    } else {\r\n      console.log('Does not fit!');\r\n    }\r\n\r\n  }\r\n\r\n}\r\n","import { parsePitch } from './note-pitch';\r\n\r\ntype symbolType = 'note' | 'halfBarline';\r\ntype noteDuration = 'quarterNote' | 'brevis';\r\ninterface NoteOptions {\r\n  duration: noteDuration;\r\n  pitch: string;\r\n}\r\n\r\n\r\ninterface SymbolConstructorOptions {\r\n  type: symbolType;\r\n}\r\n\r\nexport class NotationSymbol {\r\n\r\n  type: symbolType;\r\n\r\n  constructor(options: SymbolConstructorOptions) {\r\n    this.type = options.type;\r\n  }\r\n\r\n}\r\n\r\nexport class HalfBarline extends NotationSymbol {\r\n  constructor() {\r\n    super({ type: 'halfBarline' });\r\n  }\r\n}\r\n\r\nexport class Note extends NotationSymbol {\r\n\r\n  duration: noteDuration;\r\n  pitch: string;\r\n  hasBrackets: boolean;\r\n\r\n  constructor(noteOptions: NoteOptions) {\r\n    if (!parsePitch(noteOptions.pitch).isValid) {\r\n      throw new Error('Unable to parse pitch: ' + noteOptions.pitch);\r\n    }\r\n    super({ type: 'note'});\r\n    this.duration = noteOptions.duration;\r\n    this.pitch = noteOptions.pitch;\r\n    this.hasBrackets = false;\r\n  }\r\n\r\n  addBrackets(): Note {\r\n    this.hasBrackets = true;\r\n    return this;\r\n  }\r\n}\r\n\r\nexport class BreveNote extends Note {\r\n  constructor(pitch: string) {\r\n    super({ pitch, duration: 'brevis' });\r\n  }\r\n}\r\n","import { PsalmMelody } from './../melody-service/psalm-melody-interface';\r\nimport { RenderedPsalm } from './rendered-psalm-interface';\r\n\r\ntype psalmNote = RenderedPsalm['firstLine']['elements'][0];\r\n\r\n\r\n\r\ntype getTerminalGroupsOptions = {\r\n  syllables: string[],\r\n  psalmody: PsalmMelody['firstLine']\r\n};\r\n\r\ntype returnType = {\r\n  psalmNotes: psalmNote[],\r\n  notEnoughSyllables: boolean;\r\n};\r\n\r\n/**\r\n * Return indices of last accented syllables of an array of syllables\r\n * @param syllables array of syllables, e.g. ['Her-', 'ra', 'on', 'mi-', 'nun', 'pai-', 'me-', 'ne-', 'ni'];\r\n * @param howMany number of syllables to return\r\n */\r\nexport const getLastAccentedSyllables: (x: string[], y: number) => number[] = (syllables, howMany) => {\r\n  const wordBeginnings = [0].concat(syllables\r\n    .map((syllable, index, array) => syllable.match(/[^\\-]$/) && index < array.length - 2 ?\r\n      index + 1 : -1)\r\n    .filter(item => item > -1));\r\n\r\n  const reduceFn: (a: number[], b: number, c: number, d: number[]) => number[] = (acc, curr, index, arr) => {\r\n    const nextIndex = index < arr.length - 1 ? arr[index + 1] : syllables.length;\r\n    const gap = nextIndex - curr;\r\n    return gap < 4 ? acc.concat(curr) : acc.concat([curr, curr + Math.floor(gap / 2), nextIndex].reduce(reduceFn, []).slice(0, -1));\r\n  };\r\n\r\n  return wordBeginnings\r\n    .map((wordBeginningIndex, arrayIndex, array) => {\r\n\r\n      const wordLength = arrayIndex < array.length - 1 ?\r\n        array[arrayIndex + 1] - wordBeginningIndex :\r\n        syllables.length - wordBeginningIndex;\r\n\r\n      return wordLength < 3 ?\r\n        [ wordBeginningIndex ] :\r\n        Array.from(Array(Math.floor(wordLength / 2)).keys())\r\n          .map(delta => wordBeginningIndex + delta * 2);\r\n    })\r\n    .reduce((acc, curr) => acc.concat(...curr), [])\r\n    .filter((syllableIndex, arrayIndex, array) => arrayIndex < array.length - 1 ?\r\n      array[arrayIndex + 1] - syllableIndex > 1 :\r\n      true)\r\n    .reduce(reduceFn, [])\r\n    .slice(-1 * howMany);\r\n};\r\n\r\nexport const getTerminalGroups = (options: getTerminalGroupsOptions): returnType => {\r\n\r\n  const { syllables, psalmody } = options;\r\n  let notEnoughSyllables = false;\r\n  let terminalGroupSliceValue: number;\r\n\r\n  const accentedSyllableIndices = getLastAccentedSyllables(syllables, psalmody.terminalGroups.length);\r\n  if (syllables.length < 3) {\r\n    notEnoughSyllables = true;\r\n    return { psalmNotes: [], notEnoughSyllables };\r\n  }\r\n  // if there are very few syllables, use only the last terminal group\r\n  if (accentedSyllableIndices[0] < 2) {\r\n    terminalGroupSliceValue = -1;\r\n  } else {\r\n    terminalGroupSliceValue = -1 * psalmody.terminalGroups.length;\r\n  }\r\n\r\n  const syllableGroupLengths = accentedSyllableIndices.slice(terminalGroupSliceValue)\r\n    .map((syllableIndex, index, array) => index < array.length - 1 ?\r\n      array[index + 1] - syllableIndex :\r\n      syllables.length - syllableIndex);\r\n\r\n  return {\r\n    psalmNotes: psalmody.terminalGroups\r\n      .slice(terminalGroupSliceValue)\r\n      .map((notes, index) => {\r\n\r\n        if (notes.length > syllableGroupLengths[index]) {\r\n          notes.splice(1, 1);\r\n        } else {\r\n          if (syllableGroupLengths[index] > notes.length) {\r\n            notes.splice(1, 0, notes[1]);\r\n          }\r\n        }\r\n\r\n        return notes.map((note, indexInGroup) => ({\r\n          note,\r\n          text: syllables.splice(accentedSyllableIndices.slice(terminalGroupSliceValue)[0], 1)[0]\r\n        }));\r\n      })\r\n      .reduce((acc, curr) => acc.concat(curr), []),\r\n    notEnoughSyllables\r\n  };\r\n};\r\n","import { getLastAccentedSyllables } from './terminal-groups';\r\nimport { Injectable } from '@angular/core';\r\nimport * as Hypher from 'hypher';\r\nimport * as finnish from 'hyphenation.fi';\r\n\r\nconst modifiedFinnish = Object.assign({}, finnish, { leftmin: 1, rightmin: 1 });\r\n\r\nconst hypher = new Hypher(modifiedFinnish);\r\n\r\n/**\r\n * Hyphenated string with accented syllables at the end\r\n */\r\ninterface HyphenationWithAccents {\r\n  syllables: string[];\r\n  /** Indices of accented syllables */\r\n  accentedIndices: number[];\r\n  /** whether the sentence was too short to find enough accents */\r\n  wasTooShort: boolean;\r\n}\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class HyphenationService {\r\n\r\n\r\n  constructor() { }\r\n\r\n  hyphenate(text: string): string[] {\r\n    type Context = { previousSyllable: string; nextSyllable: string };\r\n    type Exception = { syllable: string; replace: string[]; context?: Context };\r\n    const exceptions: Exception[] = [\r\n      { syllable: 'älä', replace: ['ä', 'lä'] },\r\n      { syllable: 'näön', replace: ['nä', 'ön'] },\r\n      { syllable: 'nia', replace: ['ni', 'a'] },\r\n      { syllable: 'pusi', replace: ['pu', 'si'] },\r\n      {\r\n        syllable: 'sian',\r\n        replace: ['si', 'an'],\r\n        context: { previousSyllable: 'hoo', nextSyllable: 'na' },\r\n      },\r\n      {\r\n        syllable: 'sian',\r\n        replace: ['si', 'an'],\r\n        context: { previousSyllable: 'mor', nextSyllable: '*' },\r\n      },\r\n      { syllable: 'nua', replace: ['nu', 'a'] },\r\n      { syllable: 'teo', replace: ['te', 'o'] },\r\n      { syllable: 'teois', replace: ['te', 'ois'] },\r\n    ];\r\n\r\n    /** Helper function for case insensitive match with punctuation */\r\n    const customMatch: (a: string, b: string) => boolean = (a, b) => !!a.match(\r\n      new RegExp('^' + b + '[.,:;?!]?\\\\s?$', 'i')\r\n    );\r\n\r\n    const getFindFn = (syllable: string) => (exc: Exception) => customMatch(syllable, exc.syllable);\r\n\r\n    const replaceFn = (originalSyllable: string, context: Context): string[] => {\r\n      const matchingExceptions = exceptions.filter(e => customMatch(originalSyllable, e.syllable));\r\n      const isUpperCase = !!originalSyllable.match(/^[A-ZÅÄÖ]/);\r\n      const punctuationMatch = originalSyllable.match(/([.,?!;:]?\\s?)$/);\r\n      const originalPunctuation = punctuationMatch ? punctuationMatch[1] : '';\r\n      const addPunctuationToLast = (syll: string, i: number, arr: string[]) => i === arr.length - 1 ? syll + originalPunctuation : syll;\r\n      const matchContext: (a: Context, b: Context) => boolean = (a, exceptionContext) => {\r\n        const previousMatch = exceptionContext.previousSyllable === '*' ||\r\n          customMatch(a.previousSyllable, exceptionContext.previousSyllable);\r\n        const nextMatch = exceptionContext.nextSyllable === '*' ||\r\n          customMatch(a.nextSyllable, exceptionContext.nextSyllable);\r\n        return previousMatch && nextMatch;\r\n      };\r\n\r\n      let exc: Exception;\r\n      let replacement: string[];\r\n\r\n      // Loop through possible exceptions\r\n      // tslint:disable-next-line:prefer-for-of\r\n      for (let i = 0; i < matchingExceptions.length; i++) {\r\n        exc = matchingExceptions[i];\r\n        replacement = !exc.context ?\r\n          exc.replace.map(addPunctuationToLast) :\r\n          matchContext(context, exc.context) ?\r\n            exc.replace.map(addPunctuationToLast) :\r\n            [ originalSyllable ];\r\n        // if match was found, break out of loop\r\n        if (replacement.length > 1) {\r\n          i = matchingExceptions.length;\r\n        }\r\n      }\r\n\r\n      return isUpperCase ?\r\n        replacement.map((syll, i) => i === 0 ? syll.charAt(0).toUpperCase() + syll.slice(1) : syll) :\r\n        replacement;\r\n    };\r\n\r\n    const replaceExceptions = (acc: string[], syllable: string, index: number, syllablesArray: string[]): string[] => exceptions\r\n      .find(getFindFn(syllable)) ?\r\n        acc.concat(...replaceFn(syllable, {\r\n          previousSyllable: acc.slice(-1)[0] || '',\r\n          nextSyllable: syllablesArray[index + 1] || ''\r\n        })) :\r\n        acc.concat(syllable);\r\n\r\n    const splitOnSpaces: (s: string) => string[] = str => str\r\n      .split(/(\\s)/)\r\n      .filter(syll => !!syll)\r\n      .reduce((a, b) => b === ' ' ? a.slice(0, -1).concat(a.slice(-1)[0] + ' ') : a.concat(b), []);\r\n\r\n    return hypher.hyphenate(text)\r\n      // split on spaces\r\n      .reduce((a, b) => a.concat(...splitOnSpaces(b)), [])\r\n      .reduce((acc, curr) => acc.concat(...curr.replace(/\\s([\\S=])/g, '*$1').split('*')\r\n        .map((item, index, array) => index === 0 && array.length > 1 ? item + ' ' : item)), [])\r\n      // remove em dashes\r\n      .filter(item => item !== '– ')\r\n      .reduce(replaceExceptions, [])\r\n      .map((item, index, array) => item\r\n        .match(/[^\\s]$/) && index < array.length - 1 ? item + '-' : item.replace(/\\s$/, ''))\r\n      .map(item => item.replace('=-', '='));\r\n\r\n  }\r\n\r\n  /**\r\n   * Hyphenate a string and find last accented syllables\r\n   * @param numberOfAccents How many accented syllables to show\r\n   */\r\n\r\n  hyphenateWithAccents(text: string, numberOfAccents = 2 ): HyphenationWithAccents {\r\n    const syllables = this.hyphenate(text);\r\n    const accentedIndices = getLastAccentedSyllables(syllables, numberOfAccents);\r\n    return {\r\n      syllables,\r\n      accentedIndices,\r\n      wasTooShort: accentedIndices.length < numberOfAccents\r\n    };\r\n  }\r\n}\r\n","import { Note, BreveNote } from './../notation-service/symbol/symbol';\r\ntype terminalGroup = Note[];\r\n\r\ntype psalmLine = {\r\n  initium: Note[],\r\n  tenor: BreveNote,\r\n  extraNotes: Note[],\r\n  terminalGroups: terminalGroup[]\r\n};\r\n\r\ninterface CustomError {\r\n  atIndex: number;\r\n  message: string;\r\n}\r\n\r\nexport class MelodyError implements CustomError {\r\n\r\n  constructor(public atIndex: number, public message: string) {}\r\n}\r\n\r\n/**\r\n * Represents an analysis of a given psalm melody, with validity checks.\r\n */\r\n\r\nexport interface PsalmMelody {\r\n  originalString: string;\r\n  isValid: boolean;\r\n  firstLine: psalmLine | undefined;\r\n  secondLine: psalmLine | undefined;\r\n  errors: MelodyError[];\r\n}\r\n","import { BreveNote } from './../notation-service/symbol/symbol';\r\nimport { PsalmMelody, MelodyError } from './psalm-melody-interface';\r\nimport { Accent, Brackets } from './../notation-service/symbol/attached-object';\r\nimport { parsePitch } from './../notation-service/symbol/note-pitch';\r\nimport { StaffObject, StaffNote, HalfBarline } from './../notation-service/staff/staff';\r\nimport { Injectable } from '@angular/core';\r\nimport { Note } from '../notation-service/symbol/symbol';\r\n\r\n/**\r\n * Takes a psalm note pitch string and returns a plain note pitch.\r\n * First octave number is added.\r\n * For example: g => g1, (f) => f1, *e => e1\r\n *\r\n */\r\nconst getPlainNotePitch = (pitch: string): string => pitch\r\n  .replace(/[()*_]/g, '')\r\n  .replace(/[^\\d]$/, '$&1');\r\n\r\n\r\ntype ParseError = {\r\n  erroneousSymbol: string;\r\n  atIndex: number;\r\n};\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class MelodyService {\r\n\r\n  constructor() { }\r\n\r\n  /**\r\n   * Parses a raw psalm melody string and converts it to staff objects.\r\n   * Does not validate the melody in any way!\r\n   */\r\n  parseMelody(melodyString: string): { errors: ParseError[], result: StaffObject[] } {\r\n    const errors: ParseError[] = [];\r\n    const result: StaffObject[] = [];\r\n    const stringParticles = melodyString.split(' ');\r\n    stringParticles\r\n      .filter((item, index) => item.length || index > 0)\r\n      .forEach((objectString, index) => {\r\n\r\n        // is it a halfbarline?\r\n        if (objectString === '=') {\r\n          result.push(new HalfBarline());\r\n          return;\r\n        }\r\n\r\n        // it is a note\r\n        const hasAccent = !!objectString.match(/^\\*/);\r\n        const hasBrackets = !!objectString.match(/^\\(.+\\)$/);\r\n        const isBrevis = !!objectString.match(/_$/);\r\n        const noteString = getPlainNotePitch(objectString);\r\n        const parsedPitch = parsePitch(noteString);\r\n        if (parsedPitch.isValid) {\r\n          const staffNote = new StaffNote(new Note({ pitch: noteString, duration: isBrevis ? 'brevis' : 'quarterNote' }));\r\n          if (hasBrackets) {\r\n            staffNote.attachObject(new Brackets());\r\n          }\r\n          result.push(hasAccent ? staffNote.attachObject(new Accent()) : staffNote);\r\n        } else {\r\n          errors.push({ erroneousSymbol: objectString, atIndex: index });\r\n        }\r\n      });\r\n    return { errors, result };\r\n    }\r\n\r\n  analyzePsalmMelody(melodyString: string): PsalmMelody {\r\n\r\n    let firstLine: PsalmMelody['firstLine'];\r\n    let secondLine: PsalmMelody['secondLine'];\r\n\r\n    let isValid = true;\r\n    const errors: PsalmMelody['errors'] = [];\r\n\r\n    // handle extra spaces\r\n    const stringFragments = melodyString.split(' ').filter(str => str.length > 0);\r\n\r\n    // detect if there are two psalm lines\r\n    if (stringFragments.indexOf('=') < 0) {\r\n      isValid = false;\r\n      errors.push(new MelodyError(0, 'Psalmimelodiassa tulee olla kaksi säettä'));\r\n    } else {\r\n\r\n      // detect the tenors\r\n      let foundTenors = 0;\r\n      for (let i = 0; i < stringFragments.length; i++) {\r\n        if (stringFragments[i] === '=') {\r\n          if (foundTenors === 0) {\r\n            isValid = false;\r\n            errors.push({\r\n              atIndex: i,\r\n              message: 'Kummassakin säkeessä tulee olla täsmälleen yksi resitointisävel'\r\n            });\r\n          }\r\n          foundTenors = 0;\r\n        } else {\r\n          if (stringFragments[i].slice(-1) === '_') {\r\n            foundTenors += 1;\r\n            if (foundTenors === 2) {\r\n              isValid = false;\r\n              errors.push({\r\n                atIndex: i,\r\n                message: 'Kummassakin säkeessä tulee olla täsmälleen yksi resitointisävel'\r\n              });\r\n            }\r\n          }\r\n        }\r\n      }\r\n      if (!foundTenors) {\r\n        isValid = false;\r\n        errors.push({\r\n          atIndex: stringFragments.length - 1,\r\n          message: 'Kummassakin säkeessä tulee olla täsmälleen yksi resitointisävel'\r\n        });\r\n      }\r\n    }\r\n\r\n    // find accented notes\r\n    const accentedNoteIndexes: number[] = stringFragments\r\n      .map((item, index) => item.slice(0, 1) === '*' ? index : -1)\r\n      .filter(item => item > 0);\r\n    const tenorIndexes: number[] = stringFragments\r\n      .map((item, index) => item.slice(-1) === '_' ? index : -1)\r\n      .filter(item => item > 0);\r\n\r\n    const barlineIndex = stringFragments.findIndex(item => item === '=');\r\n    tenorIndexes.forEach(tenorIndex => {\r\n      let accentedAfterTenorCount;\r\n      if (tenorIndex < barlineIndex) {\r\n        accentedAfterTenorCount = accentedNoteIndexes\r\n          .filter(ind => ind > tenorIndex && ind < barlineIndex)\r\n          .length;\r\n      } else {\r\n        accentedAfterTenorCount = accentedNoteIndexes\r\n          .filter(ind => ind > tenorIndex && ind < stringFragments.length)\r\n          .length;\r\n      }\r\n      if (!accentedAfterTenorCount) {\r\n        isValid = false;\r\n        errors.push({ atIndex: tenorIndex, message: 'Resitointisävelen jälkeen on oltava vähintään yksi painollinen sävel'});\r\n      }\r\n    });\r\n\r\n    // analyze accented note positions\r\n    accentedNoteIndexes.forEach(index => {\r\n      if (index === barlineIndex - 1 || index === stringFragments.length - 1) {\r\n        isValid = false;\r\n        errors.push({ atIndex: index, message: 'Painollinen sävel ei voi olla säkeessä viimeisenä' });\r\n      }\r\n    });\r\n    accentedNoteIndexes.forEach((noteIndex, arrayIndex, array) => {\r\n\r\n      const checkCondition = (noteIndex < barlineIndex && array[arrayIndex + 1] < barlineIndex) ||\r\n        noteIndex > barlineIndex && arrayIndex < array.length - 1;\r\n      if (checkCondition && (array[arrayIndex + 1] - noteIndex > 3 || array[arrayIndex + 1] - noteIndex < 2)) {\r\n        isValid = false;\r\n        errors.push({ atIndex: noteIndex, message: 'Painollisten sävelten välissä on oltava 1-2 painotonta säveltä'});\r\n      }\r\n    });\r\n\r\n    // check if note pitches are correct\r\n    stringFragments.forEach((note, index) => {\r\n      const parsed = parsePitch(getPlainNotePitch(note));\r\n      if (note !== '=' && !parsed.isValid) {\r\n        isValid = false;\r\n        errors.push({ atIndex: index, message: 'Melodiassa on väärin kirjoitettuja nuotteja' });\r\n      }\r\n    });\r\n\r\n    // Do the actual analysis only if there are no errors\r\n\r\n    if (isValid) {\r\n\r\n      const getInitium = (notes: string[]): Note[] => {\r\n        const tenorIndex = notes.findIndex(note => note.slice(-1) === '_');\r\n        return notes\r\n          .slice(0, tenorIndex)\r\n          .map(note => new Note({ pitch: getPlainNotePitch(note), duration: 'quarterNote'}));\r\n      };\r\n\r\n      const getTenor = (notes: string[]): BreveNote => {\r\n        return new BreveNote(getPlainNotePitch(notes.find(note => note.slice(-1) === '_')));\r\n      };\r\n\r\n      const getExtraNotes = (notes: string[]): Note[] => {\r\n        const tenorIndex = notes.findIndex(note => note.slice(-1) === '_');\r\n        const firstAccentedNoteIndex = notes\r\n          .findIndex((note, index) => note.slice(0, 1) === '*' && index > tenorIndex);\r\n        return notes\r\n          .slice(tenorIndex + 1, firstAccentedNoteIndex)\r\n          .map(pitch => new Note({ pitch: getPlainNotePitch(pitch), duration: 'quarterNote'}));\r\n      };\r\n\r\n      const getTerminalGroups = (notes: string[]): PsalmMelody['firstLine']['terminalGroups'] => {\r\n        const indexesOfAccentedNotes = notes\r\n          .map((note, index) => note.slice(0, 1) === '*' ? index : -1)\r\n          .filter(index => index > 0);\r\n        return indexesOfAccentedNotes\r\n          .map((noteIndex, arrayIndex, array) => arrayIndex < array.length - 1 ?\r\n            notes.slice(noteIndex, array[arrayIndex + 1]) :\r\n            notes.slice(noteIndex)\r\n          )\r\n          .map(groupOfNotes => groupOfNotes.map(noteString => {\r\n            const hasBrackets = noteString.slice(0, 1) === '(';\r\n            const note = new Note({\r\n              pitch: getPlainNotePitch(noteString),\r\n              duration: 'quarterNote'\r\n            });\r\n            return hasBrackets ? note.addBrackets() : note;\r\n          }));\r\n      };\r\n\r\n      const firstLineNotes = stringFragments.slice(0, barlineIndex);\r\n      const secondLineNotes = stringFragments.slice(barlineIndex + 1);\r\n\r\n      firstLine = {\r\n        initium: getInitium(firstLineNotes),\r\n        tenor: getTenor(firstLineNotes),\r\n        extraNotes: getExtraNotes(firstLineNotes),\r\n        terminalGroups: getTerminalGroups(firstLineNotes)\r\n      };\r\n      secondLine = {\r\n        initium: getInitium(secondLineNotes),\r\n        tenor: getTenor(secondLineNotes),\r\n        extraNotes: getExtraNotes(secondLineNotes),\r\n        terminalGroups: getTerminalGroups(secondLineNotes)\r\n      };\r\n    }\r\n\r\n    return {\r\n      originalString: melodyString,\r\n      errors,\r\n      firstLine,\r\n      secondLine,\r\n      isValid\r\n    };\r\n  }\r\n}\r\n","import { PsalmMelody } from './../melody-service/psalm-melody-interface';\r\nimport { MelodyService } from './../melody-service/melody.service';\r\nimport { HyphenationService } from './hyphenation.service';\r\nimport { RenderedPsalm } from './rendered-psalm-interface';\r\nimport { Injectable } from '@angular/core';\r\nimport { getTerminalGroups } from './terminal-groups';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class PsalmTextService {\r\n\r\n  constructor(\r\n    private hyphenation: HyphenationService,\r\n    private melodyService: MelodyService\r\n  ) { }\r\n\r\n  /**\r\n   * Combine melody and lyrics to a psalm verse.\r\n   *\r\n   * @param options.lyrics either a string that will be hyphenated ar array of syllables.\r\n   */\r\n  renderPsalm(options: { melody: string, lyrics: string | string[] }): RenderedPsalm {\r\n    const { lyrics, melody } = options;\r\n    const syllables: string[] = lyrics instanceof Array ? lyrics : this.hyphenation.hyphenate(lyrics);\r\n\r\n    let isValid = true;\r\n    const textErrors: string[] = [];\r\n    let firstLine: RenderedPsalm['firstLine'];\r\n    let secondLine: RenderedPsalm['secondLine'];\r\n\r\n    const melodyAnalysis = this.melodyService.analyzePsalmMelody(melody);\r\n\r\n    if (!melodyAnalysis.isValid) {\r\n      isValid = false;\r\n    }\r\n\r\n    const verseLimiterIndex = syllables.findIndex(syllable => syllable === '=');\r\n    if (verseLimiterIndex < 0) {\r\n      isValid = false;\r\n      textErrors.push('Tekstissä pitää olla kaksi säettä');\r\n    }\r\n\r\n    // only continue if melody and words are ok\r\n    if (isValid) {\r\n      const firstTextLine = syllables.slice(0, verseLimiterIndex);\r\n      const secondTextLine = syllables.slice(verseLimiterIndex + 1);\r\n\r\n      const fitSyllablesToMelody = (\r\n        textLine: string[],\r\n        psalmody: PsalmMelody['firstLine']\r\n        ): RenderedPsalm['firstLine'] => {\r\n\r\n          type psalmNote = RenderedPsalm['firstLine']['elements'][0];\r\n          const remainingSyllables = [...textLine];\r\n          let notEnoughSyllables = false;\r\n          let tenor: psalmNote;\r\n          let extraNotes: psalmNote[] = [];\r\n\r\n          // initium\r\n          const initium: psalmNote[] = psalmody.initium.map(initiumNote => ({\r\n            note: initiumNote,\r\n            text: remainingSyllables.splice(0, 1)[0]\r\n          }));\r\n\r\n          // terminating groups\r\n\r\n          const terminalGroups = getTerminalGroups({\r\n            syllables: remainingSyllables,\r\n            psalmody\r\n          });\r\n\r\n          // extra notes\r\n          if (!terminalGroups.notEnoughSyllables) {\r\n            extraNotes = psalmody.extraNotes.reverse().map(note => ({\r\n              note,\r\n              text: remainingSyllables.splice(-1, 1)[0]\r\n            }))\r\n            .reverse();\r\n\r\n          // are there any remaining syllables left?\r\n            if (!remainingSyllables.length) {\r\n              notEnoughSyllables = true;\r\n            } else {\r\n              tenor = {\r\n                note: psalmody.tenor,\r\n                text: remainingSyllables\r\n                  .map(syllable => syllable.slice(-1) === '-' ? syllable.replace(/-$/, '') : syllable + ' ')\r\n                  .join('')\r\n                  .trim()\r\n                  + (remainingSyllables.slice(-1)[0].slice(-1) === '-' ? '-' : '')\r\n              };\r\n            }\r\n          }\r\n\r\n          return notEnoughSyllables || terminalGroups.notEnoughSyllables ?\r\n            { notEnoughSyllables: true, elements: [] } :\r\n            { elements: initium.concat(tenor, extraNotes, terminalGroups.psalmNotes) };\r\n\r\n        };\r\n\r\n      firstLine = fitSyllablesToMelody(firstTextLine, melodyAnalysis.firstLine);\r\n      secondLine = fitSyllablesToMelody(secondTextLine, melodyAnalysis.secondLine);\r\n    }\r\n\r\n    if ((firstLine && firstLine.notEnoughSyllables) || (secondLine && secondLine.notEnoughSyllables)) {\r\n      isValid = false;\r\n      textErrors.push('Tekstissä ei ole riittävästi tavuja');\r\n    }\r\n\r\n    return {\r\n      isValid,\r\n      firstLine,\r\n      secondLine,\r\n      melodyErrors: melodyAnalysis.errors,\r\n      textErrors,\r\n      originalMelodyString: melody\r\n    };\r\n\r\n  }\r\n}\r\n","import { HyphenationService } from './../psalm-text/hyphenation.service';\r\nimport { MelodyError } from './../melody-service/psalm-melody-interface';\r\nimport { notationDefaultValues } from './default-values';\r\nimport { LyricsObject } from './symbol/attached-object';\r\nimport { PsalmTextService } from './../psalm-text/psalm-text.service';\r\nimport { Staff, StaffNote, HalfBarline } from './staff/staff';\r\nimport { Injectable } from '@angular/core';\r\nimport { drawing } from './canvas/drawing';\r\nimport { RenderedPsalm } from '../psalm-text/rendered-psalm-interface';\r\nimport { Note } from './symbol/symbol';\r\n\r\ntype renderPsalmVerseOptions = {\r\n  melody: string;\r\n  lyrics: string;\r\n  canvasWidth: number\r\n};\r\n\r\ntype renderPsalmVerseReturnValue = {\r\n  staffs: Staff[],\r\n  requiredHeight: number,\r\n  errors: {\r\n    melodyErrors: MelodyError[],\r\n    textErrors: string[];\r\n  }\r\n};\r\n\r\ntype RenderedPsalmLine = RenderedPsalm['firstLine'];\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class NotationService {\r\n\r\n  constructor(\r\n    private psalmTextService: PsalmTextService,\r\n    private hyphenationService: HyphenationService\r\n  ) { }\r\n\r\n  private calculateRequiredWidth(staff: Staff): number {\r\n    return drawing.drawObjects(staff, 30).finalCursorPosition;\r\n  }\r\n\r\n  renderPsalmStaffs(options: renderPsalmVerseOptions): renderPsalmVerseReturnValue {\r\n\r\n    const staffLineSpacing = notationDefaultValues.staffLineSpacing;\r\n    const staffXPosition = 10;\r\n    const upperStaffYPosition = 25;\r\n    const { melody, lyrics, canvasWidth } = options;\r\n    const psalmVerse: RenderedPsalm = this.psalmTextService.renderPsalm({ melody, lyrics });\r\n    const selectedStaffs: Staff[] = [];\r\n    const minimumStaffScale = notationDefaultValues.staff.minimumAutomaticScale;\r\n    const indentation = 20;\r\n\r\n    const splitPsalmLine = (psalmLine: RenderedPsalmLine): RenderedPsalmLine['elements'][] => {\r\n      const tenorIndex = psalmLine.elements.findIndex(elem => elem.note.duration === 'brevis');\r\n      const tenorText = psalmLine.elements[tenorIndex].text;\r\n      const tenorPitch = psalmLine.elements[tenorIndex].note.pitch;\r\n      const naturalSplitRegex = /(^.{15,}?[\\.\\,\\?\\!])/;\r\n      const capableOfNaturalSplit = !!tenorText.match(naturalSplitRegex);\r\n      const spaceIndexes = tenorText\r\n        .split('')\r\n        .map((char, index) => ({ char, index }))\r\n        .filter(item => item.char === ' ')\r\n        .map(item => item.index)\r\n        .reduce((acc, spaceIndex) => ({\r\n          lastFoundIndex: spaceIndex,\r\n          bestFoundIndex: acc.bestFoundIndex > -1 ?\r\n            acc.bestFoundIndex :\r\n            spaceIndex > 0.65 * tenorText.length ? spaceIndex : -1\r\n        }) , { lastFoundIndex: -1, bestFoundIndex: -1 });\r\n      const splitOnSpaceIndex = spaceIndexes.bestFoundIndex > -1 ?\r\n        spaceIndexes.bestFoundIndex : spaceIndexes.lastFoundIndex;\r\n      const splitByHyphenation = (word: string): [ string, string ] => {\r\n        const syllables = this.hyphenationService.hyphenate(word);\r\n        const splitPoint = Math.round(syllables.length * 0.65);\r\n        const stripHyphens = (arrayOfSyllables: string[]): string => arrayOfSyllables\r\n          .map((s, i, arr) => i < arr.length - 1 ? s.replace(/\\-$/, '') : s)\r\n          .join('');\r\n        return [\r\n          stripHyphens(syllables.slice(0, splitPoint)),\r\n          stripHyphens(syllables.slice(splitPoint))\r\n        ];\r\n      };\r\n\r\n      const tenorFragments: [ string, string ] = capableOfNaturalSplit ?\r\n        tenorText.split(naturalSplitRegex, 3).slice(-2).map(txt => txt.trim()) as [ string, string ] :\r\n        splitOnSpaceIndex > 0 ?\r\n          [ tenorText.slice(0, splitOnSpaceIndex), tenorText.slice(splitOnSpaceIndex + 1) ] :\r\n          splitByHyphenation(tenorText);\r\n\r\n      return [\r\n        psalmLine.elements.slice(0, tenorIndex)\r\n          .concat({\r\n            note: new Note({ pitch: tenorPitch, duration: 'brevis' }),\r\n            text: tenorFragments[0]\r\n          }),\r\n        [{\r\n          note: new Note({ pitch: tenorPitch, duration: 'brevis' }),\r\n          text: tenorFragments[1]\r\n        }].concat(psalmLine.elements.slice(tenorIndex + 1))\r\n      ];\r\n    };\r\n\r\n    /** Return either one or two staffs for a line of lyrics. Depends on how much words there are */\r\n    const createStaffsForLyricsLine = (psalmLine: RenderedPsalmLine, allIndented: boolean): Staff[] => {\r\n\r\n      type createFn = (psalmLineElements: RenderedPsalmLine['elements'], indented: boolean) => Staff;\r\n      const createAndPopulateStaff: createFn = (psalmLineElements, indented) => {\r\n        const staff = new Staff().setDimensions(indented ? canvasWidth - 20 - indentation : canvasWidth - 20, 1);\r\n        psalmLineElements.forEach(elem =>\r\n          staff.addObject(new StaffNote(elem.note).attachObject(new LyricsObject(elem.text))));\r\n        const requiredWidth = this.calculateRequiredWidth(staff);\r\n        staff.scale = requiredWidth < staff.width - 15 ? 1 : staff.width / requiredWidth * 0.97;\r\n        return staff;\r\n      };\r\n\r\n      const oneStaff = createAndPopulateStaff(psalmLine.elements, allIndented);\r\n\r\n      return oneStaff.scale < minimumStaffScale ?\r\n        splitPsalmLine(psalmLine).map((partial, index) => createAndPopulateStaff(\r\n          partial,\r\n          allIndented || index === 1)) :\r\n        [ oneStaff ];\r\n    };\r\n\r\n    // Create one staff and if text doesn't fit, create several instead.\r\n    const onlyStaff = new Staff().setPosition(staffXPosition, upperStaffYPosition)\r\n      .setDimensions(canvasWidth - 20, 1);\r\n\r\n    if (psalmVerse.isValid) {\r\n      psalmVerse.firstLine.elements.forEach(elem => {\r\n        onlyStaff.addObject(new StaffNote(elem.note).attachObject(new LyricsObject(elem.text)));\r\n      });\r\n      onlyStaff.addObject(new HalfBarline());\r\n      psalmVerse.secondLine.elements.forEach(elem => {\r\n        onlyStaff.addObject(new StaffNote(elem.note).attachObject(new LyricsObject(elem.text)));\r\n      });\r\n\r\n      const onlyStaffRequiredWith = this.calculateRequiredWidth(onlyStaff);\r\n\r\n      // if text fits on one staff...\r\n      if ( onlyStaffRequiredWith < onlyStaff.width - 15) {\r\n        onlyStaff.width = onlyStaffRequiredWith + 10;\r\n        selectedStaffs.push(onlyStaff);\r\n\r\n      // otherwise, try to scale down the staff...\r\n      } else {\r\n        onlyStaff.scale = onlyStaff.width / this.calculateRequiredWidth(onlyStaff) * 0.97;\r\n\r\n        // if the staff would be too small, divide text on two or more staffs\r\n        if (onlyStaff.scale < minimumStaffScale) {\r\n          selectedStaffs.push(\r\n            ...createStaffsForLyricsLine(psalmVerse.firstLine, false),\r\n            ...createStaffsForLyricsLine(psalmVerse.secondLine, true)\r\n          );\r\n          selectedStaffs.forEach(staff => {\r\n            const requiredWidth = this.calculateRequiredWidth(staff);\r\n            staff.width = requiredWidth + 10;\r\n          });\r\n        } else {\r\n          selectedStaffs.push(onlyStaff);\r\n        }\r\n      }\r\n    }\r\n\r\n    // calculate space requirements and position staffs\r\n\r\n    interface Accumulator {\r\n      requiredHeight: number;\r\n      nextStaffYPosition: number;\r\n    }\r\n\r\n    const calculateStaffRequiredHeight: (staff: Staff) => number = staff =>\r\n      staffLineSpacing * 10 * staff.scale;\r\n\r\n    type reduceFn = (accumulator: Accumulator, staff: Staff, index: number) => Accumulator;\r\n\r\n    const reduceFunction: reduceFn = (accumulator, staff, index) => {\r\n      const xPosition = index === 0 ? staffXPosition : staffXPosition + indentation;\r\n      staff.setPosition(xPosition, accumulator.nextStaffYPosition);\r\n      const nextStaffYPosition = accumulator.nextStaffYPosition + calculateStaffRequiredHeight(staff);\r\n      return {\r\n        requiredHeight: nextStaffYPosition + 25,\r\n        nextStaffYPosition\r\n      };\r\n    };\r\n\r\n    const reduceFirstValue: Accumulator = { requiredHeight: 0, nextStaffYPosition: upperStaffYPosition };\r\n\r\n    const { requiredHeight } = selectedStaffs\r\n      .reduce(reduceFunction, reduceFirstValue);\r\n\r\n    // const requiredHeight = selectedStaffs\r\n    //   .reduce((acc, curr) => acc + staffLineSpacing * 9 * curr.scale, upperStaffYPosition);\r\n\r\n    return {\r\n      staffs: selectedStaffs,\r\n      requiredHeight,\r\n      errors: {\r\n        melodyErrors: psalmVerse.melodyErrors,\r\n        textErrors: psalmVerse.textErrors\r\n      }\r\n    };\r\n  }\r\n\r\n}\r\n","import { NotationService } from './../notation-service/notation.service';\r\nimport { combineLatest, Observable, Subject, of } from 'rxjs';\r\nimport { NotationCanvas } from './../notation-service/canvas/notation-canvas';\r\nimport { AfterViewInit, Component, EventEmitter, Input, OnDestroy, Output } from '@angular/core';\r\n\r\nimport { startWith, takeUntil } from 'rxjs/operators';\r\n\r\nexport type psalmVerseComponentInput = {\r\n  lyrics: string;\r\n  melody: string;\r\n  /** First value of the SVG canvas element width, defaults to 500 */\r\n  initialCanvasWidth?: number;\r\n};\r\n\r\n@Component({\r\n  selector: 'psalm-verse',\r\n  templateUrl: './psalm-verse.component.html',\r\n  styleUrls: ['./psalm-verse.component.scss']\r\n})\r\nexport class PsalmVerseComponent implements AfterViewInit, OnDestroy {\r\n\r\n  // TODO!! Handle situation when lyrics is null\r\n  @Input() dataInput$: Observable<psalmVerseComponentInput>;\r\n  @Input() canvasId: string;\r\n  @Input() responsiveCanvasWidth$: Observable<number>;\r\n  @Output() errors = new EventEmitter<ReturnType<NotationService['renderPsalmStaffs']>['errors']>();\r\n\r\n  onDestroy$ = new Subject<void>();\r\n  notationCanvas: NotationCanvas;\r\n\r\n  constructor(\r\n    private notationsService: NotationService\r\n  ) { }\r\n\r\n  renderNotes(options: { lyrics: string, melody: string, canvasWidth: number }): void {\r\n\r\n    this.notationCanvas.clear();\r\n    const { staffs, requiredHeight, errors } = this.notationsService.renderPsalmStaffs(options);\r\n\r\n    if (staffs.length) {\r\n      this.notationCanvas.setDimensions(options.canvasWidth, requiredHeight);\r\n      staffs.forEach(staff => this.notationCanvas.renderSystem(staff));\r\n    }\r\n    this.errors.emit(errors);\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n\r\n    const canvasEl = document.getElementById(this.canvasId) as HTMLCanvasElement;\r\n    this.notationCanvas = new NotationCanvas(canvasEl);\r\n    const canvasWidth$ = this.responsiveCanvasWidth$ ?\r\n      this.responsiveCanvasWidth$.pipe(startWith(0)) : of(0);\r\n\r\n    combineLatest([ this.dataInput$, canvasWidth$ ]).pipe(takeUntil(this.onDestroy$))\r\n      .subscribe(([ dataInput, canvasWidth ]: [ psalmVerseComponentInput, number]) => {\r\n        const finalCanvasWidth = canvasWidth || dataInput.initialCanvasWidth || 500;\r\n        this.renderNotes({\r\n          lyrics: dataInput.lyrics,\r\n          melody: dataInput.melody,\r\n          canvasWidth: finalCanvasWidth\r\n        });\r\n      });\r\n\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.onDestroy$.next();\r\n  }\r\n\r\n}\r\n","<canvas [id]=\"canvasId\" class=\"canvas\"></canvas>\r\n","import { PsalmVerseComponent } from './psalm-notation/psalm-verse/psalm-verse.component';\r\nimport { NgModule } from '@angular/core';\r\n\r\n@NgModule({\r\n  declarations: [ PsalmVerseComponent ],\r\n  exports: [ PsalmVerseComponent ]\r\n})\r\nexport class NgxPsalmNotationModule { }\r\n","/*\r\n * Public API Surface of ngx-psalm-notation\r\n */\r\n\r\nexport * from './lib/psalm-notation/psalm-verse/psalm-verse.component';\r\nexport * from './lib/ngx-psalm-notation.module';\r\nexport * from './lib/psalm-notation/psalm-text/hyphenation.service';\r\nexport * from './lib/psalm-notation/melody-service/melody.service';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["HalfBarline","i1.HyphenationService","i2.MelodyService","i1.PsalmTextService","i2.HyphenationService","i1.NotationService"],"mappings":";;;;;;;;AAQA;;;;;;;AAOG;AAEI,MAAM,UAAU,GAAG,CAAC,KAAa,KAAW;IACjD,MAAM,EAAE,GAAG,oCAAoC,CAAC;IAChD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAE9B,IAAA,MAAM,YAAY,GAAU,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AAEtF,IAAA,IAAI,KAAK,EAAE;AACT,QAAA,IAAI,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,UAAU,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAwB,CAAC;QACzD,IAAI,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC7C,QAAA,IAAI,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE;AAC9B,YAAA,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,KAAK,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5B,SAAA;AAED,QAAA,IAAI,MAAM,KAAK,GAAG,IAAI,UAAU,KAAK,EAAE,EAAE;YACvC,MAAM,GAAG,GAAG,CAAC;YACb,UAAU,GAAG,GAAG,CAAC;AAClB,SAAA;QAED,OAAO,MAAM,KAAK,GAAG,IAAI,UAAU,KAAK,EAAE,GAAG;YAC3C,MAAM;YACN,UAAU;YACV,MAAM;AACN,YAAA,OAAO,EAAE,IAAI;SACd,GAAG,YAAY,CAAC;AAClB,KAAA;AAAM,SAAA;AACL,QAAA,OAAO,YAAY,CAAC;AACrB,KAAA;AACH,CAAC,CAAC;AAEF;;;;AAIG;AACI,MAAM,kBAAkB,GAAG,CAAC,KAAa,KAAwB;AACtE,IAAA,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;AACtC,IAAA,MAAM,YAAY,GAA2B;AAC3C,QAAA,CAAC,EAAE,CAAC;AACJ,QAAA,CAAC,EAAE,CAAC;AACJ,QAAA,CAAC,EAAE,CAAC;AACJ,QAAA,CAAC,EAAE,CAAC;AACJ,QAAA,CAAC,EAAE,CAAC;AACJ,QAAA,CAAC,EAAE,CAAC;AACJ,QAAA,CAAC,EAAE,EAAE;KACN,CAAC;IAEF,IAAI,WAAW,CAAC,OAAO,EAAE;AACvB,QAAA,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACnF,IAAI,WAAW,CAAC,UAAU,EAAE;AAC1B,YAAA,OAAO,WAAW,CAAC,UAAU,KAAK,GAAG,GAAG,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;AACvE,SAAA;AAAM,aAAA;AACL,YAAA,OAAO,SAAS,CAAC;AAClB,SAAA;AACF,KAAA;AAAM,SAAA;AACL,QAAA,OAAO,SAAS,CAAC;AAClB,KAAA;AACH,CAAC,CAAC;AAGF;;;;;;AAMG;AACI,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAE,IAAA,GAAsB,GAAG,KAAwB;AAC/F,IAAA,MAAM,YAAY,GAA2B;QAC3C,CAAC,EAAE,CAAC,CAAC;QACL,CAAC,EAAE,CAAC,CAAC;QACL,CAAC,EAAE,CAAC,CAAC;QACL,CAAC,EAAE,CAAC,CAAC;QACL,CAAC,EAAE,CAAC,CAAC;QACL,CAAC,EAAE,CAAC,CAAC;AACL,QAAA,CAAC,EAAE,CAAC;KACL,CAAC;AACF,IAAA,MAAM,WAAW,GAAU,UAAU,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,WAAW,CAAC,OAAO,EAAE;AACvB,QAAA,OAAO,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;AACxE,KAAA;AAAM,SAAA;AACL,QAAA,OAAO,SAAS,CAAC;AAClB,KAAA;AACH,CAAC;;ACrGM,MAAM,qBAAqB,GAAG;AACnC,IAAA,KAAK,EAAE;AACL,QAAA,WAAW,EAAE,GAAG;AAChB,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,IAAI,EAAE,CAAC;AACP,QAAA,IAAI,EAAE,CAAC;AACP,QAAA,KAAK,EAAE,GAAG;AACV,QAAA,iBAAiB,EAAE,EAAE;AACrB,QAAA,qBAAqB,EAAE,GAAG;AAC3B,KAAA;AACD,IAAA,MAAM,EAAE;AACJ,QAAA,cAAc,EAAE,CAAC;AACjB,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,OAAO,EAAE,EAAE;AACX,QAAA,IAAI,EAAE,CAAC;AACP,QAAA,IAAI,EAAE,EAAE;AACR,QAAA,KAAK,EAAE,GAAG;AACb,KAAA;AACD,IAAA,gBAAgB,EAAE,GAAG;AACrB,IAAA,gBAAgB,EAAE,EAAE;AACpB,IAAA,WAAW,EAAE,EAAE;AACf,IAAA,iBAAiB,EAAE,EAAE;AACrB,IAAA,aAAa,EAAE,EAAE;AACjB,IAAA,aAAa,EAAE,SAAS;CACzB;;ACNM,MAAM,UAAU,GAAG,CAAC,OAA0B,KAAkB;AACrE,IAAA,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;AAEhE,IAAA,MAAM,YAAY,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,kCAAkC,GAAG,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAE5F,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzC,UAAU,CAAC,GAAG,CAAC;AACb,QAAA,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,cAAc;AACjC,QAAA,GAAG,EAAE,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,kCAAkC,CAAC;AACpF,KAAA,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,qBAAqB,CAAC,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC;AACzE,IAAA,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,GAAG,WAAW,GAAG,EAAE,GAAG,WAAW,CAAC;AAChE,IAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AAC/B,CAAC;;AC3BD,IAAK,aAUJ,CAAA;AAVD,CAAA,UAAK,aAAa,EAAA;AAChB,IAAA,aAAA,CAAA,YAAA,CAAA,GAAA,YAAyB,CAAA;AACzB,IAAA,aAAA,CAAA,wBAAA,CAAA,GAAA,wBAAiD,CAAA;AACjD,IAAA,aAAA,CAAA,WAAA,CAAA,GAAA,WAAuB,CAAA;AACvB,IAAA,aAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACf,IAAA,aAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,aAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,aAAA,CAAA,aAAA,CAAA,GAAA,aAA2B,CAAA;AAC3B,IAAA,aAAA,CAAA,cAAA,CAAA,GAAA,cAA6B,CAAA;AAC7B,IAAA,aAAA,CAAA,aAAA,CAAA,GAAA,aAA2B,CAAA;AAC7B,CAAC,EAVI,aAAa,KAAb,aAAa,GAUjB,EAAA,CAAA,CAAA,CAAA;AAEM,MAAM,UAAU,GAA0C;AAC/D,IAAA,UAAU,EAAE;AACV,QAAA,IAAI,EAAE,gnDAAgnD;AACtnD,QAAA,WAAW,EAAE,GAAG;AAChB,QAAA,UAAU,EAAE,CAAC;QACb,UAAU,EAAE,CAAC,CAAC;AACf,KAAA;AACD,IAAA,sBAAsB,EAAE;AACtB,QAAA,IAAI,EAAE,8UAA8U;AACpV,QAAA,WAAW,EAAE,IAAI;;AAGjB,QAAA,UAAU,EAAE,CAAC;AACb,QAAA,UAAU,EAAE,IAAI;AACjB,KAAA;AACD,IAAA,SAAS,EAAE;AACT,QAAA,IAAI,EAAE,gjBAAgjB;AACtjB,QAAA,WAAW,EAAE,GAAG;;AAIhB,QAAA,UAAU,EAAE,CAAC;AACb,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,YAAY,EAAE,CAAC;AAChB,KAAA;AACD,IAAA,KAAK,EAAE;AACL,QAAA,IAAI,EAAE,6LAA6L;AACnM,QAAA,WAAW,EAAE,GAAG;QAChB,UAAU,EAAE,CAAC,CAAC;QACd,UAAU,EAAE,CAAC,CAAC;AACd,QAAA,YAAY,EAAE,EAAE;AACjB,KAAA;AACD,IAAA,IAAI,EAAE;AACJ,QAAA,IAAI,EAAE,wSAAwS;AAC9S,QAAA,WAAW,EAAE,CAAC;QACd,UAAU,EAAE,CAAC,CAAC;QACd,UAAU,EAAE,CAAC,IAAI;AACjB,QAAA,YAAY,EAAE,EAAE;AACjB,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,IAAI,EAAE,6BAA6B;AACnC,QAAA,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,CAAC,CAAC;QACd,UAAU,EAAE,CAAC,CAAC;AACf,KAAA;AACD,IAAA,WAAW,EAAE;AACX,QAAA,IAAI,EAAE,+CAA+C;AACrD,QAAA,WAAW,EAAE,CAAC;QACd,UAAU,EAAE,CAAC,GAAG;QAChB,UAAU,EAAE,CAAC,GAAG;AAChB,QAAA,YAAY,EAAE,CAAC;AAChB,KAAA;AACD,IAAA,YAAY,EAAE;AACZ,QAAA,IAAI,EAAE,2CAA2C;AACjD,QAAA,WAAW,EAAE,CAAC;AACd,QAAA,UAAU,EAAE,CAAC;QACb,UAAU,EAAE,CAAC,GAAG;AAChB,QAAA,YAAY,EAAE,CAAC;AAChB,KAAA;AACD,IAAA,WAAW,EAAE;AACX,QAAA,IAAI,EAAE,yBAAyB;AAC/B,QAAA,WAAW,EAAE,GAAG;AAChB,QAAA,UAAU,EAAE,CAAC;AACb,QAAA,UAAU,EAAE,CAAC;AACb,QAAA,YAAY,EAAE,EAAE;AACjB,KAAA;CACF;;ACzEM,MAAM,eAAe,GAAG,CAAC,OAAkB,KAAiB;AAEjE,IAAA,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;AAC1C,IAAA,MAAM,iBAAiB,GAAG,UAAU,CAAC,WAAW,CAAC;IACjD,MAAM,eAAe,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;AAEhE,IAAA,IAAI,IAAI,GAAG,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC;AACvC,IAAA,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC;IACrB,IAAI,IAAI,iBAAiB,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;IACnD,GAAG,IAAI,iBAAiB,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;IAClD,eAAe,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,eAAe,CAAC,KAAK,CAAC,iBAAiB,CAAC,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAEnE,OAAO,EAAE,eAAe,EAAE,CAAC;AAC7B,CAAC;;AC1BD,IAAY,oBAKX,CAAA;AALD,CAAA,UAAY,oBAAoB,EAAA;IAC9B,oBAAA,CAAA,oBAAA,CAAA,YAAA,CAAA,GAAA,CAAA,CAAA,GAAA,YAAU,CAAA;IACV,oBAAA,CAAA,oBAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAM,CAAA;IACN,oBAAA,CAAA,oBAAA,CAAA,UAAA,CAAA,GAAA,CAAA,CAAA,GAAA,UAAQ,CAAA;IACR,oBAAA,CAAA,oBAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAM,CAAA;AACR,CAAC,EALW,oBAAoB,KAApB,oBAAoB,GAK/B,EAAA,CAAA,CAAA,CAAA;AAED;;AAEG;MACU,cAAc,CAAA;AACzB,IAAA,WAAA,CAAmB,kBAAwC,EAAA;AAAxC,QAAA,IAAkB,CAAA,kBAAA,GAAlB,kBAAkB,CAAsB;KAAI;AAChE,CAAA;AAEK,MAAO,UAAW,SAAQ,cAAc,CAAA;AAE5C,IAAA,WAAA,CAAmB,QAA0B,EAAA;AAC3C,QAAA,KAAK,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;AADtB,QAAA,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAkB;KAE5C;AACF,CAAA;AAEK,MAAO,MAAO,SAAQ,cAAc,CAAA;AACxC,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;KACpC;AACF,CAAA;AAEK,MAAO,QAAS,SAAQ,cAAc,CAAA;AAC1C,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;KACtC;AACF,CAAA;AAEK,MAAO,YAAa,SAAQ,cAAc,CAAA;AAC9C,IAAA,WAAA,CAAmB,IAAY,EAAA;AAC7B,QAAA,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;AADlB,QAAA,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAQ;KAE9B;AACF;;MC9BY,WAAW,CAAA;AAMtB,IAAA,WAAA,CAAmB,IAAqB,EAAA;AAArB,QAAA,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAiB;AAFxC,QAAA,IAAe,CAAA,eAAA,GAAqB,EAAE,CAAC;QAIvC,IAAA,CAAA,WAAW,GAAmC,CAAC,CAAC,EAAE,CAAC,KAAI;AACrD,YAAA,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;AACd,YAAA,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;AAChB,SAAC,CAAA;KAL2C;AAO5C,IAAA,YAAY,CAAC,UAA0B,EAAA;AACrC,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACtC,QAAA,OAAO,IAAI,CAAC;KACb;AAEF,CAAA;AAEK,MAAO,SAAU,SAAQ,WAAW,CAAA;AAExC,IAAA,WAAA,CAAmB,IAAU,EAAA;QAC3B,KAAK,CAAC,MAAM,CAAC,CAAC;AADG,QAAA,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAM;QAE3B,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;AACrD,QAAA,IAAI,UAAU,EAAE;AACd,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,UAAU,CAAC,UAAU,KAAK,GAAG,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC;AAC1E,SAAA;KACF;AAEF,CAAA;AAEK,MAAOA,aAAY,SAAQ,WAAW,CAAA;AAC1C,IAAA,WAAA,GAAA;QACE,KAAK,CAAC,aAAa,CAAC,CAAC;KACtB;AACF,CAAA;MAEY,KAAK,CAAA;AAQhB,IAAA,WAAA;;;QANA,IAAA,CAAA,IAAI,GAAW,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC;QAChD,IAAA,CAAA,IAAI,GAAW,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC;QAChD,IAAA,CAAA,KAAK,GAAW,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC;QAClD,IAAA,CAAA,KAAK,GAAW,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC;AAClD,QAAA,IAAO,CAAA,OAAA,GAAkB,EAAE,CAAC;KAItB;IAEN,WAAW,CAAC,CAAS,EAAE,CAAS,EAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;AACd,QAAA,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;AACd,QAAA,OAAO,IAAI,CAAC;KACb;IAED,aAAa,CAAC,KAAa,EAAE,KAAa,EAAA;AACxC,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AACnB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AACnB,QAAA,OAAO,IAAI,CAAC;KACb;IAED,cAAc,GAAA;AACZ,QAAA,OAAO,qBAAqB,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC;KAC5D;AAED,IAAA,SAAS,CAAC,GAAgB,EAAA;AACxB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KACxB;AAEF;;ACjED,MAAM,WAAW,GAAG,CAChB,OAA2B,EAC3B,iBAGC,KACsB;AACvB,IAAA,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;AACjC,IAAA,MAAM,UAAU,GAAG,iBAAiB,CAAC,UAAU,IAAI,CAAC,CAAC;AACrD,IAAA,MAAM,EAAE,cAAc,EAAE,GAAG,iBAAiB,CAAC;IAC7C,OAAO;AACL,QAAA,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,oBAAoB,GAAG,UAAU,GAAG,KAAK,CAAC,KAAK;AAC1E,QAAA,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,cAAc,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC;KAC3F,CAAC;AACJ,CAAC,CAAC;AAEJ,MAAM,cAAc,CAAA;AAElB;;;AAGG;IACH,uBAAuB,CAAC,KAAY,EAAE,cAA2B,EAAA;AAC/D,QAAA,MAAM,QAAQ,GAAG;AACf,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC,YAAY;SACjD,CAAC;AACF,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAE1B,IAAI,cAAc,YAAY,SAAS,EAAE;YACvC,OAAO,cAAc,CAAC,IAAI,CAAC,QAAQ,KAAK,aAAa;AACnD,gBAAA,QAAQ,CAAC,WAAW,GAAG,KAAK;AAC5B,gBAAA,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC;AAC3B,SAAA;QAED,IAAI,cAAc,YAAYA,aAAW,EAAE;AACzC,YAAA,OAAO,QAAQ,CAAC,WAAW,GAAG,KAAK,CAAC;AACrC,SAAA;AAED,QAAA,OAAO,CAAC,CAAC;KACV;AAED;;;AAGG;AACH,IAAA,uBAAuB,CAAC,OAKvB,EAAA;QAEC,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;AAExD,QAAA,MAAM,oBAAoB,GAAG,CAAC,KAAwB,KAAoC;YACxF,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,GAAG,GAAG,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC;AACnG,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,cAAc,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;AACtE,YAAA,MAAM,IAAI,GAAG,KAAK,KAAK,OAAO;gBAC5B,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC;AACvC,gBAAA,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;AACtC,YAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,SAAC,CAAC;AAEF,QAAA,MAAM,sBAAsB,GAAG,CAAC,gBAAwB,EAAE,UAAkB,KAAY;YACtF,OAAO,gBAAgB,GAAG,KAAK,CAAC,cAAc,EAAE,GAAG,UAAU,CAAC;AAChE,SAAC,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAG,MAAc,YAAY,CAAC,IAAI,CAAC,QAAQ,KAAK,aAAa;AACnF,YAAA,EAAE,GAAG,KAAK,CAAC,KAAK;AAChB,YAAA,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC;AAEnB,QAAA,MAAM,wBAAwB,GAAG,CAAC,aAAqB,KAAkB;AACvE,YAAA,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;YACnE,MAAM,KAAK,GAAG,EAAE,CAAC;YACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE;gBACtC,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI;AACJ,oBAAA,IAAI,EAAE,sBAAsB,CAAC,YAAY,EAAE,CAAC,CAAC;oBAC7C,KAAK,EAAE,kBAAkB,EAAE;AACd,iBAAA,CAAC,CAAC;AAClB,aAAA;AACD,YAAA,OAAO,KAAK,CAAC;AACf,SAAC,CAAC;AAEF,QAAA,MAAM,wBAAwB,GAAG,CAAC,aAAqB,KAAkB;AACvE,YAAA,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;YACnE,MAAM,KAAK,GAAG,EAAE,CAAC;YACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE;gBACtC,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI;oBACJ,IAAI,EAAE,sBAAsB,CAAC,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;oBAClD,KAAK,EAAE,kBAAkB,EAAE;AACd,iBAAA,CAAC,CAAC;AAClB,aAAA;AACD,YAAA,OAAO,KAAK,CAAC;AACf,SAAC,CAAC;AAEF,QAAA,MAAM,aAAa,GAAG,gBAAgB,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxE,QAAA,IAAI,aAAa,GAAG,CAAC,CAAC,EAAE;AACtB,YAAA,OAAO,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC;AACvE,SAAA;AAAM,aAAA;YACL,OAAO,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC/F,SAAA;KACF;AAED;;;AAGG;AACH,IAAA,qBAAqB,CAAC,OAA2B,EAAA;QAC/C,OAAO,WAAW,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;KACpD;AAED,IAAA,iBAAiB,CAAC,OAA2B,EAAA;QAC3C,OAAO,WAAW,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;KACpD;AAED,IAAA,sBAAsB,CAAC,OAA2B,EAAA;QAChD,OAAO,WAAW,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;KACpD;AAED,IAAA,uBAAuB,CAAC,OAA2B,EAAA;QACjD,OAAO,WAAW,CAChB,OAAO,EACP;AACE,YAAA,cAAc,EAAE,CAAC;AACjB,YAAA,UAAU,EAAE,UAAU,CAAC,WAAW,CAAC,YAAY;AAChD,SAAA,CACF,CAAC;KACH;AAEF,CAAA;AAEM,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE;;AChI3C,MAAM,YAAY,GAAG,CAAC,OAAkB,KAAiB;AAE9D,IAAA,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;AAEtE,IAAA,MAAM,OAAO,GAAG,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,YAAY,EAAE,UAAU,CAAC,YAAY,EAAE,CAAC;AAC/F,IAAA,MAAM,eAAe,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAClE,IAAA,MAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;AAChD,IAAA,MAAM,kBAAkB,GAAG,UAAU;QACnC,UAAU,KAAK,GAAG;YAChB,UAAU,CAAC,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,KAAK;YAC3C,UAAU,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,KAAK;AAC5C,QAAA,CAAC,CAAC;IAEJ,MAAM,SAAS,GAAoD,EAAE,CAAC;AAEtE,IAAA,MAAM,WAAW,GAAG,CAAC,WAAmB,KAAI;AAC1C,QAAA,MAAM,gBAAgB,GAAG,WAAW,KAAK,MAAM;YAC7C,cAAc,CAAC,sBAAsB,GAAG,cAAc,CAAC,uBAAuB,CAAC;QACjF,MAAM,MAAM,GAAG,gBAAgB,CAAC;AAC9B,YAAA,oBAAoB,EAAE,cAAc,GAAG,KAAK,CAAC,IAAI;YACjD,KAAK;YACL,KAAK;AACN,SAAA,CAAC,CAAC;AACH,QAAA,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AACnE,KAAC,CAAC;IAEF,WAAW,CAAC,MAAM,CAAC,CAAC;IACpB,WAAW,CAAC,OAAO,CAAC,CAAC;;;;;;AAQrB,IAAA,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;AACpE,IAAA,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;AAEnE,IAAA,SAAS,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,GAAG,kBAAkB,CAAC;AAC3F,IAAA,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;IAErE,eAAe,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AAC5E,IAAA,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAErE,gBAAgB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;AAC/E,IAAA,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;;IAGvE,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC;IACzE,QAAQ,CAAC,GAAG,CAAC;AACX,QAAA,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,iBAAiB;AACxC,KAAA,CAAC,CAAC;IACH,MAAM,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,GAAG,KAAK,CAAC,KAAK;QACxE,OAAO,CAAC,YAAY,CAAC,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC;AAElD,IAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,CAAC;AACpE,CAAC;;AC5DM,MAAM,UAAU,GAAG,CAAC,OAAkB,KAAiB;IAE5D,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;AAC5D,IAAA,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;AAChD,IAAA,MAAM,MAAM,GAAG,UAAU;AACvB,QAAA,UAAU,KAAK,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,YAAY;AACjF,QAAA,CAAC,CAAC;AAEJ,IAAA,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,cAAc,CAAC,iBAAiB,CAAC;AAC/D,QAAA,oBAAoB,EAAE,cAAc,GAAG,KAAK,CAAC,IAAI;QACjD,KAAK;QACL,KAAK;AACJ,KAAA,CAAC,CAAC;AACL,IAAA,IAAI,IAAI,YAAY,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC;IACrE,GAAG,IAAI,YAAY,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;IAC7C,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9B,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;AAEzD,IAAA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,CAAC,EAAE,CAAC;AAChD,CAAC;;AClBM,MAAM,cAAc,GAAG,CAAC,OAAkB,KAAiB;AAEhE,IAAA,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAClF,MAAM,gBAAgB,GAA4B,UAAU,CAAC,QAAQ,KAAK,OAAO;QAC/E,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC;IACrC,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAC9D,IAAA,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,cAAc,CAAC,qBAAqB,CAAC;AACnE,QAAA,oBAAoB,EAAE,cAAc,GAAG,KAAK,CAAC,IAAI;QACjD,KAAK;QACL,KAAK;AACJ,KAAA,CAAC,CAAC;IACL,IAAI,IAAI,gBAAgB,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;IAClD,GAAG,IAAI,gBAAgB,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;IACjD,cAAc,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IAClC,cAAc,CAAC,KAAK,CAAC,gBAAgB,CAAC,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;;IAGjE,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC;IACtE,QAAQ,CAAC,GAAG,CAAC;AACX,QAAA,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,iBAAiB;AACxC,KAAA,CAAC,CAAC;AAEH,IAAA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,CAAC;AACpE,CAAC;;AC9BD,MAAM,iBAAiB,GAAG,CAAC,KAAY,EAAE,MAAmC,KAAiB;IAC3F,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,gBAAgB,GAAG,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1D,IAAI,CAAC,GAAG,CAAC;AACP,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,UAAU,GAAG,gBAAgB;QACvD,GAAG,EAAE,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,UAAU,GAAG,gBAAgB;AACvD,KAAA,CAAC,CAAC;AACH,IAAA,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;AAC7B,IAAA,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAQF,MAAM,OAAO,CAAA;AAEX,IAAA,cAAc,CAAC,KAAY,EAAA;AACzB,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;QAC3C,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC;QACnC,MAAM,KAAK,GAAkB,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC1B,YAAA,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAC1B,CAAE,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,EAC/D,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AACzB,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClB,SAAA;AACD,QAAA,OAAO,KAAK,CAAC;KACd;AAED,IAAA,QAAQ,CAAC,KAAY,EAAA;AACnB,QAAA,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC;AACnC,QAAA,OAAO,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;KACvC;IAEO,QAAQ,CAAC,KAAY,EAAE,IAAU,EAAA;AACvC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,KAAK,aAAa,GAAG,UAAU,CAAC,sBAAsB,GAAG,UAAU,CAAC,SAAS,CAAC;AAC9G,QAAA,OAAO,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;KAC7C;AAED;;AAEG;IACH,WAAW,CAAC,KAAY,EAAE,qBAA6B,EAAA;QACrD,MAAM,aAAa,GAAoB,EAAE,CAAC;QAC1C,IAAI,WAAW,GAAiB,EAAE,CAAC;AAEnC,QAAA,IAAI,cAAc,GAAG,qBAAqB,GAAG,KAAK,CAAC,KAAK,CAAC;;AAGzD,QAAA,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,IAAG;YAElC,IAAI,mBAAmB,GAAG,CAAC,CAAC;YAC5B,IAAI,WAAW,GAAG,CAAC,CAAC;;YAGpB,IAAI,WAAW,YAAY,SAAS,EAAE;AACpC,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;AACxD,gBAAA,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;AACzC,gBAAA,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;;;;gBAK3C,QAAQ,CAAC,GAAG,CAAC;AACX,oBAAA,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,cAAc;AACpC,oBAAA,GAAG,EAAE,QAAQ,CAAC,GAAG,GAAG,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,GAAG,CAAC;AACvE,iBAAA,CAAC,CAAC;AAEH,gBAAA,WAAW,CAAC,eAAe,CAAC,OAAO,CAAC,UAAU,IAAG;;oBAG/C,IAAI,UAAU,YAAY,UAAU,EAAE;AAEpC,wBAAA,MAAM,uBAAuB,GAAG,cAAc,CAC5C,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,CACvE,CAAC;AACF,wBAAA,aAAa,CAAC,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAC;AAC3D,wBAAA,mBAAmB,IAAI,uBAAuB,CAAC,mBAAmB,CAAC;AACpE,qBAAA;;oBAGD,IAAI,UAAU,YAAY,MAAM,EAAE;AAChC,wBAAA,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;AACjF,qBAAA;;oBAGD,IAAI,UAAU,YAAY,QAAQ,EAAE;AAClC,wBAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC9E,wBAAA,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;AAC7C,wBAAA,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;AAC9C,wBAAA,mBAAmB,IAAI,QAAQ,CAAC,mBAAmB,CAAC;AACrD,qBAAA;;oBAGD,IAAI,UAAU,YAAY,YAAY,EAAE;AACtC,wBAAA,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;AACvF,wBAAA,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AACtC,wBAAA,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;AAC5B,qBAAA;AAEH,iBAAC,CAAC,CAAC;;gBAGH,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,cAAc,CAAC,uBAAuB,CAAC;oBACzE,KAAK;AACL,oBAAA,YAAY,EAAE,WAAW;oBACzB,cAAc;oBACd,MAAM,EAAE,mBAAmB,IAAI,CAAC;AACjC,iBAAA,CAAC,CAAC,CAAC;AAEJ,gBAAA,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAE9B,aAAA;;YAGD,IAAI,WAAW,YAAYA,aAAW,EAAE;gBACtC,MAAM,WAAW,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;AAC/D,gBAAA,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;AACjD,aAAA;;AAGD,YAAA,MAAM,kBAAkB,GAAG,cAAc,CAAC,uBAAuB,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,mBAAmB,CAAC;AAC5G,YAAA,cAAc,IAAI,kBAAkB,GAAG,WAAW,GAAG,kBAAkB,GAAG,WAAW,CAAC;AACxF,SAAC,CAAC,CAAC;QACH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAAE,CAAC;KAC5E;AACF,CAAA;AAEM,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;;MC7IvB,cAAc,CAAA;AAMzB,IAAA,WAAA,CAAY,IAAuB,EAAA;QACjC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;KAC7C;IAED,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;KACrB;IAED,aAAa,CAAC,KAAa,EAAE,MAAc,EAAA;QACzC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AAC7C,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;KAC3B;IAED,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,YAAY,CAAC;KAC1B;AAED,IAAA,YAAY,CAAC,KAAY,EAAA;AAEvB,QAAA,MAAM,UAAU,GAAG,CAAC,GAAoC,KAAI;AAC1D,YAAA,IAAI,GAAG,YAAY,MAAM,CAAC,MAAM,EAAE;AAChC,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACtB,aAAA;AAAM,iBAAA;AACL,gBAAA,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAChD,aAAA;AACH,SAAC,CAAC;AAEF,QAAA,MAAM,cAAc,GAAG,CAAC,KAAmB,KAAU;YACnD,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CACnD,CAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAE,EAC3D,EAAE,MAAM,EAAE,OAAO,EAAE,CACpB,CAAC,CAAC,CAAC;AACN,SAAC,CAAC;QAEF,UAAU,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1C,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACpC,QAAA,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC3F,QAAA,IAAI,mBAAmB,GAAG,KAAK,CAAC,KAAK,EAAG;YACtC,UAAU,CAAC,aAAa,CAAC,CAAC;YAC1B,cAAc,CAAC,WAAW,CAAC,CAAC;AAC7B,SAAA;AAAM,aAAA;AACL,YAAA,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAC9B,SAAA;KAEF;AAEF;;MC3CY,cAAc,CAAA;AAIzB,IAAA,WAAA,CAAY,OAAiC,EAAA;AAC3C,QAAA,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;KAC1B;AAEF,CAAA;AAEK,MAAO,WAAY,SAAQ,cAAc,CAAA;AAC7C,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;KAChC;AACF,CAAA;AAEK,MAAO,IAAK,SAAQ,cAAc,CAAA;AAMtC,IAAA,WAAA,CAAY,WAAwB,EAAA;QAClC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE;YAC1C,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;AAChE,SAAA;AACD,QAAA,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAC,CAAC,CAAC;AACvB,QAAA,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;AACrC,QAAA,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;KAC1B;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AACxB,QAAA,OAAO,IAAI,CAAC;KACb;AACF,CAAA;AAEK,MAAO,SAAU,SAAQ,IAAI,CAAA;AACjC,IAAA,WAAA,CAAY,KAAa,EAAA;QACvB,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;KACtC;AACF;;ACvCD;;;;AAIG;AACI,MAAM,wBAAwB,GAAyC,CAAC,SAAS,EAAE,OAAO,KAAI;IACnG,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS;SACxC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,KAAK,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;AACnF,QAAA,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;SAChB,MAAM,CAAC,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9B,MAAM,QAAQ,GAAiE,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAI;QACvG,MAAM,SAAS,GAAG,KAAK,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC;AAC7E,QAAA,MAAM,GAAG,GAAG,SAAS,GAAG,IAAI,CAAC;QAC7B,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAClI,KAAC,CAAC;AAEF,IAAA,OAAO,cAAc;SAClB,GAAG,CAAC,CAAC,kBAAkB,EAAE,UAAU,EAAE,KAAK,KAAI;QAE7C,MAAM,UAAU,GAAG,UAAU,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;YAC9C,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,kBAAkB;AAC1C,YAAA,SAAS,CAAC,MAAM,GAAG,kBAAkB,CAAC;AAExC,QAAA,OAAO,UAAU,GAAG,CAAC;YACnB,CAAE,kBAAkB,CAAE;AACtB,YAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACjD,GAAG,CAAC,KAAK,IAAI,kBAAkB,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;AACpD,KAAC,CAAC;AACD,SAAA,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AAC9C,SAAA,MAAM,CAAC,CAAC,aAAa,EAAE,UAAU,EAAE,KAAK,KAAK,UAAU,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QACzE,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,aAAa,GAAG,CAAC;AACzC,QAAA,IAAI,CAAC;AACN,SAAA,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AACpB,SAAA,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;AACzB,CAAC,CAAC;AAEK,MAAM,iBAAiB,GAAG,CAAC,OAAiC,KAAgB;AAEjF,IAAA,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACxC,IAAI,kBAAkB,GAAG,KAAK,CAAC;AAC/B,IAAA,IAAI,uBAA+B,CAAC;AAEpC,IAAA,MAAM,uBAAuB,GAAG,wBAAwB,CAAC,SAAS,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AACpG,IAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;QACxB,kBAAkB,GAAG,IAAI,CAAC;AAC1B,QAAA,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,kBAAkB,EAAE,CAAC;AAC/C,KAAA;;AAED,IAAA,IAAI,uBAAuB,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;QAClC,uBAAuB,GAAG,CAAC,CAAC,CAAC;AAC9B,KAAA;AAAM,SAAA;QACL,uBAAuB,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC;AAC/D,KAAA;AAED,IAAA,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,KAAK,CAAC,uBAAuB,CAAC;AAChF,SAAA,GAAG,CAAC,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,KAAK,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QAC5D,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,aAAa;AAChC,QAAA,SAAS,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC;IAEtC,OAAO;QACL,UAAU,EAAE,QAAQ,CAAC,cAAc;aAChC,KAAK,CAAC,uBAAuB,CAAC;AAC9B,aAAA,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;YAEpB,IAAI,KAAK,CAAC,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,EAAE;AAC9C,gBAAA,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACpB,aAAA;AAAM,iBAAA;gBACL,IAAI,oBAAoB,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE;AAC9C,oBAAA,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9B,iBAAA;AACF,aAAA;YAED,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,YAAY,MAAM;gBACxC,IAAI;AACJ,gBAAA,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,uBAAuB,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACxF,aAAA,CAAC,CAAC,CAAC;AACN,SAAC,CAAC;AACD,aAAA,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QAC9C,kBAAkB;KACnB,CAAC;AACJ,CAAC;;AC7FD,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;AAEhF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,eAAe,CAAC,CAAC;MAgB9B,kBAAkB,CAAA;AAG7B,IAAA,WAAA,GAAA,GAAiB;AAEjB,IAAA,SAAS,CAAC,IAAY,EAAA;AAGpB,QAAA,MAAM,UAAU,GAAgB;YAC9B,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE;YACzC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;YAC3C,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;YACzC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;AAC3C,YAAA;AACE,gBAAA,QAAQ,EAAE,MAAM;AAChB,gBAAA,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;gBACrB,OAAO,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE;AACzD,aAAA;AACD,YAAA;AACE,gBAAA,QAAQ,EAAE,MAAM;AAChB,gBAAA,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;gBACrB,OAAO,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE;AACxD,aAAA;YACD,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;YACzC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;YACzC,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;SAC9C,CAAC;;QAGF,MAAM,WAAW,GAAsC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CACxE,IAAI,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,gBAAgB,EAAE,GAAG,CAAC,CAC5C,CAAC;QAEF,MAAM,SAAS,GAAG,CAAC,QAAgB,KAAK,CAAC,GAAc,KAAK,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;AAEhG,QAAA,MAAM,SAAS,GAAG,CAAC,gBAAwB,EAAE,OAAgB,KAAc;AACzE,YAAA,MAAM,kBAAkB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,WAAW,CAAC,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC7F,MAAM,WAAW,GAAG,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC1D,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;AACnE,YAAA,MAAM,mBAAmB,GAAG,gBAAgB,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AACxE,YAAA,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAE,CAAS,EAAE,GAAa,KAAK,CAAC,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,mBAAmB,GAAG,IAAI,CAAC;AAClI,YAAA,MAAM,YAAY,GAAwC,CAAC,CAAC,EAAE,gBAAgB,KAAI;AAChF,gBAAA,MAAM,aAAa,GAAG,gBAAgB,CAAC,gBAAgB,KAAK,GAAG;oBAC7D,WAAW,CAAC,CAAC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;AACrE,gBAAA,MAAM,SAAS,GAAG,gBAAgB,CAAC,YAAY,KAAK,GAAG;oBACrD,WAAW,CAAC,CAAC,CAAC,YAAY,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBAC7D,OAAO,aAAa,IAAI,SAAS,CAAC;AACpC,aAAC,CAAC;AAEF,YAAA,IAAI,GAAc,CAAC;AACnB,YAAA,IAAI,WAAqB,CAAC;;;AAI1B,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAClD,gBAAA,GAAG,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAC5B,gBAAA,WAAW,GAAG,CAAC,GAAG,CAAC,OAAO;oBACxB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;oBACrC,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC;wBAChC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;wBACrC,CAAE,gBAAgB,CAAE,CAAC;;AAEzB,gBAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1B,oBAAA,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC;AAC/B,iBAAA;AACF,aAAA;YAED,OAAO,WAAW;AAChB,gBAAA,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AAC3F,gBAAA,WAAW,CAAC;AAChB,SAAC,CAAC;AAEF,QAAA,MAAM,iBAAiB,GAAG,CAAC,GAAa,EAAE,QAAgB,EAAE,KAAa,EAAE,cAAwB,KAAe,UAAU;AACzH,aAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AACxB,YAAA,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,QAAQ,EAAE;AAChC,gBAAA,gBAAgB,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;gBACxC,YAAY,EAAE,cAAc,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE;aAC9C,CAAC,CAAC;AACH,YAAA,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAEzB,QAAA,MAAM,aAAa,GAA4B,GAAG,IAAI,GAAG;aACtD,KAAK,CAAC,MAAM,CAAC;aACb,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC;aACtB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAE/F,QAAA,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;;aAE1B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;aACnD,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9E,aAAA,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;;aAExF,MAAM,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC;AAC7B,aAAA,MAAM,CAAC,iBAAiB,EAAE,EAAE,CAAC;aAC7B,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI;AAC9B,aAAA,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACrF,aAAA,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;KAEzC;AAED;;;AAGG;AAEH,IAAA,oBAAoB,CAAC,IAAY,EAAE,eAAe,GAAG,CAAC,EAAA;QACpD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,eAAe,GAAG,wBAAwB,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QAC7E,OAAO;YACL,SAAS;YACT,eAAe;AACf,YAAA,WAAW,EAAE,eAAe,CAAC,MAAM,GAAG,eAAe;SACtD,CAAC;KACH;;+GAhHU,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAlB,kBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA,CAAA;2FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;iBACnB,CAAA;;;MCPY,WAAW,CAAA;IAEtB,WAAmB,CAAA,OAAe,EAAS,OAAe,EAAA;AAAvC,QAAA,IAAO,CAAA,OAAA,GAAP,OAAO,CAAQ;AAAS,QAAA,IAAO,CAAA,OAAA,GAAP,OAAO,CAAQ;KAAI;AAC/D;;ACVD;;;;;AAKG;AACH,MAAM,iBAAiB,GAAG,CAAC,KAAa,KAAa,KAAK;AACvD,KAAA,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;AACtB,KAAA,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;MAWf,aAAa,CAAA;AAExB,IAAA,WAAA,GAAA,GAAiB;AAEjB;;;AAGG;AACH,IAAA,WAAW,CAAC,YAAoB,EAAA;QAC9B,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,MAAM,eAAe,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChD,eAAe;AACZ,aAAA,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,CAAC;AACjD,aAAA,OAAO,CAAC,CAAC,YAAY,EAAE,KAAK,KAAI;;YAG/B,IAAI,YAAY,KAAK,GAAG,EAAE;AACxB,gBAAA,MAAM,CAAC,IAAI,CAAC,IAAIA,aAAW,EAAE,CAAC,CAAC;gBAC/B,OAAO;AACR,aAAA;;YAGD,MAAM,SAAS,GAAG,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,WAAW,GAAG,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACrD,MAAM,QAAQ,GAAG,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5C,YAAA,MAAM,UAAU,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;AACnD,YAAA,MAAM,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;YAC3C,IAAI,WAAW,CAAC,OAAO,EAAE;gBACvB,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,aAAa,EAAE,CAAC,CAAC,CAAC;AAChH,gBAAA,IAAI,WAAW,EAAE;AACf,oBAAA,SAAS,CAAC,YAAY,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;AACxC,iBAAA;gBACD,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,YAAY,CAAC,IAAI,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;AAC3E,aAAA;AAAM,iBAAA;AACL,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AAChE,aAAA;AACH,SAAC,CAAC,CAAC;AACL,QAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;KACzB;AAEH,IAAA,kBAAkB,CAAC,YAAoB,EAAA;AAErC,QAAA,IAAI,SAAmC,CAAC;AACxC,QAAA,IAAI,UAAqC,CAAC;QAE1C,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,MAAM,MAAM,GAA0B,EAAE,CAAC;;QAGzC,MAAM,eAAe,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;;QAG9E,IAAI,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACpC,OAAO,GAAG,KAAK,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,CAAC,EAAE,0CAA0C,CAAC,CAAC,CAAC;AAC7E,SAAA;AAAM,aAAA;;YAGL,IAAI,WAAW,GAAG,CAAC,CAAC;AACpB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC/C,gBAAA,IAAI,eAAe,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;oBAC9B,IAAI,WAAW,KAAK,CAAC,EAAE;wBACrB,OAAO,GAAG,KAAK,CAAC;wBAChB,MAAM,CAAC,IAAI,CAAC;AACV,4BAAA,OAAO,EAAE,CAAC;AACV,4BAAA,OAAO,EAAE,iEAAiE;AAC3E,yBAAA,CAAC,CAAC;AACJ,qBAAA;oBACD,WAAW,GAAG,CAAC,CAAC;AACjB,iBAAA;AAAM,qBAAA;AACL,oBAAA,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;wBACxC,WAAW,IAAI,CAAC,CAAC;wBACjB,IAAI,WAAW,KAAK,CAAC,EAAE;4BACrB,OAAO,GAAG,KAAK,CAAC;4BAChB,MAAM,CAAC,IAAI,CAAC;AACV,gCAAA,OAAO,EAAE,CAAC;AACV,gCAAA,OAAO,EAAE,iEAAiE;AAC3E,6BAAA,CAAC,CAAC;AACJ,yBAAA;AACF,qBAAA;AACF,iBAAA;AACF,aAAA;YACD,IAAI,CAAC,WAAW,EAAE;gBAChB,OAAO,GAAG,KAAK,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC;AACV,oBAAA,OAAO,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC;AACnC,oBAAA,OAAO,EAAE,iEAAiE;AAC3E,iBAAA,CAAC,CAAC;AACJ,aAAA;AACF,SAAA;;QAGD,MAAM,mBAAmB,GAAa,eAAe;aAClD,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;aAC3D,MAAM,CAAC,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;QAC5B,MAAM,YAAY,GAAa,eAAe;aAC3C,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;aACzD,MAAM,CAAC,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;AAE5B,QAAA,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC;AACrE,QAAA,YAAY,CAAC,OAAO,CAAC,UAAU,IAAG;AAChC,YAAA,IAAI,uBAAuB,CAAC;YAC5B,IAAI,UAAU,GAAG,YAAY,EAAE;AAC7B,gBAAA,uBAAuB,GAAG,mBAAmB;AAC1C,qBAAA,MAAM,CAAC,GAAG,IAAI,GAAG,GAAG,UAAU,IAAI,GAAG,GAAG,YAAY,CAAC;AACrD,qBAAA,MAAM,CAAC;AACX,aAAA;AAAM,iBAAA;AACL,gBAAA,uBAAuB,GAAG,mBAAmB;AAC1C,qBAAA,MAAM,CAAC,GAAG,IAAI,GAAG,GAAG,UAAU,IAAI,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC;AAC/D,qBAAA,MAAM,CAAC;AACX,aAAA;YACD,IAAI,CAAC,uBAAuB,EAAE;gBAC5B,OAAO,GAAG,KAAK,CAAC;AAChB,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,sEAAsE,EAAC,CAAC,CAAC;AACtH,aAAA;AACH,SAAC,CAAC,CAAC;;AAGH,QAAA,mBAAmB,CAAC,OAAO,CAAC,KAAK,IAAG;AAClC,YAAA,IAAI,KAAK,KAAK,YAAY,GAAG,CAAC,IAAI,KAAK,KAAK,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;gBACtE,OAAO,GAAG,KAAK,CAAC;AAChB,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,mDAAmD,EAAE,CAAC,CAAC;AAC/F,aAAA;AACH,SAAC,CAAC,CAAC;QACH,mBAAmB,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,KAAK,KAAI;AAE3D,YAAA,MAAM,cAAc,GAAG,CAAC,SAAS,GAAG,YAAY,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,YAAY;gBACtF,SAAS,GAAG,YAAY,IAAI,UAAU,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YAC5D,IAAI,cAAc,KAAK,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,EAAE;gBACtG,OAAO,GAAG,KAAK,CAAC;AAChB,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,gEAAgE,EAAC,CAAC,CAAC;AAC/G,aAAA;AACH,SAAC,CAAC,CAAC;;QAGH,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;YACtC,MAAM,MAAM,GAAG,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;YACnD,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;gBACnC,OAAO,GAAG,KAAK,CAAC;AAChB,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,6CAA6C,EAAE,CAAC,CAAC;AACzF,aAAA;AACH,SAAC,CAAC,CAAC;;AAIH,QAAA,IAAI,OAAO,EAAE;AAEX,YAAA,MAAM,UAAU,GAAG,CAAC,KAAe,KAAY;gBAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;AACnE,gBAAA,OAAO,KAAK;AACT,qBAAA,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;qBACpB,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAC,CAAC,CAAC,CAAC;AACvF,aAAC,CAAC;AAEF,YAAA,MAAM,QAAQ,GAAG,CAAC,KAAe,KAAe;gBAC9C,OAAO,IAAI,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;AACtF,aAAC,CAAC;AAEF,YAAA,MAAM,aAAa,GAAG,CAAC,KAAe,KAAY;gBAChD,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;gBACnE,MAAM,sBAAsB,GAAG,KAAK;qBACjC,SAAS,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,GAAG,UAAU,CAAC,CAAC;AAC9E,gBAAA,OAAO,KAAK;AACT,qBAAA,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE,sBAAsB,CAAC;qBAC7C,GAAG,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAC,CAAC,CAAC,CAAC;AACzF,aAAC,CAAC;AAEF,YAAA,MAAM,iBAAiB,GAAG,CAAC,KAAe,KAAgD;gBACxF,MAAM,sBAAsB,GAAG,KAAK;qBACjC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;qBAC3D,MAAM,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;AAC9B,gBAAA,OAAO,sBAAsB;AAC1B,qBAAA,GAAG,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,KAAK,KAAK,UAAU,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;AAClE,oBAAA,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;AAC7C,oBAAA,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CACvB;qBACA,GAAG,CAAC,YAAY,IAAI,YAAY,CAAC,GAAG,CAAC,UAAU,IAAG;AACjD,oBAAA,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC;AACnD,oBAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC;AACpB,wBAAA,KAAK,EAAE,iBAAiB,CAAC,UAAU,CAAC;AACpC,wBAAA,QAAQ,EAAE,aAAa;AACxB,qBAAA,CAAC,CAAC;AACH,oBAAA,OAAO,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC;iBAChD,CAAC,CAAC,CAAC;AACR,aAAC,CAAC;YAEF,MAAM,cAAc,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;YAC9D,MAAM,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;AAEhE,YAAA,SAAS,GAAG;AACV,gBAAA,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC;AACnC,gBAAA,KAAK,EAAE,QAAQ,CAAC,cAAc,CAAC;AAC/B,gBAAA,UAAU,EAAE,aAAa,CAAC,cAAc,CAAC;AACzC,gBAAA,cAAc,EAAE,iBAAiB,CAAC,cAAc,CAAC;aAClD,CAAC;AACF,YAAA,UAAU,GAAG;AACX,gBAAA,OAAO,EAAE,UAAU,CAAC,eAAe,CAAC;AACpC,gBAAA,KAAK,EAAE,QAAQ,CAAC,eAAe,CAAC;AAChC,gBAAA,UAAU,EAAE,aAAa,CAAC,eAAe,CAAC;AAC1C,gBAAA,cAAc,EAAE,iBAAiB,CAAC,eAAe,CAAC;aACnD,CAAC;AACH,SAAA;QAED,OAAO;AACL,YAAA,cAAc,EAAE,YAAY;YAC5B,MAAM;YACN,SAAS;YACT,UAAU;YACV,OAAO;SACR,CAAC;KACH;;0GAnNU,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAb,aAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cAFZ,MAAM,EAAA,CAAA,CAAA;2FAEP,aAAa,EAAA,UAAA,EAAA,CAAA;kBAHzB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;iBACnB,CAAA;;;MChBY,gBAAgB,CAAA;IAE3B,WACU,CAAA,WAA+B,EAC/B,aAA4B,EAAA;AAD5B,QAAA,IAAW,CAAA,WAAA,GAAX,WAAW,CAAoB;AAC/B,QAAA,IAAa,CAAA,aAAA,GAAb,aAAa,CAAe;KACjC;AAEL;;;;AAIG;AACH,IAAA,WAAW,CAAC,OAAsD,EAAA;AAChE,QAAA,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QACnC,MAAM,SAAS,GAAa,MAAM,YAAY,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAElG,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,MAAM,UAAU,GAAa,EAAE,CAAC;AAChC,QAAA,IAAI,SAAqC,CAAC;AAC1C,QAAA,IAAI,UAAuC,CAAC;QAE5C,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAErE,QAAA,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;YAC3B,OAAO,GAAG,KAAK,CAAC;AACjB,SAAA;AAED,QAAA,MAAM,iBAAiB,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,IAAI,QAAQ,KAAK,GAAG,CAAC,CAAC;QAC5E,IAAI,iBAAiB,GAAG,CAAC,EAAE;YACzB,OAAO,GAAG,KAAK,CAAC;AAChB,YAAA,UAAU,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;AACtD,SAAA;;AAGD,QAAA,IAAI,OAAO,EAAE;YACX,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;YAC5D,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC;AAE9D,YAAA,MAAM,oBAAoB,GAAG,CAC3B,QAAkB,EAClB,QAAkC,KACF;AAG9B,gBAAA,MAAM,kBAAkB,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;gBACzC,IAAI,kBAAkB,GAAG,KAAK,CAAC;AAC/B,gBAAA,IAAI,KAAgB,CAAC;gBACrB,IAAI,UAAU,GAAgB,EAAE,CAAC;;AAGjC,gBAAA,MAAM,OAAO,GAAgB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK;AAChE,oBAAA,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,iBAAA,CAAC,CAAC,CAAC;;gBAIJ,MAAM,cAAc,GAAG,iBAAiB,CAAC;AACvC,oBAAA,SAAS,EAAE,kBAAkB;oBAC7B,QAAQ;AACT,iBAAA,CAAC,CAAC;;AAGH,gBAAA,IAAI,CAAC,cAAc,CAAC,kBAAkB,EAAE;AACtC,oBAAA,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK;wBACtD,IAAI;AACJ,wBAAA,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,qBAAA,CAAC,CAAC;AACF,yBAAA,OAAO,EAAE,CAAC;;AAGX,oBAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;wBAC9B,kBAAkB,GAAG,IAAI,CAAC;AAC3B,qBAAA;AAAM,yBAAA;AACL,wBAAA,KAAK,GAAG;4BACN,IAAI,EAAE,QAAQ,CAAC,KAAK;AACpB,4BAAA,IAAI,EAAE,kBAAkB;AACrB,iCAAA,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,QAAQ,GAAG,GAAG,CAAC;iCACzF,IAAI,CAAC,EAAE,CAAC;AACR,iCAAA,IAAI,EAAE;mCACJ,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;yBACnE,CAAC;AACH,qBAAA;AACF,iBAAA;AAED,gBAAA,OAAO,kBAAkB,IAAI,cAAc,CAAC,kBAAkB;oBAC5D,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC1C,oBAAA,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;AAE/E,aAAC,CAAC;YAEJ,SAAS,GAAG,oBAAoB,CAAC,aAAa,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;YAC1E,UAAU,GAAG,oBAAoB,CAAC,cAAc,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;AAC9E,SAAA;AAED,QAAA,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,kBAAkB,MAAM,UAAU,IAAI,UAAU,CAAC,kBAAkB,CAAC,EAAE;YAChG,OAAO,GAAG,KAAK,CAAC;AAChB,YAAA,UAAU,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;AACxD,SAAA;QAED,OAAO;YACL,OAAO;YACP,SAAS;YACT,UAAU;YACV,YAAY,EAAE,cAAc,CAAC,MAAM;YACnC,UAAU;AACV,YAAA,oBAAoB,EAAE,MAAM;SAC7B,CAAC;KAEH;;6GA7GU,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,kBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,aAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAhB,gBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA,CAAA;2FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;iBACnB,CAAA;;;MCsBY,eAAe,CAAA;IAE1B,WACU,CAAA,gBAAkC,EAClC,kBAAsC,EAAA;AADtC,QAAA,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;AAClC,QAAA,IAAkB,CAAA,kBAAA,GAAlB,kBAAkB,CAAoB;KAC3C;AAEG,IAAA,sBAAsB,CAAC,KAAY,EAAA;QACzC,OAAO,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC;KAC3D;AAED,IAAA,iBAAiB,CAAC,OAAgC,EAAA;AAEhD,QAAA,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,gBAAgB,CAAC;QAChE,MAAM,cAAc,GAAG,EAAE,CAAC;QAC1B,MAAM,mBAAmB,GAAG,EAAE,CAAC;QAC/B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;AAChD,QAAA,MAAM,UAAU,GAAkB,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACxF,MAAM,cAAc,GAAY,EAAE,CAAC;AACnC,QAAA,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,KAAK,CAAC,qBAAqB,CAAC;QAC5E,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,QAAA,MAAM,cAAc,GAAG,CAAC,SAA4B,KAAqC;YACvF,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;YACzF,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;AACtD,YAAA,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YAC7D,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;YACjD,MAAM,qBAAqB,GAAG,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACnE,MAAM,YAAY,GAAG,SAAS;iBAC3B,KAAK,CAAC,EAAE,CAAC;AACT,iBAAA,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;iBACvC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC;iBACjC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC;iBACvB,MAAM,CAAC,CAAC,GAAG,EAAE,UAAU,MAAM;AAC5B,gBAAA,cAAc,EAAE,UAAU;gBAC1B,cAAc,EAAE,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC;oBACrC,GAAG,CAAC,cAAc;AAClB,oBAAA,UAAU,GAAG,IAAI,GAAG,SAAS,CAAC,MAAM,GAAG,UAAU,GAAG,CAAC,CAAC;AACzD,aAAA,CAAC,EAAG,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACnD,MAAM,iBAAiB,GAAG,YAAY,CAAC,cAAc,GAAG,CAAC,CAAC;gBACxD,YAAY,CAAC,cAAc,GAAG,YAAY,CAAC,cAAc,CAAC;AAC5D,YAAA,MAAM,kBAAkB,GAAG,CAAC,IAAY,KAAwB;gBAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC1D,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AACvD,gBAAA,MAAM,YAAY,GAAG,CAAC,gBAA0B,KAAa,gBAAgB;AAC1E,qBAAA,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;qBACjE,IAAI,CAAC,EAAE,CAAC,CAAC;gBACZ,OAAO;oBACL,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AAC5C,oBAAA,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;iBAC1C,CAAC;AACJ,aAAC,CAAC;AAEF,YAAA,MAAM,cAAc,GAAuB,qBAAqB;gBAC9D,SAAS,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAuB;gBAC5F,iBAAiB,GAAG,CAAC;AACnB,oBAAA,CAAE,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAE;oBACjF,kBAAkB,CAAC,SAAS,CAAC,CAAC;YAElC,OAAO;gBACL,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;AACpC,qBAAA,MAAM,CAAC;AACN,oBAAA,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AACzD,oBAAA,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;iBACxB,CAAC;gBACJ,CAAC;AACC,wBAAA,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AACzD,wBAAA,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;AACxB,qBAAA,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;aACpD,CAAC;AACJ,SAAC,CAAC;;AAGF,QAAA,MAAM,yBAAyB,GAAG,CAAC,SAA4B,EAAE,WAAoB,KAAa;AAGhG,YAAA,MAAM,sBAAsB,GAAa,CAAC,iBAAiB,EAAE,QAAQ,KAAI;gBACvE,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,aAAa,CAAC,QAAQ,GAAG,WAAW,GAAG,EAAE,GAAG,WAAW,GAAG,WAAW,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AACzG,gBAAA,iBAAiB,CAAC,OAAO,CAAC,IAAI,IAC5B,KAAK,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvF,MAAM,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;gBACzD,KAAK,CAAC,KAAK,GAAG,aAAa,GAAG,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,aAAa,GAAG,IAAI,CAAC;AACxF,gBAAA,OAAO,KAAK,CAAC;AACf,aAAC,CAAC;YAEF,MAAM,QAAQ,GAAG,sBAAsB,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAEzE,YAAA,OAAO,QAAQ,CAAC,KAAK,GAAG,iBAAiB;gBACvC,cAAc,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,KAAK,sBAAsB,CACtE,OAAO,EACP,WAAW,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC;gBAC9B,CAAE,QAAQ,CAAE,CAAC;AACjB,SAAC,CAAC;;QAGF,MAAM,SAAS,GAAG,IAAI,KAAK,EAAE,CAAC,WAAW,CAAC,cAAc,EAAE,mBAAmB,CAAC;AAC3E,aAAA,aAAa,CAAC,WAAW,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QAEtC,IAAI,UAAU,CAAC,OAAO,EAAE;YACtB,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAG;gBAC3C,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1F,aAAC,CAAC,CAAC;AACH,YAAA,SAAS,CAAC,SAAS,CAAC,IAAIF,aAAW,EAAE,CAAC,CAAC;YACvC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAG;gBAC5C,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1F,aAAC,CAAC,CAAC;YAEH,MAAM,qBAAqB,GAAG,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;;AAGrE,YAAA,IAAK,qBAAqB,GAAG,SAAS,CAAC,KAAK,GAAG,EAAE,EAAE;AACjD,gBAAA,SAAS,CAAC,KAAK,GAAG,qBAAqB,GAAG,EAAE,CAAC;AAC7C,gBAAA,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;;AAGhC,aAAA;AAAM,iBAAA;AACL,gBAAA,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;;AAGlF,gBAAA,IAAI,SAAS,CAAC,KAAK,GAAG,iBAAiB,EAAE;oBACvC,cAAc,CAAC,IAAI,CACjB,GAAG,yBAAyB,CAAC,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,EACzD,GAAG,yBAAyB,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAC1D,CAAC;AACF,oBAAA,cAAc,CAAC,OAAO,CAAC,KAAK,IAAG;wBAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;AACzD,wBAAA,KAAK,CAAC,KAAK,GAAG,aAAa,GAAG,EAAE,CAAC;AACnC,qBAAC,CAAC,CAAC;AACJ,iBAAA;AAAM,qBAAA;AACL,oBAAA,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAChC,iBAAA;AACF,aAAA;AACF,SAAA;AASD,QAAA,MAAM,4BAA4B,GAA6B,KAAK,IAClE,gBAAgB,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC;QAItC,MAAM,cAAc,GAAa,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,KAAI;AAC7D,YAAA,MAAM,SAAS,GAAG,KAAK,KAAK,CAAC,GAAG,cAAc,GAAG,cAAc,GAAG,WAAW,CAAC;YAC9E,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,kBAAkB,CAAC,CAAC;YAC7D,MAAM,kBAAkB,GAAG,WAAW,CAAC,kBAAkB,GAAG,4BAA4B,CAAC,KAAK,CAAC,CAAC;YAChG,OAAO;gBACL,cAAc,EAAE,kBAAkB,GAAG,EAAE;gBACvC,kBAAkB;aACnB,CAAC;AACJ,SAAC,CAAC;QAEF,MAAM,gBAAgB,GAAgB,EAAE,cAAc,EAAE,CAAC,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,CAAC;AAErG,QAAA,MAAM,EAAE,cAAc,EAAE,GAAG,cAAc;AACtC,aAAA,MAAM,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;;;QAK5C,OAAO;AACL,YAAA,MAAM,EAAE,cAAc;YACtB,cAAc;AACd,YAAA,MAAM,EAAE;gBACN,YAAY,EAAE,UAAU,CAAC,YAAY;gBACrC,UAAU,EAAE,UAAU,CAAC,UAAU;AAClC,aAAA;SACF,CAAC;KACH;;4GA5KU,eAAe,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAG,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,kBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAf,eAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFd,MAAM,EAAA,CAAA,CAAA;2FAEP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;iBACnB,CAAA;;;MCXY,mBAAmB,CAAA;AAW9B,IAAA,WAAA,CACU,gBAAiC,EAAA;AAAjC,QAAA,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAiB;AANjC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAA8D,CAAC;AAElG,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,OAAO,EAAQ,CAAC;KAK5B;AAEL,IAAA,WAAW,CAAC,OAAgE,EAAA;AAE1E,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;AAC5B,QAAA,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAE5F,IAAI,MAAM,CAAC,MAAM,EAAE;YACjB,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;AACvE,YAAA,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AAClE,SAAA;AACD,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KAC1B;IAED,eAAe,GAAA;QAEb,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAsB,CAAC;QAC7E,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAC;AACnD,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB;AAC9C,YAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAEzD,QAAA,aAAa,CAAC,CAAE,IAAI,CAAC,UAAU,EAAE,YAAY,CAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aAC9E,SAAS,CAAC,CAAC,CAAE,SAAS,EAAE,WAAW,CAAuC,KAAI;YAC7E,MAAM,gBAAgB,GAAG,WAAW,IAAI,SAAS,CAAC,kBAAkB,IAAI,GAAG,CAAC;YAC5E,IAAI,CAAC,WAAW,CAAC;gBACf,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,MAAM,EAAE,SAAS,CAAC,MAAM;AACxB,gBAAA,WAAW,EAAE,gBAAgB;AAC9B,aAAA,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KAEN;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;KACxB;;gHAhDU,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,mBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,gMCnBhC,0DACA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;2FDkBa,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAL/B,SAAS;+BACE,aAAa,EAAA,QAAA,EAAA,0DAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,CAAA;mGAOd,UAAU,EAAA,CAAA;sBAAlB,KAAK;gBACG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBACG,sBAAsB,EAAA,CAAA;sBAA9B,KAAK;gBACI,MAAM,EAAA,CAAA;sBAAf,MAAM;;;MElBI,sBAAsB,CAAA;;mHAAtB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;oHAAtB,sBAAsB,EAAA,YAAA,EAAA,CAHjB,mBAAmB,CAAA,EAAA,OAAA,EAAA,CACxB,mBAAmB,CAAA,EAAA,CAAA,CAAA;oHAEnB,sBAAsB,EAAA,CAAA,CAAA;2FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAJlC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,YAAY,EAAE,CAAE,mBAAmB,CAAE;oBACrC,OAAO,EAAE,CAAE,mBAAmB,CAAE;iBACjC,CAAA;;;ACND;;AAEG;;ACFH;;AAEG;;;;"}