import { FilteringExtension, SelectionExtension } 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 { HighlightExtension } from "/_nuxt/lib/viewer/composables/setup/highlighting.ts"; import { getTargetObjectIds } from "/_nuxt/lib/object-sidebar/helpers.ts"; import { ref, shallowRef, computed, onBeforeUnmount, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; export const useFiltersSetup = () => { const isolatedObjectIds = ref([]); const hiddenObjectIds = ref([]); const selectedObjects = shallowRef([]); const propertyFilters = ref([]); const filteredObjectsCount = ref(0); const activeColorFilterId = ref(null); const hasAnyFiltersApplied = computed(() => { if (propertyFilters.value.some( (filter) => filter.isApplied || filter.selectedValues && filter.selectedValues.length > 0 )) return true; return false; }); const isolatedObjectsSet = computed(() => { return new Set(isolatedObjectIds.value); }); return { filters: { isolatedObjectIds, hiddenObjectIds, selectedObjects, propertyFilters, filteredObjectsCount, activeColorFilterId, hasAnyFiltersApplied, isolatedObjectsSet } }; }; export const useManualFilteringPostSetup = () => { const { ui: { filters }, viewer: { instance } } = useInjectedViewerState(); const filteringExtension = () => instance.getExtension(FilteringExtension); const preserveSelectionHighlightFilter = (filterFn) => { const selectionExtension = instance.getExtension(SelectionExtension); const highlightExtension = instance.getExtension(HighlightExtension); const selectedObjects = selectionExtension.getSelectedObjects().flatMap((obj) => getTargetObjectIds(obj)); const highlightedObjects = highlightExtension?.getSelectedObjects().flatMap((obj) => getTargetObjectIds(obj)) || []; if (selectedObjects.length) selectionExtension.clearSelection(); if (highlightedObjects.length && highlightExtension) { highlightExtension.clearSelection(); } const result = filterFn(); if (selectedObjects.length) { selectionExtension.selectObjects(selectedObjects); } if (highlightedObjects.length && highlightExtension) { highlightExtension.selectObjects(highlightedObjects); } return result; }; const { trigger: triggerIsolationWatch } = watchTriggerable( filters.isolatedObjectIds, (newIds, oldIds) => { if (!newIds || !oldIds) { return; } preserveSelectionHighlightFilter(() => { const extension = filteringExtension(); const toIsolate = newIds.filter((id) => !oldIds.includes(id)); if (toIsolate.length > 0) { extension.isolateObjects(toIsolate, "manual-isolation", true, true); } const toUnIsolate = oldIds.filter((id) => !newIds.includes(id)); if (toUnIsolate.length > 0) { extension.unIsolateObjects(toUnIsolate, "manual-isolation", true, true); } }); }, { deep: true } ); const { trigger: triggerHidingWatch } = watchTriggerable( filters.hiddenObjectIds, (newIds, oldIds) => { if (!newIds || !oldIds) return; preserveSelectionHighlightFilter(() => { const extension = filteringExtension(); const toHide = newIds.filter((id) => !oldIds.includes(id)); if (toHide.length > 0) { extension.hideObjects(toHide, "manual-hiding", false, false); } const toShow = oldIds.filter((id) => !newIds.includes(id)); if (toShow.length > 0) { extension.showObjects(toShow, "manual-hiding", false); } }); }, { deep: true } ); useOnViewerLoadComplete( () => { triggerIsolationWatch(); triggerHidingWatch(); }, { initialOnly: true } ); onBeforeUnmount(() => { const extension = filteringExtension(); if (filters.isolatedObjectIds.value.length > 0) { extension.unIsolateObjects( filters.isolatedObjectIds.value, "manual-isolation", true, true ); } if (filters.hiddenObjectIds.value.length > 0) { extension.showObjects(filters.hiddenObjectIds.value, "manual-hiding", false); } }); }; export const usePropertyFilteringPostSetup = () => { const { ui: { filters }, viewer: { instance } } = useInjectedViewerState(); const dataStore = useFilteringDataStore(); const filteringExtension = () => instance.getExtension(FilteringExtension); const applyPropertyFilters = () => { const objectIds = dataStore.getFinalObjectIds(); filters.isolatedObjectIds.value = objectIds; filters.filteredObjectsCount.value = objectIds.length; }; const { trigger: triggerDataSlicesWatch } = watchTriggerable( dataStore.dataSlices, (newSlices, oldSlices) => { if (newSlices === oldSlices) return; applyPropertyFilters(); }, { deep: true } ); watchTriggerable( () => filters.filteredObjectsCount.value, () => { const extension = filteringExtension(); const objectIds = dataStore.getFinalObjectIds(); const hasAppliedFilters = filters.propertyFilters.value.some( (filter) => filter.isApplied ); if (objectIds.length > 0) { extension.isolateObjects(objectIds, "property-filters", false, true); } else if (hasAppliedFilters) { extension.isolateObjects( ["no-match-ghost-all"], "property-filters", false, true ); } } ); watchTriggerable(dataStore.currentFilterLogic, (newLogic, oldLogic) => { if (newLogic !== oldLogic) { dataStore.computeSliceIntersections(); applyPropertyFilters(); } }); watch( () => filters.propertyFilters.value.length, (filterCount, prevFilterCount) => { if (prevFilterCount > 0 && filterCount === 0) { const extension = filteringExtension(); extension.resetFilters(); } } ); useOnViewerLoadComplete( () => { triggerDataSlicesWatch(); }, { initialOnly: true } ); onBeforeUnmount(() => { filteringExtension().resetFilters(); }); }; //# sourceMappingURL=data:application/json;base64,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Q3BDLDJCQUFxQjtBQUFBLElBQ3ZCO0FBQUEsRUFDRixDQUFDO0FBS0Q7QUFBQSxJQUNFLE1BQU0sUUFBUSxnQkFBZ0IsTUFBTTtBQUFBLElBQ3BDLENBQUMsYUFBYSxvQkFBb0I7QUFDaEMsVUFBSSxrQkFBa0IsS0FBSyxnQkFBZ0IsR0FBRztBQUM1QyxjQUFNLFlBQVksbUJBQW1CO0FBQ3JDLGtCQUFVLGFBQWE7QUFBQSxNQUN6QjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBS0E7QUFBQSxJQUNFLE1BQU07QUFDSiw2QkFBdUI7QUFBQSxJQUN6QjtBQUFBLElBQ0EsRUFBRSxhQUFhLEtBQUs7QUFBQSxFQUN0QjtBQUVBLGtCQUFnQixNQUFNO0FBQ3BCLHVCQUFtQixFQUFFLGFBQWE7QUFBQSxFQUNwQyxDQUFDO0FBQ0giLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbImZpbHRlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBGaWx0ZXJEYXRhIH0gZnJvbSAnfi9saWIvdmlld2VyL2hlbHBlcnMvZmlsdGVycy90eXBlcydcclxuaW1wb3J0IHR5cGUgeyBTcGVja2xlT2JqZWN0IH0gZnJvbSAnQHNwZWNrbGUvdmlld2VyJ1xyXG5pbXBvcnQgdHlwZSB7IFJhdyB9IGZyb20gJ3Z1ZSdcclxuaW1wb3J0IHsgRmlsdGVyaW5nRXh0ZW5zaW9uLCBTZWxlY3Rpb25FeHRlbnNpb24gfSBmcm9tICdAc3BlY2tsZS92aWV3ZXInXHJcbmltcG9ydCB7IHdhdGNoVHJpZ2dlcmFibGUgfSBmcm9tICdAdnVldXNlL2NvcmUnXHJcbmltcG9ydCB7IHVzZUluamVjdGVkVmlld2VyU3RhdGUgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAnXG5pbXBvcnQgeyB1c2VPblZpZXdlckxvYWRDb21wbGV0ZSB9IGZyb20gJ34vbGliL3ZpZXdlci9jb21wb3NhYmxlcy92aWV3ZXInXG5pbXBvcnQgeyB1c2VGaWx0ZXJpbmdEYXRhU3RvcmUgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvZmlsdGVyaW5nL2RhdGFTdG9yZSdcbmltcG9ydCB7IEhpZ2hsaWdodEV4dGVuc2lvbiB9IGZyb20gJ34vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zZXR1cC9oaWdobGlnaHRpbmcnXG5pbXBvcnQgeyBnZXRUYXJnZXRPYmplY3RJZHMgfSBmcm9tICd+L2xpYi9vYmplY3Qtc2lkZWJhci9oZWxwZXJzJ1xuXHJcbi8qKlxyXG4gKiBTZXR1cCBjb21wb3NhYmxlIGZvciBmaWx0ZXItcmVsYXRlZCBzdGF0ZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHVzZUZpbHRlcnNTZXR1cCA9ICgpID0+IHtcclxuICBjb25zdCBpc29sYXRlZE9iamVjdElkcyA9IHJlZihbXSBhcyBzdHJpbmdbXSlcclxuICBjb25zdCBoaWRkZW5PYmplY3RJZHMgPSByZWYoW10gYXMgc3RyaW5nW10pXHJcbiAgY29uc3Qgc2VsZWN0ZWRPYmplY3RzID0gc2hhbGxvd1JlZjxSYXc8U3BlY2tsZU9iamVjdD5bXT4oW10pXHJcblxyXG4gIGNvbnN0IHByb3BlcnR5RmlsdGVycyA9IHJlZjxGaWx0ZXJEYXRhW10+KFtdKVxyXG4gIGNvbnN0IGZpbHRlcmVkT2JqZWN0c0NvdW50ID0gcmVmKDApXHJcblxyXG4gIGNvbnN0IGFjdGl2ZUNvbG9yRmlsdGVySWQgPSByZWY8c3RyaW5nIHwgbnVsbD4obnVsbClcclxuXHJcbiAgY29uc3QgaGFzQW55RmlsdGVyc0FwcGxpZWQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHByb3BlcnR5RmlsdGVycy52YWx1ZS5zb21lKFxyXG4gICAgICAgIChmaWx0ZXIpID0+XHJcbiAgICAgICAgICBmaWx0ZXIuaXNBcHBsaWVkIHx8XHJcbiAgICAgICAgICAoZmlsdGVyLnNlbGVjdGVkVmFsdWVzICYmIGZpbHRlci5zZWxlY3RlZFZhbHVlcy5sZW5ndGggPiAwKVxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9KVxyXG5cclxuICBjb25zdCBpc29sYXRlZE9iamVjdHNTZXQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICByZXR1cm4gbmV3IFNldChpc29sYXRlZE9iamVjdElkcy52YWx1ZSlcclxuICB9KVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgZmlsdGVyczoge1xyXG4gICAgICBpc29sYXRlZE9iamVjdElkcyxcclxuICAgICAgaGlkZGVuT2JqZWN0SWRzLFxyXG4gICAgICBzZWxlY3RlZE9iamVjdHMsXHJcbiAgICAgIHByb3BlcnR5RmlsdGVycyxcclxuICAgICAgZmlsdGVyZWRPYmplY3RzQ291bnQsXHJcbiAgICAgIGFjdGl2ZUNvbG9yRmlsdGVySWQsXHJcbiAgICAgIGhhc0FueUZpbHRlcnNBcHBsaWVkLFxyXG4gICAgICBpc29sYXRlZE9iamVjdHNTZXRcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbnRlZ3JhdGlvbiBjb21wb3NhYmxlIGZvciBtYW51YWwgb2JqZWN0IGlzb2xhdGlvbiBhbmQgaGlkaW5nLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHVzZU1hbnVhbEZpbHRlcmluZ1Bvc3RTZXR1cCA9ICgpID0+IHtcclxuICBjb25zdCB7XHJcbiAgICB1aTogeyBmaWx0ZXJzIH0sXHJcbiAgICB2aWV3ZXI6IHsgaW5zdGFuY2UgfVxyXG4gIH0gPSB1c2VJbmplY3RlZFZpZXdlclN0YXRlKClcclxuXHJcbiAgY29uc3QgZmlsdGVyaW5nRXh0ZW5zaW9uID0gKCkgPT4gaW5zdGFuY2UuZ2V0RXh0ZW5zaW9uKEZpbHRlcmluZ0V4dGVuc2lvbilcclxuXHJcbiAgLyoqXHJcbiAgICogUHJlc2VydmUgc2VsZWN0aW9uIGFuZCBoaWdobGlnaHRpbmcgc3RhdGUgZHVyaW5nIGZpbHRlcmluZyBvcGVyYXRpb25zXHJcbiAgICogVGhpcyByZXBsaWNhdGVzIExlZ2FjeVZpZXdlcidzIHByZXNlcnZlU2VsZWN0aW9uSGlnaGxpZ2h0RmlsdGVyIGZ1bmN0aW9uXHJcbiAgICovXHJcbiAgY29uc3QgcHJlc2VydmVTZWxlY3Rpb25IaWdobGlnaHRGaWx0ZXIgPSA8VD4oZmlsdGVyRm46ICgpID0+IFQpOiBUID0+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbkV4dGVuc2lvbiA9IGluc3RhbmNlLmdldEV4dGVuc2lvbihTZWxlY3Rpb25FeHRlbnNpb24pXHJcbiAgICBjb25zdCBoaWdobGlnaHRFeHRlbnNpb24gPSBpbnN0YW5jZS5nZXRFeHRlbnNpb24oSGlnaGxpZ2h0RXh0ZW5zaW9uKVxyXG5cclxuICAgIC8vIDEuIFNBVkUgY3VycmVudCBzdGF0ZSBmcm9tIHZpZXdlciBleHRlbnNpb25zXG4gICAgY29uc3Qgc2VsZWN0ZWRPYmplY3RzID0gc2VsZWN0aW9uRXh0ZW5zaW9uXG4gICAgICAuZ2V0U2VsZWN0ZWRPYmplY3RzKClcbiAgICAgIC5mbGF0TWFwKChvYmopID0+IGdldFRhcmdldE9iamVjdElkcyhvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKVxuICAgIGNvbnN0IGhpZ2hsaWdodGVkT2JqZWN0cyA9XG4gICAgICBoaWdobGlnaHRFeHRlbnNpb25cbiAgICAgICAgPy5nZXRTZWxlY3RlZE9iamVjdHMoKVxuICAgICAgICAuZmxhdE1hcCgob2JqKSA9PiBnZXRUYXJnZXRPYmplY3RJZHMob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkgfHwgW11cblxyXG4gICAgLy8gMi4gQ0xFQVIgdmlld2VyIGV4dGVuc2lvbnMgZGlyZWN0bHlcclxuICAgIGlmIChzZWxlY3RlZE9iamVjdHMubGVuZ3RoKSBzZWxlY3Rpb25FeHRlbnNpb24uY2xlYXJTZWxlY3Rpb24oKVxyXG4gICAgaWYgKGhpZ2hsaWdodGVkT2JqZWN0cy5sZW5ndGggJiYgaGlnaGxpZ2h0RXh0ZW5zaW9uKSB7XHJcbiAgICAgIGhpZ2hsaWdodEV4dGVuc2lvbi5jbGVhclNlbGVjdGlvbigpXHJcbiAgICB9XHJcblxyXG4gICAgLy8gMy4gRVhFQ1VURSB0aGUgZmlsdGVyaW5nIG9wZXJhdGlvblxyXG4gICAgY29uc3QgcmVzdWx0ID0gZmlsdGVyRm4oKVxyXG5cclxuICAgIC8vIDQuIFJFU1RPUkUgdG8gdmlld2VyIGV4dGVuc2lvbnMgZGlyZWN0bHlcclxuICAgIGlmIChzZWxlY3RlZE9iamVjdHMubGVuZ3RoKSB7XHJcbiAgICAgIHNlbGVjdGlvbkV4dGVuc2lvbi5zZWxlY3RPYmplY3RzKHNlbGVjdGVkT2JqZWN0cylcclxuICAgIH1cclxuICAgIGlmIChoaWdobGlnaHRlZE9iamVjdHMubGVuZ3RoICYmIGhpZ2hsaWdodEV4dGVuc2lvbikge1xyXG4gICAgICBoaWdobGlnaHRFeHRlbnNpb24uc2VsZWN0T2JqZWN0cyhoaWdobGlnaHRlZE9iamVjdHMpXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2F0Y2ggZm9yIGNoYW5nZXMgdG8gbWFudWFsbHkgaXNvbGF0ZWQgb2JqZWN0IElEc1xyXG4gICAqL1xyXG4gIGNvbnN0IHsgdHJpZ2dlcjogdHJpZ2dlcklzb2xhdGlvbldhdGNoIH0gPSB3YXRjaFRyaWdnZXJhYmxlKFxyXG4gICAgZmlsdGVycy5pc29sYXRlZE9iamVjdElkcyxcclxuICAgIChuZXdJZHMsIG9sZElkcykgPT4ge1xyXG4gICAgICBpZiAoIW5ld0lkcyB8fCAhb2xkSWRzKSB7XHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHByZXNlcnZlU2VsZWN0aW9uSGlnaGxpZ2h0RmlsdGVyKCgpID0+IHtcclxuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBmaWx0ZXJpbmdFeHRlbnNpb24oKVxyXG5cclxuICAgICAgICBjb25zdCB0b0lzb2xhdGUgPSBuZXdJZHMuZmlsdGVyKChpZCkgPT4gIW9sZElkcy5pbmNsdWRlcyhpZCkpXHJcbiAgICAgICAgaWYgKHRvSXNvbGF0ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBleHRlbnNpb24uaXNvbGF0ZU9iamVjdHModG9Jc29sYXRlLCAnbWFudWFsLWlzb2xhdGlvbicsIHRydWUsIHRydWUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0b1VuSXNvbGF0ZSA9IG9sZElkcy5maWx0ZXIoKGlkKSA9PiAhbmV3SWRzLmluY2x1ZGVzKGlkKSlcclxuICAgICAgICBpZiAodG9Vbklzb2xhdGUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgZXh0ZW5zaW9uLnVuSXNvbGF0ZU9iamVjdHModG9Vbklzb2xhdGUsICdtYW51YWwtaXNvbGF0aW9uJywgdHJ1ZSwgdHJ1ZSlcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9LFxyXG4gICAgeyBkZWVwOiB0cnVlIH1cclxuICApXHJcblxyXG4gIC8qKlxyXG4gICAqIFdhdGNoIGZvciBjaGFuZ2VzIHRvIG1hbnVhbGx5IGhpZGRlbiBvYmplY3QgSURzXHJcbiAgICovXHJcbiAgY29uc3QgeyB0cmlnZ2VyOiB0cmlnZ2VySGlkaW5nV2F0Y2ggfSA9IHdhdGNoVHJpZ2dlcmFibGUoXHJcbiAgICBmaWx0ZXJzLmhpZGRlbk9iamVjdElkcyxcclxuICAgIChuZXdJZHMsIG9sZElkcykgPT4ge1xyXG4gICAgICBpZiAoIW5ld0lkcyB8fCAhb2xkSWRzKSByZXR1cm5cclxuXHJcbiAgICAgIHByZXNlcnZlU2VsZWN0aW9uSGlnaGxpZ2h0RmlsdGVyKCgpID0+IHtcclxuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBmaWx0ZXJpbmdFeHRlbnNpb24oKVxyXG5cclxuICAgICAgICBjb25zdCB0b0hpZGUgPSBuZXdJZHMuZmlsdGVyKChpZCkgPT4gIW9sZElkcy5pbmNsdWRlcyhpZCkpXHJcbiAgICAgICAgaWYgKHRvSGlkZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBleHRlbnNpb24uaGlkZU9iamVjdHModG9IaWRlLCAnbWFudWFsLWhpZGluZycsIGZhbHNlLCBmYWxzZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHRvU2hvdyA9IG9sZElkcy5maWx0ZXIoKGlkKSA9PiAhbmV3SWRzLmluY2x1ZGVzKGlkKSlcclxuICAgICAgICBpZiAodG9TaG93Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGV4dGVuc2lvbi5zaG93T2JqZWN0cyh0b1Nob3csICdtYW51YWwtaGlkaW5nJywgZmFsc2UpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfSxcclxuICAgIHsgZGVlcDogdHJ1ZSB9XHJcbiAgKVxyXG5cclxuICAvKipcclxuICAgKiBJbml0aWFsaXplIG1hbnVhbCBmaWx0ZXJpbmcgb24gdmlld2VyIGxvYWRcclxuICAgKi9cclxuICB1c2VPblZpZXdlckxvYWRDb21wbGV0ZShcclxuICAgICgpID0+IHtcclxuICAgICAgdHJpZ2dlcklzb2xhdGlvbldhdGNoKClcclxuICAgICAgdHJpZ2dlckhpZGluZ1dhdGNoKClcclxuICAgIH0sXHJcbiAgICB7IGluaXRpYWxPbmx5OiB0cnVlIH1cclxuICApXHJcblxyXG4gIG9uQmVmb3JlVW5tb3VudCgoKSA9PiB7XHJcbiAgICBjb25zdCBleHRlbnNpb24gPSBmaWx0ZXJpbmdFeHRlbnNpb24oKVxyXG4gICAgaWYgKGZpbHRlcnMuaXNvbGF0ZWRPYmplY3RJZHMudmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICBleHRlbnNpb24udW5Jc29sYXRlT2JqZWN0cyhcclxuICAgICAgICBmaWx0ZXJzLmlzb2xhdGVkT2JqZWN0SWRzLnZhbHVlLFxyXG4gICAgICAgICdtYW51YWwtaXNvbGF0aW9uJyxcclxuICAgICAgICB0cnVlLFxyXG4gICAgICAgIHRydWVcclxuICAgICAgKVxyXG4gICAgfVxyXG4gICAgaWYgKGZpbHRlcnMuaGlkZGVuT2JqZWN0SWRzLnZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgZXh0ZW5zaW9uLnNob3dPYmplY3RzKGZpbHRlcnMuaGlkZGVuT2JqZWN0SWRzLnZhbHVlLCAnbWFudWFsLWhpZGluZycsIGZhbHNlKVxyXG4gICAgfVxyXG4gIH0pXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbnRlZ3JhdGlvbiBjb21wb3NhYmxlIGZvciBwcm9wZXJ0eS1iYXNlZCBmaWx0ZXJpbmcuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdXNlUHJvcGVydHlGaWx0ZXJpbmdQb3N0U2V0dXAgPSAoKSA9PiB7XHJcbiAgY29uc3Qge1xyXG4gICAgdWk6IHsgZmlsdGVycyB9LFxyXG4gICAgdmlld2VyOiB7IGluc3RhbmNlIH1cclxuICB9ID0gdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSgpXHJcblxyXG4gIGNvbnN0IGRhdGFTdG9yZSA9IHVzZUZpbHRlcmluZ0RhdGFTdG9yZSgpXHJcbiAgY29uc3QgZmlsdGVyaW5nRXh0ZW5zaW9uID0gKCkgPT4gaW5zdGFuY2UuZ2V0RXh0ZW5zaW9uKEZpbHRlcmluZ0V4dGVuc2lvbilcclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbHkgcHJvcGVydHkgZmlsdGVycyB0byB0aGUgdmlld2VyIGJhc2VkIG9uIGN1cnJlbnQgc3RhdGVcclxuICAgKi9cclxuICBjb25zdCBhcHBseVByb3BlcnR5RmlsdGVycyA9ICgpID0+IHtcclxuICAgIGNvbnN0IG9iamVjdElkcyA9IGRhdGFTdG9yZS5nZXRGaW5hbE9iamVjdElkcygpXHJcblxyXG4gICAgZmlsdGVycy5pc29sYXRlZE9iamVjdElkcy52YWx1ZSA9IG9iamVjdElkc1xyXG4gICAgZmlsdGVycy5maWx0ZXJlZE9iamVjdHNDb3VudC52YWx1ZSA9IG9iamVjdElkcy5sZW5ndGhcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdhdGNoIGZvciBjaGFuZ2VzIHRvIHByb3BlcnR5IGZpbHRlcnMgYW5kIGFwcGx5IHRoZW0gdG8gdGhlIHZpZXdlclxyXG4gICAqL1xyXG4gIGNvbnN0IHsgdHJpZ2dlcjogdHJpZ2dlckRhdGFTbGljZXNXYXRjaCB9ID0gd2F0Y2hUcmlnZ2VyYWJsZShcclxuICAgIGRhdGFTdG9yZS5kYXRhU2xpY2VzLFxyXG4gICAgKG5ld1NsaWNlcywgb2xkU2xpY2VzKSA9PiB7XHJcbiAgICAgIGlmIChuZXdTbGljZXMgPT09IG9sZFNsaWNlcykgcmV0dXJuXHJcblxyXG4gICAgICBhcHBseVByb3BlcnR5RmlsdGVycygpXHJcbiAgICB9LFxyXG4gICAgeyBkZWVwOiB0cnVlIH1cclxuICApXHJcblxyXG4gIC8qKlxyXG4gICAqIFdhdGNoIGZvciBwcm9wZXJ0eSBmaWx0ZXIgcmVzdWx0cyBhbmQgYXBwbHkgdG8gdmlld2VyIGV4dGVuc2lvblxyXG4gICAqL1xyXG4gIHdhdGNoVHJpZ2dlcmFibGUoXHJcbiAgICAoKSA9PiBmaWx0ZXJzLmZpbHRlcmVkT2JqZWN0c0NvdW50LnZhbHVlLFxyXG4gICAgKCkgPT4ge1xyXG4gICAgICBjb25zdCBleHRlbnNpb24gPSBmaWx0ZXJpbmdFeHRlbnNpb24oKVxyXG4gICAgICBjb25zdCBvYmplY3RJZHMgPSBkYXRhU3RvcmUuZ2V0RmluYWxPYmplY3RJZHMoKVxyXG5cclxuICAgICAgY29uc3QgaGFzQXBwbGllZEZpbHRlcnMgPSBmaWx0ZXJzLnByb3BlcnR5RmlsdGVycy52YWx1ZS5zb21lKFxyXG4gICAgICAgIChmaWx0ZXIpID0+IGZpbHRlci5pc0FwcGxpZWRcclxuICAgICAgKVxyXG5cclxuICAgICAgaWYgKG9iamVjdElkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgZXh0ZW5zaW9uLmlzb2xhdGVPYmplY3RzKG9iamVjdElkcywgJ3Byb3BlcnR5LWZpbHRlcnMnLCBmYWxzZSwgdHJ1ZSlcclxuICAgICAgfSBlbHNlIGlmIChoYXNBcHBsaWVkRmlsdGVycykge1xyXG4gICAgICAgIGV4dGVuc2lvbi5pc29sYXRlT2JqZWN0cyhcclxuICAgICAgICAgIFsnbm8tbWF0Y2gtZ2hvc3QtYWxsJ10sXHJcbiAgICAgICAgICAncHJvcGVydHktZmlsdGVycycsXHJcbiAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgIHRydWVcclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgIH1cclxuICApXHJcblxyXG4gIC8qKlxyXG4gICAqIFdhdGNoIGZvciBjaGFuZ2VzIHRvIGZpbHRlciBsb2dpYyAoQU5EL09SKVxyXG4gICAqL1xyXG4gIHdhdGNoVHJpZ2dlcmFibGUoZGF0YVN0b3JlLmN1cnJlbnRGaWx0ZXJMb2dpYywgKG5ld0xvZ2ljLCBvbGRMb2dpYykgPT4ge1xyXG4gICAgaWYgKG5ld0xvZ2ljICE9PSBvbGRMb2dpYykge1xyXG4gICAgICBkYXRhU3RvcmUuY29tcHV0ZVNsaWNlSW50ZXJzZWN0aW9ucygpXHJcbiAgICAgIGFwcGx5UHJvcGVydHlGaWx0ZXJzKClcclxuICAgIH1cclxuICB9KVxyXG5cclxuICAvKipcclxuICAgKiBXYXRjaCBmb3IgZmlsdGVyIHJlc2V0cyAtIHdoZW4gYWxsIHByb3BlcnR5IGZpbHRlcnMgYXJlIHJlbW92ZWRcclxuICAgKi9cclxuICB3YXRjaChcclxuICAgICgpID0+IGZpbHRlcnMucHJvcGVydHlGaWx0ZXJzLnZhbHVlLmxlbmd0aCxcclxuICAgIChmaWx0ZXJDb3VudCwgcHJldkZpbHRlckNvdW50KSA9PiB7XHJcbiAgICAgIGlmIChwcmV2RmlsdGVyQ291bnQgPiAwICYmIGZpbHRlckNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZmlsdGVyaW5nRXh0ZW5zaW9uKClcclxuICAgICAgICBleHRlbnNpb24ucmVzZXRGaWx0ZXJzKClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIClcclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdGlhbGl6ZSBwcm9wZXJ0eSBmaWx0ZXJzIG9uIHZpZXdlciBsb2FkXHJcbiAgICovXHJcbiAgdXNlT25WaWV3ZXJMb2FkQ29tcGxldGUoXHJcbiAgICAoKSA9PiB7XHJcbiAgICAgIHRyaWdnZXJEYXRhU2xpY2VzV2F0Y2goKVxyXG4gICAgfSxcclxuICAgIHsgaW5pdGlhbE9ubHk6IHRydWUgfVxyXG4gIClcclxuXHJcbiAgb25CZWZvcmVVbm1vdW50KCgpID0+IHtcclxuICAgIGZpbHRlcmluZ0V4dGVuc2lvbigpLnJlc2V0RmlsdGVycygpXHJcbiAgfSlcclxufVxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zZXR1cC9maWx0ZXJzLnRzIn0=