{"version":3,"file":"ngx-face-detection.mjs","sources":["../../../projects/face-detection/src/lib/face-detection.interface.ts","../../../projects/face-detection/src/lib/map-face-result.ts","../../../projects/face-detection/src/lib/get-better-photo.ts","../../../projects/face-detection/src/lib/get-config.ts","../../../projects/face-detection/src/lib/getAvailableVideoInputs.ts","../../../projects/face-detection/src/lib/human-helper.ts","../../../projects/face-detection/src/lib/liveness.util.ts","../../../projects/face-detection/src/lib/load-script.ts","../../../projects/face-detection/src/lib/take-photo.ts","../../../projects/face-detection/src/lib/takephoto.util.ts","../../../projects/face-detection/src/lib/face-detection.service.ts","../../../projects/face-detection/src/lib/face-detection.component.ts","../../../projects/face-detection/src/lib/face-detection.component.html","../../../projects/face-detection/src/lib/face-detection.module.ts","../../../projects/face-detection/src/lib/get-user-media.ts","../../../projects/face-detection/src/lib/is-mobile.ts","../../../projects/face-detection/src/public-api.ts","../../../projects/face-detection/src/ngx-face-detection.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface FaceRect {\n  x: number; // 方形左上角点 x\n  y: number; // 方形左上角点 y\n  width?: number; // 方形宽度\n  height?: number; // 方形高度\n  minScore?: number; // 最小得分 0-1\n}\n\n\nexport interface IFaceDetectionOptions {\n  script: string;\n  resourcesUrl: string;\n  production?: boolean;\n}\n\n\nexport const NGX_FACE_DETECTION = new InjectionToken<IFaceDetectionOptions>('NGX_FACE_DETECTION');\n\nexport interface LivenessActionMap {\n  facingLeft?: boolean;\n  facingRight?: boolean;\n  facingCamera?: boolean;\n  blinkLeft?: boolean;\n  blinkRight?: boolean;\n  blink?: boolean;\n  mouth?: boolean;\n  headUp?: boolean;\n  headDown?: boolean;\n}\n\nexport interface LivenessActionResult extends LivenessActionMap {\n  vertical: number;\n  horizontal: number;\n}\n\nexport type LivenessActions =\n  | 'facingLeft'\n  | 'facingRight'\n  | 'facingCamera'\n  | 'blink'\n  | 'mouth'\n  | 'headUp'\n  | 'headDown'\n  | 'shake';\n\nexport interface Filter {\n  enabled: boolean;\n  equalization: boolean;\n  width: number;\n  height: number;\n  flip: boolean;\n  return: boolean;\n  brightness: number;\n  contrast: number;\n  sharpness: number;\n  blur: number;\n  saturation: number;\n  hue: number;\n  negative: boolean;\n  sepia: boolean;\n  vintage: boolean;\n  kodachrome: boolean;\n  technicolor: boolean;\n  polaroid: boolean;\n  pixelate: number;\n}\n\nexport interface Gesture {\n  enabled: boolean;\n}\n\nexport interface Detector {\n  modelPath: string;\n  rotation: boolean;\n  maxDetected: number;\n  skipFrames: number;\n  skipTime: number;\n  minConfidence: number;\n  iouThreshold: number;\n  mask: boolean;\n  return: boolean;\n}\n\nexport interface Mesh {\n  enabled: boolean;\n  modelPath: string;\n}\n\nexport interface Iris {\n  enabled: boolean;\n  modelPath: string;\n}\n\nexport interface Emotion {\n  enabled: boolean;\n  minConfidence: number;\n  skipFrames: number;\n  skipTime: number;\n  modelPath: string;\n}\n\nexport interface Description {\n  enabled: boolean;\n  modelPath: string;\n  skipFrames: number;\n  skipTime: number;\n  minConfidence: number;\n}\n\nexport interface Antispoof {\n  enabled: boolean;\n  skipFrames: number;\n  skipTime: number;\n  modelPath: string;\n}\n\nexport interface Liveness {\n  enabled: boolean;\n  skipFrames: number;\n  skipTime: number;\n  modelPath: string;\n}\n\nexport interface Face {\n  enabled: boolean;\n  detector: Detector;\n  mesh: Mesh;\n  iris: Iris;\n  emotion: Emotion;\n  description: Description;\n  antispoof: Antispoof;\n  liveness: Liveness;\n}\n\nexport interface Body {\n  enabled: boolean;\n  modelPath: string;\n  maxDetected: number;\n  minConfidence: number;\n  skipFrames: number;\n  skipTime: number;\n}\n\nexport interface Detector2 {\n  modelPath: string;\n}\n\nexport interface Skeleton {\n  modelPath: string;\n}\n\nexport interface Hand {\n  enabled: boolean;\n  rotation: boolean;\n  skipFrames: number;\n  skipTime: number;\n  minConfidence: number;\n  iouThreshold: number;\n  maxDetected: number;\n  landmarks: boolean;\n  detector: Detector2;\n  skeleton: Skeleton;\n}\n\n\n","import { LivenessActionResult } from './face-detection.interface';\nimport { IHumanFaceResult } from './human.interface';\n\n/**\n * Mapping face detection results\n * @param data A result detected that matches the condition\n */\nexport function mapFaceResult(face: IHumanFaceResult, rorateY = false): LivenessActionResult {\n  const gestures = face.gesture;\n  const temp: LivenessActionResult = { horizontal: 0, vertical: 0 };\n\n  // the angle when head turned\n  if (face.mesh) {\n    const left = face.mesh[205][2];\n    const right = face.mesh[425][2];\n    const top = face.mesh[9][2];\n    const bottom = face.mesh[200][2];\n    temp.horizontal = right - left;\n    temp.vertical = bottom - top;\n  }\n\n  gestures.forEach((gesture: string) => {\n    if (gesture.match(/\\d+/g)) {\n      if (Number((<RegExpMatchArray>gesture.match(/\\d+/g))[0]) > 35) {\n        temp.mouth = true;\n      }\n    }\n    switch (gesture) {\n      case 'facing center': {\n        temp.facingCamera = true;\n        break;\n      }\n      case 'facing left': {\n        if (temp.horizontal > 20) {\n          rorateY ? (temp.facingRight = true) : (temp.facingLeft = true);\n        }\n        break;\n      }\n      case 'facing right': {\n        if (temp.horizontal < -20) {\n          rorateY ? (temp.facingLeft = true) : (temp.facingRight = true);\n        }\n        break;\n      }\n      case 'blink right eye': {\n        rorateY ? (temp.blinkLeft = true) : (temp.blinkRight = true);\n        break;\n      }\n      case 'blink left eye': {\n        rorateY ? (temp.blinkRight = true) : (temp.blinkLeft = true);\n        break;\n      }\n      case 'head down': {\n        console.log(temp.vertical);\n        if (temp.vertical > 15) {\n          temp.headDown = true;\n        }\n        break;\n      }\n      case 'head up': {\n        console.log(temp.vertical);\n        if (temp.vertical < -15) {\n          temp.headUp = true;\n        }\n        break;\n      }\n    }\n  });\n\n  temp.blink = temp.blinkLeft && temp.blinkRight;\n  return temp;\n}\n","import { mapFaceResult } from './map-face-result';\nimport { LivenessActionResult } from './face-detection.interface';\nimport { IHumanFaceResult } from './human.interface';\n\nconst getCurrentLevel = (gestures: LivenessActionResult): number => {\n  let back = 100;\n  const gesturesLength = Object.keys(gestures).length;\n  if (gestures.facingCamera) {\n    back = gesturesLength;\n  }\n  if (gestures.blinkLeft) {\n    back += 10;\n  }\n  if (gestures.blinkRight) {\n    back += 10;\n  }\n  if (gestures.mouth) {\n    back += 30;\n  }\n  return back;\n};\n\n// get better face-photo\nexport const getBetterPhoto = (\n  currentBetterLevel: number,\n  newFaceData: IHumanFaceResult,\n  currnetFaceData?: IHumanFaceResult\n) => {\n  const gesture = mapFaceResult(newFaceData);\n  const newLevel = getCurrentLevel(gesture);\n\n  let isBetter = false;\n  let level = currentBetterLevel;\n  // get better photo\n  if (newLevel === currentBetterLevel) {\n    // TODO: Calculate data scores to judge if it is better\n  }\n  // level bigger is better\n  else if (newLevel < currentBetterLevel) {\n    level = newLevel;\n    isBetter = true;\n  }\n\n  // TODO:\n  if (currnetFaceData) {\n    //\n  }\n\n  return {\n    level,\n    isBetter\n  };\n};\n","import { Config } from '@vladmandic/human';\n\nexport interface IHumanConfig {\n  resourcesUrl?: string;\n  live?: boolean;\n  iris?: boolean;\n  debug?: boolean;\n}\n\n// todo: wasmPlatformFetch not exist in Config,later remove any\nexport const getConfig = (opts?: IHumanConfig): Config | any => {\n  const resourcesUrl = opts?.resourcesUrl ? opts?.resourcesUrl : '/';\n  const live = opts?.live ? opts?.live : false;\n  const iris = opts?.iris ? opts?.iris : false;\n  const debug = opts?.debug ? opts?.debug : false;\n  return {\n    backend: 'webgl',\n    modelBasePath: resourcesUrl,\n    cacheModels: true,\n    wasmPath: 'human/assets/',\n    wasmPlatformFetch: false,\n    debug: debug,\n    async: true,\n    warmup: 'face',\n    cacheSensitivity: 0.70,\n    skipAllowed: false,\n    deallocate: false,\n    filter: {\n      enabled: true,\n      equalization: false,\n      width: 0,\n      height: 0,\n      flip: false,\n      return: true,\n      brightness: 0,\n      contrast: 0,\n      sharpness: 0,\n      blur: 0,\n      saturation: 0,\n      hue: 0,\n      negative: false,\n      sepia: false,\n      vintage: false,\n      kodachrome: false,\n      technicolor: false,\n      polaroid: false,\n      pixelate: 0,\n    },\n    gesture: {\n      enabled: true,\n    },\n    face: {\n      enabled: true,\n      detector: {\n        modelPath: 'human/models/blazeface.json',\n        rotation: true,\n        maxDetected: 1,\n        skipFrames: 99,\n        skipTime: 2500,\n        minConfidence: 0.2,\n        iouThreshold: 0.1,\n        mask: false,\n        return: false,\n      },\n      mesh: {\n        enabled: live,\n        modelPath: 'human/models/facemesh.json',\n      },\n      iris: {\n        enabled: live && iris,\n        modelPath: `human/models/iris.json`\n      },\n      emotion: {\n        enabled: false,\n        minConfidence: 0.1,\n        skipFrames: 99,\n        skipTime: 1500,\n        modelPath: `human/models/emotion.json` // can be 'mini', 'larg'\n      },\n      description: {\n        enabled: true,\n        modelPath: `human/models/faceres.json`,\n        skipFrames: 99,\n        skipTime: 3e3,\n        minConfidence: 0.1\n      },\n      antispoof: {\n        enabled: false,\n        skipFrames: 99,\n        skipTime: 4e3,\n        modelPath: `human/models/antispoof.json`\n      },\n      liveness: {\n        enabled: false,\n        skipFrames: 99,\n        skipTime: 4e3,\n        modelPath: `human/models/liveness.json`\n      }\n    },\n\n    body: {\n      enabled: false,\n      modelPath: `human/models/movenet-lightning.json`,\n      maxDetected: -1,\n      minConfidence: 0.3,\n      skipFrames: 1,\n      skipTime: 200\n    },\n\n    hand: {\n      enabled: false,\n      rotation: false,\n      skipFrames: 15, // how many frames to go without re-running the hand bounding box detector\n      skipTime: 1e3,\n      // only used for video inputs\n      // e.g., if model is running st 25 FPS, we can re-use existing bounding\n      // box for updated hand skeleton analysis as the hand probably\n      // hasn't moved much in short time (10 * 1/25 = 0.25 sec)\n      minConfidence: 0.5, // threshold for discarding a prediction\n      iouThreshold: 0.1, // threshold for deciding whether boxes overlap too much\n      // in non-maximum suppression\n      // score in non-maximum suppression\n      maxDetected: -1, // maximum number of hands detected in the input\n      // should be set to the minimum number for performance\n      landmarks: true, // detect hand landmarks or just hand boundary box\n      detector: {\n        modelPath: `human/models/handtrack.json`\n      },\n      skeleton: {\n        modelPath: `human/models/handlandmark-full.json`\n      }\n    },\n\n    object: {\n      enabled: false,\n      modelPath: 'human/models/mb3-centernet.json',\n      minConfidence: 0.2,\n      iouThreshold: 0.4,\n      maxDetected: 10,\n      skipFrames: 99,\n      skipTime: 2e3\n    },\n    segmentation: {\n      enabled: false,\n      modelPath: 'human/models/selfie.json',\n      blur: 8\n    }\n  }\n};\n","/**\n * get the supported camera\n */\nexport async function getAvailableVideoInputs(): Promise<MediaDeviceInfo[]> {\n  if (!(!navigator.mediaDevices.enumerateDevices && !navigator.mediaDevices)) {\n    try {\n      const devices = await navigator.mediaDevices.enumerateDevices();\n      return devices.filter((device: MediaDeviceInfo) => device.kind === 'videoinput');\n    } catch (error) {\n      console.log(error);\n    }\n  }\n  return [];\n}\n","import { IHumanResult } from './human.interface';\nimport { Config } from '@vladmandic/human';\n\ndeclare const Human: any;\n\nexport interface IHuman {\n  detect(image: any, config?: Config): Promise<IHumanResult>;\n\n  load(config?: Config): Promise<void>;\n\n  warmup(config: Config, image?: any): Promise<IHumanResult>;\n\n  image(image?: any, config?: Config): Promise<IHumanResult>;\n\n  simmilarity(embedding1: any, embedding2: any): any;\n\n  [key: string]: any;\n}\n\nlet human: IHuman;\n\nexport function createHuman(config: any): IHuman {\n  if (Human && !human) {\n    human = new Human.default(config);\n  }\n  return human;\n}\n\nexport interface IOptions {\n  eleWidth: number;\n  eleHeight: number;\n  isMobile: boolean;\n  maxWidth: number;\n  maxHeight: number;\n}\n\nexport function getNeedVideoWidth(\n  width: number,\n  height: number,\n  videoMaxWidth: number,\n  videoMaxHeight: number,\n  isMobile: boolean\n): MediaTrackConstraints {\n  const oldW = width;\n  const oldH = height;\n  if (isMobile) {\n    width = oldH;\n    height = oldW;\n    videoMaxWidth = videoMaxHeight;\n  }\n  // Limit maximum width of video\n  if (width > videoMaxWidth) {\n    width = videoMaxWidth;\n    const bl = width / height;\n    height = Math.round(width / bl);\n  }\n\n  return {\n    width\n  };\n}\n","import { LivenessActionMap, LivenessActionResult, LivenessActions } from './face-detection.interface';\n\n// Calculate variance\nexport const variance = (numbers: number[]) => {\n  let mean = 0;\n  let sum = 0;\n  for (let i = 0; i < numbers.length; i++) {\n    sum += numbers[i];\n  }\n  mean = sum / numbers.length;\n  sum = 0;\n  for (let j = 0; j < numbers.length; j++) {\n    sum += Math.pow(numbers[j] - mean, 2);\n  }\n  return sum / numbers.length;\n};\n\n/**\n * By judging the appearance and disappearance distance of the action\n */\nexport const isFacingActionByDistance = (\n  needArr: Array<keyof LivenessActionMap>,\n  left: keyof LivenessActionMap,\n  right: keyof LivenessActionMap,\n  distance = 10,\n  index = 0\n): any => {\n  const leftIndex = needArr.indexOf(left, index);\n  if (leftIndex >= 0) {\n    const rightIndex = needArr.indexOf(right, leftIndex);\n    if (rightIndex !== -1) {\n      const fitDistance = rightIndex - leftIndex <= distance;\n      if (fitDistance) {\n        return true;\n      }\n      if (rightIndex < needArr.length - 1) {\n        return isFacingActionByDistance(needArr, left, right, distance, rightIndex);\n      }\n    }\n  }\n  return false;\n};\n\n/**\n * Determine whether an action is included directly\n */\nconst isFacingAction = (needArr: boolean[]) => {\n  return needArr.indexOf(true) !== -1;\n};\n\n/**\n * Judge if some actions is included\n */\nconst isFacingActions = (stageResults: LivenessActionMap[], key: keyof LivenessActionMap) => {\n  const needArr: any[] = [];\n  stageResults.forEach((stageResult: LivenessActionMap) => {\n    const value = !!stageResult[key];\n    let last = false;\n    if (needArr.length > 0) {\n      last = needArr[needArr.length - 1];\n    }\n    if (last !== value) {\n      needArr.push(value);\n    }\n  });\n  return isFacingAction(needArr);\n};\n\n/**\n * filter out actions\n */\nexport const filterActions = (\n  results: LivenessActionMap[],\n  actions: Array<keyof LivenessActionMap>\n): Array<keyof LivenessActionMap> => {\n  const needArr: any[] = [];\n  let lastAction: keyof LivenessActionMap;\n  results.forEach((stageResult: LivenessActionMap) => {\n    let hasValue = false;\n    for (let i = 0; i < actions.length; i++) {\n      const action = actions[i];\n      const value = stageResult[action];\n      if (value) {\n        hasValue = true;\n        if (lastAction !== action) {\n          needArr.push(action);\n          lastAction = action;\n        }\n        break;\n      }\n    }\n    if (!hasValue) {\n      needArr.push(undefined);\n    }\n  });\n  return needArr;\n};\n\nconst isShake = (result: LivenessActionMap[]) => {\n  const newActions = filterActions(result, ['facingLeft', 'facingRight']);\n  console.log(newActions);\n  return (\n    isFacingActionByDistance(newActions, 'facingLeft', 'facingRight', 4) ||\n    isFacingActionByDistance(newActions, 'facingRight', 'facingLeft', 4)\n  );\n};\n\nexport const hasLivenessAction = (result: LivenessActionResult[], aciton: LivenessActions) => {\n  switch (aciton) {\n    case 'facingLeft':\n    case 'facingRight':\n      return isFacingActions(result, aciton) && variance(result.map(r => r.horizontal)) > 50;\n    case 'headUp':\n    case 'headDown':\n      return isFacingActions(result, aciton) && variance(result.map(r => r.vertical)) > 100;\n    case 'mouth':\n    case 'facingCamera':\n      return isFacingActions(result, aciton);\n    case 'blink':\n      return result.findIndex(r => r.blink) > -1;\n    case 'shake':\n      return isShake(result);\n    default:\n      break;\n  }\n  return false;\n};\n","/**\n * scripts loader\n *\n * @export\n * @param url\n * @returns\n */\nexport async function loadScript(url: string) {\n  return new Promise((resolve, reject) => {\n    let scriptElement: HTMLScriptElement = document.body.querySelector(`script[src='${url}']`) as any;\n\n    if (!scriptElement) {\n      scriptElement = document.createElement('script');\n      scriptElement.type = 'text/javascript';\n      scriptElement.src = url;\n      document.body.appendChild(scriptElement);\n    }\n\n    if (scriptElement.classList.contains('load')) {\n      resolve(null);\n    }\n    const removeEvent = () => {\n      scriptElement.removeEventListener('load', onLoad);\n      scriptElement.removeEventListener('error', onError);\n    };\n    const onLoad = () => {\n      scriptElement.classList.add('load');\n      removeEvent();\n      resolve(null);\n    };\n    const onError = (e: any) => {\n      removeEvent();\n      reject(e);\n    };\n    scriptElement.addEventListener('load', onLoad);\n    scriptElement.addEventListener('error', onError);\n  });\n}\n","/**\n * take a photo when detected faces\n */\nexport const takefacePhoto = (\n  video: HTMLVideoElement,\n  canvas: HTMLCanvasElement,\n  needWidth: number,\n  needHeight: number,\n  faceRect: { x: number; y: number; width: number; height: number }\n) => {\n  const ctx = canvas.getContext('2d');\n  const { x, y, width, height } = faceRect;\n\n  canvas.width = needWidth;\n  canvas.height = needHeight;\n\n  const b1 = needWidth / needHeight;\n  const b2 = width / height;\n\n  let nw: number = width;\n  let nh: number = height;\n\n  if (b1 > b2) {\n    nw = nh * b1;\n  } else {\n    nh = nw / b1;\n  }\n  // enlarge the frame of face\n  const ex = 1.3;\n  nw *= ex;\n  nh *= ex;\n  let px = x - (nw - width) / 2;\n  let py = y - (nh - height) / 2 - height * 0.1;\n  // Guarantees that the offset x y is within the canvas\n  px = px < 0 ? 0 : px;\n  py = py < 0 ? 0 : py;\n  // handle when the right border overrun\n  const rx = px + nw;\n  if (rx > video.videoWidth) {\n    px -= rx - video.videoWidth;\n  }\n  // handle when the bottom border overrun\n  const by = py + nh;\n  if (by > video.videoHeight) {\n    py -= by - video.videoHeight;\n  }\n  if (ctx) {\n    // Fill it with black\n    ctx.fillRect(0, 0, needWidth, needHeight);\n    // make it smoothing\n    ctx.imageSmoothingEnabled = true;\n    // TODO: delete try after update\n    try {\n      ctx['imageSmoothingQuality'] = 'high';\n    } catch (error) {\n      //\n    }\n\n    ctx.scale(-1, 1);\n    // draw videos\n    ctx.drawImage(video, px, py, nw, nh, -needWidth, 0, needWidth, needHeight);\n  }\n  return canvas.toDataURL('image/jpeg', 0.85);\n};\n\n// return a screenshot from videos by detected range\nexport const takePhotoWithRect = async (\n  video: HTMLVideoElement,\n  canvas: HTMLCanvasElement,\n  faceRect: { x: number; y: number; width: number; height: number }\n) => {\n  const vWidth = video.videoWidth;\n  const nWidth = video.clientWidth;\n  const rectPhoto = canvas.getContext('2d');\n  const bl = vWidth / nWidth;\n  const x = (1 - (faceRect.x + faceRect.width) / nWidth) * vWidth;\n  let y = faceRect.y;\n  const w = (faceRect.width / nWidth) * vWidth;\n  const h = (w * faceRect.height) / faceRect.width;\n  if (nWidth > vWidth) {\n    y = faceRect.y * bl;\n  }\n  canvas.width = w;\n  canvas.height = h;\n  if (rectPhoto) {\n    rectPhoto.clearRect(0, 0, w, h);\n    rectPhoto.scale(-1, 1);\n    rectPhoto.drawImage(video, x, y, w, h, -w, 0, w, h);\n  }\n\n  return canvas.toDataURL('image/jpeg', 0.85);\n};\n\n// take a photo from videos\nexport const takeVideoPhoto = (video: HTMLVideoElement, canvas: HTMLCanvasElement) => {\n  const rectPhoto = canvas.getContext('2d');\n  const w = video.videoWidth;\n  const h = video.videoHeight;\n  canvas.width = w;\n  canvas.height = h;\n  if (rectPhoto) {\n    rectPhoto.clearRect(0, 0, w, h);\n    rectPhoto.scale(-1, 1);\n    rectPhoto.drawImage(video, 0, 0, w, h, -w, 0, w, h);\n  }\n  return canvas.toDataURL('image/jpeg', 0.85);\n};\n","import { std } from 'mathjs';\nimport { IHumanResult } from './human.interface';\n// Group comparisons as needed\nexport const groupFace = (faces: IHumanResult[]) => {\n  const newArr: number[][] = [];\n  faces?.forEach(face => {\n    const arr: number[] = [];\n    face?.face.forEach(faceChild => {\n      arr.push(faceChild.box[0]);\n      arr.push(faceChild.box[1]);\n    });\n    newArr.push(arr);\n  });\n  return handleFaces(newArr);\n};\n\n// Calculate matrix variance and 80 is ok\nexport const handleFaces = (faces: number[][]): number => {\n  return std(faces);\n};\n","import { BehaviorSubject } from 'rxjs';\n\nimport { Inject, Injectable } from '@angular/core';\n\nimport { IFaceDetectionOptions, NGX_FACE_DETECTION } from './face-detection.interface';\nimport { createHuman } from './human-helper';\nimport { loadScript } from './load-script';\nimport { getConfig } from './get-config';\n\n@Injectable({ providedIn: 'root' })\nexport class FaceDetectionService {\n  loaded!: boolean;\n\n  private cachePromiseMap = new Map<string, Promise<boolean>>();\n  private loadModelSub = new BehaviorSubject(false);\n  loadModel$ = this.loadModelSub.asObservable();\n\n  constructor(@Inject(NGX_FACE_DETECTION) private options: IFaceDetectionOptions) {}\n\n  /**\n   * preload the sources of humanjs\n   */\n  async preload(options?: { live: boolean; iris: boolean; debug: boolean }) {\n    // let { live, iris } = options;\n    const live = options?.live ? options?.live : false;\n    let iris = options?.iris ? options?.iris : false;\n    iris = live && iris;\n    const cacheKey = `${live}|${iris}`;\n    if (!this.cachePromiseMap.has(cacheKey)) {\n      const config = getConfig({\n        resourcesUrl: this.options.resourcesUrl,\n        ...options\n      });\n      const promise = loadScript(this.options.script)\n        .then(() => createHuman(config).load(config))\n        .then(\n          () => {\n            this.loadModelSub.next(true);\n            this.loaded = true;\n            return true;\n          },\n          () => false\n        )\n        .catch(err => {\n          console.log(err);\n          return false;\n        });\n      this.cachePromiseMap.set(cacheKey, promise);\n    }\n    return this.cachePromiseMap.get(cacheKey);\n  }\n}\n","import isMobileFn from 'ismobilejs';\nimport {BehaviorSubject, combineLatest, Observable, of, Subject} from 'rxjs';\nimport {filter, map, share, switchMap, take, takeUntil, tap} from 'rxjs/operators';\n\nimport {DOCUMENT, isPlatformBrowser} from '@angular/common';\nimport {\n  AfterViewInit,\n  Component,\n  ElementRef,\n  EventEmitter,\n  HostBinding,\n  Inject,\n  Input,\n  OnChanges,\n  OnDestroy,\n  OnInit,\n  Output,\n  PLATFORM_ID,\n  SimpleChanges,\n  ViewChild\n} from '@angular/core';\n\nimport {Config} from '@vladmandic/human';\nimport {\n  FaceRect,\n  IFaceDetectionOptions,\n  LivenessActionResult,\n  LivenessActions,\n  NGX_FACE_DETECTION\n} from './face-detection.interface';\nimport {FaceDetectionService} from './face-detection.service';\nimport {getBetterPhoto} from './get-better-photo';\nimport {getConfig} from './get-config';\nimport {getAvailableVideoInputs} from './getAvailableVideoInputs';\nimport {createHuman, getNeedVideoWidth, IHuman} from './human-helper';\nimport {IHumanFaceResult, IHumanResult} from './human.interface';\nimport {hasLivenessAction, variance} from './liveness.util';\nimport {loadScript} from './load-script';\nimport {mapFaceResult} from './map-face-result';\nimport {takefacePhoto, takeVideoPhoto} from './take-photo';\nimport {groupFace} from './takephoto.util';\n\ntype ImageSizeType = 'original' | 'compressed';\ntype ImageSourceType = 'album' | 'camera';\n// 处理以下 rect\nconst getFilterFace = (result: IHumanResult) =>\n  result.face\n    .filter(face => face.withinRect && face.box[2] > 50)\n    // 脸大的优先识别\n    .sort((face1, face2) => face2.box[2] - face1.box[2]);\n\n/**\n * a compoent for photo taking\n */\n@Component({\n  selector: 'ngx-face-detection',\n  templateUrl: './face-detection.component.html',\n  styleUrls: ['./face-detection.component.scss']\n})\nexport class FaceDetectionComponent implements OnInit, AfterViewInit, OnChanges, OnDestroy {\n  // debug\n  _info = '';\n  _score = 0;\n  // Cache a canvas for calculation\n  private canvasEle!: HTMLCanvasElement;\n\n  // the interval to face detection\n  @Input() delay = 100;\n\n  // if liveness detection needed\n  @Input() bioassay = false;\n  // if eyes detection needed\n  @Input() iris = false;\n\n  // ismobile devices or not\n  @Input() isMobile: boolean = isMobileFn().any;\n\n  // open test panel or not\n  @HostBinding('class.debug')\n  @Input()\n  debug = false;\n\n  // the steam of video\n  @Input() stream!: any;\n\n  // autoplay\n  @Input() autoplay = true;\n\n  // config for humanJs\n  private config!: Config;\n\n  // The maximum width of the video, some machines cannot exceed 1280\n  @Input() videoMaxWidth = 1280;\n  // The maximum height of the video\n  @Input() videoMaxHeight = 720;\n\n  @ViewChild('videoFaceDetect', {static: true}) videoEle!: ElementRef<HTMLVideoElement>;\n  @ViewChild('devCanvas') devCanvasEle!: ElementRef<HTMLCanvasElement>;\n\n  // there is still no available stream when request to open camera again\n  @Output() noAvailableStream = new EventEmitter<boolean>();\n  private onDestroy$ = new Subject<void>();\n\n  // detect the status that the sources of humanjs loaded completely or not\n  private detectStateSub = new BehaviorSubject<boolean>(false);\n  // the observable for status\n  onDetect$ = this.detectStateSub.asObservable();\n  // the detection status in first time\n  beginDetect$ = this.onDetect$.pipe(\n    filter(d => d),\n    take(1)\n  );\n\n  // the observale of face detection\n  detect$ = new Observable<IHumanResult>(subscribe => {\n    let timer: any;\n    let unsubscribed = false;\n    const loop = async () => {\n      if (unsubscribed) {\n        return;\n      }\n      if (!this.faceDetectionService.loaded) {\n        await this.faceDetectionService.preload({\n          live: this.bioassay,\n          iris: this.iris,\n          debug: this.debug\n        });\n      }\n      const result = await this.detectVideoDelegate(this.config);\n      if (result && result.face) {\n        this.detectStateSub.next(true);\n      }\n      if (result && result.face && result.face.length && result.face.length > 0) {\n        // TODO: Every time you upgrade humanjs, you may need to adapt to the new detection frame width\n        // Fix the problem that the face width is larger when the mesh mode is disabled\n        let sm = 0.6;\n        if (this.config && this.config.face.mesh?.enabled !== true) {\n          sm = 0.4;\n          if (this.isMobile) {\n            sm = 0.5;\n          }\n        }\n        result.face = result.face.map(face => {\n          const [fx, fy, fw, fh] = face.box;\n          let bx = fx;\n          let by = fy;\n          let bWidth = fw;\n          let bHeight = fh;\n\n          const nWidth = bWidth * sm;\n          const nHeight = bHeight * sm;\n          bx += (bWidth - nWidth) / 2;\n          by += (bHeight - nHeight) / 2;\n\n          bWidth = nWidth;\n          bHeight = nHeight;\n          face.box = [bx, by, bWidth, bHeight];\n          return face;\n        });\n        subscribe.next(result);\n        if (this.debug && result.face[0]) {\n          const face = result.face[0];\n          this._info =\n            (face.gesture || []).join(',') +\n            '\\ninitBackend: ' +\n            result.performance.initBackend +\n            '\\nloadModels: ' +\n            result.performance.loadModels +\n            '\\ntotal: ' +\n            result.performance.total +\n            '\\nfacebox: ' +\n            face.box[2]\n        }\n      }\n      timer = setTimeout(loop, this.delay);\n    };\n    loop();\n    return () => {\n      unsubscribed = true;\n      this.detectStateSub.next(false);\n      clearTimeout(timer);\n    };\n  }).pipe(share());\n\n  constructor(\n    private elementRef: ElementRef<HTMLElement>,\n    @Inject(PLATFORM_ID) private platformId: any,\n    @Inject(DOCUMENT) document: any,\n    @Inject(NGX_FACE_DETECTION) private options: IFaceDetectionOptions,\n    private faceDetectionService: FaceDetectionService\n  ) {\n    if (isPlatformBrowser(this.platformId)) {\n      this.canvasEle = document.createElement('canvas');\n    }\n  }\n\n  @HostBinding('class.video-loaded')\n  loadstartVideo = false;\n\n  loadstartHandler() {\n    this.loadstartVideo = true;\n  }\n\n  /**\n   * pause the stream of camera\n   */\n  pause() {\n    this.videoEle.nativeElement.pause();\n  }\n\n  /**\n   * stop the steam of camera\n   */\n  stopStream(): void {\n    if (this.stream) {\n      this.stream.getTracks().forEach((i: any) => i.stop());\n      this.stream = void 0;\n    }\n  }\n\n  /**\n   * play the stream of camera\n   */\n  play() {\n    if (this.videoEle) {\n      this.videoEle.nativeElement.play();\n    }\n  }\n\n  /**\n   * take a photo when there have faces in the area for face-detection\n   *\n   * @param photo [width=600] the width of the photo needed\n   * @param rectPhoto [height=800] the height of the photo needed\n   * @param faceRect [faceRect] the area for face-detection\n   * @param videoPhoto [videoPhoto] need photo or not\n   */\n  takePhoto(\n    width: number = 600,\n    height: number = 800,\n    faceRect?: FaceRect,\n    videoPhoto?: boolean\n  ): Observable<{ photo?: string; rectPhoto?: string; result: IHumanResult }> {\n    return new Observable(subscribe => {\n      const faces: IHumanResult[] = [];\n      const scores: number[] = [];\n      const sub = this.detectWithRect(faceRect)\n        .pipe(\n          filter(d => d.face.length > 0),\n          filter(result => getFilterFace(result)?.length > 0),\n          // TODO: Here is currently a group of 5, which can be adjusted according to the actual situation\n          tap(res => {\n            faces.push(res);\n          }),\n          // filter(res => faces.length >= 3),\n          tap(face => scores.push(groupFace(faces))),\n          filter(res => scores.length >= 3),\n          filter(res => {\n            if (variance(scores) > 0 && variance(scores) < 2) {\n              return true;\n            } else {\n              scores.shift();\n              faces.shift();\n              return false;\n            }\n          }),\n          takeUntil(this.onDestroy$)\n        )\n        .subscribe(async result => {\n          let photo: string | undefined = void 0;\n          let rectPhoto: string | undefined = void 0;\n          const withinRect = getFilterFace(result);\n          if (withinRect.length > 0) {\n            let _rectPhoto: string | undefined = void 0;\n            const faceBox = withinRect[0].box;\n            // Capture a face image with a specified width and size\n            const _photo = takefacePhoto(this.videoEle.nativeElement, this.canvasEle, width, height, {\n              x: faceBox[0],\n              y: faceBox[1],\n              width: faceBox[2],\n              height: faceBox[3]\n            });\n            if (videoPhoto) {\n              _rectPhoto = takeVideoPhoto(this.videoEle.nativeElement, this.canvasEle);\n            }\n            photo = _photo;\n            rectPhoto = _rectPhoto;\n            if (photo) {\n              if (this.isMobile) {\n                // send result\n                subscribe.next({photo, rectPhoto, result});\n                // complete the observale when there have a sent image\n                if (photo) {\n                  sub.unsubscribe();\n                  subscribe.complete();\n                }\n              } else {\n                const imgRepeated = document.createElement('img');\n                if (imgRepeated) {\n                  imgRepeated.src = photo;\n                  imgRepeated.onload = async () => {\n                    const finalResult = await this.human.detect(\n                      imgRepeated,\n                      getConfig({\n                        resourcesUrl: this.options?.resourcesUrl,\n                        debug: this.debug,\n                        iris: false,\n                        live: false\n                      })\n                    );\n                    if (finalResult && finalResult.face && finalResult.face.length > 0) {\n                      // send result\n                      subscribe.next({photo, rectPhoto, result});\n                      // complete the observale when there have a sent image\n                      if (photo) {\n                        sub.unsubscribe();\n                        subscribe.complete();\n                      }\n                    }\n                  };\n                }\n              }\n            }\n          }\n        });\n      return () => sub.unsubscribe();\n    });\n  }\n\n  /**\n   * get better photo of faces\n   *\n   * @param photo [width=600] the width of the photo needed\n   * @param rectPhoto [height=800] the height of the photo needed\n   * @param faceRect [faceRect] the area for face-detection{{\n   * @param videoPhoto [videoPhoto] need photo or not}}\n   */\n  takeBetterPhoto(\n    width: number = 600,\n    height: number = 800,\n    faceRect?: FaceRect,\n    videoPhoto?: boolean\n  ): Observable<{ photo?: string; rectPhoto?: string; result: IHumanResult }> {\n    // The current level  the bigger the badder\n    let currentBetterLevel = Number.MAX_SAFE_INTEGER;\n    // TODO: consider the situation when the person isn't the origin person\n    // TODO: Found the phenomenon, 1, the movement distance will not be too large, 2, the face width and height will not change too much\n    // current face data\n    let currnetFaceData: IHumanFaceResult;\n    return new Observable(subscribe => {\n      const sub = this.detectWithRect(faceRect)\n        .pipe(\n          filter(d => d.face.length > 0),\n          takeUntil(this.onDestroy$)\n        )\n        .subscribe(result => {\n          let rectPhoto: string | undefined = void 0;\n          // If a face is detected\n          const withinRect = getFilterFace(result);\n          if (withinRect.length > 0) {\n            const faceBox = withinRect[0].box;\n            // Determine if faceBox is better than the current one\n            const {level, isBetter} = getBetterPhoto(currentBetterLevel, withinRect[0], currnetFaceData);\n            if (isBetter) {\n              // Update level and data\n              currentBetterLevel = level;\n              currnetFaceData = withinRect[0];\n              // Capture a face image with a specified width and size\n              const photo = takefacePhoto(this.videoEle.nativeElement, this.canvasEle, width, height, {\n                x: faceBox[0],\n                y: faceBox[1],\n                width: faceBox[2],\n                height: faceBox[3]\n              });\n              // Capture a picture in an determinate area\n              if (videoPhoto) {\n                rectPhoto = takeVideoPhoto(this.videoEle.nativeElement, this.canvasEle);\n              }\n              subscribe.next({photo, rectPhoto, result});\n            }\n          }\n        });\n      return () => sub && sub.unsubscribe();\n    });\n  }\n\n  /**\n   * judge if the person is human being or not\n   */\n  liveness(action: LivenessActions, faceRect?: FaceRect): Observable<boolean> {\n    const faceDataArr: LivenessActionResult[] = [];\n    const maxLen = 30;\n    const minLen = 5;\n    return new Observable(subscribe => {\n      const sub = this.detectWithRect(faceRect)\n        .pipe(\n          takeUntil(this.onDestroy$),\n          filter(d => d.face.length > 0),\n          map(result => {\n            const withinRect = getFilterFace(result);\n            // TODO: function called more than once\n            if (withinRect.length > 0) {\n              const face = withinRect[0];\n              const gestures = mapFaceResult(face);\n              faceDataArr.push(gestures);\n              if (faceDataArr.length > maxLen) {\n                faceDataArr.shift();\n              }\n            }\n            return faceDataArr;\n          }),\n          filter(result => result.length > minLen)\n        )\n        .subscribe(result => {\n          const isLiveness = hasLivenessAction(result, action);\n          if (isLiveness) {\n            subscribe.next(true);\n            subscribe.complete();\n          }\n        });\n      return () => sub && sub.unsubscribe();\n    });\n  }\n\n  /**\n   * judge if the person is human being or not by a lot of actions\n   * @param actions a lot of actions needed\n   * @param faceRect the determinate to face-detection\n   */\n  livenessArray(actions: LivenessActions[], faceRect?: FaceRect): Observable<{ act: string; num: number }> {\n    return new Observable(subscribe => {\n      if (actions.length === 0) {\n        subscribe.error('an action at least');\n      }\n      let ob: Observable<boolean> = of(true);\n      for (let i = 0; i < actions.length; i++) {\n        const act = actions[i];\n        ob = ob.pipe(\n          switchMap(() => this.liveness(act, faceRect)),\n          tap(() => subscribe.next({act: act, num: i}))\n        );\n      }\n      const sub = ob.subscribe(() => subscribe.complete());\n\n      return () => sub && sub.unsubscribe();\n    });\n  }\n\n  /**\n   * judge if the person is human being or not by a lot of actions and return the best photo in the process when face-detection\n   * @param actions a lot of actions needed\n   * @param width the width needed\n   * @param height the height needed\n   * @param faceRect the determinate area to face-detection\n   * @param videoPhoto [videoPhoto] need photo or not\n   */\n  livenessArrayTakeBetterPhoto(\n    actions: LivenessActions[],\n    width: number = 600,\n    height: number = 800,\n    faceRect?: FaceRect,\n    videoPhoto?: boolean\n  ): Observable<{ step: number; action: string; photo?: string; rectPhoto?: string }> {\n    return new Observable(subscribe => {\n      const sub = combineLatest([\n        this.livenessArray(actions, faceRect),\n        this.takeBetterPhoto(width, height, faceRect, videoPhoto)\n      ]).subscribe(([action, result]) => {\n        if (action.num >= actions.length - 1) {\n          subscribe.next({step: action.num, action: action.act, photo: result.photo, rectPhoto: result.rectPhoto});\n          subscribe.complete();\n        }\n        subscribe.next({step: action.num, action: action.act});\n      });\n      return () => sub && sub.unsubscribe();\n    });\n  }\n\n  /**\n   * face detection in a determinate area\n   *\n   * @param rect the determinate area\n   */\n  detectWithRect(rect?: FaceRect): Observable<IHumanResult> {\n    const {x, y, width, height} = rect || {\n      x: 0,\n      y: 0,\n      width: Number.MAX_SAFE_INTEGER,\n      height: Number.MAX_SAFE_INTEGER\n    };\n    let devCtx: CanvasRenderingContext2D | null;\n    if (this.debug && this.devCanvasEle) {\n      devCtx = this.devCanvasEle.nativeElement.getContext('2d');\n    }\n    return this.detect$.pipe(\n      map((result: IHumanResult) => {\n        const vWidth = this.videoEle.nativeElement.videoWidth;\n        const vHeight = this.videoEle.nativeElement.videoHeight;\n        const nWidth = this.elementRef.nativeElement.clientWidth || document.body.clientWidth;\n        const nHeight = this.elementRef.nativeElement.clientHeight || document.body.clientHeight;\n        // 画范围框\n        if (this.debug && devCtx) {\n          this.devCanvasEle.nativeElement.width = nWidth;\n          this.devCanvasEle.nativeElement.height = nHeight;\n          devCtx.clearRect(0, 0, nWidth, nHeight);\n          devCtx.fillStyle = '#FF000033';\n          if (width && height) {\n            devCtx.fillRect(x, y, width, height);\n          }\n          // import('./draw').then(d => {\n          //   d.drawFace(result, this.devCanvasEle.nativeElement, this.human.facemesh.triangulation);\n          // });\n        }\n        // Add withinRect to calculate whether the face is inside the determinate area\n        result.face = result.face.map((face, index) => {\n          const [fx, fy, fw, fh] = face.box;\n\n          // Flip transformation of box position\n          let b_lt_x = vWidth - fx - fw;\n          let b_lt_y = fy;\n          let b_rb_x = b_lt_x + fw;\n          let b_rb_y = b_lt_y + fh;\n\n          const vBl = vWidth / vHeight;\n          const nBl = nWidth / nHeight;\n\n          // The fit cover mode converts the coordinates of the video to the screen\n          if (vBl > nBl) {\n            // height 100%\n            const bw = nHeight / vHeight;\n            b_lt_x *= bw;\n            b_lt_y *= bw;\n            b_rb_x *= bw;\n            b_rb_y *= bw;\n            const px = (nWidth - vWidth * bw) / 2;\n            // Calculate the deviation of x\n            b_lt_x += px;\n            b_rb_x += px;\n          } else {\n            // width 100%\n            const bw = nWidth / vWidth;\n            b_lt_x *= bw;\n            b_lt_y *= bw;\n            b_rb_x *= bw;\n            b_rb_y *= bw;\n            // Calculate the deviation of y\n            const py = (nHeight - vHeight * bw) / 2;\n            b_lt_y += py;\n            b_rb_y += py;\n          }\n\n          face.gesture = result.gesture.filter(d => d.face === index).map(d => d.gesture);\n          // TODO: Filter out non-positive faces\n          let withinRect;\n          if (width && height) {\n            withinRect = b_lt_x > x && b_lt_y > y && b_rb_x < x + width && b_rb_y < y + height;\n          }\n\n          if (this.debug && devCtx) {\n            //  the width and height of faces\n            const b_width = b_rb_x - b_lt_x;\n            const b_height = b_rb_y - b_lt_y;\n            // the line to describe faces\n            const color = ['green', 'red', 'yellow', 'blue', 'cyan', 'purple'][index];\n            devCtx.fillStyle = devCtx.strokeStyle = color;\n            devCtx.lineWidth = 4;\n            const size = 30;\n            let line = 1;\n            devCtx.font = `${size}px Arial`;\n            devCtx.strokeRect(b_lt_x, b_lt_y, b_width, b_height);\n            devCtx.fillText(`${index}`, b_lt_x + 10, b_lt_y + size * line++, b_width);\n            devCtx.fillText(`${face.gesture.join(',')}`, b_lt_x + 10, b_lt_y + size * line++, b_width);\n          }\n\n          // Assign current face recognition information\n          return {...face, withinRect};\n        });\n        return result;\n      })\n    );\n  }\n\n  /**\n   * start detection\n   */\n  begin(stream: MediaStream = this.stream) {\n    return new Observable(subscribe => {\n      // Determine if it can work\n      const beginNext = () => {\n        if (this.stream && this.videoEle && this.videoEle.nativeElement.srcObject !== this.stream) {\n          this.videoEle.nativeElement.srcObject = this.stream;\n          this.play();\n        }\n        if (this.faceDetectionService.loaded) {\n          subscribe.complete();\n        }\n      };\n\n      if (stream && stream.active) {\n        this.stream = stream;\n        beginNext();\n      } else {\n        const options = this.getNeedWidth();\n        // Get the stream again\n        navigator.mediaDevices\n          .getUserMedia({\n            audio: false,\n            video: {\n              ...options,\n              facingMode: 'user'\n            }\n          })\n          .then(\n            sm => {\n              this.stream = sm;\n              beginNext();\n            },\n            error => {\n              subscribe.error(error);\n            }\n          )\n          .catch(err => {\n            this.noAvailableStream.emit(true);\n            console.log(err);\n          });\n      }\n    });\n  }\n\n  /**\n   * Get the width and height of cemera\n   */\n  private getNeedWidth(): MediaTrackConstraints {\n    const width = this.elementRef.nativeElement.clientWidth;\n    const height = this.elementRef.nativeElement.clientHeight;\n    return getNeedVideoWidth(width, height, this.videoMaxWidth, this.videoMaxHeight, this.isMobile);\n  }\n\n  private get human(): IHuman {\n    return createHuman(this.config);\n  }\n\n  private async detectVideoDelegate(config?: Config) {\n    // Judgment and execution environment\n    if (!this.videoEle) {\n      return false;\n    }\n    const videoEl = this.videoEle.nativeElement;\n    if (!videoEl.currentTime || videoEl.paused || videoEl.ended) {\n      return false;\n    }\n    // videoEl.srcObject = this.stream;\n    await loadScript(this.options?.script);\n    return await this.human.detect(videoEl, config);\n  }\n\n  private updateConfig() {\n    if (this.options) {\n      this.config = getConfig({\n        resourcesUrl: this.options?.resourcesUrl,\n        debug: this.debug,\n        iris: this.iris,\n        live: this.bioassay\n      });\n    }\n  }\n\n  ngOnInit() {\n    this.updateConfig();\n  }\n\n  async ngAfterViewInit() {\n    // todo avoid error\n    // Uncaught (in promise) DOMException: The play() request was interrupted by a new load request. https://goo.gl/LdLk22\n    this.startCamera();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    const {stream, iris, bioassay} = changes;\n    if (stream?.currentValue) {\n      if (this.stream && this.stream.active) {\n        this.startCamera();\n      }\n    }\n    if (iris?.currentValue || bioassay?.currentValue) {\n      this.updateConfig();\n    }\n  }\n\n  /**\n   * Turn on the camera\n   */\n  async startCamera() {\n    if (isPlatformBrowser(this.platformId)) {\n      //TODO: Error handling 325\n      // Is there a camera capability\n      const videoInput = await getAvailableVideoInputs();\n      console.log(videoInput);\n      const hasDeviceId = videoInput?.some(video => video.deviceId);\n      if (hasDeviceId) {\n        this.begin().subscribe();\n      } else {\n        // TODO: no avaiable camera\n        // this.turnOnCamera();\n        console.log('no avaiable camera');\n      }\n    }\n  }\n\n  async detect(img: any) {\n    return this.human.detect(img, this.config);\n  }\n\n  ngOnDestroy() {\n    this.onDestroy$.next();\n  }\n}\n","<div class=\"video\">\n  <video #videoFaceDetect playsinline (loadstart)=\"loadstartHandler()\"></video>\n</div>\n<div *ngIf=\"debug\" class=\"dev\">\n  <canvas class=\"dev-canvas\" #devCanvas></canvas>\n  <h3>INFO: {{ _info }}</h3>\n  <p>onDetect: {{ onDetect$ | async }}</p>\n  <p>videoWidth: {{ videoEle?.nativeElement?.videoWidth }}</p>\n  <p>ClientWidth: {{ videoEle?.nativeElement?.clientWidth }}</p>\n  <p>videoHeight: {{ videoEle?.nativeElement?.videoHeight }}</p>\n  <p>ClientHeight: {{ videoEle?.nativeElement?.clientHeight }}</p>\n  <p style=\"color: red\">Scores: {{ _score }}</p>\n</div>\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HttpClientModule } from '@angular/common/http';\n\nimport { FaceDetectionComponent } from './face-detection.component';\nimport { IFaceDetectionOptions, NGX_FACE_DETECTION } from './face-detection.interface';\n\n@NgModule({\n  imports: [CommonModule, HttpClientModule],\n  declarations: [\n    FaceDetectionComponent\n  ],\n  exports: [\n    FaceDetectionComponent\n  ]\n})\nexport class FaceDetectionModule {\n  // https://stackoverflow.com/questions/69321466/angular-workspace-monorepo-forroot-giving-me-errors-a-value-for-forroot-can\n  // change the interface any to FaceDetectionModule\n  static forRoot(opts?: IFaceDetectionOptions): ModuleWithProviders<FaceDetectionModule> {\n    return {\n      ngModule: FaceDetectionModule,\n      providers: [{ provide: NGX_FACE_DETECTION, useValue: opts }]\n    };\n  }\n}\n","import { getNeedVideoWidth } from './human-helper';\n\nexport const getUserMedia = (\n  width: number,\n  height: number,\n  videoMaxWidth: number,\n  videoMaxHeight: number,\n  isMobile: boolean\n) => {\n  if (navigator.mediaDevices) {\n    const options = getNeedVideoWidth(width, height, videoMaxWidth, videoMaxHeight, isMobile);\n    return navigator.mediaDevices.getUserMedia({\n      audio: false,\n      video: {\n        ...options,\n        facingMode: 'user'\n      }\n    });\n  } else {\n    return Promise.reject({ name: 'NotFoundError' });\n  }\n};\n","const matchMediaFn = (win: Window, query: string): boolean => win.matchMedia(query).matches;\n\nexport const isMobile = (win: Window) => matchMediaFn(win, '(any-pointer:coarse)');\n","/*\n * Public API Surface of face-detection\n */\n\nexport * from './lib/face-detection.module';\nexport * from './lib/face-detection.interface';\nexport { FaceDetectionComponent } from './lib/face-detection.component';\nexport { FaceDetectionService } from './lib/face-detection.service';\nexport { getConfig } from './lib/get-config';\nexport { NGX_FACE_DETECTION, LivenessActionResult } from './lib/face-detection.interface';\nexport { getNeedVideoWidth } from './lib/human-helper';\nexport { createHuman, IHuman } from './lib/human-helper';\nexport { getUserMedia } from './lib/get-user-media';\nexport { groupFace } from './lib/takephoto.util';\nexport { isMobile } from './lib/is-mobile';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;MAkBa,kBAAkB,GAAG,IAAI,cAAc,CAAwB,oBAAoB;;ACfhG;;;;SAIgB,aAAa,CAAC,IAAsB,EAAE,OAAO,GAAG,KAAK;IACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;IAC9B,MAAM,IAAI,GAAyB,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;;IAGlE,IAAI,IAAI,CAAC,IAAI,EAAE;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,UAAU,GAAG,KAAK,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,GAAG,CAAC;KAC9B;IAED,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAe;QAC/B,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;YACzB,IAAI,MAAM,CAAoB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC7D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;aACnB;SACF;QACD,QAAQ,OAAO;YACb,KAAK,eAAe,EAAE;gBACpB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBACzB,MAAM;aACP;YACD,KAAK,aAAa,EAAE;gBAClB,IAAI,IAAI,CAAC,UAAU,GAAG,EAAE,EAAE;oBACxB,OAAO,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;iBAChE;gBACD,MAAM;aACP;YACD,KAAK,cAAc,EAAE;gBACnB,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,EAAE;oBACzB,OAAO,IAAI,IAAI,CAAC,UAAU,GAAG,IAAI,KAAK,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;iBAChE;gBACD,MAAM;aACP;YACD,KAAK,iBAAiB,EAAE;gBACtB,OAAO,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;gBAC7D,MAAM;aACP;YACD,KAAK,gBAAgB,EAAE;gBACrB,OAAO,IAAI,IAAI,CAAC,UAAU,GAAG,IAAI,KAAK,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;gBAC7D,MAAM;aACP;YACD,KAAK,WAAW,EAAE;gBAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3B,IAAI,IAAI,CAAC,QAAQ,GAAG,EAAE,EAAE;oBACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;iBACtB;gBACD,MAAM;aACP;YACD,KAAK,SAAS,EAAE;gBACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3B,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,EAAE;oBACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;iBACpB;gBACD,MAAM;aACP;SACF;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC;IAC/C,OAAO,IAAI,CAAC;AACd;;ACnEA,MAAM,eAAe,GAAG,CAAC,QAA8B;IACrD,IAAI,IAAI,GAAG,GAAG,CAAC;IACf,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;IACpD,IAAI,QAAQ,CAAC,YAAY,EAAE;QACzB,IAAI,GAAG,cAAc,CAAC;KACvB;IACD,IAAI,QAAQ,CAAC,SAAS,EAAE;QACtB,IAAI,IAAI,EAAE,CAAC;KACZ;IACD,IAAI,QAAQ,CAAC,UAAU,EAAE;QACvB,IAAI,IAAI,EAAE,CAAC;KACZ;IACD,IAAI,QAAQ,CAAC,KAAK,EAAE;QAClB,IAAI,IAAI,EAAE,CAAC;KACZ;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;AACO,MAAM,cAAc,GAAG,CAC5B,kBAA0B,EAC1B,WAA6B,EAC7B,eAAkC;IAElC,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAE1C,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,KAAK,GAAG,kBAAkB,CAAC;;IAE/B,IAAI,QAAQ,KAAK,kBAAkB,EAAE;;KAEpC;;SAEI,IAAI,QAAQ,GAAG,kBAAkB,EAAE;QACtC,KAAK,GAAG,QAAQ,CAAC;QACjB,QAAQ,GAAG,IAAI,CAAC;KACjB;;IAGD,IAAI,eAAe,EAAE;;KAEpB;IAED,OAAO;QACL,KAAK;QACL,QAAQ;KACT,CAAC;AACJ,CAAC;;AC3CD;MACa,SAAS,GAAG,CAAC,IAAmB;IAC3C,MAAM,YAAY,GAAG,IAAI,EAAE,YAAY,GAAG,IAAI,EAAE,YAAY,GAAG,GAAG,CAAC;IACnE,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC;IAC7C,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC;IAC7C,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC;IAChD,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,aAAa,EAAE,YAAY;QAC3B,WAAW,EAAE,IAAI;QACjB,QAAQ,EAAE,eAAe;QACzB,iBAAiB,EAAE,KAAK;QACxB,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,MAAM;QACd,gBAAgB,EAAE,IAAI;QACtB,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE,KAAK;QACjB,MAAM,EAAE;YACN,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,KAAK;YACnB,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,IAAI;YACZ,UAAU,EAAE,CAAC;YACb,QAAQ,EAAE,CAAC;YACX,SAAS,EAAE,CAAC;YACZ,IAAI,EAAE,CAAC;YACP,UAAU,EAAE,CAAC;YACb,GAAG,EAAE,CAAC;YACN,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,KAAK;YACjB,WAAW,EAAE,KAAK;YAClB,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,CAAC;SACZ;QACD,OAAO,EAAE;YACP,OAAO,EAAE,IAAI;SACd;QACD,IAAI,EAAE;YACJ,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE;gBACR,SAAS,EAAE,6BAA6B;gBACxC,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,CAAC;gBACd,UAAU,EAAE,EAAE;gBACd,QAAQ,EAAE,IAAI;gBACd,aAAa,EAAE,GAAG;gBAClB,YAAY,EAAE,GAAG;gBACjB,IAAI,EAAE,KAAK;gBACX,MAAM,EAAE,KAAK;aACd;YACD,IAAI,EAAE;gBACJ,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,4BAA4B;aACxC;YACD,IAAI,EAAE;gBACJ,OAAO,EAAE,IAAI,IAAI,IAAI;gBACrB,SAAS,EAAE,wBAAwB;aACpC;YACD,OAAO,EAAE;gBACP,OAAO,EAAE,KAAK;gBACd,aAAa,EAAE,GAAG;gBAClB,UAAU,EAAE,EAAE;gBACd,QAAQ,EAAE,IAAI;gBACd,SAAS,EAAE,2BAA2B;aACvC;YACD,WAAW,EAAE;gBACX,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,2BAA2B;gBACtC,UAAU,EAAE,EAAE;gBACd,QAAQ,EAAE,GAAG;gBACb,aAAa,EAAE,GAAG;aACnB;YACD,SAAS,EAAE;gBACT,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,EAAE;gBACd,QAAQ,EAAE,GAAG;gBACb,SAAS,EAAE,6BAA6B;aACzC;YACD,QAAQ,EAAE;gBACR,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,EAAE;gBACd,QAAQ,EAAE,GAAG;gBACb,SAAS,EAAE,4BAA4B;aACxC;SACF;QAED,IAAI,EAAE;YACJ,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,qCAAqC;YAChD,WAAW,EAAE,CAAC,CAAC;YACf,aAAa,EAAE,GAAG;YAClB,UAAU,EAAE,CAAC;YACb,QAAQ,EAAE,GAAG;SACd;QAED,IAAI,EAAE;YACJ,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,GAAG;;;;;YAKb,aAAa,EAAE,GAAG;YAClB,YAAY,EAAE,GAAG;;;YAGjB,WAAW,EAAE,CAAC,CAAC;;YAEf,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE;gBACR,SAAS,EAAE,6BAA6B;aACzC;YACD,QAAQ,EAAE;gBACR,SAAS,EAAE,qCAAqC;aACjD;SACF;QAED,MAAM,EAAE;YACN,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,iCAAiC;YAC5C,aAAa,EAAE,GAAG;YAClB,YAAY,EAAE,GAAG;YACjB,WAAW,EAAE,EAAE;YACf,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,GAAG;SACd;QACD,YAAY,EAAE;YACZ,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,0BAA0B;YACrC,IAAI,EAAE,CAAC;SACR;KACF,CAAA;AACH;;ACpJA;;;AAGO,eAAe,uBAAuB;IAC3C,IAAI,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE;QAC1E,IAAI;YACF,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC;YAChE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAuB,KAAK,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;SAClF;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SACpB;KACF;IACD,OAAO,EAAE,CAAC;AACZ;;ACMA,IAAI,KAAa,CAAC;SAEF,WAAW,CAAC,MAAW;IACrC,IAAI,KAAK,IAAI,CAAC,KAAK,EAAE;QACnB,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;KACnC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;SAUe,iBAAiB,CAC/B,KAAa,EACb,MAAc,EACd,aAAqB,EACrB,cAAsB,EACtB,QAAiB;IAEjB,MAAM,IAAI,GAAG,KAAK,CAAC;IACnB,MAAM,IAAI,GAAG,MAAM,CAAC;IACpB,IAAI,QAAQ,EAAE;QACZ,KAAK,GAAG,IAAI,CAAC;QACb,MAAM,GAAG,IAAI,CAAC;QACd,aAAa,GAAG,cAAc,CAAC;KAChC;;IAED,IAAI,KAAK,GAAG,aAAa,EAAE;QACzB,KAAK,GAAG,aAAa,CAAC;QACtB,MAAM,EAAE,GAAG,KAAK,GAAG,MAAM,CAAC;QAC1B,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;KACjC;IAED,OAAO;QACL,KAAK;KACN,CAAC;AACJ;;AC1DA;AACO,MAAM,QAAQ,GAAG,CAAC,OAAiB;IACxC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACvC,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;KACnB;IACD,IAAI,GAAG,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAC5B,GAAG,GAAG,CAAC,CAAC;IACR,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACvC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;KACvC;IACD,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;AAC9B,CAAC,CAAC;AAEF;;;AAGO,MAAM,wBAAwB,GAAG,CACtC,OAAuC,EACvC,IAA6B,EAC7B,KAA8B,EAC9B,QAAQ,GAAG,EAAE,EACb,KAAK,GAAG,CAAC;IAET,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/C,IAAI,SAAS,IAAI,CAAC,EAAE;QAClB,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACrD,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE;YACrB,MAAM,WAAW,GAAG,UAAU,GAAG,SAAS,IAAI,QAAQ,CAAC;YACvD,IAAI,WAAW,EAAE;gBACf,OAAO,IAAI,CAAC;aACb;YACD,IAAI,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnC,OAAO,wBAAwB,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;aAC7E;SACF;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF;;;AAGA,MAAM,cAAc,GAAG,CAAC,OAAkB;IACxC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF;;;AAGA,MAAM,eAAe,GAAG,CAAC,YAAiC,EAAE,GAA4B;IACtF,MAAM,OAAO,GAAU,EAAE,CAAC;IAC1B,YAAY,CAAC,OAAO,CAAC,CAAC,WAA8B;QAClD,MAAM,KAAK,GAAG,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YACtB,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;SACpC;QACD,IAAI,IAAI,KAAK,KAAK,EAAE;YAClB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACrB;KACF,CAAC,CAAC;IACH,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF;;;AAGO,MAAM,aAAa,GAAG,CAC3B,OAA4B,EAC5B,OAAuC;IAEvC,MAAM,OAAO,GAAU,EAAE,CAAC;IAC1B,IAAI,UAAmC,CAAC;IACxC,OAAO,CAAC,OAAO,CAAC,CAAC,WAA8B;QAC7C,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACvC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;YAClC,IAAI,KAAK,EAAE;gBACT,QAAQ,GAAG,IAAI,CAAC;gBAChB,IAAI,UAAU,KAAK,MAAM,EAAE;oBACzB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACrB,UAAU,GAAG,MAAM,CAAC;iBACrB;gBACD,MAAM;aACP;SACF;QACD,IAAI,CAAC,QAAQ,EAAE;YACb,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SACzB;KACF,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,MAA2B;IAC1C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,QACE,wBAAwB,CAAC,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC,CAAC;QACpE,wBAAwB,CAAC,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC,EACpE;AACJ,CAAC,CAAC;AAEK,MAAM,iBAAiB,GAAG,CAAC,MAA8B,EAAE,MAAuB;IACvF,QAAQ,MAAM;QACZ,KAAK,YAAY,CAAC;QAClB,KAAK,aAAa;YAChB,OAAO,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;QACzF,KAAK,QAAQ,CAAC;QACd,KAAK,UAAU;YACb,OAAO,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC;QACxF,KAAK,OAAO,CAAC;QACb,KAAK,cAAc;YACjB,OAAO,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzC,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7C,KAAK,OAAO;YACV,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;QACzB;YACE,MAAM;KACT;IACD,OAAO,KAAK,CAAC;AACf,CAAC;;AC9HD;;;;;;;AAOO,eAAe,UAAU,CAAC,GAAW;IAC1C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM;QACjC,IAAI,aAAa,GAAsB,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,eAAe,GAAG,IAAI,CAAQ,CAAC;QAElG,IAAI,CAAC,aAAa,EAAE;YAClB,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACjD,aAAa,CAAC,IAAI,GAAG,iBAAiB,CAAC;YACvC,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;SAC1C;QAED,IAAI,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;YAC5C,OAAO,CAAC,IAAI,CAAC,CAAC;SACf;QACD,MAAM,WAAW,GAAG;YAClB,aAAa,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAClD,aAAa,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;SACrD,CAAC;QACF,MAAM,MAAM,GAAG;YACb,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACpC,WAAW,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,CAAC;SACf,CAAC;QACF,MAAM,OAAO,GAAG,CAAC,CAAM;YACrB,WAAW,EAAE,CAAC;YACd,MAAM,CAAC,CAAC,CAAC,CAAC;SACX,CAAC;QACF,aAAa,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/C,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;KAClD,CAAC,CAAC;AACL;;ACrCA;;;AAGO,MAAM,aAAa,GAAG,CAC3B,KAAuB,EACvB,MAAyB,EACzB,SAAiB,EACjB,UAAkB,EAClB,QAAiE;IAEjE,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;IAEzC,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC;IACzB,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC;IAE3B,MAAM,EAAE,GAAG,SAAS,GAAG,UAAU,CAAC;IAClC,MAAM,EAAE,GAAG,KAAK,GAAG,MAAM,CAAC;IAE1B,IAAI,EAAE,GAAW,KAAK,CAAC;IACvB,IAAI,EAAE,GAAW,MAAM,CAAC;IAExB,IAAI,EAAE,GAAG,EAAE,EAAE;QACX,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;KACd;SAAM;QACL,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;KACd;;IAED,MAAM,EAAE,GAAG,GAAG,CAAC;IACf,EAAE,IAAI,EAAE,CAAC;IACT,EAAE,IAAI,EAAE,CAAC;IACT,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC;IAC9B,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,MAAM,GAAG,GAAG,CAAC;;IAE9C,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;IACrB,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;;IAErB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACnB,IAAI,EAAE,GAAG,KAAK,CAAC,UAAU,EAAE;QACzB,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC;KAC7B;;IAED,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACnB,IAAI,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE;QAC1B,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC;KAC9B;IACD,IAAI,GAAG,EAAE;;QAEP,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;;QAE1C,GAAG,CAAC,qBAAqB,GAAG,IAAI,CAAC;;QAEjC,IAAI;YACF,GAAG,CAAC,uBAAuB,CAAC,GAAG,MAAM,CAAC;SACvC;QAAC,OAAO,KAAK,EAAE;;SAEf;QAED,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;QAEjB,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;KAC5E;IACD,OAAO,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF;AACO,MAAM,iBAAiB,GAAG,OAC/B,KAAuB,EACvB,MAAyB,EACzB,QAAiE;IAEjE,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC;IAChC,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC;IACjC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,EAAE,GAAG,MAAM,GAAG,MAAM,CAAC;IAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,IAAI,MAAM,IAAI,MAAM,CAAC;IAChE,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IACnB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,GAAG,MAAM,IAAI,MAAM,CAAC;IAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC;IACjD,IAAI,MAAM,GAAG,MAAM,EAAE;QACnB,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;KACrB;IACD,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;IACjB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,EAAE;QACb,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvB,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;KACrD;IAED,OAAO,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF;AACO,MAAM,cAAc,GAAG,CAAC,KAAuB,EAAE,MAAyB;IAC/E,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC;IAC3B,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC;IAC5B,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;IACjB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,EAAE;QACb,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvB,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;KACrD;IACD,OAAO,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;AAC9C,CAAC;;ACxGD;MACa,SAAS,GAAG,CAAC,KAAqB;IAC7C,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,KAAK,EAAE,OAAO,CAAC,IAAI;QACjB,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;YAC1B,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC5B,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KAClB,CAAC,CAAC;IACH,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;AAC7B,EAAE;AAEF;AACO,MAAM,WAAW,GAAG,CAAC,KAAiB;IAC3C,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;AACpB,CAAC;;MCTY,oBAAoB;IAO/B,YAAgD,OAA8B;QAA9B,YAAO,GAAP,OAAO,CAAuB;QAJtE,oBAAe,GAAG,IAAI,GAAG,EAA4B,CAAC;QACtD,iBAAY,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;QAClD,eAAU,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;KAEoC;;;;IAKlF,MAAM,OAAO,CAAC,OAA0D;;QAEtE,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,GAAG,OAAO,EAAE,IAAI,GAAG,KAAK,CAAC;QACnD,IAAI,IAAI,GAAG,OAAO,EAAE,IAAI,GAAG,OAAO,EAAE,IAAI,GAAG,KAAK,CAAC;QACjD,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC;QACpB,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YACvC,MAAM,MAAM,GAAG,SAAS,CAAC;gBACvB,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY;gBACvC,GAAG,OAAO;aACX,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;iBAC5C,IAAI,CAAC,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;iBAC5C,IAAI,CACH;gBACE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,OAAO,IAAI,CAAC;aACb,EACD,MAAM,KAAK,CACZ;iBACA,KAAK,CAAC,GAAG;gBACR,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACjB,OAAO,KAAK,CAAC;aACd,CAAC,CAAC;YACL,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;SAC7C;QACD,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;KAC3C;;iHAxCU,oBAAoB,kBAOX,kBAAkB;qHAP3B,oBAAoB,cADP,MAAM;2FACnB,oBAAoB;kBADhC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;0BAQnB,MAAM;2BAAC,kBAAkB;;;AC2BxC;AACA,MAAM,aAAa,GAAG,CAAC,MAAoB,KACzC,MAAM,CAAC,IAAI;KACR,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;;KAEnD,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAEzD;;;MAQa,sBAAsB;IA6HjC,YACU,UAAmC,EACd,UAAe,EAC1B,QAAa,EACK,OAA8B,EAC1D,oBAA0C;QAJ1C,eAAU,GAAV,UAAU,CAAyB;QACd,eAAU,GAAV,UAAU,CAAK;QAER,YAAO,GAAP,OAAO,CAAuB;QAC1D,yBAAoB,GAApB,oBAAoB,CAAsB;;QAhIpD,UAAK,GAAG,EAAE,CAAC;QACX,WAAM,GAAG,CAAC,CAAC;;QAKF,UAAK,GAAG,GAAG,CAAC;;QAGZ,aAAQ,GAAG,KAAK,CAAC;;QAEjB,SAAI,GAAG,KAAK,CAAC;;QAGb,aAAQ,GAAY,UAAU,EAAE,CAAC,GAAG,CAAC;;QAK9C,UAAK,GAAG,KAAK,CAAC;;QAML,aAAQ,GAAG,IAAI,CAAC;;QAMhB,kBAAa,GAAG,IAAI,CAAC;;QAErB,mBAAc,GAAG,GAAG,CAAC;;QAMpB,sBAAiB,GAAG,IAAI,YAAY,EAAW,CAAC;QAClD,eAAU,GAAG,IAAI,OAAO,EAAQ,CAAC;;QAGjC,mBAAc,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC,CAAC;;QAE7D,cAAS,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;;QAE/C,iBAAY,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAChC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EACd,IAAI,CAAC,CAAC,CAAC,CACR,CAAC;;QAGF,YAAO,GAAG,IAAI,UAAU,CAAe,SAAS;YAC9C,IAAI,KAAU,CAAC;YACf,IAAI,YAAY,GAAG,KAAK,CAAC;YACzB,MAAM,IAAI,GAAG;gBACX,IAAI,YAAY,EAAE;oBAChB,OAAO;iBACR;gBACD,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE;oBACrC,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;wBACtC,IAAI,EAAE,IAAI,CAAC,QAAQ;wBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,KAAK,EAAE,IAAI,CAAC,KAAK;qBAClB,CAAC,CAAC;iBACJ;gBACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC3D,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE;oBACzB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBAChC;gBACD,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;;;oBAGzE,IAAI,EAAE,GAAG,GAAG,CAAC;oBACb,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,EAAE;wBAC1D,EAAE,GAAG,GAAG,CAAC;wBACT,IAAI,IAAI,CAAC,QAAQ,EAAE;4BACjB,EAAE,GAAG,GAAG,CAAC;yBACV;qBACF;oBACD,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI;wBAChC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;wBAClC,IAAI,EAAE,GAAG,EAAE,CAAC;wBACZ,IAAI,EAAE,GAAG,EAAE,CAAC;wBACZ,IAAI,MAAM,GAAG,EAAE,CAAC;wBAChB,IAAI,OAAO,GAAG,EAAE,CAAC;wBAEjB,MAAM,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC;wBAC3B,MAAM,OAAO,GAAG,OAAO,GAAG,EAAE,CAAC;wBAC7B,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;wBAC5B,EAAE,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,CAAC,CAAC;wBAE9B,MAAM,GAAG,MAAM,CAAC;wBAChB,OAAO,GAAG,OAAO,CAAC;wBAClB,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;wBACrC,OAAO,IAAI,CAAC;qBACb,CAAC,CAAC;oBACH,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACvB,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;wBAChC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBAC5B,IAAI,CAAC,KAAK;4BACR,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC;gCAC9B,iBAAiB;gCACjB,MAAM,CAAC,WAAW,CAAC,WAAW;gCAC9B,gBAAgB;gCAChB,MAAM,CAAC,WAAW,CAAC,UAAU;gCAC7B,WAAW;gCACX,MAAM,CAAC,WAAW,CAAC,KAAK;gCACxB,aAAa;gCACb,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;qBACd;iBACF;gBACD,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;aACtC,CAAC;YACF,IAAI,EAAE,CAAC;YACP,OAAO;gBACL,YAAY,GAAG,IAAI,CAAC;gBACpB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAChC,YAAY,CAAC,KAAK,CAAC,CAAC;aACrB,CAAC;SACH,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAejB,mBAAc,GAAG,KAAK,CAAC;QANrB,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACtC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;SACnD;KACF;IAKD,gBAAgB;QACd,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;KAC5B;;;;IAKD,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;KACrC;;;;IAKD,UAAU;QACR,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACtD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;SACtB;KACF;;;;IAKD,IAAI;QACF,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;SACpC;KACF;;;;;;;;;IAUD,SAAS,CACP,QAAgB,GAAG,EACnB,SAAiB,GAAG,EACpB,QAAmB,EACnB,UAAoB;QAEpB,OAAO,IAAI,UAAU,CAAC,SAAS;YAC7B,MAAM,KAAK,GAAmB,EAAE,CAAC;YACjC,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;iBACtC,IAAI,CACH,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAC9B,MAAM,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;;YAEnD,GAAG,CAAC,GAAG;gBACL,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aACjB,CAAC;;YAEF,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAC1C,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,EACjC,MAAM,CAAC,GAAG;gBACR,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;oBAChD,OAAO,IAAI,CAAC;iBACb;qBAAM;oBACL,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,KAAK,CAAC,KAAK,EAAE,CAAC;oBACd,OAAO,KAAK,CAAC;iBACd;aACF,CAAC,EACF,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAC3B;iBACA,SAAS,CAAC,OAAM,MAAM;gBACrB,IAAI,KAAK,GAAuB,KAAK,CAAC,CAAC;gBACvC,IAAI,SAAS,GAAuB,KAAK,CAAC,CAAC;gBAC3C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;gBACzC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;oBACzB,IAAI,UAAU,GAAuB,KAAK,CAAC,CAAC;oBAC5C,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;;oBAElC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE;wBACvF,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;wBACb,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;wBACb,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;wBACjB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;qBACnB,CAAC,CAAC;oBACH,IAAI,UAAU,EAAE;wBACd,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;qBAC1E;oBACD,KAAK,GAAG,MAAM,CAAC;oBACf,SAAS,GAAG,UAAU,CAAC;oBACvB,IAAI,KAAK,EAAE;wBACT,IAAI,IAAI,CAAC,QAAQ,EAAE;;4BAEjB,SAAS,CAAC,IAAI,CAAC,EAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAC,CAAC,CAAC;;4BAE3C,IAAI,KAAK,EAAE;gCACT,GAAG,CAAC,WAAW,EAAE,CAAC;gCAClB,SAAS,CAAC,QAAQ,EAAE,CAAC;6BACtB;yBACF;6BAAM;4BACL,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;4BAClD,IAAI,WAAW,EAAE;gCACf,WAAW,CAAC,GAAG,GAAG,KAAK,CAAC;gCACxB,WAAW,CAAC,MAAM,GAAG;oCACnB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CACzC,WAAW,EACX,SAAS,CAAC;wCACR,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY;wCACxC,KAAK,EAAE,IAAI,CAAC,KAAK;wCACjB,IAAI,EAAE,KAAK;wCACX,IAAI,EAAE,KAAK;qCACZ,CAAC,CACH,CAAC;oCACF,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;;wCAElE,SAAS,CAAC,IAAI,CAAC,EAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAC,CAAC,CAAC;;wCAE3C,IAAI,KAAK,EAAE;4CACT,GAAG,CAAC,WAAW,EAAE,CAAC;4CAClB,SAAS,CAAC,QAAQ,EAAE,CAAC;yCACtB;qCACF;iCACF,CAAC;6BACH;yBACF;qBACF;iBACF;aACF,CAAC,CAAC;YACL,OAAO,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;SAChC,CAAC,CAAC;KACJ;;;;;;;;;IAUD,eAAe,CACb,QAAgB,GAAG,EACnB,SAAiB,GAAG,EACpB,QAAmB,EACnB,UAAoB;;QAGpB,IAAI,kBAAkB,GAAG,MAAM,CAAC,gBAAgB,CAAC;;;;QAIjD,IAAI,eAAiC,CAAC;QACtC,OAAO,IAAI,UAAU,CAAC,SAAS;YAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;iBACtC,IAAI,CACH,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAC9B,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAC3B;iBACA,SAAS,CAAC,MAAM;gBACf,IAAI,SAAS,GAAuB,KAAK,CAAC,CAAC;;gBAE3C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;gBACzC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;oBACzB,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;;oBAElC,MAAM,EAAC,KAAK,EAAE,QAAQ,EAAC,GAAG,cAAc,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;oBAC7F,IAAI,QAAQ,EAAE;;wBAEZ,kBAAkB,GAAG,KAAK,CAAC;wBAC3B,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;;wBAEhC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE;4BACtF,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;4BACb,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;4BACb,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;4BACjB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;yBACnB,CAAC,CAAC;;wBAEH,IAAI,UAAU,EAAE;4BACd,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;yBACzE;wBACD,SAAS,CAAC,IAAI,CAAC,EAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAC,CAAC,CAAC;qBAC5C;iBACF;aACF,CAAC,CAAC;YACL,OAAO,MAAM,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;SACvC,CAAC,CAAC;KACJ;;;;IAKD,QAAQ,CAAC,MAAuB,EAAE,QAAmB;QACnD,MAAM,WAAW,GAA2B,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,CAAC,CAAC;QACjB,OAAO,IAAI,UAAU,CAAC,SAAS;YAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;iBACtC,IAAI,CACH,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,EAC1B,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAC9B,GAAG,CAAC,MAAM;gBACR,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;;gBAEzC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;oBACzB,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;oBAC3B,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;oBACrC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC3B,IAAI,WAAW,CAAC,MAAM,GAAG,MAAM,EAAE;wBAC/B,WAAW,CAAC,KAAK,EAAE,CAAC;qBACrB;iBACF;gBACD,OAAO,WAAW,CAAC;aACpB,CAAC,EACF,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,CACzC;iBACA,SAAS,CAAC,MAAM;gBACf,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACrD,IAAI,UAAU,EAAE;oBACd,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACrB,SAAS,CAAC,QAAQ,EAAE,CAAC;iBACtB;aACF,CAAC,CAAC;YACL,OAAO,MAAM,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;SACvC,CAAC,CAAC;KACJ;;;;;;IAOD,aAAa,CAAC,OAA0B,EAAE,QAAmB;QAC3D,OAAO,IAAI,UAAU,CAAC,SAAS;YAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;gBACxB,SAAS,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;aACvC;YACD,IAAI,EAAE,GAAwB,EAAE,CAAC,IAAI,CAAC,CAAC;YACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACvC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACvB,EAAE,GAAG,EAAE,CAAC,IAAI,CACV,SAAS,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,EAC7C,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,CAAC,EAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAC,CAAC,CAAC,CAC9C,CAAC;aACH;YACD,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;YAErD,OAAO,MAAM,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;SACvC,CAAC,CAAC;KACJ;;;;;;;;;IAUD,4BAA4B,CAC1B,OAA0B,EAC1B,QAAgB,GAAG,EACnB,SAAiB,GAAG,EACpB,QAAmB,EACnB,UAAoB;QAEpB,OAAO,IAAI,UAAU,CAAC,SAAS;YAC7B,MAAM,GAAG,GAAG,aAAa,CAAC;gBACxB,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC;gBACrC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC;aAC1D,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC;gBAC5B,IAAI,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;oBACpC,SAAS,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAC,CAAC,CAAC;oBACzG,SAAS,CAAC,QAAQ,EAAE,CAAC;iBACtB;gBACD,SAAS,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,EAAC,CAAC,CAAC;aACxD,CAAC,CAAC;YACH,OAAO,MAAM,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;SACvC,CAAC,CAAC;KACJ;;;;;;IAOD,cAAc,CAAC,IAAe;QAC5B,MAAM,EAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAC,GAAG,IAAI,IAAI;YACpC,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;YACJ,KAAK,EAAE,MAAM,CAAC,gBAAgB;YAC9B,MAAM,EAAE,MAAM,CAAC,gBAAgB;SAChC,CAAC;QACF,IAAI,MAAuC,CAAC;QAC5C,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,EAAE;YACnC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;SAC3D;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CACtB,GAAG,CAAC,CAAC,MAAoB;YACvB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC;YACtD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC;YACxD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,IAAI,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;YACtF,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,IAAI,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;;YAEzF,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,EAAE;gBACxB,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,GAAG,MAAM,CAAC;gBAC/C,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,GAAG,OAAO,CAAC;gBACjD,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBACxC,MAAM,CAAC,SAAS,GAAG,WAAW,CAAC;gBAC/B,IAAI,KAAK,IAAI,MAAM,EAAE;oBACnB,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;iBACtC;;;;aAIF;;YAED,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK;gBACxC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;;gBAGlC,IAAI,MAAM,GAAG,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC;gBAC9B,IAAI,MAAM,GAAG,EAAE,CAAC;gBAChB,IAAI,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC;gBACzB,IAAI,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC;gBAEzB,MAAM,GAAG,GAAG,MAAM,GAAG,OAAO,CAAC;gBAC7B,MAAM,GAAG,GAAG,MAAM,GAAG,OAAO,CAAC;;gBAG7B,IAAI,GAAG,GAAG,GAAG,EAAE;;oBAEb,MAAM,EAAE,GAAG,OAAO,GAAG,OAAO,CAAC;oBAC7B,MAAM,IAAI,EAAE,CAAC;oBACb,MAAM,IAAI,EAAE,CAAC;oBACb,MAAM,IAAI,EAAE,CAAC;oBACb,MAAM,IAAI,EAAE,CAAC;oBACb,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,EAAE,IAAI,CAAC,CAAC;;oBAEtC,MAAM,IAAI,EAAE,CAAC;oBACb,MAAM,IAAI,EAAE,CAAC;iBACd;qBAAM;;oBAEL,MAAM,EAAE,GAAG,MAAM,GAAG,MAAM,CAAC;oBAC3B,MAAM,IAAI,EAAE,CAAC;oBACb,MAAM,IAAI,EAAE,CAAC;oBACb,MAAM,IAAI,EAAE,CAAC;oBACb,MAAM,IAAI,EAAE,CAAC;;oBAEb,MAAM,EAAE,GAAG,CAAC,OAAO,GAAG,OAAO,GAAG,EAAE,IAAI,CAAC,CAAC;oBACxC,MAAM,IAAI,EAAE,CAAC;oBACb,MAAM,IAAI,EAAE,CAAC;iBACd;gBAED,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;;gBAEhF,IAAI,UAAU,CAAC;gBACf,IAAI,KAAK,IAAI,MAAM,EAAE;oBACnB,UAAU,GAAG,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,GAAG,KAAK,IAAI,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC;iBACpF;gBAED,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,EAAE;;oBAExB,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;oBAChC,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;;oBAEjC,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC;oBAC1E,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;oBAC9C,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;oBACrB,MAAM,IAAI,GAAG,EAAE,CAAC;oBAChB,IAAI,IAAI,GAAG,CAAC,CAAC;oBACb,MAAM,CAAC,IAAI,GAAG,GAAG,IAAI,UAAU,CAAC;oBAChC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;oBACrD,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;oBAC1E,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;iBAC5F;;gBAGD,OAAO,EAAC,GAAG,IAAI,EAAE,UAAU,EAAC,CAAC;aAC9B,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;SACf,CAAC,CACH,CAAC;KACH;;;;IAKD,KAAK,CAAC,SAAsB,IAAI,CAAC,MAAM;QACrC,OAAO,IAAI,UAAU,CAAC,SAAS;;YAE7B,MAAM,SAAS,GAAG;gBAChB,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,KAAK,IAAI,CAAC,MAAM,EAAE;oBACzF,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;oBACpD,IAAI,CAAC,IAAI,EAAE,CAAC;iBACb;gBACD,IAAI,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE;oBACpC,SAAS,CAAC,QAAQ,EAAE,CAAC;iBACtB;aACF,CAAC;YAEF,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE;gBAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;gBACrB,SAAS,EAAE,CAAC;aACb;iBAAM;gBACL,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;;gBAEpC,SAAS,CAAC,YAAY;qBACnB,YAAY,CAAC;oBACZ,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE;wBACL,GAAG,OAAO;wBACV,UAAU,EAAE,MAAM;qBACnB;iBACF,CAAC;qBACD,IAAI,CACH,EAAE;oBACA,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;oBACjB,SAAS,EAAE,CAAC;iBACb,EACD,KAAK;oBACH,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;iBACxB,CACF;qBACA,KAAK,CAAC,GAAG;oBACR,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAClC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;iBAClB,CAAC,CAAC;aACN;SACF,CAAC,CAAC;KACJ;;;;IAKO,YAAY;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC;QAC1D,OAAO,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KACjG;IAED,IAAY,KAAK;QACf,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KACjC;IAEO,MAAM,mBAAmB,CAAC,MAAe;;QAE/C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,OAAO,KAAK,CAAC;SACd;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,EAAE;YAC3D,OAAO,KAAK,CAAC;SACd;;QAED,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACvC,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KACjD;IAEO,YAAY;QAClB,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;gBACtB,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY;gBACxC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,QAAQ;aACpB,CAAC,CAAC;SACJ;KACF;IAED,QAAQ;QACN,IAAI,CAAC,YAAY,EAAE,CAAC;KACrB;IAED,MAAM,eAAe;;;QAGnB,IAAI,CAAC,WAAW,EAAE,CAAC;KACpB;IAED,WAAW,CAAC,OAAsB;QAChC,MAAM,EAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAC,GAAG,OAAO,CAAC;QACzC,IAAI,MAAM,EAAE,YAAY,EAAE;YACxB,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;gBACrC,IAAI,CAAC,WAAW,EAAE,CAAC;aACpB;SACF;QACD,IAAI,IAAI,EAAE,YAAY,IAAI,QAAQ,EAAE,YAAY,EAAE;YAChD,IAAI,CAAC,YAAY,EAAE,CAAC;SACrB;KACF;;;;IAKD,MAAM,WAAW;QACf,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;;;YAGtC,MAAM,UAAU,GAAG,MAAM,uBAAuB,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACxB,MAAM,WAAW,GAAG,UAAU,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC9D,IAAI,WAAW,EAAE;gBACf,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,CAAC;aAC1B;iBAAM;;;gBAGL,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;aACnC;SACF;KACF;IAED,MAAM,MAAM,CAAC,GAAQ;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;KAC5C;IAED,WAAW;QACT,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;KACxB;;mHAhpBU,sBAAsB,4CA+HvB,WAAW,aACX,QAAQ,aACR,kBAAkB;uGAjIjB,sBAAsB,+oBC3DnC,4lBAaA;2FD8Ca,sBAAsB;kBALlC,SAAS;+BACE,oBAAoB;;0BAmI3B,MAAM;2BAAC,WAAW;;0BAClB,MAAM;2BAAC,QAAQ;;0BACf,MAAM;2BAAC,kBAAkB;4EAzHnB,KAAK;sBAAb,KAAK;gBAGG,QAAQ;sBAAhB,KAAK;gBAEG,IAAI;sBAAZ,KAAK;gBAGG,QAAQ;sBAAhB,KAAK;gBAKN,KAAK;sBAFJ,WAAW;uBAAC,aAAa;;sBACzB,KAAK;gBAIG,MAAM;sBAAd,KAAK;gBAGG,QAAQ;sBAAhB,KAAK;gBAMG,aAAa;sBAArB,KAAK;gBAEG,cAAc;sBAAtB,KAAK;gBAEwC,QAAQ;sBAArD,SAAS;uBAAC,iBAAiB,EAAE,EAAC,MAAM,EAAE,IAAI,EAAC;gBACpB,YAAY;sBAAnC,SAAS;uBAAC,WAAW;gBAGZ,iBAAiB;sBAA1B,MAAM;gBAiGP,cAAc;sBADb,WAAW;uBAAC,oBAAoB;;;MEpLtB,mBAAmB;;;IAG9B,OAAO,OAAO,CAAC,IAA4B;QACzC,OAAO;YACL,QAAQ,EAAE,mBAAmB;YAC7B,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;SAC7D,CAAC;KACH;;gHARU,mBAAmB;iHAAnB,mBAAmB,iBAN5B,sBAAsB,aAFd,YAAY,EAAE,gBAAgB,aAKtC,sBAAsB;iHAGb,mBAAmB,YARrB,CAAC,YAAY,EAAE,gBAAgB,CAAC;2FAQ9B,mBAAmB;kBAT/B,QAAQ;mBAAC;oBACR,OAAO,EAAE,CAAC,YAAY,EAAE,gBAAgB,CAAC;oBACzC,YAAY,EAAE;wBACZ,sBAAsB;qBACvB;oBACD,OAAO,EAAE;wBACP,sBAAsB;qBACvB;iBACF;;;MCbY,YAAY,GAAG,CAC1B,KAAa,EACb,MAAc,EACd,aAAqB,EACrB,cAAsB,EACtB,QAAiB;IAEjB,IAAI,SAAS,CAAC,YAAY,EAAE;QAC1B,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;QAC1F,OAAO,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC;YACzC,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE;gBACL,GAAG,OAAO;gBACV,UAAU,EAAE,MAAM;aACnB;SACF,CAAC,CAAC;KACJ;SAAM;QACL,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;KAClD;AACH;;ACrBA,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,KAAa,KAAc,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;MAE/E,QAAQ,GAAG,CAAC,GAAW,KAAK,YAAY,CAAC,GAAG,EAAE,sBAAsB;;ACFjF;;;;ACAA;;;;;;"}