import { FilteringExtension } from "/_nuxt/@fs/D:/speckle-server/packages/viewer/dist/index.js"; import { watchTriggerable } from "/_nuxt/node_modules/@vueuse/core/index.mjs?v=e4f18c29"; import { useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts"; import { useOnViewerLoadComplete } from "/_nuxt/lib/viewer/composables/viewer.ts"; import { useFilteringDataStore } from "/_nuxt/lib/viewer/composables/filtering/dataStore.ts"; import { watch, onBeforeUnmount } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; export const useFilterColoringPostSetup = () => { const { ui: { filters }, viewer } = useInjectedViewerState(); const dataStore = useFilteringDataStore(); const filteringExtension = () => viewer.instance.getExtension(FilteringExtension); const setNumericColorFilter = (filterId) => { const filter = filters.propertyFilters.value.find((f) => f.id === filterId); if (!filter?.filter || filter.type !== "numeric" || filter.filter.type !== "number") return; const numericFilter = filter.filter; const min = parseFloat(filter.numericRange.min.toFixed(4)); const max = parseFloat(filter.numericRange.max.toFixed(4)); const finalFilteredObjectIds = new Set(dataStore.getFinalObjectIds()); const colorGroups = numericFilter.valueGroups?.filter((vg) => { const roundedValue = parseFloat(vg.value.toFixed(4)); const inRange = roundedValue >= min && roundedValue <= max; const isInFinalFilteredSet = finalFilteredObjectIds.has(vg.id); return inRange && isInFinalFilteredSet; })?.map((vg) => { const normalizedValue = (vg.value - numericFilter.min) / (numericFilter.max - numericFilter.min); const fromColor = { r: 59, g: 130, b: 246 }; const toColor = { r: 236, g: 72, b: 153 }; const r = Math.round( fromColor.r + (toColor.r - fromColor.r) * normalizedValue ); const g = Math.round( fromColor.g + (toColor.g - fromColor.g) * normalizedValue ); const b = Math.round( fromColor.b + (toColor.b - fromColor.b) * normalizedValue ); return { objectIds: [vg.id], color: `rgb(${r}, ${g}, ${b})` }; }) || []; const extension = filteringExtension(); extension.setUserObjectColors(colorGroups); }; const setStringColorFilter = (filterId) => { const filter = filters.propertyFilters.value.find((f) => f.id === filterId); if (!filter?.filter || filter.type !== "string") return; const extension = filteringExtension(); extension.setColorFilter(filter.filter); }; const removeColorFilter = () => { const extension = filteringExtension(); extension.removeColorFilter(); extension.removeUserObjectColors(); }; const { trigger: triggerColorFilterWatch, ignoreUpdates: ignoreColorFilterUpdates } = watchTriggerable(filters.activeColorFilterId, (newFilterId, oldFilterId) => { if (newFilterId === oldFilterId) return; if (!newFilterId) { removeColorFilter(); return; } const filter = filters.propertyFilters.value.find((f) => f.id === newFilterId); if (filter?.filter) { if (filter.type === "numeric") { setNumericColorFilter(newFilterId); } else { setStringColorFilter(newFilterId); } } else { ignoreColorFilterUpdates(() => { filters.activeColorFilterId.value = null; }); } }); watchTriggerable( () => filters.propertyFilters.value.map((f) => ({ id: f.id, key: f.filter?.key, type: f.type })), () => { const activeFilterId = filters.activeColorFilterId.value; if (!activeFilterId) return; const activeFilter = filters.propertyFilters.value.find( (f) => f.id === activeFilterId ); if (!activeFilter) { ignoreColorFilterUpdates(() => { filters.activeColorFilterId.value = null; }); } else { if (activeFilter.filter) { if (activeFilter.type === "numeric") { setNumericColorFilter(activeFilterId); } else { setStringColorFilter(activeFilterId); } } } }, { deep: true } ); watchTriggerable( () => filters.propertyFilters.value.map((f) => f.type === "numeric" ? { id: f.id, range: f.numericRange } : null).filter(Boolean), () => { const activeFilterId = filters.activeColorFilterId.value; if (!activeFilterId) return; const activeFilter = filters.propertyFilters.value.find( (f) => f.id === activeFilterId ); if (activeFilter?.filter && activeFilter.type === "numeric") { setNumericColorFilter(activeFilterId); } }, { deep: true } ); watch( () => filters.propertyFilters.value.length, (filterCount, prevFilterCount) => { if (prevFilterCount > 0 && filterCount === 0) { removeColorFilter(); } } ); useOnViewerLoadComplete( () => { triggerColorFilterWatch(); }, { initialOnly: true } ); onBeforeUnmount(() => { removeColorFilter(); }); }; //# sourceMappingURL=data:application/json;base64,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YUFBYSxJQUFJLElBQUssRUFDOUUsT0FBTyxPQUFPO0FBQUEsSUFDbkIsTUFBTTtBQUNKLFlBQU0saUJBQWlCLFFBQVEsb0JBQW9CO0FBQ25ELFVBQUksQ0FBQyxlQUFnQjtBQUVyQixZQUFNLGVBQWUsUUFBUSxnQkFBZ0IsTUFBTTtBQUFBLFFBQ2pELENBQUMsTUFBTSxFQUFFLE9BQU87QUFBQSxNQUNsQjtBQUVBLFVBQUksY0FBYyxVQUFVLGFBQWEsU0FBUyxXQUFXO0FBQzNELDhCQUFzQixjQUFjO0FBQUEsTUFDdEM7QUFBQSxJQUNGO0FBQUEsSUFDQSxFQUFFLE1BQU0sS0FBSztBQUFBLEVBQ2Y7QUFLQTtBQUFBLElBQ0UsTUFBTSxRQUFRLGdCQUFnQixNQUFNO0FBQUEsSUFDcEMsQ0FBQyxhQUFhLG9CQUFvQjtBQUNoQyxVQUFJLGtCQUFrQixLQUFLLGdCQUFnQixHQUFHO0FBQzVDLDBCQUFrQjtBQUFBLE1BQ3BCO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFLQTtBQUFBLElBQ0UsTUFBTTtBQUNKLDhCQUF3QjtBQUFBLElBQzFCO0FBQUEsSUFDQSxFQUFFLGFBQWEsS0FBSztBQUFBLEVBQ3RCO0FBRUEsa0JBQWdCLE1BQU07QUFDcEIsc0JBQWtCO0FBQUEsRUFDcEIsQ0FBQztBQUNIIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJjb2xvcmluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGaWx0ZXJpbmdFeHRlbnNpb24gfSBmcm9tICdAc3BlY2tsZS92aWV3ZXInXHJcbmltcG9ydCB0eXBlIHsgTnVtZXJpY1Byb3BlcnR5SW5mbyB9IGZyb20gJ0BzcGVja2xlL3ZpZXdlcidcclxuaW1wb3J0IHsgd2F0Y2hUcmlnZ2VyYWJsZSB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IHsgdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSB9IGZyb20gJ34vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zZXR1cCdcclxuaW1wb3J0IHsgdXNlT25WaWV3ZXJMb2FkQ29tcGxldGUgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvdmlld2VyJ1xyXG5pbXBvcnQgeyB1c2VGaWx0ZXJpbmdEYXRhU3RvcmUgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvZmlsdGVyaW5nL2RhdGFTdG9yZSdcclxuXHJcbi8qKlxyXG4gKiBJbnRlZ3JhdGlvbiBjb21wb3NhYmxlIHRoYXQgc2V0cyB1cCB3YXRjaGVycyB0byBzeW5jIHN0YXRlIHdpdGggdGhlIHZpZXdlci5cclxuICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSBkdXJpbmcgcG9zdC1zZXR1cCBhZnRlciB0aGUgdmlld2VyIGlzIGluaXRpYWxpemVkLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHVzZUZpbHRlckNvbG9yaW5nUG9zdFNldHVwID0gKCkgPT4ge1xyXG4gIGNvbnN0IHtcclxuICAgIHVpOiB7IGZpbHRlcnMgfSxcclxuICAgIHZpZXdlclxyXG4gIH0gPSB1c2VJbmplY3RlZFZpZXdlclN0YXRlKClcclxuXHJcbiAgY29uc3QgZGF0YVN0b3JlID0gdXNlRmlsdGVyaW5nRGF0YVN0b3JlKClcclxuICBjb25zdCBmaWx0ZXJpbmdFeHRlbnNpb24gPSAoKSA9PiB2aWV3ZXIuaW5zdGFuY2UuZ2V0RXh0ZW5zaW9uKEZpbHRlcmluZ0V4dGVuc2lvbilcclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyBjb2xvciBmaWx0ZXIgZm9yIG51bWVyaWMgZmlsdGVycyB1c2luZyBzZXRVc2VyT2JqZWN0Q29sb3JzXHJcbiAgICovXHJcbiAgY29uc3Qgc2V0TnVtZXJpY0NvbG9yRmlsdGVyID0gKGZpbHRlcklkOiBzdHJpbmcpID0+IHtcclxuICAgIGNvbnN0IGZpbHRlciA9IGZpbHRlcnMucHJvcGVydHlGaWx0ZXJzLnZhbHVlLmZpbmQoKGYpID0+IGYuaWQgPT09IGZpbHRlcklkKVxyXG4gICAgaWYgKCFmaWx0ZXI/LmZpbHRlciB8fCBmaWx0ZXIudHlwZSAhPT0gJ251bWVyaWMnIHx8IGZpbHRlci5maWx0ZXIudHlwZSAhPT0gJ251bWJlcicpXHJcbiAgICAgIHJldHVyblxyXG5cclxuICAgIGNvbnN0IG51bWVyaWNGaWx0ZXIgPSBmaWx0ZXIuZmlsdGVyIGFzIE51bWVyaWNQcm9wZXJ0eUluZm9cclxuICAgIC8vIFVzZSB0aGUgc2FtZSByb3VuZGluZyBwcmVjaXNpb24gYXMgdGhlIGZpbHRlcmluZyBsb2dpYyB0byBhdm9pZCBmbG9hdGluZyBwb2ludCBpc3N1ZXNcclxuICAgIGNvbnN0IG1pbiA9IHBhcnNlRmxvYXQoZmlsdGVyLm51bWVyaWNSYW5nZS5taW4udG9GaXhlZCg0KSlcclxuICAgIGNvbnN0IG1heCA9IHBhcnNlRmxvYXQoZmlsdGVyLm51bWVyaWNSYW5nZS5tYXgudG9GaXhlZCg0KSlcclxuXHJcbiAgICAvLyBHZXQgdGhlIGZpbmFsIGZpbHRlcmVkIG9iamVjdCBJRHMgZnJvbSBhbGwgYWN0aXZlIGZpbHRlcnMgdG8gZW5zdXJlIGNvbG9yaW5nIHJlc3BlY3RzIGFsbCBmaWx0ZXJzXHJcbiAgICBjb25zdCBmaW5hbEZpbHRlcmVkT2JqZWN0SWRzID0gbmV3IFNldChkYXRhU3RvcmUuZ2V0RmluYWxPYmplY3RJZHMoKSlcclxuXHJcbiAgICBjb25zdCBjb2xvckdyb3VwcyA9XHJcbiAgICAgIG51bWVyaWNGaWx0ZXIudmFsdWVHcm91cHNcclxuICAgICAgICA/LmZpbHRlcigodmcpID0+IHtcclxuICAgICAgICAgIC8vIEFwcGx5IHRoZSBzYW1lIHJvdW5kaW5nIHByZWNpc2lvbiB0byB2YWx1ZUdyb3VwIHZhbHVlcyBmb3IgY29uc2lzdGVudCBjb21wYXJpc29uXHJcbiAgICAgICAgICBjb25zdCByb3VuZGVkVmFsdWUgPSBwYXJzZUZsb2F0KHZnLnZhbHVlLnRvRml4ZWQoNCkpXHJcbiAgICAgICAgICBjb25zdCBpblJhbmdlID0gcm91bmRlZFZhbHVlID49IG1pbiAmJiByb3VuZGVkVmFsdWUgPD0gbWF4XHJcbiAgICAgICAgICAvLyBPbmx5IGluY2x1ZGUgb2JqZWN0cyB0aGF0IGFyZSBpbiB0aGUgZmluYWwgZmlsdGVyZWQgc2V0IChpbnRlcnNlY3Rpb24gb2YgYWxsIGFjdGl2ZSBmaWx0ZXJzKVxyXG4gICAgICAgICAgY29uc3QgaXNJbkZpbmFsRmlsdGVyZWRTZXQgPSBmaW5hbEZpbHRlcmVkT2JqZWN0SWRzLmhhcyh2Zy5pZClcclxuICAgICAgICAgIHJldHVybiBpblJhbmdlICYmIGlzSW5GaW5hbEZpbHRlcmVkU2V0XHJcbiAgICAgICAgfSlcclxuICAgICAgICA/Lm1hcCgodmcpID0+IHtcclxuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9XHJcbiAgICAgICAgICAgICh2Zy52YWx1ZSAtIG51bWVyaWNGaWx0ZXIubWluKSAvIChudW1lcmljRmlsdGVyLm1heCAtIG51bWVyaWNGaWx0ZXIubWluKVxyXG4gICAgICAgICAgY29uc3QgZnJvbUNvbG9yID0geyByOiA1OSwgZzogMTMwLCBiOiAyNDYgfSAvLyAjM2I4MmY2XHJcbiAgICAgICAgICBjb25zdCB0b0NvbG9yID0geyByOiAyMzYsIGc6IDcyLCBiOiAxNTMgfSAvLyAjZWM0ODk5XHJcblxyXG4gICAgICAgICAgY29uc3QgciA9IE1hdGgucm91bmQoXHJcbiAgICAgICAgICAgIGZyb21Db2xvci5yICsgKHRvQ29sb3IuciAtIGZyb21Db2xvci5yKSAqIG5vcm1hbGl6ZWRWYWx1ZVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgY29uc3QgZyA9IE1hdGgucm91bmQoXHJcbiAgICAgICAgICAgIGZyb21Db2xvci5nICsgKHRvQ29sb3IuZyAtIGZyb21Db2xvci5nKSAqIG5vcm1hbGl6ZWRWYWx1ZVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgY29uc3QgYiA9IE1hdGgucm91bmQoXHJcbiAgICAgICAgICAgIGZyb21Db2xvci5iICsgKHRvQ29sb3IuYiAtIGZyb21Db2xvci5iKSAqIG5vcm1hbGl6ZWRWYWx1ZVxyXG4gICAgICAgICAgKVxyXG5cclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG9iamVjdElkczogW3ZnLmlkXSxcclxuICAgICAgICAgICAgY29sb3I6IGByZ2IoJHtyfSwgJHtnfSwgJHtifSlgXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkgfHwgW11cclxuXHJcbiAgICBjb25zdCBleHRlbnNpb24gPSBmaWx0ZXJpbmdFeHRlbnNpb24oKVxyXG4gICAgZXh0ZW5zaW9uLnNldFVzZXJPYmplY3RDb2xvcnMoY29sb3JHcm91cHMpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIGNvbG9yIGZpbHRlciBmb3Igc3RyaW5nIGZpbHRlcnMgdXNpbmcgc2V0Q29sb3JGaWx0ZXJcclxuICAgKi9cclxuICBjb25zdCBzZXRTdHJpbmdDb2xvckZpbHRlciA9IChmaWx0ZXJJZDogc3RyaW5nKSA9PiB7XHJcbiAgICBjb25zdCBmaWx0ZXIgPSBmaWx0ZXJzLnByb3BlcnR5RmlsdGVycy52YWx1ZS5maW5kKChmKSA9PiBmLmlkID09PSBmaWx0ZXJJZClcclxuICAgIGlmICghZmlsdGVyPy5maWx0ZXIgfHwgZmlsdGVyLnR5cGUgIT09ICdzdHJpbmcnKSByZXR1cm5cclxuXHJcbiAgICBjb25zdCBleHRlbnNpb24gPSBmaWx0ZXJpbmdFeHRlbnNpb24oKVxyXG4gICAgZXh0ZW5zaW9uLnNldENvbG9yRmlsdGVyKGZpbHRlci5maWx0ZXIpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmVzIHRoZSBhY3RpdmUgY29sb3IgZmlsdGVyIGJ5IGNhbGxpbmcgdGhlIHZpZXdlciBleHRlbnNpb25cclxuICAgKi9cclxuICBjb25zdCByZW1vdmVDb2xvckZpbHRlciA9ICgpID0+IHtcclxuICAgIGNvbnN0IGV4dGVuc2lvbiA9IGZpbHRlcmluZ0V4dGVuc2lvbigpXHJcbiAgICBleHRlbnNpb24ucmVtb3ZlQ29sb3JGaWx0ZXIoKVxyXG4gICAgZXh0ZW5zaW9uLnJlbW92ZVVzZXJPYmplY3RDb2xvcnMoKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2F0Y2ggZm9yIGNoYW5nZXMgdG8gYWN0aXZlQ29sb3JGaWx0ZXJJZCBhbmQgYXBwbHkvcmVtb3ZlIGNvbG9yIGZpbHRlcnMgYWNjb3JkaW5nbHlcclxuICAgKi9cclxuICBjb25zdCB7IHRyaWdnZXI6IHRyaWdnZXJDb2xvckZpbHRlcldhdGNoLCBpZ25vcmVVcGRhdGVzOiBpZ25vcmVDb2xvckZpbHRlclVwZGF0ZXMgfSA9XHJcbiAgICB3YXRjaFRyaWdnZXJhYmxlKGZpbHRlcnMuYWN0aXZlQ29sb3JGaWx0ZXJJZCwgKG5ld0ZpbHRlcklkLCBvbGRGaWx0ZXJJZCkgPT4ge1xyXG4gICAgICBpZiAobmV3RmlsdGVySWQgPT09IG9sZEZpbHRlcklkKSByZXR1cm5cclxuXHJcbiAgICAgIGlmICghbmV3RmlsdGVySWQpIHtcclxuICAgICAgICByZW1vdmVDb2xvckZpbHRlcigpXHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGZpbHRlciA9IGZpbHRlcnMucHJvcGVydHlGaWx0ZXJzLnZhbHVlLmZpbmQoKGYpID0+IGYuaWQgPT09IG5ld0ZpbHRlcklkKVxyXG4gICAgICBpZiAoZmlsdGVyPy5maWx0ZXIpIHtcclxuICAgICAgICBpZiAoZmlsdGVyLnR5cGUgPT09ICdudW1lcmljJykge1xyXG4gICAgICAgICAgc2V0TnVtZXJpY0NvbG9yRmlsdGVyKG5ld0ZpbHRlcklkKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzZXRTdHJpbmdDb2xvckZpbHRlcihuZXdGaWx0ZXJJZClcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWdub3JlQ29sb3JGaWx0ZXJVcGRhdGVzKCgpID0+IHtcclxuICAgICAgICAgIGZpbHRlcnMuYWN0aXZlQ29sb3JGaWx0ZXJJZC52YWx1ZSA9IG51bGxcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAvKipcclxuICAgKiBXYXRjaCBmb3IgY2hhbmdlcyB0byBwcm9wZXJ0eUZpbHRlcnMgdG8gdmFsaWRhdGUgYWN0aXZlQ29sb3JGaWx0ZXJJZFxyXG4gICAqIE9ubHkgcmUtYXBwbHkgY29sb3JzIHdoZW4gZmlsdGVyIHN0cnVjdHVyZSBjaGFuZ2VzLCBub3Qgd2hlbiB2YWx1ZXMgY2hhbmdlXHJcbiAgICovXHJcbiAgd2F0Y2hUcmlnZ2VyYWJsZShcclxuICAgICgpID0+XHJcbiAgICAgIGZpbHRlcnMucHJvcGVydHlGaWx0ZXJzLnZhbHVlLm1hcCgoZikgPT4gKHtcclxuICAgICAgICBpZDogZi5pZCxcclxuICAgICAgICBrZXk6IGYuZmlsdGVyPy5rZXksXHJcbiAgICAgICAgdHlwZTogZi50eXBlXHJcbiAgICAgIH0pKSxcclxuICAgICgpID0+IHtcclxuICAgICAgY29uc3QgYWN0aXZlRmlsdGVySWQgPSBmaWx0ZXJzLmFjdGl2ZUNvbG9yRmlsdGVySWQudmFsdWVcclxuICAgICAgaWYgKCFhY3RpdmVGaWx0ZXJJZCkgcmV0dXJuXHJcblxyXG4gICAgICBjb25zdCBhY3RpdmVGaWx0ZXIgPSBmaWx0ZXJzLnByb3BlcnR5RmlsdGVycy52YWx1ZS5maW5kKFxyXG4gICAgICAgIChmKSA9PiBmLmlkID09PSBhY3RpdmVGaWx0ZXJJZFxyXG4gICAgICApXHJcblxyXG4gICAgICBpZiAoIWFjdGl2ZUZpbHRlcikge1xyXG4gICAgICAgIGlnbm9yZUNvbG9yRmlsdGVyVXBkYXRlcygoKSA9PiB7XHJcbiAgICAgICAgICBmaWx0ZXJzLmFjdGl2ZUNvbG9yRmlsdGVySWQudmFsdWUgPSBudWxsXHJcbiAgICAgICAgfSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoYWN0aXZlRmlsdGVyLmZpbHRlcikge1xyXG4gICAgICAgICAgaWYgKGFjdGl2ZUZpbHRlci50eXBlID09PSAnbnVtZXJpYycpIHtcclxuICAgICAgICAgICAgc2V0TnVtZXJpY0NvbG9yRmlsdGVyKGFjdGl2ZUZpbHRlcklkKVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2V0U3RyaW5nQ29sb3JGaWx0ZXIoYWN0aXZlRmlsdGVySWQpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgeyBkZWVwOiB0cnVlIH1cclxuICApXHJcblxyXG4gIC8qKlxyXG4gICAqIFdhdGNoIGZvciBjaGFuZ2VzIHRvIG51bWVyaWMgcmFuZ2UgdmFsdWVzIGFuZCByZS1hcHBseSBjb2xvciBmaWx0ZXJcclxuICAgKi9cclxuICB3YXRjaFRyaWdnZXJhYmxlKFxyXG4gICAgKCkgPT5cclxuICAgICAgZmlsdGVycy5wcm9wZXJ0eUZpbHRlcnMudmFsdWVcclxuICAgICAgICAubWFwKChmKSA9PiAoZi50eXBlID09PSAnbnVtZXJpYycgPyB7IGlkOiBmLmlkLCByYW5nZTogZi5udW1lcmljUmFuZ2UgfSA6IG51bGwpKVxyXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbiksXHJcbiAgICAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGFjdGl2ZUZpbHRlcklkID0gZmlsdGVycy5hY3RpdmVDb2xvckZpbHRlcklkLnZhbHVlXHJcbiAgICAgIGlmICghYWN0aXZlRmlsdGVySWQpIHJldHVyblxyXG5cclxuICAgICAgY29uc3QgYWN0aXZlRmlsdGVyID0gZmlsdGVycy5wcm9wZXJ0eUZpbHRlcnMudmFsdWUuZmluZChcclxuICAgICAgICAoZikgPT4gZi5pZCA9PT0gYWN0aXZlRmlsdGVySWRcclxuICAgICAgKVxyXG5cclxuICAgICAgaWYgKGFjdGl2ZUZpbHRlcj8uZmlsdGVyICYmIGFjdGl2ZUZpbHRlci50eXBlID09PSAnbnVtZXJpYycpIHtcclxuICAgICAgICBzZXROdW1lcmljQ29sb3JGaWx0ZXIoYWN0aXZlRmlsdGVySWQpXHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7IGRlZXA6IHRydWUgfVxyXG4gIClcclxuXHJcbiAgLyoqXHJcbiAgICogV2F0Y2ggZm9yIGZpbHRlciByZXNldHMgLSB3aGVuIGFsbCBwcm9wZXJ0eSBmaWx0ZXJzIGFyZSByZW1vdmVkLCBjbGVhciBjb2xvciBmaWx0ZXJcclxuICAgKi9cclxuICB3YXRjaChcclxuICAgICgpID0+IGZpbHRlcnMucHJvcGVydHlGaWx0ZXJzLnZhbHVlLmxlbmd0aCxcclxuICAgIChmaWx0ZXJDb3VudCwgcHJldkZpbHRlckNvdW50KSA9PiB7XHJcbiAgICAgIGlmIChwcmV2RmlsdGVyQ291bnQgPiAwICYmIGZpbHRlckNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgcmVtb3ZlQ29sb3JGaWx0ZXIoKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgKVxyXG5cclxuICAvKipcclxuICAgKiBJbml0aWFsaXplIGNvbG9yIGZpbHRlciBvbiB2aWV3ZXIgbG9hZFxyXG4gICAqL1xyXG4gIHVzZU9uVmlld2VyTG9hZENvbXBsZXRlKFxyXG4gICAgKCkgPT4ge1xyXG4gICAgICB0cmlnZ2VyQ29sb3JGaWx0ZXJXYXRjaCgpXHJcbiAgICB9LFxyXG4gICAgeyBpbml0aWFsT25seTogdHJ1ZSB9XHJcbiAgKVxyXG5cclxuICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xyXG4gICAgcmVtb3ZlQ29sb3JGaWx0ZXIoKVxyXG4gIH0pXHJcbn1cclxuIl0sImZpbGUiOiJEOi9zcGVja2xlLXNlcnZlci9wYWNrYWdlcy9mcm9udGVuZC0yL2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAvY29sb3JpbmcudHMifQ==