@signaltree/ng-forms 4.0.7 → 4.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/LICENSE +54 -0
  2. package/eslint.config.mjs +48 -0
  3. package/jest.config.ts +21 -0
  4. package/ng-package.json +8 -0
  5. package/package.json +6 -27
  6. package/project.json +48 -0
  7. package/src/audit/audit.ts +75 -0
  8. package/src/audit/index.ts +1 -0
  9. package/src/audit/ng-package.json +5 -0
  10. package/src/core/async-validators.ts +80 -0
  11. package/src/core/ng-forms.spec.ts +204 -0
  12. package/src/core/ng-forms.ts +1316 -0
  13. package/src/core/validators.ts +209 -0
  14. package/src/history/history.ts +169 -0
  15. package/src/history/index.ts +1 -0
  16. package/src/history/ng-package.json +5 -0
  17. package/src/index.ts +5 -0
  18. package/src/rxjs/index.ts +1 -0
  19. package/src/rxjs/ng-package.json +5 -0
  20. package/src/rxjs/public-api.ts +5 -0
  21. package/src/rxjs/rxjs-bridge.ts +75 -0
  22. package/src/test-setup.ts +6 -0
  23. package/src/types/signaltree-core.d.ts +11 -0
  24. package/src/wizard/index.ts +1 -0
  25. package/src/wizard/wizard.ts +145 -0
  26. package/tsconfig.json +33 -0
  27. package/tsconfig.lib.json +25 -0
  28. package/tsconfig.lib.prod.json +13 -0
  29. package/tsconfig.spec.json +17 -0
  30. package/fesm2022/signaltree-ng-forms-src-audit.mjs +0 -20
  31. package/fesm2022/signaltree-ng-forms-src-audit.mjs.map +0 -1
  32. package/fesm2022/signaltree-ng-forms-src-history.mjs +0 -113
  33. package/fesm2022/signaltree-ng-forms-src-history.mjs.map +0 -1
  34. package/fesm2022/signaltree-ng-forms-src-rxjs.mjs +0 -21
  35. package/fesm2022/signaltree-ng-forms-src-rxjs.mjs.map +0 -1
  36. package/fesm2022/signaltree-ng-forms.mjs +0 -1038
  37. package/fesm2022/signaltree-ng-forms.mjs.map +0 -1
  38. package/index.d.ts +0 -128
  39. package/src/audit/index.d.ts +0 -15
  40. package/src/history/index.d.ts +0 -24
  41. package/src/rxjs/index.d.ts +0 -6
@@ -1 +0,0 @@
1
- {"version":3,"file":"signaltree-ng-forms.mjs","sources":["../tmp-esm2022/core/ng-forms.js","../tmp-esm2022/core/validators.js","../tmp-esm2022/core/async-validators.js","../tmp-esm2022/history/history.js"],"sourcesContent":["import { computed, DestroyRef, Directive, effect, ElementRef, EventEmitter, forwardRef, HostListener, inject, Input, isSignal, Output, Renderer2, signal, } from '@angular/core';\nimport { FormArray, FormControl, FormGroup, NG_VALUE_ACCESSOR, } from '@angular/forms';\nimport { signalTree } from '@signaltree/core';\nimport { deepClone, matchPath, mergeDeep, parsePath } from '@signaltree/shared';\nimport { firstValueFrom, isObservable } from 'rxjs';\nimport * as i0 from \"@angular/core\";\nexport class FormValidationError extends Error {\n errors;\n asyncErrors;\n constructor(errors, asyncErrors) {\n super('Form validation failed');\n this.errors = errors;\n this.asyncErrors = asyncErrors;\n this.name = 'FormValidationError';\n }\n}\nconst SYNC_ERROR_KEY = 'signaltree';\nconst ASYNC_ERROR_KEY = 'signaltreeAsync';\nexport function createFormTree(initialValues, config = {}) {\n const { validators: baseValidators = {}, asyncValidators: baseAsyncValidators = {}, destroyRef: providedDestroyRef, fieldConfigs = {}, conditionals = [], persistKey, storage, persistDebounceMs = 100, validationBatchMs = 0, ...treeConfig } = config;\n const syncValidators = normalizeSyncValidators(baseValidators, fieldConfigs);\n const asyncValidators = normalizeAsyncValidators(baseAsyncValidators, fieldConfigs);\n const { values: hydratedInitialValues } = hydrateInitialValues(initialValues, persistKey, storage);\n const initialSnapshot = deepClone(hydratedInitialValues);\n const valuesTree = signalTree(hydratedInitialValues, treeConfig);\n assertTreeNode(valuesTree.state);\n const flattenedState = valuesTree.state;\n enhanceArraysRecursively(flattenedState);\n const formGroup = createAbstractControl(hydratedInitialValues, '', syncValidators, asyncValidators);\n const destroyRef = providedDestroyRef ?? tryInjectDestroyRef();\n const cleanupCallbacks = [];\n const errors = signal({}, ...(ngDevMode ? [{ debugName: \"errors\" }] : []));\n const asyncErrors = signal({}, ...(ngDevMode ? [{ debugName: \"asyncErrors\" }] : []));\n const touched = signal({}, ...(ngDevMode ? [{ debugName: \"touched\" }] : []));\n const asyncValidating = signal({}, ...(ngDevMode ? [{ debugName: \"asyncValidating\" }] : []));\n const dirty = signal(formGroup.dirty, ...(ngDevMode ? [{ debugName: \"dirty\" }] : []));\n const valid = signal(formGroup.valid && !formGroup.pending, ...(ngDevMode ? [{ debugName: \"valid\" }] : []));\n const submitting = signal(false, ...(ngDevMode ? [{ debugName: \"submitting\" }] : []));\n const refreshRunner = () => {\n const snapshot = collectControlSnapshot(formGroup);\n errors.set(snapshot.syncErrors);\n asyncErrors.set(snapshot.asyncErrors);\n touched.set(snapshot.touched);\n asyncValidating.set(snapshot.pending);\n dirty.set(formGroup.dirty);\n valid.set(formGroup.valid && !formGroup.pending);\n };\n let refreshTimer = null;\n const refreshAggregates = (immediate = false) => {\n if (immediate || validationBatchMs <= 0) {\n if (refreshTimer) {\n clearTimeout(refreshTimer);\n refreshTimer = null;\n }\n refreshRunner();\n return;\n }\n if (refreshTimer) {\n clearTimeout(refreshTimer);\n }\n refreshTimer = setTimeout(() => {\n refreshTimer = null;\n refreshRunner();\n }, validationBatchMs);\n };\n refreshAggregates(true);\n const persistController = createPersistController(formGroup, persistKey, storage, persistDebounceMs, cleanupCallbacks);\n persistController.persistImmediately();\n const fieldErrorKeys = new Set([\n ...Object.keys(syncValidators),\n ...Object.keys(asyncValidators),\n ]);\n const fieldErrors = {};\n const fieldAsyncErrors = {};\n fieldErrorKeys.forEach((fieldPath) => {\n fieldErrors[fieldPath] = computed(() => errors()[fieldPath]);\n fieldAsyncErrors[fieldPath] = computed(() => asyncErrors()[fieldPath]);\n });\n const fieldConfigLookup = (path) => resolveFieldConfig(fieldConfigs, path);\n const connectControlRecursive = (control, path) => {\n if (control instanceof FormGroup) {\n Object.entries(control.controls).forEach(([key, child]) => {\n connectControlRecursive(child, joinPath(path, key));\n });\n return;\n }\n if (control instanceof FormArray) {\n const arraySignal = getSignalAtPath(flattenedState, path);\n if (arraySignal) {\n connectFormArrayAndSignal(control, arraySignal, path, syncValidators, asyncValidators, cleanupCallbacks, connectControlRecursive);\n }\n control.controls.forEach((child, index) => {\n connectControlRecursive(child, joinPath(path, String(index)));\n });\n return;\n }\n const signalAtPath = getSignalAtPath(flattenedState, path);\n if (signalAtPath) {\n connectControlAndSignal(control, signalAtPath, cleanupCallbacks, fieldConfigLookup(path));\n }\n };\n connectControlRecursive(formGroup, '');\n const conditionalState = new Map();\n const applyConditionals = conditionals.length > 0\n ? () => {\n const values = formGroup.getRawValue();\n conditionals.forEach(({ when, fields }) => {\n let visible = true;\n try {\n visible = when(values);\n }\n catch {\n visible = true;\n }\n fields.forEach((fieldPath) => {\n const control = formGroup.get(fieldPath);\n if (!control) {\n return;\n }\n const previous = conditionalState.get(fieldPath);\n if (previous === visible) {\n return;\n }\n conditionalState.set(fieldPath, visible);\n if (visible) {\n control.enable({ emitEvent: false });\n }\n else {\n control.disable({ emitEvent: false });\n }\n });\n });\n }\n : () => undefined;\n applyConditionals();\n const aggregateSubscriptions = [];\n aggregateSubscriptions.push(formGroup.valueChanges.subscribe(() => {\n refreshAggregates();\n persistController.schedulePersist();\n applyConditionals();\n }));\n aggregateSubscriptions.push(formGroup.statusChanges.subscribe(() => refreshAggregates()));\n if (formGroup.events) {\n aggregateSubscriptions.push(formGroup.events.subscribe(() => refreshAggregates()));\n }\n cleanupCallbacks.push(() => {\n aggregateSubscriptions.forEach((sub) => sub.unsubscribe());\n if (refreshTimer) {\n clearTimeout(refreshTimer);\n }\n });\n if (destroyRef) {\n destroyRef.onDestroy(() => {\n cleanupCallbacks.splice(0).forEach((fn) => fn());\n });\n }\n const setValue = (field, value) => {\n const targetSignal = getSignalAtPath(flattenedState, field);\n const control = formGroup.get(field);\n if (targetSignal && 'set' in targetSignal) {\n targetSignal.set(value);\n }\n else if (control) {\n control.setValue(value, { emitEvent: true });\n }\n if (control) {\n const untypedControl = control;\n untypedControl.markAsTouched();\n untypedControl.markAsDirty();\n untypedControl.updateValueAndValidity({ emitEvent: true });\n }\n refreshAggregates(true);\n persistController.schedulePersist();\n };\n const setValues = (values) => {\n Object.entries(values).forEach(([key, value]) => {\n setValue(key, value);\n });\n };\n const reset = () => {\n formGroup.reset(initialSnapshot);\n submitting.set(false);\n refreshAggregates(true);\n persistController.persistImmediately();\n applyConditionals();\n };\n const validate = async (field) => {\n if (field) {\n const control = formGroup.get(field);\n if (!control) {\n return;\n }\n control.markAsTouched();\n control.updateValueAndValidity({ emitEvent: true });\n refreshAggregates(true);\n await waitForPending(control);\n refreshAggregates(true);\n return;\n }\n formGroup.markAllAsTouched();\n formGroup.updateValueAndValidity({ emitEvent: true });\n refreshAggregates(true);\n await waitForPending(formGroup);\n refreshAggregates(true);\n };\n const submit = async (submitFn) => {\n submitting.set(true);\n try {\n await validate();\n if (!valid()) {\n throw new FormValidationError(errors(), asyncErrors());\n }\n const currentValues = formGroup.getRawValue();\n const result = await submitFn(currentValues);\n return result;\n }\n finally {\n submitting.set(false);\n refreshAggregates(true);\n }\n };\n const destroy = () => {\n cleanupCallbacks.splice(0).forEach((fn) => fn());\n };\n const formTree = {\n state: flattenedState,\n $: flattenedState,\n form: formGroup,\n errors,\n asyncErrors,\n touched,\n asyncValidating,\n dirty,\n valid,\n submitting,\n unwrap: () => valuesTree(),\n setValue,\n setValues,\n reset,\n submit,\n validate,\n getFieldError: (field) => fieldErrors[field] || computed(() => undefined),\n getFieldAsyncError: (field) => fieldAsyncErrors[field] || computed(() => undefined),\n getFieldTouched: (field) => computed(() => formGroup.get(field)?.touched ?? false),\n isFieldValid: (field) => computed(() => {\n const control = formGroup.get(field);\n return !!control && control.valid && !control.pending;\n }),\n isFieldAsyncValidating: (field) => computed(() => !!formGroup.get(field)?.pending),\n fieldErrors,\n fieldAsyncErrors,\n values: valuesTree,\n destroy,\n };\n return formTree;\n}\nexport function createVirtualFormArray(items, visibleRange, controlFactory = (value) => new FormControl(value)) {\n const start = Math.max(0, visibleRange.start);\n const end = Math.max(start, visibleRange.end);\n const controls = items\n .slice(start, end)\n .map((item, offset) => controlFactory(item, start + offset));\n return new FormArray(controls);\n}\nfunction enhanceArraysRecursively(obj, visited = new WeakSet()) {\n if (visited.has(obj)) {\n return;\n }\n visited.add(obj);\n for (const key in obj) {\n const value = obj[key];\n if (isSignal(value)) {\n const signalValue = value();\n if (Array.isArray(signalValue)) {\n obj[key] = enhanceArray(value);\n }\n }\n else if (typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)) {\n enhanceArraysRecursively(value, visited);\n }\n }\n}\nconst enhanceArray = (arraySignal) => {\n const enhanced = arraySignal;\n enhanced.push = (item) => {\n arraySignal.update((arr) => [...arr, item]);\n };\n enhanced.removeAt = (index) => {\n arraySignal.update((arr) => arr.filter((_, i) => i !== index));\n };\n enhanced.setAt = (index, value) => {\n arraySignal.update((arr) => arr.map((item, i) => (i === index ? value : item)));\n };\n enhanced.insertAt = (index, item) => {\n arraySignal.update((arr) => [\n ...arr.slice(0, index),\n item,\n ...arr.slice(index),\n ]);\n };\n enhanced.move = (from, to) => {\n arraySignal.update((arr) => {\n const newArr = [...arr];\n const [item] = newArr.splice(from, 1);\n if (item !== undefined) {\n newArr.splice(to, 0, item);\n }\n return newArr;\n });\n };\n enhanced.clear = () => {\n arraySignal.set([]);\n };\n return enhanced;\n};\nfunction getSignalAtPath(node, path) {\n if (!path) {\n return null;\n }\n const segments = parsePath(path);\n let current = node;\n for (const segment of segments) {\n if (!current || typeof current !== 'object') {\n return null;\n }\n current = current[segment];\n }\n if (isSignal(current)) {\n return current;\n }\n return null;\n}\nfunction joinPath(parent, segment) {\n return parent ? `${parent}.${segment}` : segment;\n}\nfunction wrapSyncValidator(validator) {\n return (control) => {\n const result = validator(control.value);\n return result ? { [SYNC_ERROR_KEY]: result } : null;\n };\n}\nfunction wrapAsyncValidator(validator) {\n return async (control) => {\n try {\n const maybeAsync = validator(control.value);\n const resolved = isObservable(maybeAsync)\n ? await firstValueFrom(maybeAsync)\n : await maybeAsync;\n return resolved ? { [ASYNC_ERROR_KEY]: resolved } : null;\n }\n catch {\n return { [ASYNC_ERROR_KEY]: 'Validation error' };\n }\n };\n}\nfunction createAbstractControl(value, path, validators, asyncValidators) {\n const syncValidator = findValidator(validators, path);\n const asyncValidator = findValidator(asyncValidators, path);\n const syncFns = syncValidator\n ? [wrapSyncValidator(syncValidator)]\n : undefined;\n const asyncFns = asyncValidator\n ? [wrapAsyncValidator(asyncValidator)]\n : undefined;\n if (Array.isArray(value)) {\n const controls = value.map((item, index) => createAbstractControl(item, joinPath(path, String(index)), validators, asyncValidators));\n return new FormArray(controls, syncFns, asyncFns);\n }\n if (isPlainObject(value)) {\n const controls = {};\n for (const [key, child] of Object.entries(value)) {\n controls[key] = createAbstractControl(child, joinPath(path, key), validators, asyncValidators);\n }\n return new FormGroup(controls, {\n validators: syncFns,\n asyncValidators: asyncFns,\n });\n }\n return new FormControl(value, {\n validators: syncFns,\n asyncValidators: asyncFns,\n nonNullable: false,\n });\n}\nfunction connectControlAndSignal(control, valueSignal, cleanupCallbacks, fieldConfig) {\n let updatingFromControl = false;\n let updatingFromSignal = false;\n let versionCounter = 0;\n let lastControlVersion = 0;\n let controlDebounceTimer = null;\n const debounceMs = fieldConfig?.debounceMs ?? 0;\n const originalSet = valueSignal.set.bind(valueSignal);\n const originalUpdate = valueSignal.update.bind(valueSignal);\n const applyControlValue = (value) => {\n updatingFromSignal = true;\n if (!Object.is(control.value, value)) {\n const untypedControl = control;\n untypedControl.setValue(value, { emitEvent: true });\n untypedControl.markAsDirty();\n }\n updatingFromSignal = false;\n };\n valueSignal.set = (value) => {\n const currentVersion = ++versionCounter;\n originalSet(value);\n if (updatingFromControl) {\n return;\n }\n if (lastControlVersion > currentVersion) {\n return;\n }\n applyControlValue(value);\n };\n valueSignal.update = (updater) => {\n const next = updater(valueSignal());\n valueSignal.set(next);\n };\n const pushUpdateFromControl = (value) => {\n updatingFromControl = true;\n lastControlVersion = ++versionCounter;\n originalSet(value);\n updatingFromControl = false;\n };\n const handleControlChange = (value) => {\n if (updatingFromSignal) {\n return;\n }\n if (debounceMs > 0) {\n if (controlDebounceTimer) {\n clearTimeout(controlDebounceTimer);\n }\n controlDebounceTimer = setTimeout(() => {\n controlDebounceTimer = null;\n pushUpdateFromControl(value);\n }, debounceMs);\n return;\n }\n pushUpdateFromControl(value);\n };\n const subscription = control.valueChanges.subscribe((value) => {\n handleControlChange(value);\n });\n cleanupCallbacks.push(() => {\n subscription.unsubscribe();\n valueSignal.set = originalSet;\n valueSignal.update = originalUpdate;\n if (controlDebounceTimer) {\n clearTimeout(controlDebounceTimer);\n }\n });\n}\nfunction connectFormArrayAndSignal(formArray, arraySignal, path, validators, asyncValidators, cleanupCallbacks, connectControlRecursive) {\n let updatingFromControl = false;\n let updatingFromSignal = false;\n const originalSet = arraySignal.set.bind(arraySignal);\n const originalUpdate = arraySignal.update.bind(arraySignal);\n arraySignal.set = (value) => {\n originalSet(value);\n if (updatingFromControl) {\n return;\n }\n updatingFromSignal = true;\n syncFormArrayFromValue(formArray, value, path, validators, asyncValidators, connectControlRecursive);\n formArray.markAsDirty();\n updatingFromSignal = false;\n };\n arraySignal.update = (updater) => {\n const next = updater(arraySignal());\n arraySignal.set(next);\n };\n const subscription = formArray.valueChanges.subscribe((value) => {\n if (updatingFromSignal) {\n return;\n }\n updatingFromControl = true;\n originalSet(value);\n updatingFromControl = false;\n });\n cleanupCallbacks.push(() => {\n subscription.unsubscribe();\n arraySignal.set = originalSet;\n arraySignal.update = originalUpdate;\n });\n syncFormArrayFromValue(formArray, arraySignal(), path, validators, asyncValidators, connectControlRecursive);\n}\nfunction syncFormArrayFromValue(formArray, nextValue, path, validators, asyncValidators, connectControlRecursive) {\n if (!Array.isArray(nextValue)) {\n nextValue = [];\n }\n while (formArray.length > nextValue.length) {\n formArray.removeAt(formArray.length - 1);\n }\n nextValue.forEach((item, index) => {\n const childPath = joinPath(path, String(index));\n const existing = formArray.at(index);\n if (!existing) {\n const control = createAbstractControl(item, childPath, validators, asyncValidators);\n formArray.insert(index, control);\n connectControlRecursive(control, childPath);\n return;\n }\n if (existing instanceof FormArray) {\n syncFormArrayFromValue(existing, Array.isArray(item) ? item : [], childPath, validators, asyncValidators, connectControlRecursive);\n return;\n }\n if (existing instanceof FormGroup) {\n if (isPlainObject(item)) {\n existing.setValue(item, {\n emitEvent: false,\n });\n }\n return;\n }\n if (!Object.is(existing.value, item)) {\n const untypedExisting = existing;\n untypedExisting.setValue(item, { emitEvent: false });\n }\n });\n}\nfunction collectControlSnapshot(control) {\n const snapshot = {\n syncErrors: {},\n asyncErrors: {},\n touched: {},\n pending: {},\n };\n traverseControls(control, (currentPath, currentControl) => {\n if (!currentPath) {\n return;\n }\n if (currentControl.touched) {\n snapshot.touched[currentPath] = true;\n }\n if (currentControl.pending) {\n snapshot.pending[currentPath] = true;\n }\n const errors = currentControl.errors;\n if (!errors) {\n return;\n }\n const syncMessage = errors[SYNC_ERROR_KEY];\n if (typeof syncMessage === 'string') {\n snapshot.syncErrors[currentPath] = syncMessage;\n }\n const asyncMessage = errors[ASYNC_ERROR_KEY];\n if (typeof asyncMessage === 'string') {\n snapshot.asyncErrors[currentPath] = asyncMessage;\n }\n }, '');\n return snapshot;\n}\nfunction traverseControls(control, visitor, path = '') {\n visitor(path, control);\n if (control instanceof FormGroup) {\n Object.entries(control.controls).forEach(([key, child]) => {\n traverseControls(child, visitor, joinPath(path, key));\n });\n return;\n }\n if (control instanceof FormArray) {\n control.controls.forEach((child, index) => {\n traverseControls(child, visitor, joinPath(path, String(index)));\n });\n }\n}\nfunction waitForPending(control) {\n if (!control.pending) {\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n const subscription = control.statusChanges.subscribe(() => {\n if (!control.pending) {\n subscription.unsubscribe();\n resolve();\n }\n });\n });\n}\nfunction isPlainObject(value) {\n return (!!value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n Object.prototype.toString.call(value) === '[object Object]');\n}\nfunction tryInjectDestroyRef() {\n try {\n return inject(DestroyRef);\n }\n catch {\n return null;\n }\n}\nfunction normalizeSyncValidators(base, fieldConfigs) {\n const buckets = new Map();\n for (const [path, validator] of Object.entries(base)) {\n const existing = buckets.get(path) ?? [];\n existing.push(validator);\n buckets.set(path, existing);\n }\n for (const [path, config] of Object.entries(fieldConfigs)) {\n const validators = toValidatorArray(config.validators);\n if (validators.length === 0) {\n continue;\n }\n const existing = buckets.get(path) ?? [];\n existing.push(...validators);\n buckets.set(path, existing);\n }\n const normalized = {};\n buckets.forEach((validators, path) => {\n normalized[path] = (value) => {\n for (const validator of validators) {\n const result = validator(value);\n if (result) {\n return result;\n }\n }\n return null;\n };\n });\n return { ...base, ...normalized };\n}\nfunction normalizeAsyncValidators(base, fieldConfigs) {\n const buckets = new Map();\n for (const [path, validator] of Object.entries(base)) {\n const existing = buckets.get(path) ?? [];\n existing.push(validator);\n buckets.set(path, existing);\n }\n for (const [path, config] of Object.entries(fieldConfigs)) {\n const validators = toValidatorArray(config.asyncValidators);\n if (validators.length === 0) {\n continue;\n }\n const existing = buckets.get(path) ?? [];\n existing.push(...validators);\n buckets.set(path, existing);\n }\n const normalized = {};\n buckets.forEach((validators, path) => {\n normalized[path] = async (value) => {\n for (const validator of validators) {\n const maybeAsync = validator(value);\n const result = isObservable(maybeAsync)\n ? await firstValueFrom(maybeAsync)\n : await maybeAsync;\n if (result) {\n return result;\n }\n }\n return null;\n };\n });\n return { ...base, ...normalized };\n}\nfunction toValidatorArray(input) {\n if (!input) {\n return [];\n }\n if (Array.isArray(input)) {\n return input;\n }\n return Object.values(input);\n}\nfunction hydrateInitialValues(initialValues, persistKey, storage) {\n const baseClone = deepClone(initialValues);\n if (!persistKey || !storage) {\n return { values: baseClone };\n }\n try {\n const storedRaw = storage.getItem(persistKey);\n if (!storedRaw) {\n return { values: baseClone };\n }\n const parsed = JSON.parse(storedRaw);\n const merged = mergeDeep(baseClone, parsed);\n return { values: merged };\n }\n catch {\n return { values: baseClone };\n }\n}\nfunction assertTreeNode(state) {\n if (!state || typeof state !== 'object') {\n throw new Error('Invalid state structure for form tree');\n }\n}\nfunction resolveFieldConfig(fieldConfigs, path) {\n if (fieldConfigs[path]) {\n return fieldConfigs[path];\n }\n const keys = Object.keys(fieldConfigs);\n let match;\n for (const key of keys) {\n if (!key.includes('*')) {\n continue;\n }\n if (matchPath(key, path)) {\n if (!match || match.key.length < key.length) {\n match = { key, config: fieldConfigs[key] };\n }\n }\n }\n if (match) {\n return match.config;\n }\n return fieldConfigs['*'];\n}\nfunction findValidator(map, path) {\n if (map[path]) {\n return map[path];\n }\n let candidate;\n for (const key of Object.keys(map)) {\n if (!key.includes('*')) {\n continue;\n }\n if (matchPath(key, path)) {\n if (!candidate || candidate.key.length < key.length) {\n candidate = { key, value: map[key] };\n }\n }\n }\n if (candidate) {\n return candidate.value;\n }\n return map['*'];\n}\nfunction createPersistController(formGroup, persistKey, storage, debounceMs, cleanupCallbacks) {\n if (!persistKey || !storage) {\n return {\n schedulePersist: () => undefined,\n persistImmediately: () => undefined,\n };\n }\n let timer = null;\n const persist = () => {\n try {\n const payload = JSON.stringify(formGroup.getRawValue());\n storage.setItem(persistKey, payload);\n }\n catch {\n }\n };\n const schedulePersist = () => {\n if (debounceMs <= 0) {\n persist();\n return;\n }\n if (timer) {\n clearTimeout(timer);\n }\n timer = setTimeout(() => {\n timer = null;\n persist();\n }, debounceMs);\n };\n cleanupCallbacks.push(() => {\n if (timer) {\n clearTimeout(timer);\n }\n });\n return {\n schedulePersist,\n persistImmediately: persist,\n };\n}\nexport class SignalValueDirective {\n signalTreeSignalValue;\n signalTreeSignalValueChange = new EventEmitter();\n elementRef = inject(ElementRef);\n renderer = inject(Renderer2);\n onChange = () => {\n };\n onTouched = () => {\n };\n ngOnInit() {\n effect(() => {\n const value = this.signalTreeSignalValue();\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', value);\n });\n }\n handleChange(event) {\n const target = event.target;\n const value = target?.value;\n if (value !== undefined) {\n this.signalTreeSignalValue.set(value);\n this.signalTreeSignalValueChange.emit(value);\n this.onChange(value);\n }\n }\n handleBlur() {\n this.onTouched();\n }\n writeValue(value) {\n if (value !== undefined) {\n this.signalTreeSignalValue.set(value);\n }\n }\n registerOnChange(fn) {\n this.onChange = fn;\n }\n registerOnTouched(fn) {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled) {\n this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', isDisabled);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.7\", ngImport: i0, type: SignalValueDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.3.7\", type: SignalValueDirective, isStandalone: true, selector: \"[signalTreeSignalValue]\", inputs: { signalTreeSignalValue: \"signalTreeSignalValue\" }, outputs: { signalTreeSignalValueChange: \"signalTreeSignalValueChange\" }, host: { listeners: { \"input\": \"handleChange($event)\", \"change\": \"handleChange($event)\", \"blur\": \"handleBlur()\" } }, providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SignalValueDirective),\n multi: true,\n },\n ], ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.7\", ngImport: i0, type: SignalValueDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[signalTreeSignalValue]',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SignalValueDirective),\n multi: true,\n },\n ],\n standalone: true,\n }]\n }], propDecorators: { signalTreeSignalValue: [{\n type: Input\n }], signalTreeSignalValueChange: [{\n type: Output\n }], handleChange: [{\n type: HostListener,\n args: ['input', ['$event']]\n }, {\n type: HostListener,\n args: ['change', ['$event']]\n }], handleBlur: [{\n type: HostListener,\n args: ['blur']\n }] } });\nexport const SIGNAL_FORM_DIRECTIVES = [SignalValueDirective];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctZm9ybXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy1mb3Jtcy9zcmMvY29yZS9uZy1mb3Jtcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsUUFBUSxFQUNSLFVBQVUsRUFDVixTQUFTLEVBQ1QsTUFBTSxFQUNOLFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFFUixNQUFNLEVBQ04sU0FBUyxFQUVULE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBSUwsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1QsaUJBQWlCLEdBR2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRixPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBNEIsTUFBTSxNQUFNLENBQUM7O0FBc0c5RSxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsS0FBSztJQUUxQjtJQUNBO0lBRmxCLFlBQ2tCLE1BQThCLEVBQzlCLFdBQW1DO1FBRW5ELEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBSGhCLFdBQU0sR0FBTixNQUFNLENBQXdCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxDQUF3QjtRQUduRCxJQUFJLENBQUMsSUFBSSxHQUFHLHFCQUFxQixDQUFDO0lBQ3BDLENBQUM7Q0FDRjtBQUtELE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQztBQUNwQyxNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQztBQVUxQyxNQUFNLFVBQVUsY0FBYyxDQUM1QixhQUFnQixFQUNoQixTQUE2QixFQUFFO0lBRS9CLE1BQU0sRUFD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RUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHFCQUFxQixDQUFDOzRCQUNuRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtvQkFDRCxVQUFVLEVBQUUsSUFBSTtpQkFDakI7O3NCQUVFLEtBQUs7O3NCQUNMLE1BQU07O3NCQW1CTixZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQzs7c0JBQ2hDLFlBQVk7dUJBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDOztzQkFXakMsWUFBWTt1QkFBQyxNQUFNOztBQWdDdEIsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgY29tcHV0ZWQsXG4gIERlc3Ryb3lSZWYsXG4gIERpcmVjdGl2ZSxcbiAgZWZmZWN0LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgaXNTaWduYWwsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFNpZ25hbCxcbiAgc2lnbmFsLFxuICBXcml0YWJsZVNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIEFzeW5jVmFsaWRhdG9yRm4gYXMgQW5ndWxhckFzeW5jVmFsaWRhdG9yRm4sXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBGb3JtQXJyYXksXG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXAsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3JGbiBhcyBBbmd1bGFyVmFsaWRhdG9yRm4sXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHNpZ25hbFRyZWUgfSBmcm9tICdAc2lnbmFsdHJlZS9jb3JlJztcbmltcG9ydCB7IGRlZXBDbG9uZSwgbWF0Y2hQYXRoLCBtZXJnZURlZXAsIHBhcnNlUGF0aCB9IGZyb20gJ0BzaWduYWx0cmVlL3NoYXJlZCc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgaXNPYnNlcnZhYmxlLCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IEFuZ3VsYXIgRm9ybXMgSW50ZWdyYXRpb24gZm9yIFNpZ25hbFRyZWVcbiAqXG4gKiBQcm92aWRlcyBjb21wcmVoZW5zaXZlIEFuZ3VsYXIgZm9ybSBpbnRlZ3JhdGlvbiBpbmNsdWRpbmcgRm9ybVRyZWUsXG4gKiBkaXJlY3RpdmVzLCB2YWxpZGF0b3JzLCBlbmhhbmNlZCBhcnJheSBvcGVyYXRpb25zLCBhbmQgUnhKUyBicmlkZ2UuXG4gKi9cblxuLy8gUmUtZXhwb3J0IGNvcmUgdHlwZXMgbmVlZGVkIGZvciBmb3Jtc1xuaW1wb3J0IHR5cGUgeyBTaWduYWxUcmVlLCBUcmVlQ29uZmlnLCBUcmVlTm9kZSB9IGZyb20gJ0BzaWduYWx0cmVlL2NvcmUnO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEZPUk0gVFJFRSBUWVBFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUgRm9ybVRyZWVBc3luY1ZhbGlkYXRvckZuPFQ+ID0gKFxuICB2YWx1ZTogVFxuKSA9PiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+IHwgUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcblxuZXhwb3J0IHR5cGUgRW5oYW5jZWRBcnJheVNpZ25hbDxUPiA9IFdyaXRhYmxlU2lnbmFsPFRbXT4gJiB7XG4gIHB1c2g6IChpdGVtOiBUKSA9PiB2b2lkO1xuICByZW1vdmVBdDogKGluZGV4OiBudW1iZXIpID0+IHZvaWQ7XG4gIHNldEF0OiAoaW5kZXg6IG51bWJlciwgdmFsdWU6IFQpID0+IHZvaWQ7XG4gIGluc2VydEF0OiAoaW5kZXg6IG51bWJlciwgaXRlbTogVCkgPT4gdm9pZDtcbiAgbW92ZTogKGZyb206IG51bWJlciwgdG86IG51bWJlcikgPT4gdm9pZDtcbiAgY2xlYXI6ICgpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgdHlwZSBGaWVsZFZhbGlkYXRvciA9ICh2YWx1ZTogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVsbDtcblxuZXhwb3J0IGludGVyZmFjZSBGaWVsZENvbmZpZyB7XG4gIGRlYm91bmNlTXM/OiBudW1iZXI7XG4gIHZhbGlkYXRvcnM/OiBSZWNvcmQ8c3RyaW5nLCBGaWVsZFZhbGlkYXRvcj4gfCBGaWVsZFZhbGlkYXRvcltdO1xuICBhc3luY1ZhbGlkYXRvcnM/OlxuICAgIHwgUmVjb3JkPHN0cmluZywgRm9ybVRyZWVBc3luY1ZhbGlkYXRvckZuPHVua25vd24+PlxuICAgIHwgQXJyYXk8Rm9ybVRyZWVBc3luY1ZhbGlkYXRvckZuPHVua25vd24+Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25kaXRpb25hbEZpZWxkPFQ+IHtcbiAgd2hlbjogKHZhbHVlczogVCkgPT4gYm9vbGVhbjtcbiAgZmllbGRzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtVHJlZU9wdGlvbnM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxuICBleHRlbmRzIFRyZWVDb25maWcge1xuICB2YWxpZGF0b3JzPzogU3luY1ZhbGlkYXRvck1hcDtcbiAgYXN5bmNWYWxpZGF0b3JzPzogQXN5bmNWYWxpZGF0b3JNYXA7XG4gIGRlc3Ryb3lSZWY/OiBEZXN0cm95UmVmO1xuICBmaWVsZENvbmZpZ3M/OiBSZWNvcmQ8c3RyaW5nLCBGaWVsZENvbmZpZz47XG4gIGNvbmRpdGlvbmFscz86IEFycmF5PENvbmRpdGlvbmFsRmllbGQ8VD4+O1xuICBwZXJzaXN0S2V5Pzogc3RyaW5nO1xuICBzdG9yYWdlPzogUGljazxTdG9yYWdlLCAnZ2V0SXRlbScgfCAnc2V0SXRlbScgfCAncmVtb3ZlSXRlbSc+O1xuICBwZXJzaXN0RGVib3VuY2VNcz86IG51bWJlcjtcbiAgdmFsaWRhdGlvbkJhdGNoTXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogRm9ybSB0cmVlIHR5cGUgdGhhdCBmbGF0dGVucyB0aGUgc3RhdGUgYWNjZXNzIHdoaWxlIG1haW50YWluaW5nIGZvcm0tc3BlY2lmaWMgcHJvcGVydGllc1xuICovXG5leHBvcnQgdHlwZSBGb3JtVHJlZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID0ge1xuICAvLyBGbGF0dGVuZWQgc3RhdGUgYWNjZXNzIC0gZGlyZWN0IGFjY2VzcyB0byBmb3JtIHZhbHVlcyBhcyBzaWduYWxzXG4gIHN0YXRlOiBUcmVlTm9kZTxUPjtcbiAgJDogVHJlZU5vZGU8VD47IC8vIEFsaWFzIGZvciBzdGF0ZVxuXG4gIC8vIFVuZGVybHlpbmcgQW5ndWxhciBmb3JtIHN0cnVjdHVyZVxuICBmb3JtOiBGb3JtR3JvdXA7XG5cbiAgLy8gRm9ybS1zcGVjaWZpYyBzaWduYWxzXG4gIGVycm9yczogV3JpdGFibGVTaWduYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gIGFzeW5jRXJyb3JzOiBXcml0YWJsZVNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgdG91Y2hlZDogV3JpdGFibGVTaWduYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+O1xuICBhc3luY1ZhbGlkYXRpbmc6IFdyaXRhYmxlU2lnbmFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+PjtcbiAgZGlydHk6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+O1xuICB2YWxpZDogV3JpdGFibGVTaWduYWw8Ym9vbGVhbj47XG4gIHN1Ym1pdHRpbmc6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+O1xuXG4gIC8vIEZvcm0gbWV0aG9kc1xuICB1bndyYXAoKTogVDtcbiAgc2V0VmFsdWUoZmllbGQ6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICBzZXRWYWx1ZXModmFsdWVzOiBQYXJ0aWFsPFQ+KTogdm9pZDtcbiAgcmVzZXQoKTogdm9pZDtcbiAgc3VibWl0PFRSZXN1bHQ+KHN1Ym1pdEZuOiAodmFsdWVzOiBUKSA9PiBQcm9taXNlPFRSZXN1bHQ+KTogUHJvbWlzZTxUUmVzdWx0PjtcbiAgdmFsaWRhdGUoZmllbGQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8vIEZpZWxkLWxldmVsIGhlbHBlcnNcbiAgZ2V0RmllbGRFcnJvcihmaWVsZDogc3RyaW5nKTogU2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIGdldEZpZWxkQXN5bmNFcnJvcihmaWVsZDogc3RyaW5nKTogU2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIGdldEZpZWxkVG91Y2hlZChmaWVsZDogc3RyaW5nKTogU2lnbmFsPGJvb2xlYW4gfCB1bmRlZmluZWQ+O1xuICBpc0ZpZWxkVmFsaWQoZmllbGQ6IHN0cmluZyk6IFNpZ25hbDxib29sZWFuPjtcbiAgaXNGaWVsZEFzeW5jVmFsaWRhdGluZyhmaWVsZDogc3RyaW5nKTogU2lnbmFsPGJvb2xlYW4gfCB1bmRlZmluZWQ+O1xuXG4gIC8vIERpcmVjdCBhY2Nlc3MgdG8gZmllbGQgZXJyb3JzXG4gIGZpZWxkRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBTaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPj47XG4gIGZpZWxkQXN5bmNFcnJvcnM6IFJlY29yZDxzdHJpbmcsIFNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+PjtcblxuICAvLyBLZWVwIHZhbHVlcyB0cmVlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gIHZhbHVlczogU2lnbmFsVHJlZTxUPjtcblxuICAvLyBDbGVhbnVwIGhlbHBlcnMgdG8gdGVhciBkb3duIHN1YnNjcmlwdGlvbnMgY3JlYXRlZCBmb3IgYnJpZGdlIGxheWVyXG4gIGRlc3Ryb3koKTogdm9pZDtcbn07XG5cbmV4cG9ydCBjbGFzcyBGb3JtVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIHB1YmxpYyByZWFkb25seSBhc3luY0Vycm9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICApIHtcbiAgICBzdXBlcignRm9ybSB2YWxpZGF0aW9uIGZhaWxlZCcpO1xuICAgIHRoaXMubmFtZSA9ICdGb3JtVmFsaWRhdGlvbkVycm9yJztcbiAgfVxufVxuXG50eXBlIFN5bmNWYWxpZGF0b3JNYXAgPSBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IHVua25vd24pID0+IHN0cmluZyB8IG51bGw+O1xudHlwZSBBc3luY1ZhbGlkYXRvck1hcCA9IFJlY29yZDxzdHJpbmcsIEZvcm1UcmVlQXN5bmNWYWxpZGF0b3JGbjx1bmtub3duPj47XG5cbmNvbnN0IFNZTkNfRVJST1JfS0VZID0gJ3NpZ25hbHRyZWUnO1xuY29uc3QgQVNZTkNfRVJST1JfS0VZID0gJ3NpZ25hbHRyZWVBc3luYyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVVElMSVRZIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEZPUk0gVFJFRSBJTVBMRU1FTlRBVElPTlxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZvcm1UcmVlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gIGluaXRpYWxWYWx1ZXM6IFQsXG4gIGNvbmZpZzogRm9ybVRyZWVPcHRpb25zPFQ+ID0ge31cbik6IEZvcm1UcmVlPFQ+IHtcbiAgY29uc3Qge1xuICAgIHZhbGlkYXRvcnM6IGJhc2VWYWxpZGF0b3JzID0ge30sXG4gICAgYXN5bmNWYWxpZGF0b3JzOiBiYXNlQXN5bmNWYWxpZGF0b3JzID0ge30sXG4gICAgZGVzdHJveVJlZjogcHJvdmlkZWREZXN0cm95UmVmLFxuICAgIGZpZWxkQ29uZmlncyA9IHt9LFxuICAgIGNvbmRpdGlvbmFscyA9IFtdLFxuICAgIHBlcnNpc3RLZXksXG4gICAgc3RvcmFnZSxcbiAgICBwZXJzaXN0RGVib3VuY2VNcyA9IDEwMCxcbiAgICB2YWxpZGF0aW9uQmF0Y2hNcyA9IDAsXG4gICAgLi4udHJlZUNvbmZpZ1xuICB9ID0gY29uZmlnO1xuXG4gIGNvbnN0IHN5bmNWYWxpZGF0b3JzID0gbm9ybWFsaXplU3luY1ZhbGlkYXRvcnMoYmFzZVZhbGlkYXRvcnMsIGZpZWxkQ29uZmlncyk7XG4gIGNvbnN0IGFzeW5jVmFsaWRhdG9ycyA9IG5vcm1hbGl6ZUFzeW5jVmFsaWRhdG9ycyhcbiAgICBiYXNlQXN5bmNWYWxpZGF0b3JzLFxuICAgIGZpZWxkQ29uZmlnc1xuICApO1xuXG4gIGNvbnN0IHsgdmFsdWVzOiBoeWRyYXRlZEluaXRpYWxWYWx1ZXMgfSA9IGh5ZHJhdGVJbml0aWFsVmFsdWVzKFxuICAgIGluaXRpYWxWYWx1ZXMsXG4gICAgcGVyc2lzdEtleSxcbiAgICBzdG9yYWdlXG4gICk7XG4gIGNvbnN0IGluaXRpYWxTbmFwc2hvdCA9IGRlZXBDbG9uZShoeWRyYXRlZEluaXRpYWxWYWx1ZXMpO1xuXG4gIGNvbnN0IHZhbHVlc1RyZWUgPSBzaWduYWxUcmVlKGh5ZHJhdGVkSW5pdGlhbFZhbHVlcywgdHJlZUNvbmZpZyk7XG4gIGFzc2VydFRyZWVOb2RlPFQ+KHZhbHVlc1RyZWUuc3RhdGUpO1xuICBjb25zdCBmbGF0dGVuZWRTdGF0ZSA9IHZhbHVlc1RyZWUuc3RhdGU7XG5cbiAgZW5oYW5jZUFycmF5c1JlY3Vyc2l2ZWx5KFxuICAgIGZsYXR0ZW5lZFN0YXRlIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTtcblxuICBjb25zdCBmb3JtR3JvdXAgPSBjcmVhdGVBYnN0cmFjdENvbnRyb2woXG4gICAgaHlkcmF0ZWRJbml0aWFsVmFsdWVzLFxuICAgICcnLFxuICAgIHN5bmNWYWxpZGF0b3JzLFxuICAgIGFzeW5jVmFsaWRhdG9yc1xuICApIGFzIEZvcm1Hcm91cDtcblxuICBjb25zdCBkZXN0cm95UmVmID0gcHJvdmlkZWREZXN0cm95UmVmID8/IHRyeUluamVjdERlc3Ryb3lSZWYoKTtcbiAgY29uc3QgY2xlYW51cENhbGxiYWNrczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcblxuICBjb25zdCBlcnJvcnMgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oe30pO1xuICBjb25zdCBhc3luY0Vycm9ycyA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pih7fSk7XG4gIGNvbnN0IHRvdWNoZWQgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+KHt9KTtcbiAgY29uc3QgYXN5bmNWYWxpZGF0aW5nID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+Pih7fSk7XG4gIGNvbnN0IGRpcnR5ID0gc2lnbmFsKGZvcm1Hcm91cC5kaXJ0eSk7XG4gIGNvbnN0IHZhbGlkID0gc2lnbmFsKGZvcm1Hcm91cC52YWxpZCAmJiAhZm9ybUdyb3VwLnBlbmRpbmcpO1xuICBjb25zdCBzdWJtaXR0aW5nID0gc2lnbmFsKGZhbHNlKTtcblxuICBjb25zdCByZWZyZXNoUnVubmVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gY29sbGVjdENvbnRyb2xTbmFwc2hvdChmb3JtR3JvdXApO1xuICAgIGVycm9ycy5zZXQoc25hcHNob3Quc3luY0Vycm9ycyk7XG4gICAgYXN5bmNFcnJvcnMuc2V0KHNuYXBzaG90LmFzeW5jRXJyb3JzKTtcbiAgICB0b3VjaGVkLnNldChzbmFwc2hvdC50b3VjaGVkKTtcbiAgICBhc3luY1ZhbGlkYXRpbmcuc2V0KHNuYXBzaG90LnBlbmRpbmcpO1xuICAgIGRpcnR5LnNldChmb3JtR3JvdXAuZGlydHkpO1xuICAgIHZhbGlkLnNldChmb3JtR3JvdXAudmFsaWQgJiYgIWZvcm1Hcm91cC5wZW5kaW5nKTtcbiAgfTtcblxuICBsZXQgcmVmcmVzaFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBjb25zdCByZWZyZXNoQWdncmVnYXRlcyA9IChpbW1lZGlhdGUgPSBmYWxzZSkgPT4ge1xuICAgIGlmIChpbW1lZGlhdGUgfHwgdmFsaWRhdGlvbkJhdGNoTXMgPD0gMCkge1xuICAgICAgaWYgKHJlZnJlc2hUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQocmVmcmVzaFRpbWVyKTtcbiAgICAgICAgcmVmcmVzaFRpbWVyID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJlZnJlc2hSdW5uZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocmVmcmVzaFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQocmVmcmVzaFRpbWVyKTtcbiAgICB9XG5cbiAgICByZWZyZXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJlZnJlc2hUaW1lciA9IG51bGw7XG4gICAgICByZWZyZXNoUnVubmVyKCk7XG4gICAgfSwgdmFsaWRhdGlvbkJhdGNoTXMpO1xuICB9O1xuXG4gIHJlZnJlc2hBZ2dyZWdhdGVzKHRydWUpO1xuXG4gIGNvbnN0IHBlcnNpc3RDb250cm9sbGVyID0gY3JlYXRlUGVyc2lzdENvbnRyb2xsZXIoXG4gICAgZm9ybUdyb3VwLFxuICAgIHBlcnNpc3RLZXksXG4gICAgc3RvcmFnZSxcbiAgICBwZXJzaXN0RGVib3VuY2VNcyxcbiAgICBjbGVhbnVwQ2FsbGJhY2tzXG4gICk7XG4gIHBlcnNpc3RDb250cm9sbGVyLnBlcnNpc3RJbW1lZGlhdGVseSgpO1xuXG4gIGNvbnN0IGZpZWxkRXJyb3JLZXlzID0gbmV3IFNldChbXG4gICAgLi4uT2JqZWN0LmtleXMoc3luY1ZhbGlkYXRvcnMpLFxuICAgIC4uLk9iamVjdC5rZXlzKGFzeW5jVmFsaWRhdG9ycyksXG4gIF0pO1xuXG4gIGNvbnN0IGZpZWxkRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBTaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPj4gPSB7fTtcbiAgY29uc3QgZmllbGRBc3luY0Vycm9yczogUmVjb3JkPHN0cmluZywgU2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4+ID0ge307XG5cbiAgZmllbGRFcnJvcktleXMuZm9yRWFjaCgoZmllbGRQYXRoKSA9PiB7XG4gICAgZmllbGRFcnJvcnNbZmllbGRQYXRoXSA9IGNvbXB1dGVkKCgpID0+IGVycm9ycygpW2ZpZWxkUGF0aF0pO1xuICAgIGZpZWxkQXN5bmNFcnJvcnNbZmllbGRQYXRoXSA9IGNvbXB1dGVkKCgpID0+IGFzeW5jRXJyb3JzKClbZmllbGRQYXRoXSk7XG4gIH0pO1xuXG4gIGNvbnN0IGZpZWxkQ29uZmlnTG9va3VwID0gKHBhdGg6IHN0cmluZykgPT5cbiAgICByZXNvbHZlRmllbGRDb25maWcoZmllbGRDb25maWdzLCBwYXRoKTtcblxuICBjb25zdCBjb25uZWN0Q29udHJvbFJlY3Vyc2l2ZSA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIHBhdGg6IHN0cmluZykgPT4ge1xuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICBPYmplY3QuZW50cmllcyhjb250cm9sLmNvbnRyb2xzKS5mb3JFYWNoKChba2V5LCBjaGlsZF0pID0+IHtcbiAgICAgICAgY29ubmVjdENvbnRyb2xSZWN1cnNpdmUoY2hpbGQsIGpvaW5QYXRoKHBhdGgsIGtleSkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgIGNvbnN0IGFycmF5U2lnbmFsID0gZ2V0U2lnbmFsQXRQYXRoKGZsYXR0ZW5lZFN0YXRlLCBwYXRoKTtcbiAgICAgIGlmIChhcnJheVNpZ25hbCkge1xuICAgICAgICBjb25uZWN0Rm9ybUFycmF5QW5kU2lnbmFsKFxuICAgICAgICAgIGNvbnRyb2wsXG4gICAgICAgICAgYXJyYXlTaWduYWwgYXMgRW5oYW5jZWRBcnJheVNpZ25hbDx1bmtub3duPixcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHN5bmNWYWxpZGF0b3JzLFxuICAgICAgICAgIGFzeW5jVmFsaWRhdG9ycyxcbiAgICAgICAgICBjbGVhbnVwQ2FsbGJhY2tzLFxuICAgICAgICAgIGNvbm5lY3RDb250cm9sUmVjdXJzaXZlXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRyb2wuY29udHJvbHMuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbm5lY3RDb250cm9sUmVjdXJzaXZlKGNoaWxkLCBqb2luUGF0aChwYXRoLCBTdHJpbmcoaW5kZXgpKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduYWxBdFBhdGggPSBnZXRTaWduYWxBdFBhdGgoZmxhdHRlbmVkU3RhdGUsIHBhdGgpO1xuICAgIGlmIChzaWduYWxBdFBhdGgpIHtcbiAgICAgIGNvbm5lY3RDb250cm9sQW5kU2lnbmFsKFxuICAgICAgICBjb250cm9sIGFzIEZvcm1Db250cm9sLFxuICAgICAgICBzaWduYWxBdFBhdGggYXMgV3JpdGFibGVTaWduYWw8dW5rbm93bj4sXG4gICAgICAgIGNsZWFudXBDYWxsYmFja3MsXG4gICAgICAgIGZpZWxkQ29uZmlnTG9va3VwKHBhdGgpXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBjb25uZWN0Q29udHJvbFJlY3Vyc2l2ZShmb3JtR3JvdXAsICcnKTtcblxuICBjb25zdCBjb25kaXRpb25hbFN0YXRlID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gIGNvbnN0IGFwcGx5Q29uZGl0aW9uYWxzID1cbiAgICBjb25kaXRpb25hbHMubGVuZ3RoID4gMFxuICAgICAgPyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWVzID0gZm9ybUdyb3VwLmdldFJhd1ZhbHVlKCkgYXMgVDtcbiAgICAgICAgICBjb25kaXRpb25hbHMuZm9yRWFjaCgoeyB3aGVuLCBmaWVsZHMgfSkgPT4ge1xuICAgICAgICAgICAgbGV0IHZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgdmlzaWJsZSA9IHdoZW4odmFsdWVzKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICB2aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZFBhdGgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IGZvcm1Hcm91cC5nZXQoZmllbGRQYXRoKTtcbiAgICAgICAgICAgICAgaWYgKCFjb250cm9sKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzID0gY29uZGl0aW9uYWxTdGF0ZS5nZXQoZmllbGRQYXRoKTtcbiAgICAgICAgICAgICAgaWYgKHByZXZpb3VzID09PSB2aXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbmRpdGlvbmFsU3RhdGUuc2V0KGZpZWxkUGF0aCwgdmlzaWJsZSk7XG4gICAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRyb2wuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICA6ICgpID0+IHVuZGVmaW5lZDtcblxuICBhcHBseUNvbmRpdGlvbmFscygpO1xuXG4gIGNvbnN0IGFnZ3JlZ2F0ZVN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIGFnZ3JlZ2F0ZVN1YnNjcmlwdGlvbnMucHVzaChcbiAgICBmb3JtR3JvdXAudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICByZWZyZXNoQWdncmVnYXRlcygpO1xuICAgICAgcGVyc2lzdENvbnRyb2xsZXIuc2NoZWR1bGVQZXJzaXN0KCk7XG4gICAgICBhcHBseUNvbmRpdGlvbmFscygpO1xuICAgIH0pXG4gICk7XG4gIGFnZ3JlZ2F0ZVN1YnNjcmlwdGlvbnMucHVzaChcbiAgICBmb3JtR3JvdXAuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gcmVmcmVzaEFnZ3JlZ2F0ZXMoKSlcbiAgKTtcbiAgaWYgKGZvcm1Hcm91cC5ldmVudHMpIHtcbiAgICBhZ2dyZWdhdGVTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBmb3JtR3JvdXAuZXZlbnRzLnN1YnNjcmliZSgoKSA9PiByZWZyZXNoQWdncmVnYXRlcygpKVxuICAgICk7XG4gIH1cblxuICBjbGVhbnVwQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xuICAgIGFnZ3JlZ2F0ZVN1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3ViKSA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gICAgaWYgKHJlZnJlc2hUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHJlZnJlc2hUaW1lcik7XG4gICAgfVxuICB9KTtcblxuICBpZiAoZGVzdHJveVJlZikge1xuICAgIGRlc3Ryb3lSZWYub25EZXN0cm95KCgpID0+IHtcbiAgICAgIGNsZWFudXBDYWxsYmFja3Muc3BsaWNlKDApLmZvckVhY2goKGZuKSA9PiBmbigpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHNldFZhbHVlID0gKGZpZWxkOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0U2lnbmFsID0gZ2V0U2lnbmFsQXRQYXRoKGZsYXR0ZW5lZFN0YXRlLCBmaWVsZCk7XG4gICAgY29uc3QgY29udHJvbCA9IGZvcm1Hcm91cC5nZXQoZmllbGQpO1xuXG4gICAgaWYgKHRhcmdldFNpZ25hbCAmJiAnc2V0JyBpbiB0YXJnZXRTaWduYWwpIHtcbiAgICAgICh0YXJnZXRTaWduYWwgYXMgV3JpdGFibGVTaWduYWw8dW5rbm93bj4pLnNldCh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChjb250cm9sKSB7XG4gICAgICAoY29udHJvbCBhcyBBYnN0cmFjdENvbnRyb2wpLnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBpZiAoY29udHJvbCkge1xuICAgICAgY29uc3QgdW50eXBlZENvbnRyb2wgPSBjb250cm9sIGFzIEFic3RyYWN0Q29udHJvbDtcbiAgICAgIHVudHlwZWRDb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgIHVudHlwZWRDb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICB1bnR5cGVkQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHJlZnJlc2hBZ2dyZWdhdGVzKHRydWUpO1xuICAgIHBlcnNpc3RDb250cm9sbGVyLnNjaGVkdWxlUGVyc2lzdCgpO1xuICB9O1xuXG4gIGNvbnN0IHNldFZhbHVlcyA9ICh2YWx1ZXM6IFBhcnRpYWw8VD4pID0+IHtcbiAgICBPYmplY3QuZW50cmllcyh2YWx1ZXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgc2V0VmFsdWUoa2V5LCB2YWx1ZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgZm9ybUdyb3VwLnJlc2V0KGluaXRpYWxTbmFwc2hvdCk7XG4gICAgc3VibWl0dGluZy5zZXQoZmFsc2UpO1xuICAgIHJlZnJlc2hBZ2dyZWdhdGVzKHRydWUpO1xuICAgIHBlcnNpc3RDb250cm9sbGVyLnBlcnNpc3RJbW1lZGlhdGVseSgpO1xuICAgIGFwcGx5Q29uZGl0aW9uYWxzKCk7XG4gIH07XG5cbiAgY29uc3QgdmFsaWRhdGUgPSBhc3luYyAoZmllbGQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoZmllbGQpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KGZpZWxkKTtcbiAgICAgIGlmICghY29udHJvbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICAgICAgcmVmcmVzaEFnZ3JlZ2F0ZXModHJ1ZSk7XG4gICAgICBhd2FpdCB3YWl0Rm9yUGVuZGluZyhjb250cm9sKTtcbiAgICAgIHJlZnJlc2hBZ2dyZWdhdGVzKHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvcm1Hcm91cC5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgZm9ybUdyb3VwLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgcmVmcmVzaEFnZ3JlZ2F0ZXModHJ1ZSk7XG4gICAgYXdhaXQgd2FpdEZvclBlbmRpbmcoZm9ybUdyb3VwKTtcbiAgICByZWZyZXNoQWdncmVnYXRlcyh0cnVlKTtcbiAgfTtcblxuICBjb25zdCBzdWJtaXQgPSBhc3luYyA8VFJlc3VsdD4oXG4gICAgc3VibWl0Rm46ICh2YWx1ZXM6IFQpID0+IFByb21pc2U8VFJlc3VsdD5cbiAgKTogUHJvbWlzZTxUUmVzdWx0PiA9PiB7XG4gICAgc3VibWl0dGluZy5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHZhbGlkYXRlKCk7XG5cbiAgICAgIGlmICghdmFsaWQoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRm9ybVZhbGlkYXRpb25FcnJvcihlcnJvcnMoKSwgYXN5bmNFcnJvcnMoKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZXMgPSBmb3JtR3JvdXAuZ2V0UmF3VmFsdWUoKSBhcyBUO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3VibWl0Rm4oY3VycmVudFZhbHVlcyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzdWJtaXR0aW5nLnNldChmYWxzZSk7XG4gICAgICByZWZyZXNoQWdncmVnYXRlcyh0cnVlKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZGVzdHJveSA9ICgpID0+IHtcbiAgICBjbGVhbnVwQ2FsbGJhY2tzLnNwbGljZSgwKS5mb3JFYWNoKChmbikgPT4gZm4oKSk7XG4gIH07XG5cbiAgY29uc3QgZm9ybVRyZWU6IEZvcm1UcmVlPFQ+ID0ge1xuICAgIHN0YXRlOiBmbGF0dGVuZWRTdGF0ZSxcbiAgICAkOiBmbGF0dGVuZWRTdGF0ZSxcbiAgICBmb3JtOiBmb3JtR3JvdXAsXG4gICAgZXJyb3JzLFxuICAgIGFzeW5jRXJyb3JzLFxuICAgIHRvdWNoZWQsXG4gICAgYXN5bmNWYWxpZGF0aW5nLFxuICAgIGRpcnR5LFxuICAgIHZhbGlkLFxuICAgIHN1Ym1pdHRpbmcsXG4gICAgdW53cmFwOiAoKSA9PiB2YWx1ZXNUcmVlKCksXG4gICAgc2V0VmFsdWUsXG4gICAgc2V0VmFsdWVzLFxuICAgIHJlc2V0LFxuICAgIHN1Ym1pdCxcbiAgICB2YWxpZGF0ZSxcbiAgICBnZXRGaWVsZEVycm9yOiAoZmllbGQ6IHN0cmluZykgPT5cbiAgICAgIGZpZWxkRXJyb3JzW2ZpZWxkXSB8fCBjb21wdXRlZCgoKSA9PiB1bmRlZmluZWQpLFxuICAgIGdldEZpZWxkQXN5bmNFcnJvcjogKGZpZWxkOiBzdHJpbmcpID0+XG4gICAgICBmaWVsZEFzeW5jRXJyb3JzW2ZpZWxkXSB8fCBjb21wdXRlZCgoKSA9PiB1bmRlZmluZWQpLFxuICAgIGdldEZpZWxkVG91Y2hlZDogKGZpZWxkOiBzdHJpbmcpID0+XG4gICAgICBjb21wdXRlZCgoKSA9PiBmb3JtR3JvdXAuZ2V0KGZpZWxkKT8udG91Y2hlZCA/PyBmYWxzZSksXG4gICAgaXNGaWVsZFZhbGlkOiAoZmllbGQ6IHN0cmluZykgPT5cbiAgICAgIGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IGZvcm1Hcm91cC5nZXQoZmllbGQpO1xuICAgICAgICByZXR1cm4gISFjb250cm9sICYmIGNvbnRyb2wudmFsaWQgJiYgIWNvbnRyb2wucGVuZGluZztcbiAgICAgIH0pLFxuICAgIGlzRmllbGRBc3luY1ZhbGlkYXRpbmc6IChmaWVsZDogc3RyaW5nKSA9PlxuICAgICAgY29tcHV0ZWQoKCkgPT4gISFmb3JtR3JvdXAuZ2V0KGZpZWxkKT8ucGVuZGluZyksXG4gICAgZmllbGRFcnJvcnMsXG4gICAgZmllbGRBc3luY0Vycm9ycyxcbiAgICB2YWx1ZXM6IHZhbHVlc1RyZWUsXG4gICAgZGVzdHJveSxcbiAgfTtcblxuICByZXR1cm4gZm9ybVRyZWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVWaXJ0dWFsRm9ybUFycmF5PFQ+KFxuICBpdGVtczogVFtdLFxuICB2aXNpYmxlUmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSxcbiAgY29udHJvbEZhY3Rvcnk6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gQWJzdHJhY3RDb250cm9sID0gKHZhbHVlKSA9PlxuICAgIG5ldyBGb3JtQ29udHJvbCh2YWx1ZSlcbik6IEZvcm1BcnJheSB7XG4gIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoMCwgdmlzaWJsZVJhbmdlLnN0YXJ0KTtcbiAgY29uc3QgZW5kID0gTWF0aC5tYXgoc3RhcnQsIHZpc2libGVSYW5nZS5lbmQpO1xuXG4gIGNvbnN0IGNvbnRyb2xzID0gaXRlbXNcbiAgICAuc2xpY2Uoc3RhcnQsIGVuZClcbiAgICAubWFwKChpdGVtLCBvZmZzZXQpID0+IGNvbnRyb2xGYWN0b3J5KGl0ZW0sIHN0YXJ0ICsgb2Zmc2V0KSk7XG5cbiAgcmV0dXJuIG5ldyBGb3JtQXJyYXkoY29udHJvbHMpO1xufVxuXG5mdW5jdGlvbiBlbmhhbmNlQXJyYXlzUmVjdXJzaXZlbHkoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHZpc2l0ZWQgPSBuZXcgV2Vha1NldDxvYmplY3Q+KClcbik6IHZvaWQge1xuICBpZiAodmlzaXRlZC5oYXMob2JqKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2aXNpdGVkLmFkZChvYmopO1xuXG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gICAgaWYgKGlzU2lnbmFsKHZhbHVlKSkge1xuICAgICAgY29uc3Qgc2lnbmFsVmFsdWUgPSAodmFsdWUgYXMgU2lnbmFsPHVua25vd24+KSgpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2lnbmFsVmFsdWUpKSB7XG4gICAgICAgIG9ialtrZXldID0gZW5oYW5jZUFycmF5KHZhbHVlIGFzIFdyaXRhYmxlU2lnbmFsPHVua25vd25bXT4pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgKSB7XG4gICAgICBlbmhhbmNlQXJyYXlzUmVjdXJzaXZlbHkodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHZpc2l0ZWQpO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBlbmhhbmNlQXJyYXkgPSA8VT4oXG4gIGFycmF5U2lnbmFsOiBXcml0YWJsZVNpZ25hbDxVW10+XG4pOiBFbmhhbmNlZEFycmF5U2lnbmFsPFU+ID0+IHtcbiAgY29uc3QgZW5oYW5jZWQgPSBhcnJheVNpZ25hbCBhcyBFbmhhbmNlZEFycmF5U2lnbmFsPFU+O1xuXG4gIGVuaGFuY2VkLnB1c2ggPSAoaXRlbTogVSkgPT4ge1xuICAgIGFycmF5U2lnbmFsLnVwZGF0ZSgoYXJyKSA9PiBbLi4uYXJyLCBpdGVtXSk7XG4gIH07XG5cbiAgZW5oYW5jZWQucmVtb3ZlQXQgPSAoaW5kZXg6IG51bWJlcikgPT4ge1xuICAgIGFycmF5U2lnbmFsLnVwZGF0ZSgoYXJyKSA9PiBhcnIuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCkpO1xuICB9O1xuXG4gIGVuaGFuY2VkLnNldEF0ID0gKGluZGV4OiBudW1iZXIsIHZhbHVlOiBVKSA9PiB7XG4gICAgYXJyYXlTaWduYWwudXBkYXRlKChhcnIpID0+XG4gICAgICBhcnIubWFwKChpdGVtLCBpKSA9PiAoaSA9PT0gaW5kZXggPyB2YWx1ZSA6IGl0ZW0pKVxuICAgICk7XG4gIH07XG5cbiAgZW5oYW5jZWQuaW5zZXJ0QXQgPSAoaW5kZXg6IG51bWJlciwgaXRlbTogVSkgPT4ge1xuICAgIGFycmF5U2lnbmFsLnVwZGF0ZSgoYXJyKSA9PiBbXG4gICAgICAuLi5hcnIuc2xpY2UoMCwgaW5kZXgpLFxuICAgICAgaXRlbSxcbiAgICAgIC4uLmFyci5zbGljZShpbmRleCksXG4gICAgXSk7XG4gIH07XG5cbiAgZW5oYW5jZWQubW92ZSA9IChmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpID0+IHtcbiAgICBhcnJheVNpZ25hbC51cGRhdGUoKGFycikgPT4ge1xuICAgICAgY29uc3QgbmV3QXJyID0gWy4uLmFycl07XG4gICAgICBjb25zdCBbaXRlbV0gPSBuZXdBcnIuc3BsaWNlKGZyb20sIDEpO1xuICAgICAgaWYgKGl0ZW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdBcnIuc3BsaWNlKHRvLCAwLCBpdGVtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXdBcnI7XG4gICAgfSk7XG4gIH07XG5cbiAgZW5oYW5jZWQuY2xlYXIgPSAoKSA9PiB7XG4gICAgYXJyYXlTaWduYWwuc2V0KFtdKTtcbiAgfTtcblxuICByZXR1cm4gZW5oYW5jZWQ7XG59O1xuXG5mdW5jdGlvbiBnZXRTaWduYWxBdFBhdGg8VD4oXG4gIG5vZGU6IFRyZWVOb2RlPFQ+LFxuICBwYXRoOiBzdHJpbmdcbik6IFdyaXRhYmxlU2lnbmFsPHVua25vd24+IHwgbnVsbCB7XG4gIGlmICghcGF0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgc2VnbWVudHMgPSBwYXJzZVBhdGgocGF0aCk7XG4gIGxldCBjdXJyZW50OiB1bmtub3duID0gbm9kZTtcblxuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc2VnbWVudHMpIHtcbiAgICBpZiAoIWN1cnJlbnQgfHwgdHlwZW9mIGN1cnJlbnQgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjdXJyZW50ID0gKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3NlZ21lbnRdO1xuICB9XG5cbiAgaWYgKGlzU2lnbmFsKGN1cnJlbnQpKSB7XG4gICAgcmV0dXJuIGN1cnJlbnQgYXMgV3JpdGFibGVTaWduYWw8dW5rbm93bj47XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gam9pblBhdGgocGFyZW50OiBzdHJpbmcsIHNlZ21lbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXJlbnQgPyBgJHtwYXJlbnR9LiR7c2VnbWVudH1gIDogc2VnbWVudDtcbn1cblxuZnVuY3Rpb24gd3JhcFN5bmNWYWxpZGF0b3IoXG4gIHZhbGlkYXRvcjogKHZhbHVlOiB1bmtub3duKSA9PiBzdHJpbmcgfCBudWxsXG4pOiBBbmd1bGFyVmFsaWRhdG9yRm4ge1xuICByZXR1cm4gKGNvbnRyb2wpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSB2YWxpZGF0b3IoY29udHJvbC52YWx1ZSk7XG4gICAgcmV0dXJuIHJlc3VsdCA/IHsgW1NZTkNfRVJST1JfS0VZXTogcmVzdWx0IH0gOiBudWxsO1xuICB9O1xufVxuXG5mdW5jdGlvbiB3cmFwQXN5bmNWYWxpZGF0b3IoXG4gIHZhbGlkYXRvcjogRm9ybVRyZWVBc3luY1ZhbGlkYXRvckZuPHVua25vd24+XG4pOiBBbmd1bGFyQXN5bmNWYWxpZGF0b3JGbiB7XG4gIHJldHVybiBhc3luYyAoY29udHJvbCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtYXliZUFzeW5jID0gdmFsaWRhdG9yKGNvbnRyb2wudmFsdWUpO1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBpc09ic2VydmFibGUobWF5YmVBc3luYylcbiAgICAgICAgPyBhd2FpdCBmaXJzdFZhbHVlRnJvbShtYXliZUFzeW5jKVxuICAgICAgICA6IGF3YWl0IG1heWJlQXN5bmM7XG4gICAgICByZXR1cm4gcmVzb2x2ZWQgPyB7IFtBU1lOQ19FUlJPUl9LRVldOiByZXNvbHZlZCB9IDogbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7IFtBU1lOQ19FUlJPUl9LRVldOiAnVmFsaWRhdGlvbiBlcnJvcicgfTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFic3RyYWN0Q29udHJvbChcbiAgdmFsdWU6IHVua25vd24sXG4gIHBhdGg6IHN0cmluZyxcbiAgdmFsaWRhdG9yczogU3luY1ZhbGlkYXRvck1hcCxcbiAgYXN5bmNWYWxpZGF0b3JzOiBBc3luY1ZhbGlkYXRvck1hcFxuKTogQWJzdHJhY3RDb250cm9sIHtcbiAgY29uc3Qgc3luY1ZhbGlkYXRvciA9IGZpbmRWYWxpZGF0b3IodmFsaWRhdG9ycywgcGF0aCk7XG4gIGNvbnN0IGFzeW5jVmFsaWRhdG9yID0gZmluZFZhbGlkYXRvcihhc3luY1ZhbGlkYXRvcnMsIHBhdGgpO1xuXG4gIGNvbnN0IHN5bmNGbnMgPSBzeW5jVmFsaWRhdG9yXG4gICAgPyBbd3JhcFN5bmNWYWxpZGF0b3Ioc3luY1ZhbGlkYXRvcildXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGFzeW5jRm5zID0gYXN5bmNWYWxpZGF0b3JcbiAgICA/IFt3cmFwQXN5bmNWYWxpZGF0b3IoYXN5bmNWYWxpZGF0b3IpXVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IGNvbnRyb2xzID0gdmFsdWUubWFwKChpdGVtLCBpbmRleCkgPT5cbiAgICAgIGNyZWF0ZUFic3RyYWN0Q29udHJvbChcbiAgICAgICAgaXRlbSxcbiAgICAgICAgam9pblBhdGgocGF0aCwgU3RyaW5nKGluZGV4KSksXG4gICAgICAgIHZhbGlkYXRvcnMsXG4gICAgICAgIGFzeW5jVmFsaWRhdG9yc1xuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIG5ldyBGb3JtQXJyYXkoY29udHJvbHMsIHN5bmNGbnMsIGFzeW5jRm5zKTtcbiAgfVxuXG4gIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgIGNvbnN0IGNvbnRyb2xzOiBSZWNvcmQ8c3RyaW5nLCBBYnN0cmFjdENvbnRyb2w+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICBjb250cm9sc1trZXldID0gY3JlYXRlQWJzdHJhY3RDb250cm9sKFxuICAgICAgICBjaGlsZCxcbiAgICAgICAgam9pblBhdGgocGF0aCwga2V5KSxcbiAgICAgICAgdmFsaWRhdG9ycyxcbiAgICAgICAgYXN5bmNWYWxpZGF0b3JzXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEZvcm1Hcm91cChjb250cm9scywge1xuICAgICAgdmFsaWRhdG9yczogc3luY0ZucyxcbiAgICAgIGFzeW5jVmFsaWRhdG9yczogYXN5bmNGbnMsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV3IEZvcm1Db250cm9sKHZhbHVlLCB7XG4gICAgdmFsaWRhdG9yczogc3luY0ZucyxcbiAgICBhc3luY1ZhbGlkYXRvcnM6IGFzeW5jRm5zLFxuICAgIG5vbk51bGxhYmxlOiBmYWxzZSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbm5lY3RDb250cm9sQW5kU2lnbmFsKFxuICBjb250cm9sOiBGb3JtQ29udHJvbCxcbiAgdmFsdWVTaWduYWw6IFdyaXRhYmxlU2lnbmFsPHVua25vd24+LFxuICBjbGVhbnVwQ2FsbGJhY2tzOiBBcnJheTwoKSA9PiB2b2lkPixcbiAgZmllbGRDb25maWc/OiBGaWVsZENvbmZpZ1xuKTogdm9pZCB7XG4gIGxldCB1cGRhdGluZ0Zyb21Db250cm9sID0gZmFsc2U7XG4gIGxldCB1cGRhdGluZ0Zyb21TaWduYWwgPSBmYWxzZTtcbiAgbGV0IHZlcnNpb25Db3VudGVyID0gMDtcbiAgbGV0IGxhc3RDb250cm9sVmVyc2lvbiA9IDA7XG4gIGxldCBjb250cm9sRGVib3VuY2VUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgY29uc3QgZGVib3VuY2VNcyA9IGZpZWxkQ29uZmlnPy5kZWJvdW5jZU1zID8/IDA7XG5cbiAgY29uc3Qgb3JpZ2luYWxTZXQgPSB2YWx1ZVNpZ25hbC5zZXQuYmluZCh2YWx1ZVNpZ25hbCk7XG4gIGNvbnN0IG9yaWdpbmFsVXBkYXRlID0gdmFsdWVTaWduYWwudXBkYXRlLmJpbmQodmFsdWVTaWduYWwpO1xuXG4gIGNvbnN0IGFwcGx5Q29udHJvbFZhbHVlID0gKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgdXBkYXRpbmdGcm9tU2lnbmFsID0gdHJ1ZTtcbiAgICBpZiAoIU9iamVjdC5pcyhjb250cm9sLnZhbHVlLCB2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHVudHlwZWRDb250cm9sID0gY29udHJvbCBhcyBBYnN0cmFjdENvbnRyb2w7XG4gICAgICB1bnR5cGVkQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgICB1bnR5cGVkQ29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgIH1cbiAgICB1cGRhdGluZ0Zyb21TaWduYWwgPSBmYWxzZTtcbiAgfTtcblxuICB2YWx1ZVNpZ25hbC5zZXQgPSAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9ICsrdmVyc2lvbkNvdW50ZXI7XG4gICAgb3JpZ2luYWxTZXQodmFsdWUpO1xuICAgIGlmICh1cGRhdGluZ0Zyb21Db250cm9sKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChsYXN0Q29udHJvbFZlcnNpb24gPiBjdXJyZW50VmVyc2lvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhcHBseUNvbnRyb2xWYWx1ZSh2YWx1ZSk7XG4gIH07XG5cbiAgdmFsdWVTaWduYWwudXBkYXRlID0gKHVwZGF0ZXIpID0+IHtcbiAgICBjb25zdCBuZXh0ID0gdXBkYXRlcih2YWx1ZVNpZ25hbCgpKTtcbiAgICB2YWx1ZVNpZ25hbC5zZXQobmV4dCk7XG4gIH07XG5cbiAgY29uc3QgcHVzaFVwZGF0ZUZyb21Db250cm9sID0gKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgdXBkYXRpbmdGcm9tQ29udHJvbCA9IHRydWU7XG4gICAgbGFzdENvbnRyb2xWZXJzaW9uID0gKyt2ZXJzaW9uQ291bnRlcjtcbiAgICBvcmlnaW5hbFNldCh2YWx1ZSk7XG4gICAgdXBkYXRpbmdGcm9tQ29udHJvbCA9IGZhbHNlO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUNvbnRyb2xDaGFuZ2UgPSAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBpZiAodXBkYXRpbmdGcm9tU2lnbmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRlYm91bmNlTXMgPiAwKSB7XG4gICAgICBpZiAoY29udHJvbERlYm91bmNlVGltZXIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGNvbnRyb2xEZWJvdW5jZVRpbWVyKTtcbiAgICAgIH1cbiAgICAgIGNvbnRyb2xEZWJvdW5jZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnRyb2xEZWJvdW5jZVRpbWVyID0gbnVsbDtcbiAgICAgICAgcHVzaFVwZGF0ZUZyb21Db250cm9sKHZhbHVlKTtcbiAgICAgIH0sIGRlYm91bmNlTXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHB1c2hVcGRhdGVGcm9tQ29udHJvbCh2YWx1ZSk7XG4gIH07XG5cbiAgY29uc3Qgc3Vic2NyaXB0aW9uID0gY29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgIGhhbmRsZUNvbnRyb2xDaGFuZ2UodmFsdWUpO1xuICB9KTtcblxuICBjbGVhbnVwQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xuICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHZhbHVlU2lnbmFsLnNldCA9IG9yaWdpbmFsU2V0O1xuICAgIHZhbHVlU2lnbmFsLnVwZGF0ZSA9IG9yaWdpbmFsVXBkYXRlO1xuICAgIGlmIChjb250cm9sRGVib3VuY2VUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KGNvbnRyb2xEZWJvdW5jZVRpbWVyKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb25uZWN0Rm9ybUFycmF5QW5kU2lnbmFsKFxuICBmb3JtQXJyYXk6IEZvcm1BcnJheSxcbiAgYXJyYXlTaWduYWw6IEVuaGFuY2VkQXJyYXlTaWduYWw8dW5rbm93bj4sXG4gIHBhdGg6IHN0cmluZyxcbiAgdmFsaWRhdG9yczogU3luY1ZhbGlkYXRvck1hcCxcbiAgYXN5bmNWYWxpZGF0b3JzOiBBc3luY1ZhbGlkYXRvck1hcCxcbiAgY2xlYW51cENhbGxiYWNrczogQXJyYXk8KCkgPT4gdm9pZD4sXG4gIGNvbm5lY3RDb250cm9sUmVjdXJzaXZlOiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBwYXRoOiBzdHJpbmcpID0+IHZvaWRcbik6IHZvaWQge1xuICBsZXQgdXBkYXRpbmdGcm9tQ29udHJvbCA9IGZhbHNlO1xuICBsZXQgdXBkYXRpbmdGcm9tU2lnbmFsID0gZmFsc2U7XG5cbiAgY29uc3Qgb3JpZ2luYWxTZXQgPSBhcnJheVNpZ25hbC5zZXQuYmluZChhcnJheVNpZ25hbCk7XG4gIGNvbnN0IG9yaWdpbmFsVXBkYXRlID0gYXJyYXlTaWduYWwudXBkYXRlLmJpbmQoYXJyYXlTaWduYWwpO1xuXG4gIGFycmF5U2lnbmFsLnNldCA9ICh2YWx1ZTogdW5rbm93bltdKSA9PiB7XG4gICAgb3JpZ2luYWxTZXQodmFsdWUpO1xuICAgIGlmICh1cGRhdGluZ0Zyb21Db250cm9sKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHVwZGF0aW5nRnJvbVNpZ25hbCA9IHRydWU7XG4gICAgc3luY0Zvcm1BcnJheUZyb21WYWx1ZShcbiAgICAgIGZvcm1BcnJheSxcbiAgICAgIHZhbHVlLFxuICAgICAgcGF0aCxcbiAgICAgIHZhbGlkYXRvcnMsXG4gICAgICBhc3luY1ZhbGlkYXRvcnMsXG4gICAgICBjb25uZWN0Q29udHJvbFJlY3Vyc2l2ZVxuICAgICk7XG4gICAgZm9ybUFycmF5Lm1hcmtBc0RpcnR5KCk7XG4gICAgdXBkYXRpbmdGcm9tU2lnbmFsID0gZmFsc2U7XG4gIH07XG5cbiAgYXJyYXlTaWduYWwudXBkYXRlID0gKHVwZGF0ZXIpID0+IHtcbiAgICBjb25zdCBuZXh0ID0gdXBkYXRlcihhcnJheVNpZ25hbCgpKTtcbiAgICBhcnJheVNpZ25hbC5zZXQobmV4dCk7XG4gIH07XG5cbiAgY29uc3Qgc3Vic2NyaXB0aW9uID0gZm9ybUFycmF5LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgaWYgKHVwZGF0aW5nRnJvbVNpZ25hbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB1cGRhdGluZ0Zyb21Db250cm9sID0gdHJ1ZTtcbiAgICBvcmlnaW5hbFNldCh2YWx1ZSBhcyB1bmtub3duW10pO1xuICAgIHVwZGF0aW5nRnJvbUNvbnRyb2wgPSBmYWxzZTtcbiAgfSk7XG5cbiAgY2xlYW51cENhbGxiYWNrcy5wdXNoKCgpID0+IHtcbiAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICBhcnJheVNpZ25hbC5zZXQgPSBvcmlnaW5hbFNldDtcbiAgICBhcnJheVNpZ25hbC51cGRhdGUgPSBvcmlnaW5hbFVwZGF0ZTtcbiAgfSk7XG5cbiAgc3luY0Zvcm1BcnJheUZyb21WYWx1ZShcbiAgICBmb3JtQXJyYXksXG4gICAgYXJyYXlTaWduYWwoKSxcbiAgICBwYXRoLFxuICAgIHZhbGlkYXRvcnMsXG4gICAgYXN5bmNWYWxpZGF0b3JzLFxuICAgIGNvbm5lY3RDb250cm9sUmVjdXJzaXZlXG4gICk7XG59XG5cbmZ1bmN0aW9uIHN5bmNGb3JtQXJyYXlGcm9tVmFsdWUoXG4gIGZvcm1BcnJheTogRm9ybUFycmF5LFxuICBuZXh0VmFsdWU6IHVua25vd25bXSxcbiAgcGF0aDogc3RyaW5nLFxuICB2YWxpZGF0b3JzOiBTeW5jVmFsaWRhdG9yTWFwLFxuICBhc3luY1ZhbGlkYXRvcnM6IEFzeW5jVmFsaWRhdG9yTWFwLFxuICBjb25uZWN0Q29udHJvbFJlY3Vyc2l2ZTogKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgcGF0aDogc3RyaW5nKSA9PiB2b2lkXG4pOiB2b2lkIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG5leHRWYWx1ZSkpIHtcbiAgICBuZXh0VmFsdWUgPSBbXTtcbiAgfVxuXG4gIHdoaWxlIChmb3JtQXJyYXkubGVuZ3RoID4gbmV4dFZhbHVlLmxlbmd0aCkge1xuICAgIGZvcm1BcnJheS5yZW1vdmVBdChmb3JtQXJyYXkubGVuZ3RoIC0gMSk7XG4gIH1cblxuICBuZXh0VmFsdWUuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBjaGlsZFBhdGggPSBqb2luUGF0aChwYXRoLCBTdHJpbmcoaW5kZXgpKTtcbiAgICBjb25zdCBleGlzdGluZyA9IGZvcm1BcnJheS5hdChpbmRleCk7XG5cbiAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gY3JlYXRlQWJzdHJhY3RDb250cm9sKFxuICAgICAgICBpdGVtLFxuICAgICAgICBjaGlsZFBhdGgsXG4gICAgICAgIHZhbGlkYXRvcnMsXG4gICAgICAgIGFzeW5jVmFsaWRhdG9yc1xuICAgICAgKTtcbiAgICAgIGZvcm1BcnJheS5pbnNlcnQoaW5kZXgsIGNvbnRyb2wpO1xuICAgICAgY29ubmVjdENvbnRyb2xSZWN1cnNpdmUoY29udHJvbCwgY2hpbGRQYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXhpc3RpbmcgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgIHN5bmNGb3JtQXJyYXlGcm9tVmFsdWUoXG4gICAgICAgIGV4aXN0aW5nLFxuICAgICAgICBBcnJheS5pc0FycmF5KGl0ZW0pID8gaXRlbSA6IFtdLFxuICAgICAgICBjaGlsZFBhdGgsXG4gICAgICAgIHZhbGlkYXRvcnMsXG4gICAgICAgIGFzeW5jVmFsaWRhdG9ycyxcbiAgICAgICAgY29ubmVjdENvbnRyb2xSZWN1cnNpdmVcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV4aXN0aW5nIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICBpZiAoaXNQbGFpbk9iamVjdChpdGVtKSkge1xuICAgICAgICBleGlzdGluZy5zZXRWYWx1ZShpdGVtIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCB7XG4gICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFPYmplY3QuaXMoZXhpc3RpbmcudmFsdWUsIGl0ZW0pKSB7XG4gICAgICBjb25zdCB1bnR5cGVkRXhpc3RpbmcgPSBleGlzdGluZyBhcyBBYnN0cmFjdENvbnRyb2w7XG4gICAgICB1bnR5cGVkRXhpc3Rpbmcuc2V0VmFsdWUoaXRlbSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmludGVyZmFjZSBDb250cm9sU25hcHNob3Qge1xuICBzeW5jRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBhc3luY0Vycm9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgdG91Y2hlZDogUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG4gIHBlbmRpbmc6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+O1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0Q29udHJvbFNuYXBzaG90KGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IENvbnRyb2xTbmFwc2hvdCB7XG4gIGNvbnN0IHNuYXBzaG90OiBDb250cm9sU25hcHNob3QgPSB7XG4gICAgc3luY0Vycm9yczoge30sXG4gICAgYXN5bmNFcnJvcnM6IHt9LFxuICAgIHRvdWNoZWQ6IHt9LFxuICAgIHBlbmRpbmc6IHt9LFxuICB9O1xuXG4gIHRyYXZlcnNlQ29udHJvbHMoXG4gICAgY29udHJvbCxcbiAgICAoY3VycmVudFBhdGgsIGN1cnJlbnRDb250cm9sKSA9PiB7XG4gICAgICBpZiAoIWN1cnJlbnRQYXRoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnJlbnRDb250cm9sLnRvdWNoZWQpIHtcbiAgICAgICAgc25hcHNob3QudG91Y2hlZFtjdXJyZW50UGF0aF0gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3VycmVudENvbnRyb2wucGVuZGluZykge1xuICAgICAgICBzbmFwc2hvdC5wZW5kaW5nW2N1cnJlbnRQYXRoXSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9ycyA9IGN1cnJlbnRDb250cm9sLmVycm9ycyBhcyBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbDtcbiAgICAgIGlmICghZXJyb3JzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3luY01lc3NhZ2UgPSBlcnJvcnNbU1lOQ19FUlJPUl9LRVldO1xuICAgICAgaWYgKHR5cGVvZiBzeW5jTWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc25hcHNob3Quc3luY0Vycm9yc1tjdXJyZW50UGF0aF0gPSBzeW5jTWVzc2FnZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXN5bmNNZXNzYWdlID0gZXJyb3JzW0FTWU5DX0VSUk9SX0tFWV07XG4gICAgICBpZiAodHlwZW9mIGFzeW5jTWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc25hcHNob3QuYXN5bmNFcnJvcnNbY3VycmVudFBhdGhdID0gYXN5bmNNZXNzYWdlO1xuICAgICAgfVxuICAgIH0sXG4gICAgJydcbiAgKTtcblxuICByZXR1cm4gc25hcHNob3Q7XG59XG5cbmZ1bmN0aW9uIHRyYXZlcnNlQ29udHJvbHMoXG4gIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCxcbiAgdmlzaXRvcjogKHBhdGg6IHN0cmluZywgY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB2b2lkLFxuICBwYXRoID0gJydcbik6IHZvaWQge1xuICB2aXNpdG9yKHBhdGgsIGNvbnRyb2wpO1xuXG4gIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgT2JqZWN0LmVudHJpZXMoY29udHJvbC5jb250cm9scykuZm9yRWFjaCgoW2tleSwgY2hpbGRdKSA9PiB7XG4gICAgICB0cmF2ZXJzZUNvbnRyb2xzKGNoaWxkLCB2aXNpdG9yLCBqb2luUGF0aChwYXRoLCBrZXkpKTtcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgIGNvbnRyb2wuY29udHJvbHMuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICB0cmF2ZXJzZUNvbnRyb2xzKGNoaWxkLCB2aXNpdG9yLCBqb2luUGF0aChwYXRoLCBTdHJpbmcoaW5kZXgpKSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gd2FpdEZvclBlbmRpbmcoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghY29udHJvbC5wZW5kaW5nKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gY29udHJvbC5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAoIWNvbnRyb2wucGVuZGluZykge1xuICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIChcbiAgICAhIXZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nXG4gICk7XG59XG5cbmZ1bmN0aW9uIHRyeUluamVjdERlc3Ryb3lSZWYoKTogRGVzdHJveVJlZiB8IG51bGwge1xuICB0cnkge1xuICAgIHJldHVybiBpbmplY3QoRGVzdHJveVJlZik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN5bmNWYWxpZGF0b3JzKFxuICBiYXNlOiBTeW5jVmFsaWRhdG9yTWFwLFxuICBmaWVsZENvbmZpZ3M6IFJlY29yZDxzdHJpbmcsIEZpZWxkQ29uZmlnPlxuKTogU3luY1ZhbGlkYXRvck1hcCB7XG4gIGNvbnN0IGJ1Y2tldHMgPSBuZXcgTWFwPHN0cmluZywgRmllbGRWYWxpZGF0b3JbXT4oKTtcblxuICBmb3IgKGNvbnN0IFtwYXRoLCB2YWxpZGF0b3JdIG9mIE9iamVjdC5lbnRyaWVzKGJhc2UpKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBidWNrZXRzLmdldChwYXRoKSA/PyBbXTtcbiAgICBleGlzdGluZy5wdXNoKHZhbGlkYXRvcik7XG4gICAgYnVja2V0cy5zZXQocGF0aCwgZXhpc3RpbmcpO1xuICB9XG5cbiAgZm9yIChjb25zdCBbcGF0aCwgY29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhmaWVsZENvbmZpZ3MpKSB7XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IHRvVmFsaWRhdG9yQXJyYXkoY29uZmlnLnZhbGlkYXRvcnMpO1xuICAgIGlmICh2YWxpZGF0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nID0gYnVja2V0cy5nZXQocGF0aCkgPz8gW107XG4gICAgZXhpc3RpbmcucHVzaCguLi52YWxpZGF0b3JzKTtcbiAgICBidWNrZXRzLnNldChwYXRoLCBleGlzdGluZyk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkOiBTeW5jVmFsaWRhdG9yTWFwID0ge307XG4gIGJ1Y2tldHMuZm9yRWFjaCgodmFsaWRhdG9ycywgcGF0aCkgPT4ge1xuICAgIG5vcm1hbGl6ZWRbcGF0aF0gPSAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgIGZvciAoY29uc3QgdmFsaWRhdG9yIG9mIHZhbGlkYXRvcnMpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdmFsaWRhdG9yKHZhbHVlKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH0pO1xuXG4gIHJldHVybiB7IC4uLmJhc2UsIC4uLm5vcm1hbGl6ZWQgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQXN5bmNWYWxpZGF0b3JzKFxuICBiYXNlOiBBc3luY1ZhbGlkYXRvck1hcCxcbiAgZmllbGRDb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBGaWVsZENvbmZpZz5cbik6IEFzeW5jVmFsaWRhdG9yTWFwIHtcbiAgY29uc3QgYnVja2V0cyA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTxGb3JtVHJlZUFzeW5jVmFsaWRhdG9yRm48dW5rbm93bj4+PigpO1xuXG4gIGZvciAoY29uc3QgW3BhdGgsIHZhbGlkYXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoYmFzZSkpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IGJ1Y2tldHMuZ2V0KHBhdGgpID8/IFtdO1xuICAgIGV4aXN0aW5nLnB1c2godmFsaWRhdG9yKTtcbiAgICBidWNrZXRzLnNldChwYXRoLCBleGlzdGluZyk7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtwYXRoLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKGZpZWxkQ29uZmlncykpIHtcbiAgICBjb25zdCB2YWxpZGF0b3JzID0gdG9WYWxpZGF0b3JBcnJheShjb25maWcuYXN5bmNWYWxpZGF0b3JzKTtcbiAgICBpZiAodmFsaWRhdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZyA9IGJ1Y2tldHMuZ2V0KHBhdGgpID8/IFtdO1xuICAgIGV4aXN0aW5nLnB1c2goLi4udmFsaWRhdG9ycyk7XG4gICAgYnVja2V0cy5zZXQocGF0aCwgZXhpc3RpbmcpO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZDogQXN5bmNWYWxpZGF0b3JNYXAgPSB7fTtcbiAgYnVja2V0cy5mb3JFYWNoKCh2YWxpZGF0b3JzLCBwYXRoKSA9PiB7XG4gICAgbm9ybWFsaXplZFtwYXRoXSA9IGFzeW5jICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgZm9yIChjb25zdCB2YWxpZGF0b3Igb2YgdmFsaWRhdG9ycykge1xuICAgICAgICBjb25zdCBtYXliZUFzeW5jID0gdmFsaWRhdG9yKHZhbHVlKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaXNPYnNlcnZhYmxlKG1heWJlQXN5bmMpXG4gICAgICAgICAgPyBhd2FpdCBmaXJzdFZhbHVlRnJvbShtYXliZUFzeW5jKVxuICAgICAgICAgIDogYXdhaXQgbWF5YmVBc3luYztcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH0pO1xuXG4gIHJldHVybiB7IC4uLmJhc2UsIC4uLm5vcm1hbGl6ZWQgfTtcbn1cblxuZnVuY3Rpb24gdG9WYWxpZGF0b3JBcnJheTxUPihpbnB1dD86IFJlY29yZDxzdHJpbmcsIFQ+IHwgVFtdKTogVFtdIHtcbiAgaWYgKCFpbnB1dCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoaW5wdXQpO1xufVxuXG5mdW5jdGlvbiBoeWRyYXRlSW5pdGlhbFZhbHVlczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBpbml0aWFsVmFsdWVzOiBULFxuICBwZXJzaXN0S2V5Pzogc3RyaW5nLFxuICBzdG9yYWdlPzogUGljazxTdG9yYWdlLCAnZ2V0SXRlbScgfCAnc2V0SXRlbScgfCAncmVtb3ZlSXRlbSc+XG4pOiB7IHZhbHVlczogVCB9IHtcbiAgY29uc3QgYmFzZUNsb25lID0gZGVlcENsb25lKGluaXRpYWxWYWx1ZXMpO1xuXG4gIGlmICghcGVyc2lzdEtleSB8fCAhc3RvcmFnZSkge1xuICAgIHJldHVybiB7IHZhbHVlczogYmFzZUNsb25lIH07XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHN0b3JlZFJhdyA9IHN0b3JhZ2UuZ2V0SXRlbShwZXJzaXN0S2V5KTtcbiAgICBpZiAoIXN0b3JlZFJhdykge1xuICAgICAgcmV0dXJuIHsgdmFsdWVzOiBiYXNlQ2xvbmUgfTtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzdG9yZWRSYXcpIGFzIFBhcnRpYWw8VD47XG4gICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VEZWVwKGJhc2VDbG9uZSwgcGFyc2VkKTtcbiAgICByZXR1cm4geyB2YWx1ZXM6IG1lcmdlZCB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyB2YWx1ZXM6IGJhc2VDbG9uZSB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFRyZWVOb2RlPFQ+KHN0YXRlOiB1bmtub3duKTogYXNzZXJ0cyBzdGF0ZSBpcyBUcmVlTm9kZTxUPiB7XG4gIGlmICghc3RhdGUgfHwgdHlwZW9mIHN0YXRlICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdGF0ZSBzdHJ1Y3R1cmUgZm9yIGZvcm0gdHJlZScpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVGaWVsZENvbmZpZyhcbiAgZmllbGRDb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBGaWVsZENvbmZpZz4sXG4gIHBhdGg6IHN0cmluZ1xuKTogRmllbGRDb25maWcgfCB1bmRlZmluZWQge1xuICBpZiAoZmllbGRDb25maWdzW3BhdGhdKSB7XG4gICAgcmV0dXJuIGZpZWxkQ29uZmlnc1twYXRoXTtcbiAgfVxuXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhmaWVsZENvbmZpZ3MpO1xuICBsZXQgbWF0Y2g6IHsga2V5OiBzdHJpbmc7IGNvbmZpZzogRmllbGRDb25maWcgfSB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgaWYgKCFrZXkuaW5jbHVkZXMoJyonKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChtYXRjaFBhdGgoa2V5LCBwYXRoKSkge1xuICAgICAgaWYgKCFtYXRjaCB8fCBtYXRjaC5rZXkubGVuZ3RoIDwga2V5Lmxlbmd0aCkge1xuICAgICAgICBtYXRjaCA9IHsga2V5LCBjb25maWc6IGZpZWxkQ29uZmlnc1trZXldIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKG1hdGNoKSB7XG4gICAgcmV0dXJuIG1hdGNoLmNvbmZpZztcbiAgfVxuXG4gIHJldHVybiBmaWVsZENvbmZpZ3NbJyonXTtcbn1cblxuZnVuY3Rpb24gZmluZFZhbGlkYXRvcjxUPihtYXA6IFJlY29yZDxzdHJpbmcsIFQ+LCBwYXRoOiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG1hcFtwYXRoXSkge1xuICAgIHJldHVybiBtYXBbcGF0aF07XG4gIH1cblxuICBsZXQgY2FuZGlkYXRlOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogVCB9IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtYXApKSB7XG4gICAgaWYgKCFrZXkuaW5jbHVkZXMoJyonKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChtYXRjaFBhdGgoa2V5LCBwYXRoKSkge1xuICAgICAgaWYgKCFjYW5kaWRhdGUgfHwgY2FuZGlkYXRlLmtleS5sZW5ndGggPCBrZXkubGVuZ3RoKSB7XG4gICAgICAgIGNhbmRpZGF0ZSA9IHsga2V5LCB2YWx1ZTogbWFwW2tleV0gfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY2FuZGlkYXRlKSB7XG4gICAgcmV0dXJuIGNhbmRpZGF0ZS52YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBtYXBbJyonXTtcbn1cblxuaW50ZXJmYWNlIFBlcnNpc3RDb250cm9sbGVyIHtcbiAgc2NoZWR1bGVQZXJzaXN0OiAoKSA9PiB2b2lkO1xuICBwZXJzaXN0SW1tZWRpYXRlbHk6ICgpID0+IHZvaWQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBlcnNpc3RDb250cm9sbGVyKFxuICBmb3JtR3JvdXA6IEZvcm1Hcm91cCxcbiAgcGVyc2lzdEtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBzdG9yYWdlOiBQaWNrPFN0b3JhZ2UsICdnZXRJdGVtJyB8ICdzZXRJdGVtJyB8ICdyZW1vdmVJdGVtJz4gfCB1bmRlZmluZWQsXG4gIGRlYm91bmNlTXM6IG51bWJlcixcbiAgY2xlYW51cENhbGxiYWNrczogQXJyYXk8KCkgPT4gdm9pZD5cbik6IFBlcnNpc3RDb250cm9sbGVyIHtcbiAgaWYgKCFwZXJzaXN0S2V5IHx8ICFzdG9yYWdlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjaGVkdWxlUGVyc2lzdDogKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgcGVyc2lzdEltbWVkaWF0ZWx5OiAoKSA9PiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdCBwZXJzaXN0ID0gKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoZm9ybUdyb3VwLmdldFJhd1ZhbHVlKCkpO1xuICAgICAgc3RvcmFnZS5zZXRJdGVtKHBlcnNpc3RLZXksIHBheWxvYWQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU3dhbGxvdyBwZXJzaXN0ZW5jZSBlcnJvcnMgdG8gYXZvaWQgYnJlYWtpbmcgZm9ybSB1cGRhdGVzXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHNjaGVkdWxlUGVyc2lzdCA9ICgpID0+IHtcbiAgICBpZiAoZGVib3VuY2VNcyA8PSAwKSB7XG4gICAgICBwZXJzaXN0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIH1cblxuICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aW1lciA9IG51bGw7XG4gICAgICBwZXJzaXN0KCk7XG4gICAgfSwgZGVib3VuY2VNcyk7XG4gIH07XG5cbiAgY2xlYW51cENhbGxiYWNrcy5wdXNoKCgpID0+IHtcbiAgICBpZiAodGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHNjaGVkdWxlUGVyc2lzdCxcbiAgICBwZXJzaXN0SW1tZWRpYXRlbHk6IHBlcnNpc3QsXG4gIH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBTkdVTEFSIERJUkVDVElWRVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBTaW1wbGUgZGlyZWN0aXZlIGZvciB0d28td2F5IGJpbmRpbmcgd2l0aCBzaWduYWxzXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tzaWduYWxUcmVlU2lnbmFsVmFsdWVdJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTaWduYWxWYWx1ZURpcmVjdGl2ZSksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBTaWduYWxWYWx1ZURpcmVjdGl2ZSBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQge1xuICBASW5wdXQoKSBzaWduYWxUcmVlU2lnbmFsVmFsdWUhOiBXcml0YWJsZVNpZ25hbDx1bmtub3duPjtcbiAgQE91dHB1dCgpIHNpZ25hbFRyZWVTaWduYWxWYWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8dW5rbm93bj4oKTtcblxuICBwcml2YXRlIGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcblxuICBwcml2YXRlIG9uQ2hhbmdlOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgLy8gRW1wdHkgaW1wbGVtZW50YXRpb24gZm9yIENvbnRyb2xWYWx1ZUFjY2Vzc29yXG4gIH07XG4gIHByaXZhdGUgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge1xuICAgIC8vIEVtcHR5IGltcGxlbWVudGF0aW9uIGZvciBDb250cm9sVmFsdWVBY2Nlc3NvclxuICB9O1xuXG4gIG5nT25Jbml0KCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2lnbmFsVHJlZVNpZ25hbFZhbHVlKCk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCB2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdpbnB1dCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ2NoYW5nZScsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUNoYW5nZShldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCB2YWx1ZSA9IHRhcmdldD8udmFsdWU7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2lnbmFsVHJlZVNpZ25hbFZhbHVlLnNldCh2YWx1ZSk7XG4gICAgICB0aGlzLnNpZ25hbFRyZWVTaWduYWxWYWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInKVxuICBoYW5kbGVCbHVyKCkge1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2lnbmFsVHJlZVNpZ25hbFZhbHVlLnNldCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoXG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICdkaXNhYmxlZCcsXG4gICAgICBpc0Rpc2FibGVkXG4gICAgKTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRVhQT1JUU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IFNJR05BTF9GT1JNX0RJUkVDVElWRVMgPSBbU2lnbmFsVmFsdWVEaXJlY3RpdmVdO1xuIl19","export function required(message = 'Required') {\n return (value) => (!value ? message : null);\n}\nexport function email(message = 'Invalid email') {\n return (value) => {\n const strValue = value;\n return strValue && !strValue.includes('@') ? message : null;\n };\n}\nexport function minLength(min, message) {\n return (value) => {\n const strValue = value;\n const errorMsg = message ?? `Min ${min} characters`;\n return strValue && strValue.length < min ? errorMsg : null;\n };\n}\nexport function maxLength(max, message) {\n return (value) => {\n const strValue = value;\n const errorMsg = message ?? `Max ${max} characters`;\n return strValue && strValue.length > max ? errorMsg : null;\n };\n}\nexport function pattern(regex, message = 'Invalid format') {\n return (value) => {\n const strValue = value;\n return strValue && !regex.test(strValue) ? message : null;\n };\n}\nexport function min(min, message) {\n return (value) => {\n const numValue = value;\n const errorMsg = message ?? `Must be at least ${min}`;\n return numValue < min ? errorMsg : null;\n };\n}\nexport function max(max, message) {\n return (value) => {\n const numValue = value;\n const errorMsg = message ?? `Must be at most ${max}`;\n return numValue > max ? errorMsg : null;\n };\n}\nexport function compose(validators) {\n return (value) => {\n for (const validator of validators) {\n const error = validator(value);\n if (error) {\n return error;\n }\n }\n return null;\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLWZvcm1zL3NyYy9jb3JlL3ZhbGlkYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMEJBLE1BQU0sVUFBVSxRQUFRLENBQUMsT0FBTyxHQUFHLFVBQVU7SUFDM0MsT0FBTyxDQUFDLEtBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBaUJELE1BQU0sVUFBVSxLQUFLLENBQUMsT0FBTyxHQUFHLGVBQWU7SUFDN0MsT0FBTyxDQUFDLEtBQWMsRUFBRSxFQUFFO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLEtBQWUsQ0FBQztRQUNqQyxPQUFPLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzlELENBQUMsQ0FBQztBQUNKLENBQUM7QUFtQkQsTUFBTSxVQUFVLFNBQVMsQ0FBQyxHQUFXLEVBQUUsT0FBZ0I7SUFDckQsT0FBTyxDQUFDLEtBQWMsRUFBRSxFQUFFO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLEtBQWUsQ0FBQztRQUNqQyxNQUFNLFFBQVEsR0FBRyxPQUFPLElBQUksT0FBTyxHQUFHLGFBQWEsQ0FBQztRQUNwRCxPQUFPLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDN0QsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQW1CRCxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVcsRUFBRSxPQUFnQjtJQUNyRCxPQUFPLENBQUMsS0FBYyxFQUFFLEVBQUU7UUFDeEIsTUFBTSxRQUFRLEdBQUcsS0FBZSxDQUFDO1FBQ2pDLE1BQU0sUUFBUSxHQUFHLE9BQU8sSUFBSSxPQUFPLEdBQUcsYUFBYSxDQUFDO1FBQ3BELE9BQU8sUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM3RCxDQUFDLENBQUM7QUFDSixDQUFDO0FBbUJELE1BQU0sVUFBVSxPQUFPLENBQ3JCLEtBQWEsRUFDYixPQUFPLEdBQUcsZ0JBQWdCO0lBRTFCLE9BQU8sQ0FBQyxLQUFjLEVBQUUsRUFBRTtRQUN4QixNQUFNLFFBQVEsR0FBRyxLQUFlLENBQUM7UUFDakMsT0FBTyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM1RCxDQUFDLENBQUM7QUFDSixDQUFDO0FBbUJELE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBVyxFQUFFLE9BQWdCO0lBQy9DLE9BQU8sQ0FBQyxLQUFjLEVBQUUsRUFBRTtRQUN4QixNQUFNLFFBQVEsR0FBRyxLQUFlLENBQUM7UUFDakMsTUFBTSxRQUFRLEdBQUcsT0FBTyxJQUFJLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztRQUN0RCxPQUFPLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzFDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFtQkQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFXLEVBQUUsT0FBZ0I7SUFDL0MsT0FBTyxDQUFDLEtBQWMsRUFBRSxFQUFFO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLEtBQWUsQ0FBQztRQUNqQyxNQUFNLFFBQVEsR0FBRyxPQUFPLElBQUksbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQ3JELE9BQU8sUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDMUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQXFCRCxNQUFNLFVBQVUsT0FBTyxDQUFDLFVBQTRCO0lBQ2xELE9BQU8sQ0FBQyxLQUFjLEVBQUUsRUFBRTtRQUN4QixLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ25DLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQixJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgVHJlZS1zaGFrZWFibGUgdmFsaWRhdG9yIGZ1bmN0aW9ucyBmb3IgZm9ybSBmaWVsZHNcbiAqXG4gKiBUaGVzZSB2YWxpZGF0b3JzIGFyZSBleHBvcnRlZCBhcyBpbmRpdmlkdWFsIGZ1bmN0aW9ucyB0byBlbmFibGVcbiAqIHRyZWUtc2hha2luZy4gT25seSB0aGUgdmFsaWRhdG9ycyB5b3UgYWN0dWFsbHkgdXNlIHdpbGwgYmUgaW5jbHVkZWRcbiAqIGluIHlvdXIgYnVuZGxlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRmllbGRWYWxpZGF0b3IgfSBmcm9tICcuL25nLWZvcm1zJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVxdWlyZWQgZmllbGQgdmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIG1lc3NhZ2UgLSBDdXN0b20gZXJyb3IgbWVzc2FnZSAoZGVmYXVsdDogXCJSZXF1aXJlZFwiKVxuICogQHJldHVybnMgVmFsaWRhdG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBlcnJvciBtZXNzYWdlIGlmIHZhbHVlIGlzIGZhbHN5XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNyZWF0ZUZvcm1UcmVlKGRhdGEsIHtcbiAqICAgdmFsaWRhdG9yczoge1xuICogICAgIG5hbWU6IHJlcXVpcmVkKCksXG4gKiAgICAgZW1haWw6IHJlcXVpcmVkKCdFbWFpbCBpcyByZXF1aXJlZCcpXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZChtZXNzYWdlID0gJ1JlcXVpcmVkJyk6IEZpZWxkVmFsaWRhdG9yIHtcbiAgcmV0dXJuICh2YWx1ZTogdW5rbm93bikgPT4gKCF2YWx1ZSA/IG1lc3NhZ2UgOiBudWxsKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVtYWlsIGZvcm1hdCB2YWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIChkZWZhdWx0OiBcIkludmFsaWQgZW1haWxcIilcbiAqIEByZXR1cm5zIFZhbGlkYXRvciBmdW5jdGlvbiB0aGF0IGNoZWNrcyBmb3IgQCBzeW1ib2xcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY3JlYXRlRm9ybVRyZWUoZGF0YSwge1xuICogICB2YWxpZGF0b3JzOiB7XG4gKiAgICAgZW1haWw6IGVtYWlsKCdQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzJylcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVtYWlsKG1lc3NhZ2UgPSAnSW52YWxpZCBlbWFpbCcpOiBGaWVsZFZhbGlkYXRvciB7XG4gIHJldHVybiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBjb25zdCBzdHJWYWx1ZSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICByZXR1cm4gc3RyVmFsdWUgJiYgIXN0clZhbHVlLmluY2x1ZGVzKCdAJykgPyBtZXNzYWdlIDogbnVsbDtcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWluaW11bSBsZW5ndGggdmFsaWRhdG9yIGZvciBzdHJpbmdzXG4gKlxuICogQHBhcmFtIG1pbiAtIE1pbmltdW0gcmVxdWlyZWQgbGVuZ3RoXG4gKiBAcGFyYW0gbWVzc2FnZSAtIE9wdGlvbmFsIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBAcmV0dXJucyBWYWxpZGF0b3IgZnVuY3Rpb24gdGhhdCBjaGVja3Mgc3RyaW5nIGxlbmd0aFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjcmVhdGVGb3JtVHJlZShkYXRhLCB7XG4gKiAgIHZhbGlkYXRvcnM6IHtcbiAqICAgICBwYXNzd29yZDogbWluTGVuZ3RoKDgpLFxuICogICAgIGRlc2NyaXB0aW9uOiBtaW5MZW5ndGgoMTAsICdEZXNjcmlwdGlvbiBtdXN0IGJlIGF0IGxlYXN0IDEwIGNoYXJhY3RlcnMnKVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWluTGVuZ3RoKG1pbjogbnVtYmVyLCBtZXNzYWdlPzogc3RyaW5nKTogRmllbGRWYWxpZGF0b3Ige1xuICByZXR1cm4gKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgY29uc3Qgc3RyVmFsdWUgPSB2YWx1ZSBhcyBzdHJpbmc7XG4gICAgY29uc3QgZXJyb3JNc2cgPSBtZXNzYWdlID8/IGBNaW4gJHttaW59IGNoYXJhY3RlcnNgO1xuICAgIHJldHVybiBzdHJWYWx1ZSAmJiBzdHJWYWx1ZS5sZW5ndGggPCBtaW4gPyBlcnJvck1zZyA6IG51bGw7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1heGltdW0gbGVuZ3RoIHZhbGlkYXRvciBmb3Igc3RyaW5nc1xuICpcbiAqIEBwYXJhbSBtYXggLSBNYXhpbXVtIGFsbG93ZWQgbGVuZ3RoXG4gKiBAcGFyYW0gbWVzc2FnZSAtIE9wdGlvbmFsIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBAcmV0dXJucyBWYWxpZGF0b3IgZnVuY3Rpb24gdGhhdCBjaGVja3Mgc3RyaW5nIGxlbmd0aFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjcmVhdGVGb3JtVHJlZShkYXRhLCB7XG4gKiAgIHZhbGlkYXRvcnM6IHtcbiAqICAgICB1c2VybmFtZTogbWF4TGVuZ3RoKDIwKSxcbiAqICAgICBiaW86IG1heExlbmd0aCg1MDAsICdCaW8gbXVzdCBiZSB1bmRlciA1MDAgY2hhcmFjdGVycycpXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXhMZW5ndGgobWF4OiBudW1iZXIsIG1lc3NhZ2U/OiBzdHJpbmcpOiBGaWVsZFZhbGlkYXRvciB7XG4gIHJldHVybiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBjb25zdCBzdHJWYWx1ZSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICBjb25zdCBlcnJvck1zZyA9IG1lc3NhZ2UgPz8gYE1heCAke21heH0gY2hhcmFjdGVyc2A7XG4gICAgcmV0dXJuIHN0clZhbHVlICYmIHN0clZhbHVlLmxlbmd0aCA+IG1heCA/IGVycm9yTXNnIDogbnVsbDtcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVnZXggcGF0dGVybiB2YWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0gcmVnZXggLSBSZWd1bGFyIGV4cHJlc3Npb24gdG8gdGVzdCBhZ2FpbnN0XG4gKiBAcGFyYW0gbWVzc2FnZSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIChkZWZhdWx0OiBcIkludmFsaWQgZm9ybWF0XCIpXG4gKiBAcmV0dXJucyBWYWxpZGF0b3IgZnVuY3Rpb24gdGhhdCB0ZXN0cyB2YWx1ZSBhZ2FpbnN0IHJlZ2V4XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNyZWF0ZUZvcm1UcmVlKGRhdGEsIHtcbiAqICAgdmFsaWRhdG9yczoge1xuICogICAgIHBob25lOiBwYXR0ZXJuKC9eXFxkezN9LVxcZHszfS1cXGR7NH0kLywgJ1Bob25lIG11c3QgYmUgaW4gZm9ybWF0OiAxMjMtNDU2LTc4OTAnKSxcbiAqICAgICB6aXBDb2RlOiBwYXR0ZXJuKC9eXFxkezV9JC8sICdaaXAgY29kZSBtdXN0IGJlIDUgZGlnaXRzJylcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdHRlcm4oXG4gIHJlZ2V4OiBSZWdFeHAsXG4gIG1lc3NhZ2UgPSAnSW52YWxpZCBmb3JtYXQnXG4pOiBGaWVsZFZhbGlkYXRvciB7XG4gIHJldHVybiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBjb25zdCBzdHJWYWx1ZSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICByZXR1cm4gc3RyVmFsdWUgJiYgIXJlZ2V4LnRlc3Qoc3RyVmFsdWUpID8gbWVzc2FnZSA6IG51bGw7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1pbmltdW0gdmFsdWUgdmFsaWRhdG9yIGZvciBudW1iZXJzXG4gKlxuICogQHBhcmFtIG1pbiAtIE1pbmltdW0gYWxsb3dlZCB2YWx1ZVxuICogQHBhcmFtIG1lc3NhZ2UgLSBPcHRpb25hbCBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICogQHJldHVybnMgVmFsaWRhdG9yIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIG51bWVyaWMgbWluaW11bVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjcmVhdGVGb3JtVHJlZShkYXRhLCB7XG4gKiAgIHZhbGlkYXRvcnM6IHtcbiAqICAgICBhZ2U6IG1pbigxOCwgJ011c3QgYmUgYXQgbGVhc3QgMTggeWVhcnMgb2xkJyksXG4gKiAgICAgcXVhbnRpdHk6IG1pbigxKVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWluKG1pbjogbnVtYmVyLCBtZXNzYWdlPzogc3RyaW5nKTogRmllbGRWYWxpZGF0b3Ige1xuICByZXR1cm4gKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgY29uc3QgbnVtVmFsdWUgPSB2YWx1ZSBhcyBudW1iZXI7XG4gICAgY29uc3QgZXJyb3JNc2cgPSBtZXNzYWdlID8/IGBNdXN0IGJlIGF0IGxlYXN0ICR7bWlufWA7XG4gICAgcmV0dXJuIG51bVZhbHVlIDwgbWluID8gZXJyb3JNc2cgOiBudWxsO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXhpbXVtIHZhbHVlIHZhbGlkYXRvciBmb3IgbnVtYmVyc1xuICpcbiAqIEBwYXJhbSBtYXggLSBNYXhpbXVtIGFsbG93ZWQgdmFsdWVcbiAqIEBwYXJhbSBtZXNzYWdlIC0gT3B0aW9uYWwgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAqIEByZXR1cm5zIFZhbGlkYXRvciBmdW5jdGlvbiB0aGF0IGNoZWNrcyBudW1lcmljIG1heGltdW1cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY3JlYXRlRm9ybVRyZWUoZGF0YSwge1xuICogICB2YWxpZGF0b3JzOiB7XG4gKiAgICAgYWdlOiBtYXgoMTIwLCAnTXVzdCBiZSB1bmRlciAxMjAgeWVhcnMgb2xkJyksXG4gKiAgICAgcXVhbnRpdHk6IG1heCgxMDApXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXgobWF4OiBudW1iZXIsIG1lc3NhZ2U/OiBzdHJpbmcpOiBGaWVsZFZhbGlkYXRvciB7XG4gIHJldHVybiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBjb25zdCBudW1WYWx1ZSA9IHZhbHVlIGFzIG51bWJlcjtcbiAgICBjb25zdCBlcnJvck1zZyA9IG1lc3NhZ2UgPz8gYE11c3QgYmUgYXQgbW9zdCAke21heH1gO1xuICAgIHJldHVybiBudW1WYWx1ZSA+IG1heCA/IGVycm9yTXNnIDogbnVsbDtcbiAgfTtcbn1cblxuLyoqXG4gKiBDb21iaW5lcyBtdWx0aXBsZSB2YWxpZGF0b3JzIGludG8gYSBzaW5nbGUgdmFsaWRhdG9yIGZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHZhbGlkYXRvcnMgLSBBcnJheSBvZiB2YWxpZGF0b3IgZnVuY3Rpb25zIHRvIGNvbWJpbmVcbiAqIEByZXR1cm5zIENvbWJpbmVkIHZhbGlkYXRvciB0aGF0IHJldHVybnMgdGhlIGZpcnN0IGVycm9yIGVuY291bnRlcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNyZWF0ZUZvcm1UcmVlKGRhdGEsIHtcbiAqICAgdmFsaWRhdG9yczoge1xuICogICAgIGVtYWlsOiBjb21wb3NlKFtcbiAqICAgICAgIHJlcXVpcmVkKCdFbWFpbCBpcyByZXF1aXJlZCcpLFxuICogICAgICAgZW1haWwoJ0ludmFsaWQgZW1haWwgZm9ybWF0JyksXG4gKiAgICAgICBwYXR0ZXJuKC9AY29tcGFueVxcLmNvbSQvLCAnTXVzdCBiZSBhIGNvbXBhbnkgZW1haWwnKVxuICogICAgIF0pXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlKHZhbGlkYXRvcnM6IEZpZWxkVmFsaWRhdG9yW10pOiBGaWVsZFZhbGlkYXRvciB7XG4gIHJldHVybiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBmb3IgKGNvbnN0IHZhbGlkYXRvciBvZiB2YWxpZGF0b3JzKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHZhbGlkYXRvcih2YWx1ZSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbn1cbiJdfQ==","import { firstValueFrom, isObservable } from 'rxjs';\nexport function unique(checkFn, message = 'Already exists') {\n return async (value) => {\n if (!value)\n return null;\n const exists = await checkFn(value);\n return exists ? message : null;\n };\n}\nexport function debounce(validator, delayMs) {\n let timeoutId;\n return async (value) => {\n return new Promise((resolve) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(async () => {\n const maybeAsync = validator(value);\n const result = isObservable(maybeAsync)\n ? await firstValueFrom(maybeAsync)\n : await maybeAsync;\n resolve(result);\n }, delayMs);\n });\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtdmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLWZvcm1zL3NyYy9jb3JlL2FzeW5jLXZhbGlkYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUErQnBELE1BQU0sVUFBVSxNQUFNLENBQ3BCLE9BQTZDLEVBQzdDLE9BQU8sR0FBRyxnQkFBZ0I7SUFFMUIsT0FBTyxLQUFLLEVBQUUsS0FBYyxFQUFFLEVBQUU7UUFDOUIsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN4QixNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDakMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQXFCRCxNQUFNLFVBQVUsUUFBUSxDQUN0QixTQUE0QyxFQUM1QyxPQUFlO0lBRWYsSUFBSSxTQUF3QyxDQUFDO0lBRTdDLE9BQU8sS0FBSyxFQUFFLEtBQWMsRUFBRSxFQUFFO1FBQzlCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM3QixZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDeEIsU0FBUyxHQUFHLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDaEMsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwQyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDO29CQUNyQyxDQUFDLENBQUMsTUFBTSxjQUFjLENBQUMsVUFBVSxDQUFDO29CQUNsQyxDQUFDLENBQUMsTUFBTSxVQUFVLENBQUM7Z0JBQ3JCLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsQixDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgaXNPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogQGZpbGVvdmVydmlldyBUcmVlLXNoYWtlYWJsZSBhc3luYyB2YWxpZGF0b3IgZnVuY3Rpb25zIGZvciBmb3JtIGZpZWxkc1xuICovXG5cbmltcG9ydCB0eXBlIHsgRm9ybVRyZWVBc3luY1ZhbGlkYXRvckZuIH0gZnJvbSAnLi9uZy1mb3Jtcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhc3luYyB1bmlxdWVuZXNzIHZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSBjaGVja0ZuIC0gQXN5bmMgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdmFsdWUgYWxyZWFkeSBleGlzdHNcbiAqIEBwYXJhbSBtZXNzYWdlIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgKGRlZmF1bHQ6IFwiQWxyZWFkeSBleGlzdHNcIilcbiAqIEByZXR1cm5zIEFzeW5jIHZhbGlkYXRvciBmdW5jdGlvblxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjcmVhdGVGb3JtVHJlZShkYXRhLCB7XG4gKiAgIGFzeW5jVmFsaWRhdG9yczoge1xuICogICAgIGVtYWlsOiB1bmlxdWUoXG4gKiAgICAgICBhc3luYyAoZW1haWwpID0+IHtcbiAqICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS9jaGVjay1lbWFpbD9lbWFpbD0ke2VtYWlsfWApO1xuICogICAgICAgICBjb25zdCB7IGV4aXN0cyB9ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICogICAgICAgICByZXR1cm4gZXhpc3RzO1xuICogICAgICAgfSxcbiAqICAgICAgICdUaGlzIGVtYWlsIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCdcbiAqICAgICApXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWUoXG4gIGNoZWNrRm46ICh2YWx1ZTogdW5rbm93bikgPT4gUHJvbWlzZTxib29sZWFuPixcbiAgbWVzc2FnZSA9ICdBbHJlYWR5IGV4aXN0cydcbik6IEZvcm1UcmVlQXN5bmNWYWxpZGF0b3JGbjx1bmtub3duPiB7XG4gIHJldHVybiBhc3luYyAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBleGlzdHMgPSBhd2FpdCBjaGVja0ZuKHZhbHVlKTtcbiAgICByZXR1cm4gZXhpc3RzID8gbWVzc2FnZSA6IG51bGw7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBhc3luYyB2YWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0gdmFsaWRhdG9yIC0gVGhlIGFzeW5jIHZhbGlkYXRvciB0byBkZWJvdW5jZVxuICogQHBhcmFtIGRlbGF5TXMgLSBEZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHJ1bm5pbmcgdmFsaWRhdGlvblxuICogQHJldHVybnMgRGVib3VuY2VkIGFzeW5jIHZhbGlkYXRvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjcmVhdGVGb3JtVHJlZShkYXRhLCB7XG4gKiAgIGFzeW5jVmFsaWRhdG9yczoge1xuICogICAgIHVzZXJuYW1lOiBkZWJvdW5jZShcbiAqICAgICAgIHVuaXF1ZShjaGVja1VzZXJuYW1lLCAnVXNlcm5hbWUgdGFrZW4nKSxcbiAqICAgICAgIDUwMCAvLyBXYWl0IDUwMG1zIGFmdGVyIHVzZXIgc3RvcHMgdHlwaW5nXG4gKiAgICAgKVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVib3VuY2UoXG4gIHZhbGlkYXRvcjogRm9ybVRyZWVBc3luY1ZhbGlkYXRvckZuPHVua25vd24+LFxuICBkZWxheU1zOiBudW1iZXJcbik6IEZvcm1UcmVlQXN5bmNWYWxpZGF0b3JGbjx1bmtub3duPiB7XG4gIGxldCB0aW1lb3V0SWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuXG4gIHJldHVybiBhc3luYyAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgdGltZW91dElkID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1heWJlQXN5bmMgPSB2YWxpZGF0b3IodmFsdWUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBpc09ic2VydmFibGUobWF5YmVBc3luYylcbiAgICAgICAgICA/IGF3YWl0IGZpcnN0VmFsdWVGcm9tKG1heWJlQXN5bmMpXG4gICAgICAgICAgOiBhd2FpdCBtYXliZUFzeW5jO1xuICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9LCBkZWxheU1zKTtcbiAgICB9KTtcbiAgfTtcbn1cbiJdfQ==","import { signal } from '@angular/core';\nimport { deepClone, snapshotsEqual } from '@signaltree/shared';\nexport function withFormHistory(formTree, options = {}) {\n const capacity = Math.max(1, options.capacity ?? 10);\n const historySignal = signal({\n past: [],\n present: deepClone(formTree.form.getRawValue()),\n future: [],\n }, ...(ngDevMode ? [{ debugName: \"historySignal\" }] : []));\n let recording = true;\n let suppressUpdates = 0;\n let internalHistory = {\n past: [],\n present: deepClone(formTree.form.getRawValue()),\n future: [],\n };\n const subscription = formTree.form.valueChanges.subscribe(() => {\n if (suppressUpdates > 0) {\n suppressUpdates--;\n return;\n }\n if (!recording) {\n internalHistory = {\n ...internalHistory,\n present: deepClone(formTree.form.getRawValue()),\n };\n return;\n }\n const snapshot = deepClone(formTree.form.getRawValue());\n if (snapshotsEqual(internalHistory.present, snapshot)) {\n internalHistory = {\n ...internalHistory,\n present: snapshot,\n };\n historySignal.set(cloneHistory(internalHistory));\n return;\n }\n const updatedPast = [...internalHistory.past, internalHistory.present];\n if (updatedPast.length > capacity) {\n updatedPast.shift();\n }\n internalHistory = {\n past: updatedPast,\n present: snapshot,\n future: [],\n };\n historySignal.set(cloneHistory(internalHistory));\n });\n const originalDestroy = formTree.destroy;\n formTree.destroy = () => {\n subscription.unsubscribe();\n originalDestroy();\n };\n const undo = () => {\n const history = historySignal();\n if (history.past.length === 0) {\n return;\n }\n const previous = deepClone(history.past[history.past.length - 1]);\n recording = false;\n suppressUpdates++;\n formTree.setValues(previous);\n recording = true;\n internalHistory = {\n past: history.past.slice(0, -1),\n present: previous,\n future: [history.present, ...history.future],\n };\n historySignal.set(cloneHistory(internalHistory));\n };\n const redo = () => {\n const history = historySignal();\n if (history.future.length === 0) {\n return;\n }\n const next = deepClone(history.future[0]);\n recording = false;\n suppressUpdates++;\n formTree.setValues(next);\n recording = true;\n internalHistory = {\n past: [...history.past, history.present],\n present: next,\n future: history.future.slice(1),\n };\n historySignal.set(cloneHistory(internalHistory));\n };\n const clearHistory = () => {\n internalHistory = {\n past: [],\n present: deepClone(formTree.form.getRawValue()),\n future: [],\n };\n historySignal.set(cloneHistory(internalHistory));\n };\n function cloneHistory(state) {\n return {\n past: state.past.map((entry) => deepClone(entry)),\n present: deepClone(state.present),\n future: state.future.map((entry) => deepClone(entry)),\n };\n }\n return Object.assign(formTree, {\n undo,\n redo,\n clearHistory,\n history: historySignal.asReadonly(),\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLWZvcm1zL3NyYy9oaXN0b3J5L2hpc3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBNEMvRCxNQUFNLFVBQVUsZUFBZSxDQUM3QixRQUFxQixFQUNyQixVQUFpQyxFQUFFO0lBT25DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7SUFDckQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFpQjtRQUMzQyxJQUFJLEVBQUUsRUFBRTtRQUNSLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQU8sQ0FBQztRQUNwRCxNQUFNLEVBQUUsRUFBRTtLQUNYLHlEQUFDLENBQUM7SUFFSCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDckIsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLElBQUksZUFBZSxHQUFtQjtRQUNwQyxJQUFJLEVBQUUsRUFBRTtRQUNSLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQU8sQ0FBQztRQUNwRCxNQUFNLEVBQUUsRUFBRTtLQUNYLENBQUM7SUFFRixNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQzdELElBQUksZUFBZSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDO1lBQ2xCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2Ys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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTaWduYWwsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZGVlcENsb25lLCBzbmFwc2hvdHNFcXVhbCB9IGZyb20gJ0BzaWduYWx0cmVlL3NoYXJlZCc7XG5cbi8vIExvY2FsIHR5cGUgZGVmaW5pdGlvbiB0byBhdm9pZCBjaXJjdWxhciBpbXBvcnRzIGluIHNlY29uZGFyeSBlbnRyeSBwb2ludHNcbmludGVyZmFjZSBGb3JtVHJlZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZm9ybTogYW55OyAvLyBGb3JtR3JvdXBcbiAgdW53cmFwKCk6IFQ7XG4gIGRlc3Ryb3koKTogdm9pZDtcbiAgc2V0VmFsdWVzKHZhbHVlczogUGFydGlhbDxUPik6IHZvaWQ7XG59XG5cbi8qKlxuICogRm9ybSBoaXN0b3J5IHN0YXRlIHN0cnVjdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1IaXN0b3J5PFQ+IHtcbiAgcGFzdDogVFtdO1xuICBwcmVzZW50OiBUO1xuICBmdXR1cmU6IFRbXTtcbn1cblxuLyoqXG4gKiBFbmhhbmNlcyBhIEZvcm1UcmVlIHdpdGggdW5kby9yZWRvIGNhcGFiaWxpdGllcy5cbiAqIFByb3ZpZGVzIGZvcm0tc3BlY2lmaWMgaGlzdG9yeSBtYW5hZ2VtZW50IHdpdGggY2FwYWNpdHkgbGltaXRzIGFuZCBjaGFuZ2UgdHJhY2tpbmcuXG4gKlxuICogQHBhcmFtIGZvcm1UcmVlIC0gVGhlIGZvcm0gdHJlZSB0byBlbmhhbmNlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHBhcmFtIG9wdGlvbnMuY2FwYWNpdHkgLSBNYXhpbXVtIG51bWJlciBvZiBoaXN0b3J5IGVudHJpZXMgKGRlZmF1bHQ6IDEwKVxuICogQHJldHVybnMgRXh0ZW5kZWQgRm9ybVRyZWUgd2l0aCB1bmRvLCByZWRvLCBhbmQgaGlzdG9yeSBhY2Nlc3NcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZm9ybSA9IGNyZWF0ZUZvcm1UcmVlKHsgbmFtZTogJycsIGVtYWlsOiAnJyB9KTtcbiAqIGNvbnN0IGZvcm1XaXRoSGlzdG9yeSA9IHdpdGhGb3JtSGlzdG9yeShmb3JtLCB7IGNhcGFjaXR5OiAyMCB9KTtcbiAqXG4gKiBmb3JtLiQubmFtZS5zZXQoJ0pvaG4nKTtcbiAqIGZvcm0uJC5lbWFpbC5zZXQoJ2pvaG5AZXhhbXBsZS5jb20nKTtcbiAqXG4gKiBmb3JtV2l0aEhpc3RvcnkudW5kbygpOyAvLyBSZXZlcnRzIGVtYWlsIGNoYW5nZVxuICogZm9ybVdpdGhIaXN0b3J5LnVuZG8oKTsgLy8gUmV2ZXJ0cyBuYW1lIGNoYW5nZVxuICogZm9ybVdpdGhIaXN0b3J5LnJlZG8oKTsgLy8gUmVhcHBsaWVzIG5hbWUgY2hhbmdlXG4gKlxuICogY29uc29sZS5sb2coZm9ybVdpdGhIaXN0b3J5Lmhpc3RvcnkoKS5wYXN0Lmxlbmd0aCk7IC8vIDFcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aEZvcm1IaXN0b3J5PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gIGZvcm1UcmVlOiBGb3JtVHJlZTxUPixcbiAgb3B0aW9uczogeyBjYXBhY2l0eT86IG51bWJlciB9ID0ge31cbik6IEZvcm1UcmVlPFQ+ICYge1xuICB1bmRvOiAoKSA9PiB2b2lkO1xuICByZWRvOiAoKSA9PiB2b2lkO1xuICBjbGVhckhpc3Rvcnk6ICgpID0+IHZvaWQ7XG4gIGhpc3Rvcnk6IFNpZ25hbDxGb3JtSGlzdG9yeTxUPj47XG59IHtcbiAgY29uc3QgY2FwYWNpdHkgPSBNYXRoLm1heCgxLCBvcHRpb25zLmNhcGFjaXR5ID8/IDEwKTtcbiAgY29uc3QgaGlzdG9yeVNpZ25hbCA9IHNpZ25hbDxGb3JtSGlzdG9yeTxUPj4oe1xuICAgIHBhc3Q6IFtdLFxuICAgIHByZXNlbnQ6IGRlZXBDbG9uZShmb3JtVHJlZS5mb3JtLmdldFJhd1ZhbHVlKCkgYXMgVCksXG4gICAgZnV0dXJlOiBbXSxcbiAgfSk7XG5cbiAgbGV0IHJlY29yZGluZyA9IHRydWU7XG4gIGxldCBzdXBwcmVzc1VwZGF0ZXMgPSAwO1xuICBsZXQgaW50ZXJuYWxIaXN0b3J5OiBGb3JtSGlzdG9yeTxUPiA9IHtcbiAgICBwYXN0OiBbXSxcbiAgICBwcmVzZW50OiBkZWVwQ2xvbmUoZm9ybVRyZWUuZm9ybS5nZXRSYXdWYWx1ZSgpIGFzIFQpLFxuICAgIGZ1dHVyZTogW10sXG4gIH07XG5cbiAgY29uc3Qgc3Vic2NyaXB0aW9uID0gZm9ybVRyZWUuZm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICBpZiAoc3VwcHJlc3NVcGRhdGVzID4gMCkge1xuICAgICAgc3VwcHJlc3NVcGRhdGVzLS07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFyZWNvcmRpbmcpIHtcbiAgICAgIGludGVybmFsSGlzdG9yeSA9IHtcbiAgICAgICAgLi4uaW50ZXJuYWxIaXN0b3J5LFxuICAgICAgICBwcmVzZW50OiBkZWVwQ2xvbmUoZm9ybVRyZWUuZm9ybS5nZXRSYXdWYWx1ZSgpIGFzIFQpLFxuICAgICAgfTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc25hcHNob3QgPSBkZWVwQ2xvbmUoZm9ybVRyZWUuZm9ybS5nZXRSYXdWYWx1ZSgpIGFzIFQpO1xuICAgIGlmIChzbmFwc2hvdHNFcXVhbChpbnRlcm5hbEhpc3RvcnkucHJlc2VudCwgc25hcHNob3QpKSB7XG4gICAgICBpbnRlcm5hbEhpc3RvcnkgPSB7XG4gICAgICAgIC4uLmludGVybmFsSGlzdG9yeSxcbiAgICAgICAgcHJlc2VudDogc25hcHNob3QsXG4gICAgICB9O1xuICAgICAgaGlzdG9yeVNpZ25hbC5zZXQoY2xvbmVIaXN0b3J5KGludGVybmFsSGlzdG9yeSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGVkUGFzdCA9IFsuLi5pbnRlcm5hbEhpc3RvcnkucGFzdCwgaW50ZXJuYWxIaXN0b3J5LnByZXNlbnRdO1xuICAgIGlmICh1cGRhdGVkUGFzdC5sZW5ndGggPiBjYXBhY2l0eSkge1xuICAgICAgdXBkYXRlZFBhc3Quc2hpZnQoKTtcbiAgICB9XG4gICAgaW50ZXJuYWxIaXN0b3J5ID0ge1xuICAgICAgcGFzdDogdXBkYXRlZFBhc3QsXG4gICAgICBwcmVzZW50OiBzbmFwc2hvdCxcbiAgICAgIGZ1dHVyZTogW10sXG4gICAgfTtcbiAgICBoaXN0b3J5U2lnbmFsLnNldChjbG9uZUhpc3RvcnkoaW50ZXJuYWxIaXN0b3J5KSk7XG4gIH0pO1xuXG4gIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGZvcm1UcmVlLmRlc3Ryb3k7XG4gIGZvcm1UcmVlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgb3JpZ2luYWxEZXN0cm95KCk7XG4gIH07XG5cbiAgY29uc3QgdW5kbyA9ICgpID0+IHtcbiAgICBjb25zdCBoaXN0b3J5ID0gaGlzdG9yeVNpZ25hbCgpO1xuICAgIGlmIChoaXN0b3J5LnBhc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHByZXZpb3VzID0gZGVlcENsb25lKGhpc3RvcnkucGFzdFtoaXN0b3J5LnBhc3QubGVuZ3RoIC0gMV0pO1xuICAgIHJlY29yZGluZyA9IGZhbHNlO1xuICAgIHN1cHByZXNzVXBkYXRlcysrO1xuICAgIGZvcm1UcmVlLnNldFZhbHVlcyhwcmV2aW91cyk7XG4gICAgcmVjb3JkaW5nID0gdHJ1ZTtcbiAgICBpbnRlcm5hbEhpc3RvcnkgPSB7XG4gICAgICBwYXN0OiBoaXN0b3J5LnBhc3Quc2xpY2UoMCwgLTEpLFxuICAgICAgcHJlc2VudDogcHJldmlvdXMsXG4gICAgICBmdXR1cmU6IFtoaXN0b3J5LnByZXNlbnQsIC4uLmhpc3RvcnkuZnV0dXJlXSxcbiAgICB9O1xuICAgIGhpc3RvcnlTaWduYWwuc2V0KGNsb25lSGlzdG9yeShpbnRlcm5hbEhpc3RvcnkpKTtcbiAgfTtcblxuICBjb25zdCByZWRvID0gKCkgPT4ge1xuICAgIGNvbnN0IGhpc3RvcnkgPSBoaXN0b3J5U2lnbmFsKCk7XG4gICAgaWYgKGhpc3RvcnkuZnV0dXJlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gZGVlcENsb25lKGhpc3RvcnkuZnV0dXJlWzBdKTtcbiAgICByZWNvcmRpbmcgPSBmYWxzZTtcbiAgICBzdXBwcmVzc1VwZGF0ZXMrKztcbiAgICBmb3JtVHJlZS5zZXRWYWx1ZXMobmV4dCk7XG4gICAgcmVjb3JkaW5nID0gdHJ1ZTtcbiAgICBpbnRlcm5hbEhpc3RvcnkgPSB7XG4gICAgICBwYXN0OiBbLi4uaGlzdG9yeS5wYXN0LCBoaXN0b3J5LnByZXNlbnRdLFxuICAgICAgcHJlc2VudDogbmV4dCxcbiAgICAgIGZ1dHVyZTogaGlzdG9yeS5mdXR1cmUuc2xpY2UoMSksXG4gICAgfTtcbiAgICBoaXN0b3J5U2lnbmFsLnNldChjbG9uZUhpc3RvcnkoaW50ZXJuYWxIaXN0b3J5KSk7XG4gIH07XG5cbiAgY29uc3QgY2xlYXJIaXN0b3J5ID0gKCkgPT4ge1xuICAgIGludGVybmFsSGlzdG9yeSA9IHtcbiAgICAgIHBhc3Q6IFtdLFxuICAgICAgcHJlc2VudDogZGVlcENsb25lKGZvcm1UcmVlLmZvcm0uZ2V0UmF3VmFsdWUoKSBhcyBUKSxcbiAgICAgIGZ1dHVyZTogW10sXG4gICAgfTtcbiAgICBoaXN0b3J5U2lnbmFsLnNldChjbG9uZUhpc3RvcnkoaW50ZXJuYWxIaXN0b3J5KSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gY2xvbmVIaXN0b3J5KHN0YXRlOiBGb3JtSGlzdG9yeTxUPik6IEZvcm1IaXN0b3J5PFQ+IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFzdDogc3RhdGUucGFzdC5tYXAoKGVudHJ5KSA9PiBkZWVwQ2xvbmUoZW50cnkpKSxcbiAgICAgIHByZXNlbnQ6IGRlZXBDbG9uZShzdGF0ZS5wcmVzZW50KSxcbiAgICAgIGZ1dHVyZTogc3RhdGUuZnV0dXJlLm1hcCgoZW50cnkpID0+IGRlZXBDbG9uZShlbnRyeSkpLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbihmb3JtVHJlZSwge1xuICAgIHVuZG8sXG4gICAgcmVkbyxcbiAgICBjbGVhckhpc3RvcnksXG4gICAgaGlzdG9yeTogaGlzdG9yeVNpZ25hbC5hc1JlYWRvbmx5KCksXG4gIH0pO1xufVxuIl19"],"names":[],"mappings":"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"}
package/index.d.ts DELETED
@@ -1,128 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { WritableSignal, DestroyRef, Signal, OnInit, EventEmitter } from '@angular/core';
3
- import { FormGroup, AbstractControl, FormArray, ControlValueAccessor } from '@angular/forms';
4
- import { Observable } from 'rxjs';
5
- import { TreeConfig, TreeNode, SignalTree } from '@signaltree/core';
6
-
7
- type FormTreeAsyncValidatorFn<T> = (value: T) => Observable<string | null> | Promise<string | null>;
8
- type EnhancedArraySignal<T> = WritableSignal<T[]> & {
9
- push: (item: T) => void;
10
- removeAt: (index: number) => void;
11
- setAt: (index: number, value: T) => void;
12
- insertAt: (index: number, item: T) => void;
13
- move: (from: number, to: number) => void;
14
- clear: () => void;
15
- };
16
- type FieldValidator = (value: unknown) => string | null;
17
- interface FieldConfig {
18
- debounceMs?: number;
19
- validators?: Record<string, FieldValidator> | FieldValidator[];
20
- asyncValidators?: Record<string, FormTreeAsyncValidatorFn<unknown>> | Array<FormTreeAsyncValidatorFn<unknown>>;
21
- }
22
- interface ConditionalField<T> {
23
- when: (values: T) => boolean;
24
- fields: string[];
25
- }
26
- interface FormTreeOptions<T extends Record<string, unknown>> extends TreeConfig {
27
- validators?: SyncValidatorMap;
28
- asyncValidators?: AsyncValidatorMap;
29
- destroyRef?: DestroyRef;
30
- fieldConfigs?: Record<string, FieldConfig>;
31
- conditionals?: Array<ConditionalField<T>>;
32
- persistKey?: string;
33
- storage?: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;
34
- persistDebounceMs?: number;
35
- validationBatchMs?: number;
36
- }
37
- type FormTree$1<T extends Record<string, unknown>> = {
38
- state: TreeNode<T>;
39
- $: TreeNode<T>;
40
- form: FormGroup;
41
- errors: WritableSignal<Record<string, string>>;
42
- asyncErrors: WritableSignal<Record<string, string>>;
43
- touched: WritableSignal<Record<string, boolean>>;
44
- asyncValidating: WritableSignal<Record<string, boolean>>;
45
- dirty: WritableSignal<boolean>;
46
- valid: WritableSignal<boolean>;
47
- submitting: WritableSignal<boolean>;
48
- unwrap(): T;
49
- setValue(field: string, value: unknown): void;
50
- setValues(values: Partial<T>): void;
51
- reset(): void;
52
- submit<TResult>(submitFn: (values: T) => Promise<TResult>): Promise<TResult>;
53
- validate(field?: string): Promise<void>;
54
- getFieldError(field: string): Signal<string | undefined>;
55
- getFieldAsyncError(field: string): Signal<string | undefined>;
56
- getFieldTouched(field: string): Signal<boolean | undefined>;
57
- isFieldValid(field: string): Signal<boolean>;
58
- isFieldAsyncValidating(field: string): Signal<boolean | undefined>;
59
- fieldErrors: Record<string, Signal<string | undefined>>;
60
- fieldAsyncErrors: Record<string, Signal<string | undefined>>;
61
- values: SignalTree<T>;
62
- destroy(): void;
63
- };
64
- declare class FormValidationError extends Error {
65
- readonly errors: Record<string, string>;
66
- readonly asyncErrors: Record<string, string>;
67
- constructor(errors: Record<string, string>, asyncErrors: Record<string, string>);
68
- }
69
- type SyncValidatorMap = Record<string, (value: unknown) => string | null>;
70
- type AsyncValidatorMap = Record<string, FormTreeAsyncValidatorFn<unknown>>;
71
- declare function createFormTree<T extends Record<string, unknown>>(initialValues: T, config?: FormTreeOptions<T>): FormTree$1<T>;
72
- declare function createVirtualFormArray<T>(items: T[], visibleRange: {
73
- start: number;
74
- end: number;
75
- }, controlFactory?: (value: T, index: number) => AbstractControl): FormArray;
76
- declare class SignalValueDirective implements ControlValueAccessor, OnInit {
77
- signalTreeSignalValue: WritableSignal<unknown>;
78
- signalTreeSignalValueChange: EventEmitter<unknown>;
79
- private elementRef;
80
- private renderer;
81
- private onChange;
82
- private onTouched;
83
- ngOnInit(): void;
84
- handleChange(event: Event): void;
85
- handleBlur(): void;
86
- writeValue(value: unknown): void;
87
- registerOnChange(fn: (value: unknown) => void): void;
88
- registerOnTouched(fn: () => void): void;
89
- setDisabledState?(isDisabled: boolean): void;
90
- static ɵfac: i0.ɵɵFactoryDeclaration<SignalValueDirective, never>;
91
- static ɵdir: i0.ɵɵDirectiveDeclaration<SignalValueDirective, "[signalTreeSignalValue]", never, { "signalTreeSignalValue": { "alias": "signalTreeSignalValue"; "required": false; }; }, { "signalTreeSignalValueChange": "signalTreeSignalValueChange"; }, never, never, true, never>;
92
- }
93
- declare const SIGNAL_FORM_DIRECTIVES: (typeof SignalValueDirective)[];
94
-
95
- declare function required(message?: string): FieldValidator;
96
- declare function email(message?: string): FieldValidator;
97
- declare function minLength(min: number, message?: string): FieldValidator;
98
- declare function maxLength(max: number, message?: string): FieldValidator;
99
- declare function pattern(regex: RegExp, message?: string): FieldValidator;
100
- declare function min(min: number, message?: string): FieldValidator;
101
- declare function max(max: number, message?: string): FieldValidator;
102
- declare function compose(validators: FieldValidator[]): FieldValidator;
103
-
104
- declare function unique(checkFn: (value: unknown) => Promise<boolean>, message?: string): FormTreeAsyncValidatorFn<unknown>;
105
- declare function debounce(validator: FormTreeAsyncValidatorFn<unknown>, delayMs: number): FormTreeAsyncValidatorFn<unknown>;
106
-
107
- interface FormTree<T extends Record<string, unknown>> {
108
- form: any;
109
- unwrap(): T;
110
- destroy(): void;
111
- setValues(values: Partial<T>): void;
112
- }
113
- interface FormHistory<T> {
114
- past: T[];
115
- present: T;
116
- future: T[];
117
- }
118
- declare function withFormHistory<T extends Record<string, unknown>>(formTree: FormTree<T>, options?: {
119
- capacity?: number;
120
- }): FormTree<T> & {
121
- undo: () => void;
122
- redo: () => void;
123
- clearHistory: () => void;
124
- history: Signal<FormHistory<T>>;
125
- };
126
-
127
- export { FormValidationError, SIGNAL_FORM_DIRECTIVES, SignalValueDirective, compose, createFormTree, createVirtualFormArray, debounce, email, max, maxLength, min, minLength, pattern, required, unique, withFormHistory };
128
- export type { ConditionalField, EnhancedArraySignal, FieldConfig, FieldValidator, FormHistory, FormTree$1 as FormTree, FormTreeAsyncValidatorFn, FormTreeOptions };
@@ -1,15 +0,0 @@
1
- import { Middleware } from '@signaltree/core';
2
-
3
- interface AuditEntry<T = unknown> {
4
- timestamp: number;
5
- changes: Partial<T>;
6
- metadata?: {
7
- userId?: string;
8
- source?: string;
9
- description?: string;
10
- };
11
- }
12
- declare function createAuditMiddleware<T>(auditLog: AuditEntry<T>[], getMetadata?: () => AuditEntry<T>['metadata']): Middleware<T>;
13
-
14
- export { createAuditMiddleware };
15
- export type { AuditEntry };
@@ -1,24 +0,0 @@
1
- import { Signal } from '@angular/core';
2
-
3
- interface FormTree<T extends Record<string, unknown>> {
4
- form: any;
5
- unwrap(): T;
6
- destroy(): void;
7
- setValues(values: Partial<T>): void;
8
- }
9
- interface FormHistory<T> {
10
- past: T[];
11
- present: T;
12
- future: T[];
13
- }
14
- declare function withFormHistory<T extends Record<string, unknown>>(formTree: FormTree<T>, options?: {
15
- capacity?: number;
16
- }): FormTree<T> & {
17
- undo: () => void;
18
- redo: () => void;
19
- clearHistory: () => void;
20
- history: Signal<FormHistory<T>>;
21
- };
22
-
23
- export { withFormHistory };
24
- export type { FormHistory };
@@ -1,6 +0,0 @@
1
- import { Signal } from '@angular/core';
2
- import { Observable } from 'rxjs';
3
-
4
- declare function toObservable<T>(signal: Signal<T>): Observable<T>;
5
-
6
- export { toObservable };