@kontur.candy/tools 2.129.0 → 2.131.0
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.
- package/CHANGELOG.md +27 -0
- package/README.md +6 -6
- package/distr/Common/AsyncUtils.js +1 -30
- package/distr/Common/CandyApiClient/CandyApiClient.js +56 -39
- package/distr/Common/CandyApiClient/CandyApiClientContext.js +1 -33
- package/distr/Common/CandyApiClient/ClientDraftInfo/ClientDraftInfoResponse.js +0 -4
- package/distr/Common/CandyApiClient/ClientDraftInfo/FnsFormInfo.js +0 -4
- package/distr/Common/CandyApiClient/ClientDraftInfo/GetClientDraftInfoUrl.js +1 -29
- package/distr/Common/CandyApiClient/ClientDraftInfo/PrintInfo.js +0 -4
- package/distr/Common/CandyApiClient/DigestApiClient/Decorators/DigestApiClientWithCache.js +1 -35
- package/distr/Common/CandyApiClient/DigestApiClient/Decorators/DigestApiClientWithDebouncedBatching.js +1 -35
- package/distr/Common/CandyApiClient/DigestApiClient/DigestApiClient.js +1 -37
- package/distr/Common/CandyApiClient/DigestApiClient/Fakes/Data/TaxRebate1152026.js +1 -29
- package/distr/Common/CandyApiClient/DigestApiClient/Fakes/FakeDigestApiClient.js +1 -34
- package/distr/Common/CandyApiClient/DigestApiClient/Fakes/FakePicklists.js +1 -28
- package/distr/Common/CandyApiClient/DigestApiClient/IDigestApiClient.js +0 -4
- package/distr/Common/CandyApiClient/DigestApiClient/React/DigestApiClientContext.js +1 -33
- package/distr/Common/CandyApiClient/DigestApiClient/TestDigestApiClient.js +1 -29
- package/distr/Common/CandyApiClient/DigestApiClient/Types/DigestQueryFilter.js +1 -6
- package/distr/Common/CandyApiClient/DigestApiClient/Types/DigestRequest.js +0 -4
- package/distr/Common/CandyApiClient/DigestApiClient/Types/DigestResponse.js +0 -4
- package/distr/Common/CandyApiClient/FakeCandyApiClient.js +22 -38
- package/distr/Common/CandyApiClient/ICandyApiClient.js +1 -5
- package/distr/Common/CandyApiClient/IsBuffer.js +1 -29
- package/distr/Common/CandyApiClient/Types/Attachments/Attacments.js +0 -4
- package/distr/Common/CandyApiClient/Types/Attachments/GetAttachmentsResponse.js +0 -4
- package/distr/Common/CandyApiClient/Types/ChangeSet/ServerChangeSet.js +0 -4
- package/distr/Common/CandyApiClient/Types/CreateDraft/CreateDraftResponse.js +0 -4
- package/distr/Common/CandyApiClient/Types/DiagResourcesResponse.js +0 -4
- package/distr/Common/CandyApiClient/Types/DraftActions/CombineFufResult.js +1 -6
- package/distr/Common/CandyApiClient/Types/DraftActions/ConvertDraftRequest.js +0 -4
- package/distr/Common/CandyApiClient/Types/DraftActions/FileProperties.js +0 -4
- package/distr/Common/CandyApiClient/Types/DraftActions/FufSizeTooLargeError.js +11 -0
- package/distr/Common/CandyApiClient/Types/DraftFullId.js +0 -4
- package/distr/Common/CandyApiClient/Types/ErrorLog/ServerErrorLog.js +0 -4
- package/distr/Common/CandyApiClient/Types/ExplanatoryNote/CreateExplanatoryNoteResponse.js +1 -6
- package/distr/Common/CandyApiClient/Types/FeatureFlags/FeatureFlagsResponse.js +0 -4
- package/distr/Common/CandyApiClient/Types/Focus/FocusServerResponse.js +0 -4
- package/distr/Common/CandyApiClient/Types/Focus/FocusTypes.js +1 -6
- package/distr/Common/CandyApiClient/Types/GetInner/ServerInnerResponse.js +0 -4
- package/distr/Common/CandyApiClient/Types/GetInner/ServerRequisitesResponse.js +0 -4
- package/distr/Common/CandyApiClient/Types/Guid.js +0 -4
- package/distr/Common/CandyApiClient/Types/Presentations/DraftPresentationType.js +1 -6
- package/distr/Common/CandyApiClient/Types/Presentations/PresentationContent.js +0 -4
- package/distr/Common/CandyApiClient/Types/Tasks/GetTasksServerResponse.js +0 -4
- package/distr/Common/CandyApiClient/Types/Tasks/Tasks.js +1 -6
- package/distr/Common/CommonConstants/SectionNames.js +1 -28
- package/distr/Common/Comparers.js +8 -30
- package/distr/Common/EmotionStorybookWorkaroundViaAliases.js +1 -29
- package/distr/Common/EndPoints.js +1 -34
- package/distr/Common/Errors.js +3 -71
- package/distr/Common/FormActionHandlers/ContextualActionNames.js +1 -30
- package/distr/Common/FormActionHandlers/ControlNamedContextualAction.js +0 -4
- package/distr/Common/Funcs.js +1 -29
- package/distr/Common/GFV.js +0 -4
- package/distr/Common/Hooks/UseLocalStorage.js +42 -0
- package/distr/Common/HttpClient/AuthenticationMode.js +1 -32
- package/distr/Common/HttpClient/FetchImplementation/BrowserFetchWithOptionalPolyfill.js +12 -0
- package/distr/Common/HttpClient/FetchImplementation/BrowserFetchWithPolyfill.js +1 -29
- package/distr/Common/HttpClient/FetchImplementation/Fetch.js +0 -4
- package/distr/Common/HttpClient/FetchImplementation/NativeBrowserFetch.js +1 -30
- package/distr/Common/HttpClient/FetchImplementation/NodeFetch.js +3 -31
- package/distr/Common/HttpClient/HttpClient.js +12 -56
- package/distr/Common/HttpClient/HttpClientAuthenticationProvider.js +0 -4
- package/distr/Common/HttpClient/IHttpClient.js +0 -4
- package/distr/Common/IndentString.js +18 -0
- package/distr/Common/IntRangeUtils.js +1 -31
- package/distr/Common/IterableUtils.js +23 -38
- package/distr/Common/KCLangRuntimeUtils.js +3 -38
- package/distr/Common/ModelPath/BuildIterationSequence.js +3 -31
- package/distr/Common/ModelPath/EachCurrentCollision.js +1 -6
- package/distr/Common/ModelPath/IEquatable.js +0 -4
- package/distr/Common/ModelPath/Map/AbsoluteModelPathMap.js +30 -0
- package/distr/Common/ModelPath/Map/Map2.js +103 -0
- package/distr/Common/ModelPath/Map/ModelPathMap.js +30 -0
- package/distr/Common/ModelPath/ModelPath.js +206 -206
- package/distr/Common/ModelPath/ModelPathBuilder.js +11 -40
- package/distr/Common/ModelPath/ModelPathHelper.js +13 -0
- package/distr/Common/ModelPath/PathMatcher.js +8 -37
- package/distr/Common/ModelPath/PathSplitHelper.js +26 -0
- package/distr/Common/ModelPath/Set/AbsoluteModelPathSet.js +40 -0
- package/distr/Common/ModelPath/Set/AbsoluteResolvedModelPathSet.js +40 -0
- package/distr/Common/ModelPath/Set/ModelPathSet.js +40 -0
- package/distr/Common/ModelPath/Set/Set2.js +60 -0
- package/distr/Common/NidusClient/ContextualNidusClient/ContextualNidusClient.js +1 -34
- package/distr/Common/NidusClient/ContextualNidusClient/IContextualNidusClient.js +0 -4
- package/distr/Common/NidusClient/Fakes/CreateUniqueNidusEntryId.js +1 -29
- package/distr/Common/NidusClient/Fakes/FakeNidusClient.js +1 -34
- package/distr/Common/NidusClient/Fakes/LocalStorageBasedNidusClient.js +1 -38
- package/distr/Common/NidusClient/INidusClient.js +1 -30
- package/distr/Common/NidusClient/NidusClientContext.js +1 -38
- package/distr/Common/NidusClient/NidusClientImpl.js +1 -34
- package/distr/Common/PathConstants.js +3 -31
- package/distr/Common/TypingUtils.js +6 -50
- package/distr/Common/UUID.js +1 -30
- package/distr/Common/UseAsyncEffect.js +1 -31
- package/distr/Tools/src/BuildTasks/ClientJS/BuildClientJsTask.js +3 -36
- package/distr/Tools/src/BuildTasks/ClientJS/IsWebpack5.js +1 -29
- package/distr/Tools/src/BuildTasks/Engine/AcquireFormEngine.js +1 -30
- package/distr/Tools/src/BuildTasks/Engine/AcquirePublishedEngineTask.js +3 -36
- package/distr/Tools/src/BuildTasks/Engine/BuildLocalEngineTask.js +3 -36
- package/distr/Tools/src/BuildTasks/Engine/EngineSource.js +1 -29
- package/distr/Tools/src/BuildTasks/EngineStructureUtils.js +3 -34
- package/distr/Tools/src/BuildTasks/EngineVersionUtils.js +1 -28
- package/distr/Tools/src/BuildTasks/FSTask.js +3 -30
- package/distr/Tools/src/BuildTasks/Form/CompileForm.js +3 -32
- package/distr/Tools/src/BuildTasks/Form/GenerateForm.js +1 -37
- package/distr/Tools/src/BuildTasks/Form/NullFormGenerator.js +1 -34
- package/distr/Tools/src/BuildTasks/Form/WriteAttachmentPathFiles.js +3 -31
- package/distr/Tools/src/BuildTasks/Form/WriteFLangNormalizationFiles.js +1 -29
- package/distr/Tools/src/BuildTasks/Generator/AcquireFormGenerator.js +1 -31
- package/distr/Tools/src/BuildTasks/Generator/AcquirePublishedGeneratorTask.js +3 -36
- package/distr/Tools/src/BuildTasks/Generator/BuildGeneratorFromSourcesTask.js +3 -37
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/CreateAsyncGenerator.js +2 -37
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/GeneratorRequireUtils.js +2 -34
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/ProcessSugarWorker.js +1 -5
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/ReadSourcesAndProcessSugarWorker.js +1 -5
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/RequireUncached.js +3 -33
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/TypedProcessWorker.js +1 -28
- package/distr/Tools/src/BuildTasks/ProcessUtils/ProcessUtils.js +3 -30
- package/distr/Tools/src/BuildTasks/ProcessUtils/ShellProcessHandle.js +1 -34
- package/distr/Tools/src/BuildTasks/PublishedVersionUtils.js +1 -45
- package/distr/Tools/src/BuildTasks/ReadFormSource.js +4 -39
- package/distr/Tools/src/BuildTasks/ResolveFormInfo.js +3 -33
- package/distr/Tools/src/BuildTasks/Version.js +1 -32
- package/distr/Tools/src/BuildTasks/WriteFormMeta.js +3 -31
- package/distr/Tools/src/CLICommands/BuildForms/BuildCacheMode.js +1 -30
- package/distr/Tools/src/CLICommands/BuildForms/BuildFormsOptions.js +7 -34
- package/distr/Tools/src/CLICommands/BuildForms/RunBuildForms.js +3 -33
- package/distr/Tools/src/CLICommands/BuildServer/BuildLogsWebsocketController.js +1 -34
- package/distr/Tools/src/CLICommands/BuildServer/BuildServerServerOptions.js +1 -29
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBackendResourcesController.js +6 -37
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBackendResourcesUpdatesController.js +6 -47
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBuildFormsController.js +26 -43
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerClientJsController.js +6 -40
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerClientJsFromResourcesController.js +6 -38
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerFormInfoController.js +6 -37
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerLocalSourcesEngineController.js +6 -39
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerPrebuiltResourcesController.js +6 -37
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerPublishedEngineController.js +6 -39
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/BuildFormDevServer.js +3 -36
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/ClientJsDevServer.js +3 -36
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/EngineDevServer.js +12 -37
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/ReportGeneratorErrorToPageBody.js +3 -31
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/RunFormCompilationViaWebpackDevServer.js +5 -35
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackDevServerWorker/WebpackDevServerWorker.js +4 -36
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackDevServerWorker/WebpackDevServerWorkerFactory.js +3 -31
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackInMemoryUtils/IInputFileSystem.js +0 -4
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackInMemoryUtils/IWatchFileSystem.js +0 -4
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackInMemoryUtils/WebpackHybridFileSystem.js +2 -42
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/Directories/FarmDirectory.js +3 -36
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/GlobToRegexp.js +1 -29
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/IGeneratedServerSideSourcesProvider.js +0 -4
- package/distr/Tools/src/CLICommands/BuildServer/RunBuildServer.js +1 -30
- package/distr/Tools/src/CLICommands/BuildServer/StdStreamsIntercepter.js +1 -29
- package/distr/Tools/src/CLICommands/CommonOptions/BuildDebugOnlyOption.js +1 -29
- package/distr/Tools/src/CLICommands/CommonOptions/CommonOptionDefintions.js +1 -30
- package/distr/Tools/src/CLICommands/CommonOptions/CommonOptions.js +0 -4
- package/distr/Tools/src/CLICommands/DevBuild/DevBuildOptions.js +1 -28
- package/distr/Tools/src/CLICommands/DevBuild/RunDevBuild.js +3 -31
- package/distr/Tools/src/CLICommands/FormStats/FormStatsOptions.js +1 -28
- package/distr/Tools/src/CLICommands/FormStats/RunFormStats.js +3 -31
- package/distr/Tools/src/CLICommands/FormsHelper/FormsHelperController.js +6 -40
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/autocalc/{gfv}.calc.js +1 -30
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/helpers/setKppValue.js +1 -29
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/test/browser/Smoke.test.js +1 -34
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/test/ui/DemoTest.test.js +6 -37
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/validations/kppValue.js +1 -29
- package/distr/Tools/src/CLICommands/InitForm/InitFormOptions.js +1 -28
- package/distr/Tools/src/CLICommands/InitForm/RunInitForm.js +1 -30
- package/distr/Tools/src/CLICommands/Localization/LocalizationOptions.js +1 -28
- package/distr/Tools/src/CLICommands/Localization/RunLocalization.js +3 -32
- package/distr/Tools/src/CLICommands/UpgradeForm/RunUpgradeForm.js +1 -32
- package/distr/Tools/src/CLICommands/UpgradeForm/UpgradeFormOptions.js +1 -29
- package/distr/Tools/src/CandyCLI.js +3 -31
- package/distr/Tools/src/CheckNodeJsVersion.js +3 -33
- package/distr/Tools/src/Commons/ConsoleApplication/ConsoleApplication.js +4 -35
- package/distr/Tools/src/Commons/ConsoleApplication/ConsoleApplicationContext.js +1 -34
- package/distr/Tools/src/Commons/ErrorUntyped.js +0 -4
- package/distr/Tools/src/Commons/EventObject.js +2 -44
- package/distr/Tools/src/Commons/ExecUtils.js +1 -29
- package/distr/Tools/src/Commons/ExtractGfvsFromFileName.js +1 -29
- package/distr/Tools/src/Commons/FormGlobsUtils.js +3 -36
- package/distr/Tools/src/Commons/FsUtils.js +3 -34
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Actions.js +1 -32
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Methods.js +2 -33
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/NotFoundWebError.js +1 -34
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/CookieParamParamBinder.js +1 -34
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/IParamBinder.js +0 -4
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/JsonBodyParamBinder.js +1 -34
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/StringBodyParamBinder.js +1 -34
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/UrlParamBinder.js +2 -34
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/UrlQueryParamBinder.js +1 -34
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Params.js +1 -36
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/CustomActionResultHandler.js +1 -34
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/CustomContentResultHandler.js +1 -34
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/EmptyResultHandler.js +1 -34
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/HtmlResultHandler.js +1 -34
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/IResultHandler.js +0 -4
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/JsonResultHandler.js +1 -34
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/PlainTextResultHandler.js +1 -34
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/StreamResultHandler.js +3 -57
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results.js +1 -28
- package/distr/Tools/src/Commons/HttpServer/ExpressWrapper/ExpressServerWrapper.js +3 -36
- package/distr/Tools/src/Commons/HttpServer/ExpressWrapper/SingletonController.js +1 -34
- package/distr/Tools/src/Commons/Locks/Lock.js +3 -36
- package/distr/Tools/src/Commons/Locks/LockHandle.js +1 -34
- package/distr/Tools/src/Commons/Locks/ReadWriteLockCollection.js +3 -36
- package/distr/Tools/src/Commons/Logging/ELKLogger.js +3 -33
- package/distr/Tools/src/Commons/Logging/ILogger.js +1 -36
- package/distr/Tools/src/Commons/Logging/InMemoryLogger.js +1 -41
- package/distr/Tools/src/Commons/Logging/Logger.js +3 -36
- package/distr/Tools/src/Commons/Logging/StaticLogger.js +1 -38
- package/distr/Tools/src/Commons/Options/CommandBasedOptionsParser.d.js +1 -30
- package/distr/Tools/src/Commons/Options/CommandBasedOptionsParser.js +6 -53
- package/distr/Tools/src/Commons/PathPattern.js +1 -34
- package/distr/Tools/src/Commons/TasksCore/AggregatedError.js +1 -34
- package/distr/Tools/src/Commons/TasksCore/BuildTask.js +0 -4
- package/distr/Tools/src/Commons/TasksCore/ChainableValueProducer.js +3 -89
- package/distr/Tools/src/Commons/TasksCore/DirectoryEntriesProducer.js +3 -36
- package/distr/Tools/src/Commons/TasksCore/EmptyProducer.js +1 -34
- package/distr/Tools/src/Commons/TasksCore/FileSystemEntriesProducer.js +3 -36
- package/distr/Tools/src/Commons/TasksCore/FileValueProducer.js +3 -36
- package/distr/Tools/src/Commons/TasksCore/Observe.js +1 -28
- package/distr/Tools/src/Commons/TasksCore/SingleValueProducer.js +1 -34
- package/distr/Tools/src/Commons/TimingUtils.js +1 -29
- package/distr/Tools/src/FormWebpackConfiguration/CacheAssetsPlugin.js +55 -48
- package/distr/Tools/src/FormWebpackConfiguration/createFormWebpackConfiguration.js +8 -36
- package/distr/Tools/src/GenerateReadMe.js +1 -31
- package/distr/Tools/src/LocalServerFrontEndDist/enhancedClient.js +1 -1
- package/distr/Tools/src/LocalServerFrontEndDist/index.js +1 -1
- package/distr/Tools/src/LocalServerFrontEndDist/index.js.map +1 -1
- package/distr/Tools/src/Options/CandyToolOptions.js +1 -28
- package/distr/Tools/src/ReadFarmConfig.js +3 -31
- package/distr/Tools/src/SelfUpdate.js +4 -36
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.js +1000 -2036
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.js.map +1 -1
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.min.js +366 -361
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.min.js.map +1 -1
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/jquery-1.11.3.min.js +1 -5
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/polyfill.min.js +1 -5
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/testing.min.js +1 -5
- package/distr/Tools/src/StaticFilesForResourcesDir/jquery-1.11.3.min.js +1 -5
- package/distr/Tools/src/StaticFilesForResourcesDir/polyfill.min.js +1 -5
- package/distr/Tools/src/StaticFilesForResourcesDir/testing.min.js +1 -5
- package/package.json +9 -8
- package/distr/Common/ModelPath/AbsoluteModelPathSet.js +0 -95
- package/distr/Common/ModelPath/ModelPathMap.js +0 -160
- package/distr/Common/ModelPath/ModelPathSet.js +0 -99
|
@@ -3,10 +3,21 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.PathTokens = exports.
|
|
6
|
+
exports.PathTokens = exports.ModelPathImpl = exports.AbsoluteModelFieldPath = void 0;
|
|
7
7
|
exports.convertToAbsolutModelPath = convertToAbsolutModelPath;
|
|
8
8
|
exports.convertToLegacyPath = convertToLegacyPath;
|
|
9
|
+
exports.createAbsolute = createAbsolute;
|
|
10
|
+
exports.createAbsoluteFromMask = createAbsoluteFromMask;
|
|
11
|
+
exports.createAbsoluteFromTokens = createAbsoluteFromTokens;
|
|
12
|
+
exports.createAbsoluteResolvedFromTokens = createAbsoluteResolvedFromTokens;
|
|
13
|
+
exports.createFromMask = createFromMask;
|
|
14
|
+
exports.createModelPath = createModelPath;
|
|
15
|
+
exports.createRelativeFromTokens = createRelativeFromTokens;
|
|
16
|
+
exports.createRelativeResolvedModelPath = createRelativeResolvedModelPath;
|
|
17
|
+
exports.emptyAbsoluteModelPath = emptyAbsoluteModelPath;
|
|
18
|
+
exports.emptyModelPath = emptyModelPath;
|
|
9
19
|
exports.isModelPath = isModelPath;
|
|
20
|
+
exports.joinModelPaths = joinModelPaths;
|
|
10
21
|
|
|
11
22
|
var _IterableUtils = require("../IterableUtils");
|
|
12
23
|
|
|
@@ -18,15 +29,6 @@ var _ModelPathBuilder = require("./ModelPathBuilder");
|
|
|
18
29
|
|
|
19
30
|
var _PathMatcher = require("./PathMatcher");
|
|
20
31
|
|
|
21
|
-
(function () {
|
|
22
|
-
var enterModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.enterModule : undefined;
|
|
23
|
-
enterModule && enterModule(module);
|
|
24
|
-
})();
|
|
25
|
-
|
|
26
|
-
var __signature__ = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default.signature : function (a) {
|
|
27
|
-
return a;
|
|
28
|
-
};
|
|
29
|
-
|
|
30
32
|
const EachSymbol = Symbol.for("__EACH__");
|
|
31
33
|
const CurrentSymbol = Symbol.for("__CURRENT__");
|
|
32
34
|
|
|
@@ -50,7 +52,7 @@ PathTokens.each = EachSymbol;
|
|
|
50
52
|
PathTokens.current = CurrentSymbol;
|
|
51
53
|
|
|
52
54
|
function isModelPath(path) {
|
|
53
|
-
return typeof path !== "string";
|
|
55
|
+
return typeof path !== "string" && path instanceof ModelPathImpl;
|
|
54
56
|
}
|
|
55
57
|
|
|
56
58
|
function convertToLegacyPath(path) {
|
|
@@ -58,7 +60,122 @@ function convertToLegacyPath(path) {
|
|
|
58
60
|
}
|
|
59
61
|
|
|
60
62
|
function convertToAbsolutModelPath(path) {
|
|
61
|
-
return isModelPath(path) ? path :
|
|
63
|
+
return isModelPath(path) ? path : createAbsoluteFromMask(path, PathTokens.each);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function emptyModelPath() {
|
|
67
|
+
return new ModelPathImpl([], false);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function emptyAbsoluteModelPath() {
|
|
71
|
+
return new ModelPathImpl([], true);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function createModelPath(path, absolute) {
|
|
75
|
+
const partPartStrings = path.split("/");
|
|
76
|
+
ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);
|
|
77
|
+
|
|
78
|
+
if (absolute === "auto") {
|
|
79
|
+
if (path.startsWith("/")) {
|
|
80
|
+
return new ModelPathImpl(partPartStrings.slice(1), true);
|
|
81
|
+
} else {
|
|
82
|
+
return new ModelPathImpl(partPartStrings, false);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (absolute && path.startsWith("/")) {
|
|
87
|
+
return new ModelPathImpl(partPartStrings.slice(1), true);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return new ModelPathImpl(partPartStrings, absolute);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function createFromMask(path, absolute, multiplicitySymbol) {
|
|
94
|
+
const partPartStrings = path.split("/").map(x => x === "*" ? multiplicitySymbol : x);
|
|
95
|
+
|
|
96
|
+
if (absolute === "auto") {
|
|
97
|
+
if (path.startsWith("/")) {
|
|
98
|
+
return new ModelPathImpl(partPartStrings.slice(1), true);
|
|
99
|
+
} else {
|
|
100
|
+
return new ModelPathImpl(partPartStrings, false);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (absolute && path.startsWith("/")) {
|
|
105
|
+
return new ModelPathImpl(partPartStrings.slice(1), true);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return new ModelPathImpl(partPartStrings, absolute);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function createAbsoluteFromMask(path, multiplicitySymbol) {
|
|
112
|
+
const partPartStrings = path.split("/").map(x => x === "*" ? multiplicitySymbol : x);
|
|
113
|
+
|
|
114
|
+
if (path.startsWith("/")) {
|
|
115
|
+
return new ModelPathImpl(partPartStrings.slice(1), true);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return new ModelPathImpl(partPartStrings, true);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function ensurePlainPathPartsDoesNotContainMultiplicity(parts) {
|
|
122
|
+
if (parts.some(x => x === "*")) {
|
|
123
|
+
throw new Error("Path must not contain * symbol");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function createAbsolute(path) {
|
|
128
|
+
const partPartStrings = path.split("/");
|
|
129
|
+
ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);
|
|
130
|
+
|
|
131
|
+
if (path.startsWith("/")) {
|
|
132
|
+
return new ModelPathImpl(partPartStrings.slice(1), true);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return new ModelPathImpl(partPartStrings, true);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function createRelativeResolvedModelPath(path) {
|
|
139
|
+
const partPartStrings = path.split("/");
|
|
140
|
+
ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);
|
|
141
|
+
return new ModelPathImpl(partPartStrings, false);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function createAbsoluteFromTokens(tokens) {
|
|
145
|
+
return new ModelPathImpl(tokens, true);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function createAbsoluteResolvedFromTokens(tokens) {
|
|
149
|
+
ensurePlainPathPartsDoesNotContainMultiplicity(tokens);
|
|
150
|
+
return new ModelPathImpl(tokens, true);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function createRelativeFromTokens(tokens) {
|
|
154
|
+
return new ModelPathImpl(tokens, false);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function joinModelPaths(...parts) {
|
|
158
|
+
let absolute = false;
|
|
159
|
+
let resultParts = [];
|
|
160
|
+
|
|
161
|
+
for (const joinItem of parts) {
|
|
162
|
+
if (typeof joinItem === "string") {
|
|
163
|
+
resultParts.push(joinItem);
|
|
164
|
+
} else if (isModelPath(joinItem)) {
|
|
165
|
+
if (joinItem.isAbsolute()) {
|
|
166
|
+
absolute = true;
|
|
167
|
+
resultParts = [...joinItem.getPathPartsAsArray()];
|
|
168
|
+
} else {
|
|
169
|
+
resultParts.push(...joinItem.getPathPartsAsArray());
|
|
170
|
+
}
|
|
171
|
+
} else if (Array.isArray(joinItem)) {
|
|
172
|
+
resultParts.push(...joinItem);
|
|
173
|
+
} else if (PathTokens.isMultiToken(joinItem)) {
|
|
174
|
+
resultParts.push(joinItem);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return new ModelPathImpl(resultParts, absolute);
|
|
62
179
|
}
|
|
63
180
|
|
|
64
181
|
class AbsoluteModelFieldPath {
|
|
@@ -75,39 +192,47 @@ class AbsoluteModelFieldPath {
|
|
|
75
192
|
|
|
76
193
|
static createFromString(pathWithFieldName) {
|
|
77
194
|
if (pathWithFieldName.endsWith(".$errorCount")) {
|
|
78
|
-
return new AbsoluteModelFieldPath(
|
|
195
|
+
return new AbsoluteModelFieldPath(createAbsolute(pathWithFieldName.replace(".$errorCount", "")), "$errorCount");
|
|
79
196
|
}
|
|
80
197
|
|
|
81
198
|
if (pathWithFieldName.endsWith(".$warningCount")) {
|
|
82
|
-
return new AbsoluteModelFieldPath(
|
|
199
|
+
return new AbsoluteModelFieldPath(createAbsolute(pathWithFieldName.replace(".$warningCount", "")), "$warningCount");
|
|
83
200
|
}
|
|
84
201
|
|
|
85
|
-
return new AbsoluteModelFieldPath(
|
|
202
|
+
return new AbsoluteModelFieldPath(createAbsolute(pathWithFieldName), "value");
|
|
86
203
|
}
|
|
87
204
|
|
|
88
205
|
static createFromMask(pathWithFieldName, multiplicitySymbol) {
|
|
89
206
|
if (pathWithFieldName.endsWith(".$errorCount")) {
|
|
90
|
-
return new AbsoluteModelFieldPath(
|
|
207
|
+
return new AbsoluteModelFieldPath(createAbsoluteFromMask(pathWithFieldName.replace(".$errorCount", ""), multiplicitySymbol), "$errorCount");
|
|
91
208
|
}
|
|
92
209
|
|
|
93
210
|
if (pathWithFieldName.endsWith(".$warningCount")) {
|
|
94
|
-
return new AbsoluteModelFieldPath(
|
|
211
|
+
return new AbsoluteModelFieldPath(createAbsoluteFromMask(pathWithFieldName.replace(".$warningCount", ""), multiplicitySymbol), "$warningCount");
|
|
95
212
|
}
|
|
96
213
|
|
|
97
|
-
|
|
98
|
-
|
|
214
|
+
if (pathWithFieldName.endsWith(".errorsCount")) {
|
|
215
|
+
return new AbsoluteModelFieldPath(createAbsoluteFromMask(pathWithFieldName.replace(".errorsCount", ""), multiplicitySymbol), "errorsCount");
|
|
216
|
+
}
|
|
99
217
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
218
|
+
if (pathWithFieldName.endsWith(".warningsCount")) {
|
|
219
|
+
return new AbsoluteModelFieldPath(createAbsoluteFromMask(pathWithFieldName.replace(".warningsCount", ""), multiplicitySymbol), "warningsCount");
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
return new AbsoluteModelFieldPath(createAbsoluteFromMask(pathWithFieldName, multiplicitySymbol), "value");
|
|
104
223
|
}
|
|
105
224
|
|
|
106
225
|
}
|
|
107
226
|
|
|
108
227
|
exports.AbsoluteModelFieldPath = AbsoluteModelFieldPath;
|
|
109
228
|
|
|
110
|
-
|
|
229
|
+
function isAllTokensResolved(tokens) {
|
|
230
|
+
// Я что-то немогу сообразить как тут всё строго написать...
|
|
231
|
+
// @ts-expect-error
|
|
232
|
+
return tokens.every(PathTokens.isSimpleToken);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
class ModelPathImpl {
|
|
111
236
|
constructor(pathParts, absolute) {
|
|
112
237
|
this.tokens = void 0;
|
|
113
238
|
this.absolute = void 0;
|
|
@@ -116,79 +241,8 @@ class ModelPath {
|
|
|
116
241
|
this.absolute = absolute;
|
|
117
242
|
}
|
|
118
243
|
|
|
119
|
-
|
|
120
|
-
return
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
static builder(forceAbsolute = false) {
|
|
124
|
-
return new _ModelPathBuilder.ModelPathBuilder(forceAbsolute);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
static createFromString(path, absolute) {
|
|
128
|
-
const partPartStrings = path.split("/");
|
|
129
|
-
this.ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);
|
|
130
|
-
|
|
131
|
-
if (absolute === "auto") {
|
|
132
|
-
if (path.startsWith("/")) {
|
|
133
|
-
return new ModelPath(partPartStrings.slice(1), true);
|
|
134
|
-
} else {
|
|
135
|
-
return new ModelPath(partPartStrings, false);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
if (absolute && path.startsWith("/")) {
|
|
140
|
-
return new ModelPath(partPartStrings.slice(1), true);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
return new ModelPath(partPartStrings, absolute);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
static createFromMask(path, absolute, multiplicitySymbol) {
|
|
147
|
-
const partPartStrings = path.split("/").map(x => x === "*" ? multiplicitySymbol : x);
|
|
148
|
-
|
|
149
|
-
if (absolute === "auto") {
|
|
150
|
-
if (path.startsWith("/")) {
|
|
151
|
-
return new ModelPath(partPartStrings.slice(1), true);
|
|
152
|
-
} else {
|
|
153
|
-
return new ModelPath(partPartStrings, false);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
if (absolute && path.startsWith("/")) {
|
|
158
|
-
return new ModelPath(partPartStrings.slice(1), true);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
return new ModelPath(partPartStrings, absolute);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
static join(...parts) {
|
|
165
|
-
let absolute = false;
|
|
166
|
-
let resultParts = [];
|
|
167
|
-
|
|
168
|
-
for (const joinItem of parts) {
|
|
169
|
-
if (typeof joinItem === "string") {
|
|
170
|
-
resultParts.push(joinItem);
|
|
171
|
-
} else if (joinItem instanceof ModelPath) {
|
|
172
|
-
if (joinItem.isAbsolute()) {
|
|
173
|
-
absolute = true;
|
|
174
|
-
resultParts = [...joinItem.tokens];
|
|
175
|
-
} else {
|
|
176
|
-
resultParts.push(...joinItem.tokens);
|
|
177
|
-
}
|
|
178
|
-
} else if (Array.isArray(joinItem)) {
|
|
179
|
-
resultParts.push(...joinItem);
|
|
180
|
-
} else if (PathTokens.isMultiToken(joinItem)) {
|
|
181
|
-
resultParts.push(joinItem);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
return new ModelPath(resultParts, absolute);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
static ensurePlainPathPartsDoesNotContainMultiplicity(parts) {
|
|
189
|
-
if (parts.some(x => x === "*")) {
|
|
190
|
-
throw new Error("Path must not contain * symbol");
|
|
191
|
-
}
|
|
244
|
+
get resolved() {
|
|
245
|
+
return isAllTokensResolved(this.tokens);
|
|
192
246
|
}
|
|
193
247
|
|
|
194
248
|
getPathParts() {
|
|
@@ -223,10 +277,11 @@ class ModelPath {
|
|
|
223
277
|
}
|
|
224
278
|
|
|
225
279
|
joinWith(...path) {
|
|
226
|
-
return
|
|
280
|
+
return joinModelPaths(this, ...path);
|
|
227
281
|
}
|
|
228
282
|
|
|
229
283
|
isResolved() {
|
|
284
|
+
return isAllTokensResolved(this.tokens);
|
|
230
285
|
return this.tokens.every(PathTokens.isSimpleToken);
|
|
231
286
|
}
|
|
232
287
|
|
|
@@ -238,7 +293,7 @@ class ModelPath {
|
|
|
238
293
|
return instance;
|
|
239
294
|
}
|
|
240
295
|
});
|
|
241
|
-
return new
|
|
296
|
+
return new ModelPathImpl(tokens, this.absolute);
|
|
242
297
|
}
|
|
243
298
|
|
|
244
299
|
isContainIteration() {
|
|
@@ -249,6 +304,17 @@ class ModelPath {
|
|
|
249
304
|
return this.tokens.some(x => x === PathTokens.current);
|
|
250
305
|
}
|
|
251
306
|
|
|
307
|
+
getLastListPath() {
|
|
308
|
+
if (!this.isContainIteration()) {
|
|
309
|
+
throw new Error("Path must contain iteration");
|
|
310
|
+
} // Проверка выше гарантирует, что будет PathTokens.each
|
|
311
|
+
// @ts-ignore
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
const lastIterationIndex = this.tokens.lastIndexOf(PathTokens.each);
|
|
315
|
+
return this.tokens.slice(0, lastIterationIndex);
|
|
316
|
+
}
|
|
317
|
+
|
|
252
318
|
isAbsolute() {
|
|
253
319
|
return this.absolute;
|
|
254
320
|
}
|
|
@@ -314,13 +380,15 @@ class ModelPath {
|
|
|
314
380
|
}
|
|
315
381
|
|
|
316
382
|
isIncludes(modelPath) {
|
|
317
|
-
|
|
383
|
+
const targetTokens = modelPath.getPathPartsAsArray();
|
|
384
|
+
|
|
385
|
+
if (this.tokens.length !== targetTokens.length) {
|
|
318
386
|
return false;
|
|
319
387
|
}
|
|
320
388
|
|
|
321
389
|
for (let i = 0; i < this.tokens.length; i++) {
|
|
322
390
|
const leftPart = this.tokens[i];
|
|
323
|
-
const rightPart =
|
|
391
|
+
const rightPart = targetTokens[i];
|
|
324
392
|
|
|
325
393
|
if (typeof leftPart === "string") {
|
|
326
394
|
if (typeof rightPart === "string") {
|
|
@@ -369,19 +437,19 @@ class ModelPath {
|
|
|
369
437
|
throw new Error(`Cannot match non absolute path '${modelPath.toString()}'`);
|
|
370
438
|
}
|
|
371
439
|
|
|
372
|
-
return _PathMatcher.PathMatcher.match(this.tokens, modelPath.
|
|
440
|
+
return _PathMatcher.PathMatcher.match(this.tokens, modelPath.getPathPartsAsArray());
|
|
373
441
|
}
|
|
374
442
|
|
|
375
443
|
*splitByMultiplicity() {
|
|
376
|
-
let lastSimpleParts =
|
|
444
|
+
let lastSimpleParts = new _ModelPathBuilder.ModelPathBuilder(this.isAbsolute());
|
|
377
445
|
|
|
378
446
|
for (const token of this.tokens) {
|
|
379
447
|
if (PathTokens.isSimpleToken(token)) {
|
|
380
448
|
lastSimpleParts.append(token);
|
|
381
449
|
} else {
|
|
382
450
|
if (!lastSimpleParts.empty) {
|
|
383
|
-
yield lastSimpleParts.
|
|
384
|
-
lastSimpleParts =
|
|
451
|
+
yield lastSimpleParts.toResolvedPath();
|
|
452
|
+
lastSimpleParts = new _ModelPathBuilder.ModelPathBuilder(false);
|
|
385
453
|
}
|
|
386
454
|
|
|
387
455
|
yield token;
|
|
@@ -389,7 +457,7 @@ class ModelPath {
|
|
|
389
457
|
}
|
|
390
458
|
|
|
391
459
|
if (!lastSimpleParts.empty) {
|
|
392
|
-
yield lastSimpleParts.
|
|
460
|
+
yield lastSimpleParts.toResolvedPath();
|
|
393
461
|
}
|
|
394
462
|
}
|
|
395
463
|
|
|
@@ -416,7 +484,7 @@ class ModelPath {
|
|
|
416
484
|
resultTokens.push(pathPart);
|
|
417
485
|
}
|
|
418
486
|
|
|
419
|
-
return new
|
|
487
|
+
return new ModelPathImpl(resultTokens, this.absolute);
|
|
420
488
|
}
|
|
421
489
|
/**
|
|
422
490
|
* @summary Спецификаторы множественности Each заменяет на Current
|
|
@@ -424,11 +492,25 @@ class ModelPath {
|
|
|
424
492
|
|
|
425
493
|
|
|
426
494
|
toCurrentIteration() {
|
|
427
|
-
|
|
495
|
+
if (this.isResolved()) {
|
|
496
|
+
return this;
|
|
497
|
+
} else {
|
|
498
|
+
// NOTE Тут не получается наложить дискриминатор
|
|
499
|
+
// @ts-expect-error
|
|
500
|
+
const pathParts = this.tokens.map(x => x === PathTokens.each ? PathTokens.current : x);
|
|
501
|
+
return new ModelPathImpl(pathParts, this.absolute);
|
|
502
|
+
}
|
|
428
503
|
}
|
|
429
504
|
|
|
430
505
|
toEachIteration() {
|
|
431
|
-
|
|
506
|
+
if (this.isResolved()) {
|
|
507
|
+
return this;
|
|
508
|
+
} else {
|
|
509
|
+
// NOTE Тут не получается наложить дискриминатор
|
|
510
|
+
// @ts-expect-error
|
|
511
|
+
const pathParts = this.tokens.map(x => x === PathTokens.current ? PathTokens.each : x);
|
|
512
|
+
return new ModelPathImpl(pathParts, this.absolute);
|
|
513
|
+
}
|
|
432
514
|
}
|
|
433
515
|
|
|
434
516
|
toAbsolute() {
|
|
@@ -436,11 +518,11 @@ class ModelPath {
|
|
|
436
518
|
throw new Error(`Path '${this.toLegacyPath()} is not absolute'`);
|
|
437
519
|
}
|
|
438
520
|
|
|
439
|
-
return new
|
|
521
|
+
return new ModelPathImpl(this.tokens, true);
|
|
440
522
|
}
|
|
441
523
|
|
|
442
524
|
*getAllParentPaths() {
|
|
443
|
-
const result =
|
|
525
|
+
const result = new _ModelPathBuilder.ModelPathBuilder(this.isAbsolute());
|
|
444
526
|
|
|
445
527
|
for (const token of _IterableUtils.IterUtils.skipLast(this.getPathParts(), 1)) {
|
|
446
528
|
result.append(token);
|
|
@@ -452,20 +534,22 @@ class ModelPath {
|
|
|
452
534
|
const lastItem = _IterableUtils.IterUtils.last(this.tokens);
|
|
453
535
|
|
|
454
536
|
if (lastItem != undefined && PathTokens.isMultiToken(lastItem)) {
|
|
455
|
-
return new
|
|
537
|
+
return new ModelPathImpl(this.tokens.slice(0, -1), this.absolute);
|
|
456
538
|
}
|
|
457
539
|
|
|
458
540
|
return this;
|
|
459
541
|
}
|
|
460
542
|
|
|
461
543
|
getParentPath() {
|
|
462
|
-
const result =
|
|
544
|
+
const result = new _ModelPathBuilder.ModelPathBuilder(this.absolute);
|
|
463
545
|
|
|
464
546
|
for (const token of _IterableUtils.IterUtils.skipLast(this.getPathParts(), 1)) {
|
|
465
547
|
result.append(token);
|
|
466
|
-
}
|
|
548
|
+
} // Тут получается так, что по другому никак
|
|
549
|
+
// @ts-expect-error
|
|
550
|
+
|
|
467
551
|
|
|
468
|
-
return result.
|
|
552
|
+
return result.toPath();
|
|
469
553
|
}
|
|
470
554
|
|
|
471
555
|
applyInstancesDirty(instances) {
|
|
@@ -474,7 +558,7 @@ class ModelPath {
|
|
|
474
558
|
}
|
|
475
559
|
|
|
476
560
|
let instanceCounter = 0;
|
|
477
|
-
const result =
|
|
561
|
+
const result = new _ModelPathBuilder.ModelPathBuilder(true);
|
|
478
562
|
|
|
479
563
|
for (const token of this.getPathParts()) {
|
|
480
564
|
if (PathTokens.isMultiToken(token) && instanceCounter < instances.length) {
|
|
@@ -485,9 +569,11 @@ class ModelPath {
|
|
|
485
569
|
} else {
|
|
486
570
|
result.append(token);
|
|
487
571
|
}
|
|
488
|
-
}
|
|
572
|
+
} // Тут получается так, что по другому никак
|
|
573
|
+
// @ts-expect-error
|
|
489
574
|
|
|
490
|
-
|
|
575
|
+
|
|
576
|
+
return result.toPath();
|
|
491
577
|
}
|
|
492
578
|
|
|
493
579
|
pathPartToString(pathPart) {
|
|
@@ -506,93 +592,7 @@ class ModelPath {
|
|
|
506
592
|
throw new Error(`Unknown path part specified: ${(0, _TypingUtils.ensureAndGetString)(pathPart)}`);
|
|
507
593
|
}
|
|
508
594
|
|
|
509
|
-
// @ts-ignore
|
|
510
|
-
__reactstandin__regenerateByEval(key, code) {
|
|
511
|
-
// @ts-ignore
|
|
512
|
-
this[key] = eval(code);
|
|
513
|
-
}
|
|
514
|
-
|
|
515
595
|
}
|
|
516
596
|
|
|
517
|
-
exports.
|
|
518
|
-
|
|
519
|
-
class AbsoluteModelPath extends ModelPath {
|
|
520
|
-
constructor(pathParts) {
|
|
521
|
-
super(pathParts, true);
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
static createAbsoluteFromMask(path, multiplicitySymbol) {
|
|
525
|
-
const partPartStrings = path.split("/").map(x => x === "*" ? multiplicitySymbol : x);
|
|
526
|
-
|
|
527
|
-
if (path.startsWith("/")) {
|
|
528
|
-
return new AbsoluteModelPath(partPartStrings.slice(1));
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
return new AbsoluteModelPath(partPartStrings);
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
static createAbsolute(path) {
|
|
535
|
-
const partPartStrings = path.split("/");
|
|
536
|
-
this.ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);
|
|
537
|
-
|
|
538
|
-
if (path.startsWith("/")) {
|
|
539
|
-
return new AbsoluteModelPath(partPartStrings.slice(1));
|
|
540
|
-
}
|
|
541
|
-
|
|
542
|
-
return new AbsoluteModelPath(partPartStrings);
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
joinWith(path) {
|
|
546
|
-
return super.joinWith(path).toAbsolute();
|
|
547
|
-
}
|
|
548
|
-
|
|
549
|
-
getParentPath() {
|
|
550
|
-
const result = ModelPath.builder(true);
|
|
551
|
-
|
|
552
|
-
for (const token of _IterableUtils.IterUtils.skipLast(this.getPathParts(), 1)) {
|
|
553
|
-
result.append(token);
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
return result.toAbsolutePath();
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
applyInstancesDirty(instances) {
|
|
560
|
-
return super.applyInstancesDirty(instances).toAbsolute();
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
// @ts-ignore
|
|
564
|
-
__reactstandin__regenerateByEval(key, code) {
|
|
565
|
-
// @ts-ignore
|
|
566
|
-
this[key] = eval(code);
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
exports.AbsoluteModelPath = AbsoluteModelPath;
|
|
572
|
-
;
|
|
573
|
-
|
|
574
|
-
(function () {
|
|
575
|
-
var reactHotLoader = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.default : undefined;
|
|
576
|
-
|
|
577
|
-
if (!reactHotLoader) {
|
|
578
|
-
return;
|
|
579
|
-
}
|
|
580
|
-
|
|
581
|
-
reactHotLoader.register(EachSymbol, "EachSymbol", "C:\\buildAgent\\work\\8df8f1edd755969c\\Common\\ModelPath\\ModelPath.ts");
|
|
582
|
-
reactHotLoader.register(CurrentSymbol, "CurrentSymbol", "C:\\buildAgent\\work\\8df8f1edd755969c\\Common\\ModelPath\\ModelPath.ts");
|
|
583
|
-
reactHotLoader.register(PathTokens, "PathTokens", "C:\\buildAgent\\work\\8df8f1edd755969c\\Common\\ModelPath\\ModelPath.ts");
|
|
584
|
-
reactHotLoader.register(isModelPath, "isModelPath", "C:\\buildAgent\\work\\8df8f1edd755969c\\Common\\ModelPath\\ModelPath.ts");
|
|
585
|
-
reactHotLoader.register(convertToLegacyPath, "convertToLegacyPath", "C:\\buildAgent\\work\\8df8f1edd755969c\\Common\\ModelPath\\ModelPath.ts");
|
|
586
|
-
reactHotLoader.register(convertToAbsolutModelPath, "convertToAbsolutModelPath", "C:\\buildAgent\\work\\8df8f1edd755969c\\Common\\ModelPath\\ModelPath.ts");
|
|
587
|
-
reactHotLoader.register(AbsoluteModelFieldPath, "AbsoluteModelFieldPath", "C:\\buildAgent\\work\\8df8f1edd755969c\\Common\\ModelPath\\ModelPath.ts");
|
|
588
|
-
reactHotLoader.register(ModelPath, "ModelPath", "C:\\buildAgent\\work\\8df8f1edd755969c\\Common\\ModelPath\\ModelPath.ts");
|
|
589
|
-
reactHotLoader.register(AbsoluteModelPath, "AbsoluteModelPath", "C:\\buildAgent\\work\\8df8f1edd755969c\\Common\\ModelPath\\ModelPath.ts");
|
|
590
|
-
})();
|
|
591
|
-
|
|
592
|
-
;
|
|
593
|
-
|
|
594
|
-
(function () {
|
|
595
|
-
var leaveModule = typeof reactHotLoaderGlobal !== 'undefined' ? reactHotLoaderGlobal.leaveModule : undefined;
|
|
596
|
-
leaveModule && leaveModule(module);
|
|
597
|
-
})();
|
|
598
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL0NvbW1vbi9Nb2RlbFBhdGgvTW9kZWxQYXRoLnRzIl0sIm5hbWVzIjpbIkVhY2hTeW1ib2wiLCJTeW1ib2wiLCJmb3IiLCJDdXJyZW50U3ltYm9sIiwiUGF0aFRva2VucyIsImlzTXVsdGlUb2tlbiIsInBhcnQiLCJlYWNoIiwiY3VycmVudCIsImlzU2ltcGxlVG9rZW4iLCJpc0luc3RhbmNlVG9rZW4iLCJ0ZXN0IiwiaXNNb2RlbFBhdGgiLCJwYXRoIiwiY29udmVydFRvTGVnYWN5UGF0aCIsInRvTGVnYWN5UGF0aCIsImNvbnZlcnRUb0Fic29sdXRNb2RlbFBhdGgiLCJBYnNvbHV0ZU1vZGVsUGF0aCIsImNyZWF0ZUFic29sdXRlRnJvbU1hc2siLCJBYnNvbHV0ZU1vZGVsRmllbGRQYXRoIiwiY29uc3RydWN0b3IiLCJmaWVsZE5hbWUiLCJmaWVsZCIsImlzRXF1YWxzIiwibW9kZWxQYXRoIiwiZWFjaEN1cnJlbnRDb2xsaXNpb24iLCJFYWNoQ3VycmVudENvbGxpc2lvbiIsIkFyZVNhbWUiLCJjcmVhdGVGcm9tU3RyaW5nIiwicGF0aFdpdGhGaWVsZE5hbWUiLCJlbmRzV2l0aCIsImNyZWF0ZUFic29sdXRlIiwicmVwbGFjZSIsImNyZWF0ZUZyb21NYXNrIiwibXVsdGlwbGljaXR5U3ltYm9sIiwiTW9kZWxQYXRoIiwicGF0aFBhcnRzIiwiYWJzb2x1dGUiLCJ0b2tlbnMiLCJsZWdhY3lQYXRoIiwiZmlsdGVyIiwieCIsImVtcHR5IiwiYnVpbGRlciIsImZvcmNlQWJzb2x1dGUiLCJNb2RlbFBhdGhCdWlsZGVyIiwicGFydFBhcnRTdHJpbmdzIiwic3BsaXQiLCJlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5Iiwic3RhcnRzV2l0aCIsInNsaWNlIiwibWFwIiwiam9pbiIsInBhcnRzIiwicmVzdWx0UGFydHMiLCJqb2luSXRlbSIsInB1c2giLCJpc0Fic29sdXRlIiwiQXJyYXkiLCJpc0FycmF5Iiwic29tZSIsIkVycm9yIiwiZ2V0UGF0aFBhcnRzIiwiZ2V0UGF0aFBhcnRzQXNBcnJheSIsImdldFNpbXBsZVRva2Vuc1N0cmljdCIsInRva2VuIiwiZ2V0U2ltcGxlVG9rZW5zQXNBcnJheVN0cmljdCIsImpvaW5XaXRoIiwiaXNSZXNvbHZlZCIsImV2ZXJ5IiwicmVzb2x2ZUFsbCIsImluc3RhbmNlIiwiaXNDb250YWluSXRlcmF0aW9uIiwiaXNDb250YWluQ3VycmVudEl0ZXJhdGlvbiIsInRvU3RyaW5nIiwibGVuZ3RoIiwicGF0aFBhcnRUb1N0cmluZyIsIkl0ZXJhdG9yIiwiZnJvbSIsIkl0ZXJVdGlscyIsInppcCIsInQxIiwidDIiLCJnZXRIYXNoIiwiaGFzaCIsImN1cnJlbnRTdHIiLCJBcmVEaWZmZXJlbnQiLCJzdHJpbmdJbmRleCIsImNoYXJDb2RlQXQiLCJpc0luY2x1ZGVzIiwiaSIsImxlZnRQYXJ0IiwicmlnaHRQYXJ0IiwiaXNGaW5pdGUiLCJOdW1iZXIiLCJnZXRJdGVyYXRpb25SYW5rIiwiaXNFbXB0eSIsIm1hdGNoRm9yIiwiUGF0aE1hdGNoZXIiLCJtYXRjaCIsInNwbGl0QnlNdWx0aXBsaWNpdHkiLCJsYXN0U2ltcGxlUGFydHMiLCJhcHBlbmQiLCJ0b1BhdGgiLCJub3JtYWxpemUiLCJyZXN1bHRUb2tlbnMiLCJwYXRoUGFydCIsInBvcCIsInRvQ3VycmVudEl0ZXJhdGlvbiIsInRvRWFjaEl0ZXJhdGlvbiIsInRvQWJzb2x1dGUiLCJnZXRBbGxQYXJlbnRQYXRocyIsInJlc3VsdCIsInNraXBMYXN0IiwidHJpbUxhc3RTdGFySWZMYXN0VG9rZW4iLCJsYXN0SXRlbSIsImxhc3QiLCJ1bmRlZmluZWQiLCJnZXRQYXJlbnRQYXRoIiwidG9BYnNvbHV0ZVBhdGgiLCJhcHBseUluc3RhbmNlc0RpcnR5IiwiaW5zdGFuY2VzIiwiaW5zdGFuY2VDb3VudGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7O0FB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eEMsQ0FBcEIsRUFBZ0U7QUFDNURrRCxNQUFBQSxNQUFNLENBQUNWLE1BQVAsQ0FBY3JDLEtBQWQ7QUFDSDs7QUFDRCxXQUFPK0MsTUFBTSxDQUFDTyxjQUFQLEVBQVA7QUFDSDs7QUFFTUMsRUFBQUEsbUJBQW1CLENBQUNDLFNBQUQsRUFBa0Q7QUFDeEUsV0FBTyxNQUFNRCxtQkFBTixDQUEwQkMsU0FBMUIsRUFBcUNYLFVBQXJDLEVBQVA7QUFDSDs7QUFwQzRDO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7Ozs7Ozs7Ozs7OzswQkE5YzNDOUcsVTswQkFDQUcsYTswQkFFT0MsVTswQkFxQkdRLFc7MEJBSUFFLG1COzBCQUlBRSx5QjswQkFJSEcsc0I7MEJBMERBZ0IsUzswQkFnWEFsQixpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJpbmRpbmdQYXRoLCBWaWV3TW9kZWxGaWVsZE5hbWUgfSBmcm9tIFwiLi4vLi4vRW5naW5lL3NyYy9FbmdpbmUvQ29yZS9Db3JlVHlwZXNcIjtcbmltcG9ydCB7IGNvdW50LCBJdGVyVXRpbHMsIHJldmVyc2VBcnJheSB9IGZyb20gXCIuLi9JdGVyYWJsZVV0aWxzXCI7XG5pbXBvcnQgeyBlbnN1cmVBbmRHZXRTdHJpbmcsIHJlamVjdCB9IGZyb20gXCIuLi9UeXBpbmdVdGlsc1wiO1xuXG5pbXBvcnQgeyBFYWNoQ3VycmVudENvbGxpc2lvbiB9IGZyb20gXCIuL0VhY2hDdXJyZW50Q29sbGlzaW9uXCI7XG5pbXBvcnQgeyBNb2RlbFBhdGhCdWlsZGVyIH0gZnJvbSBcIi4vTW9kZWxQYXRoQnVpbGRlclwiO1xuaW1wb3J0IHsgUGF0aE1hdGNoZXIsIFBhdGhNYXRjaGluZyB9IGZyb20gXCIuL1BhdGhNYXRjaGVyXCI7XG5pbXBvcnQgeyBJRXF1YXRhYmxlIH0gZnJvbSBcIi4vSUVxdWF0YWJsZVwiO1xuXG5jb25zdCBFYWNoU3ltYm9sID0gU3ltYm9sLmZvcihcIl9fRUFDSF9fXCIpO1xuY29uc3QgQ3VycmVudFN5bWJvbCA9IFN5bWJvbC5mb3IoXCJfX0NVUlJFTlRfX1wiKTtcblxuZXhwb3J0IGNsYXNzIFBhdGhUb2tlbnMge1xuICAgIHB1YmxpYyBzdGF0aWMgZWFjaDogdHlwZW9mIEVhY2hTeW1ib2wgPSBFYWNoU3ltYm9sO1xuICAgIHB1YmxpYyBzdGF0aWMgY3VycmVudDogdHlwZW9mIEN1cnJlbnRTeW1ib2wgPSBDdXJyZW50U3ltYm9sO1xuXG4gICAgcHVibGljIHN0YXRpYyBpc011bHRpVG9rZW4ocGFydDogdW5kZWZpbmVkIHwgUGF0aFRva2VuKTogcGFydCBpcyB0eXBlb2YgRWFjaFN5bWJvbCB8IHR5cGVvZiBDdXJyZW50U3ltYm9sIHtcbiAgICAgICAgcmV0dXJuIHBhcnQgPT09IFBhdGhUb2tlbnMuZWFjaCB8fCBwYXJ0ID09PSBQYXRoVG9rZW5zLmN1cnJlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc1NpbXBsZVRva2VuKHBhcnQ6IHVuZGVmaW5lZCB8IFBhdGhUb2tlbik6IHBhcnQgaXMgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNJbnN0YW5jZVRva2VuKHBhcnQ6IHVuZGVmaW5lZCB8IFBhdGhUb2tlbik6IHBhcnQgaXMgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiICYmIC9eXFxkKyQvaS50ZXN0KHBhcnQpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgU2ltcGxlUGF0aFRva2VuID0gc3RyaW5nO1xuXG5leHBvcnQgdHlwZSBQYXRoVG9rZW4gPSBTaW1wbGVQYXRoVG9rZW4gfCB0eXBlb2YgRWFjaFN5bWJvbCB8IHR5cGVvZiBDdXJyZW50U3ltYm9sO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNNb2RlbFBhdGgocGF0aDogQmluZGluZ1BhdGggfCBNb2RlbFBhdGgpOiBwYXRoIGlzIE1vZGVsUGF0aCB7XG4gICAgcmV0dXJuIHR5cGVvZiBwYXRoICE9PSBcInN0cmluZ1wiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRvTGVnYWN5UGF0aChwYXRoOiBCaW5kaW5nUGF0aCB8IE1vZGVsUGF0aCk6IEJpbmRpbmdQYXRoIHtcbiAgICByZXR1cm4gaXNNb2RlbFBhdGgocGF0aCkgPyBwYXRoLnRvTGVnYWN5UGF0aCgpIDogcGF0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb0Fic29sdXRNb2RlbFBhdGgocGF0aDogQmluZGluZ1BhdGggfCBBYnNvbHV0ZU1vZGVsUGF0aCk6IEFic29sdXRlTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gaXNNb2RlbFBhdGgocGF0aCkgPyBwYXRoIDogQWJzb2x1dGVNb2RlbFBhdGguY3JlYXRlQWJzb2x1dGVGcm9tTWFzayhwYXRoLCBQYXRoVG9rZW5zLmVhY2gpO1xufVxuXG5leHBvcnQgY2xhc3MgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aCB7XG4gICAgcHVibGljIHJlYWRvbmx5IHBhdGg6IEFic29sdXRlTW9kZWxQYXRoO1xuICAgIHB1YmxpYyByZWFkb25seSBmaWVsZDogVmlld01vZGVsRmllbGROYW1lIHwgXCIkZXJyb3JDb3VudFwiIHwgXCIkd2FybmluZ0NvdW50XCI7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocGF0aDogQWJzb2x1dGVNb2RlbFBhdGgsIGZpZWxkTmFtZTogVmlld01vZGVsRmllbGROYW1lIHwgXCIkZXJyb3JDb3VudFwiIHwgXCIkd2FybmluZ0NvdW50XCIpIHtcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNFcXVhbHMoXG4gICAgICAgIG1vZGVsUGF0aDogQWJzb2x1dGVNb2RlbEZpZWxkUGF0aCxcbiAgICAgICAgZWFjaEN1cnJlbnRDb2xsaXNpb246IEVhY2hDdXJyZW50Q29sbGlzaW9uID0gRWFjaEN1cnJlbnRDb2xsaXNpb24uQXJlU2FtZVxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXRoLmlzRXF1YWxzKG1vZGVsUGF0aC5wYXRoLCBlYWNoQ3VycmVudENvbGxpc2lvbikgJiYgdGhpcy5maWVsZCA9PT0gbW9kZWxQYXRoLmZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlRnJvbVN0cmluZyhwYXRoV2l0aEZpZWxkTmFtZTogc3RyaW5nKTogQWJzb2x1dGVNb2RlbEZpZWxkUGF0aCB7XG4gICAgICAgIGlmIChwYXRoV2l0aEZpZWxkTmFtZS5lbmRzV2l0aChcIi4kZXJyb3JDb3VudFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoKFxuICAgICAgICAgICAgICAgIEFic29sdXRlTW9kZWxQYXRoLmNyZWF0ZUFic29sdXRlKHBhdGhXaXRoRmllbGROYW1lLnJlcGxhY2UoXCIuJGVycm9yQ291bnRcIiwgXCJcIikpLFxuICAgICAgICAgICAgICAgIFwiJGVycm9yQ291bnRcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFdpdGhGaWVsZE5hbWUuZW5kc1dpdGgoXCIuJHdhcm5pbmdDb3VudFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoKFxuICAgICAgICAgICAgICAgIEFic29sdXRlTW9kZWxQYXRoLmNyZWF0ZUFic29sdXRlKHBhdGhXaXRoRmllbGROYW1lLnJlcGxhY2UoXCIuJHdhcm5pbmdDb3VudFwiLCBcIlwiKSksXG4gICAgICAgICAgICAgICAgXCIkd2FybmluZ0NvdW50XCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoKEFic29sdXRlTW9kZWxQYXRoLmNyZWF0ZUFic29sdXRlKHBhdGhXaXRoRmllbGROYW1lKSwgXCJ2YWx1ZVwiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUZyb21NYXNrKHBhdGhXaXRoRmllbGROYW1lOiBzdHJpbmcsIG11bHRpcGxpY2l0eVN5bWJvbDogUGF0aFRva2VuKTogQWJzb2x1dGVNb2RlbEZpZWxkUGF0aCB7XG4gICAgICAgIGlmIChwYXRoV2l0aEZpZWxkTmFtZS5lbmRzV2l0aChcIi4kZXJyb3JDb3VudFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoKFxuICAgICAgICAgICAgICAgIEFic29sdXRlTW9kZWxQYXRoLmNyZWF0ZUFic29sdXRlRnJvbU1hc2soXG4gICAgICAgICAgICAgICAgICAgIHBhdGhXaXRoRmllbGROYW1lLnJlcGxhY2UoXCIuJGVycm9yQ291bnRcIiwgXCJcIiksXG4gICAgICAgICAgICAgICAgICAgIG11bHRpcGxpY2l0eVN5bWJvbFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgXCIkZXJyb3JDb3VudFwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoV2l0aEZpZWxkTmFtZS5lbmRzV2l0aChcIi4kd2FybmluZ0NvdW50XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxGaWVsZFBhdGgoXG4gICAgICAgICAgICAgICAgQWJzb2x1dGVNb2RlbFBhdGguY3JlYXRlQWJzb2x1dGVGcm9tTWFzayhcbiAgICAgICAgICAgICAgICAgICAgcGF0aFdpdGhGaWVsZE5hbWUucmVwbGFjZShcIi4kd2FybmluZ0NvdW50XCIsIFwiXCIpLFxuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsaWNpdHlTeW1ib2xcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIFwiJHdhcm5pbmdDb3VudFwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChcbiAgICAgICAgICAgIEFic29sdXRlTW9kZWxQYXRoLmNyZWF0ZUFic29sdXRlRnJvbU1hc2socGF0aFdpdGhGaWVsZE5hbWUsIG11bHRpcGxpY2l0eVN5bWJvbCksXG4gICAgICAgICAgICBcInZhbHVlXCJcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb2RlbFBhdGggaW1wbGVtZW50cyBJRXF1YXRhYmxlPE1vZGVsUGF0aD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdG9rZW5zOiByZWFkb25seSBQYXRoVG9rZW5bXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFic29sdXRlOiBib29sZWFuO1xuICAgIHByaXZhdGUgbGVnYWN5UGF0aDogdW5kZWZpbmVkIHwgc3RyaW5nO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBhdGhQYXJ0czogcmVhZG9ubHkgUGF0aFRva2VuW10sIGFic29sdXRlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMudG9rZW5zID0gcGF0aFBhcnRzLmZpbHRlcih4ID0+IHggIT09IFwiXCIpO1xuICAgICAgICB0aGlzLmFic29sdXRlID0gYWJzb2x1dGU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlbXB0eSgpOiBNb2RlbFBhdGgge1xuICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aChbXSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYnVpbGRlcihmb3JjZUFic29sdXRlOiBib29sZWFuID0gZmFsc2UpOiBNb2RlbFBhdGhCdWlsZGVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhCdWlsZGVyKGZvcmNlQWJzb2x1dGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlRnJvbVN0cmluZyhwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBib29sZWFuIHwgXCJhdXRvXCIpOiBNb2RlbFBhdGgge1xuICAgICAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgICAgICAgdGhpcy5lbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgICAgIGlmIChhYnNvbHV0ZSA9PT0gXCJhdXRvXCIpIHtcbiAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGgocGFydFBhcnRTdHJpbmdzLnNsaWNlKDEpLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGgocGFydFBhcnRTdHJpbmdzLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFic29sdXRlICYmIHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGgocGFydFBhcnRTdHJpbmdzLCBhYnNvbHV0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVGcm9tTWFzayhwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBib29sZWFuIHwgXCJhdXRvXCIsIG11bHRpcGxpY2l0eVN5bWJvbDogUGF0aFRva2VuKTogTW9kZWxQYXRoIHtcbiAgICAgICAgY29uc3QgcGFydFBhcnRTdHJpbmdzID0gcGF0aC5zcGxpdChcIi9cIikubWFwKHggPT4gKHggPT09IFwiKlwiID8gbXVsdGlwbGljaXR5U3ltYm9sIDogeCkpO1xuICAgICAgICBpZiAoYWJzb2x1dGUgPT09IFwiYXV0b1wiKSB7XG4gICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoKHBhcnRQYXJ0U3RyaW5ncywgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhYnNvbHV0ZSAmJiBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aChwYXJ0UGFydFN0cmluZ3Muc2xpY2UoMSksIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoKHBhcnRQYXJ0U3RyaW5ncywgYWJzb2x1dGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgam9pbiguLi5wYXJ0czogQXJyYXk8TW9kZWxQYXRoIHwgUGF0aFRva2VuIHwgUGF0aFRva2VuW10+KTogTW9kZWxQYXRoIHtcbiAgICAgICAgbGV0IGFic29sdXRlID0gZmFsc2U7XG4gICAgICAgIGxldCByZXN1bHRQYXJ0czogUGF0aFRva2VuW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBqb2luSXRlbSBvZiBwYXJ0cykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBqb2luSXRlbSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHJlc3VsdFBhcnRzLnB1c2goam9pbkl0ZW0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChqb2luSXRlbSBpbnN0YW5jZW9mIE1vZGVsUGF0aCkge1xuICAgICAgICAgICAgICAgIGlmIChqb2luSXRlbS5pc0Fic29sdXRlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRQYXJ0cyA9IFsuLi5qb2luSXRlbS50b2tlbnNdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFBhcnRzLnB1c2goLi4uam9pbkl0ZW0udG9rZW5zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoam9pbkl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0UGFydHMucHVzaCguLi5qb2luSXRlbSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFBhdGhUb2tlbnMuaXNNdWx0aVRva2VuKGpvaW5JdGVtKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFBhcnRzLnB1c2goam9pbkl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGgocmVzdWx0UGFydHMsIGFic29sdXRlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIGVuc3VyZVBsYWluUGF0aFBhcnRzRG9lc05vdENvbnRhaW5NdWx0aXBsaWNpdHkocGFydHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgICAgIGlmIChwYXJ0cy5zb21lKHggPT4geCA9PT0gXCIqXCIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXRoIG11c3Qgbm90IGNvbnRhaW4gKiBzeW1ib2xcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGF0aFBhcnRzKCk6IEl0ZXJhYmxlPFBhdGhUb2tlbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhdGhQYXJ0c0FzQXJyYXkoKTogcmVhZG9ubHkgUGF0aFRva2VuW10ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnM7XG4gICAgfVxuXG4gICAgcHVibGljICpnZXRTaW1wbGVUb2tlbnNTdHJpY3QoKTogSXRlcmFibGU8U2ltcGxlUGF0aFRva2VuPiB7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdGhpcy50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmICghUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKHRva2VuKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhdGggbXVzdCBub3QgY29udGFpbiBzcGVjIHRva2Vuc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIHRva2VuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNpbXBsZVRva2Vuc0FzQXJyYXlTdHJpY3QoKTogcmVhZG9ubHkgU2ltcGxlUGF0aFRva2VuW10ge1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRoaXMudG9rZW5zKSB7XG4gICAgICAgICAgICBpZiAoIVBhdGhUb2tlbnMuaXNTaW1wbGVUb2tlbih0b2tlbikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXRoIG11c3Qgbm90IGNvbnRhaW4gc3BlYyB0b2tlbnNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g0J/RgNC+0LLQtdGA0LrQsCDQstGL0YjQtSDQs9Cw0YDQsNC10L3RgtC40YDRg9C10YIg0YfRgtC+INCx0YPQtNGD0YIg0YLQvtC70YzQutC+IFNpbXBsZVBhdGhUb2tlbi5cbiAgICAgICAgLy8g0JLRgdC1IG1hcCDQuCBmaWx0ZXIg0YPQsdGA0LDQvdGLINC00LvRjyDQv9GA0L7QuNC30LLQvtC00LjRgtC10LvRjNC90L7RgdGC0LhcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGpvaW5XaXRoKC4uLnBhdGg6IEFycmF5PE1vZGVsUGF0aCB8IFBhdGhUb2tlbj4pOiBNb2RlbFBhdGgge1xuICAgICAgICByZXR1cm4gTW9kZWxQYXRoLmpvaW4odGhpcywgLi4ucGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzUmVzb2x2ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2Vucy5ldmVyeShQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXNvbHZlQWxsKGluc3RhbmNlOiBzdHJpbmcpOiBNb2RlbFBhdGgge1xuICAgICAgICBjb25zdCB0b2tlbnMgPSB0aGlzLnRva2Vucy5tYXAodG9rZW4gPT4ge1xuICAgICAgICAgICAgaWYgKFBhdGhUb2tlbnMuaXNTaW1wbGVUb2tlbih0b2tlbikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGgodG9rZW5zLCB0aGlzLmFic29sdXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNDb250YWluSXRlcmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc29tZSh4ID0+IHggPT09IFBhdGhUb2tlbnMuZWFjaCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29udGFpbkN1cnJlbnRJdGVyYXRpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2Vucy5zb21lKHggPT4geCA9PT0gUGF0aFRva2Vucy5jdXJyZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBYnNvbHV0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWJzb2x1dGU7XG4gICAgfVxuXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnRva2Vucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAodGhpcy5hYnNvbHV0ZSA/IFwiL1wiIDogXCJcIikgKyB0aGlzLnRva2Vucy5tYXAoeCA9PiB0aGlzLnBhdGhQYXJ0VG9TdHJpbmcoeCkpLmpvaW4oXCIvXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0xlZ2FjeVBhdGgoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVnYWN5UGF0aCA/PyAodGhpcy5sZWdhY3lQYXRoID0gdGhpcy50b2tlbnMubWFwKHggPT4gdGhpcy5wYXRoUGFydFRvU3RyaW5nKHgpKS5qb2luKFwiL1wiKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRXF1YWxzKFxuICAgICAgICBtb2RlbFBhdGg6IE1vZGVsUGF0aCxcbiAgICAgICAgZWFjaEN1cnJlbnRDb2xsaXNpb246IEVhY2hDdXJyZW50Q29sbGlzaW9uID0gRWFjaEN1cnJlbnRDb2xsaXNpb24uQXJlU2FtZVxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoZWFjaEN1cnJlbnRDb2xsaXNpb24gPT09IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZVNhbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvTGVnYWN5UGF0aCgpID09PSBtb2RlbFBhdGgudG9MZWdhY3lQYXRoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHRoaXMuaXNBYnNvbHV0ZSgpID09PSBtb2RlbFBhdGguaXNBYnNvbHV0ZSgpICYmXG4gICAgICAgICAgICAgICAgSXRlcmF0b3IuZnJvbShJdGVyVXRpbHMuemlwKHRoaXMuZ2V0UGF0aFBhcnRzKCksIG1vZGVsUGF0aC5nZXRQYXRoUGFydHMoKSkpLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAoW3QxLCB0Ml0pID0+IHQxID09PSB0MlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktGB0LXQs9C00LAg0YbQtdC70L7QtSDQv9C+0LvQvtC20LjRgtC10LvRjNC90L7QtSDQsdC10LfQt9C90LDQutC+0LLQvtC1IDMyLdCx0LjRgtC90L7QtSDRh9C40YHQu9C+XG4gICAgICovXG4gICAgcHVibGljIGdldEhhc2goZWFjaEN1cnJlbnRDb2xsaXNpb246IEVhY2hDdXJyZW50Q29sbGlzaW9uID0gRWFjaEN1cnJlbnRDb2xsaXNpb24uQXJlU2FtZSk6IG51bWJlciB7XG4gICAgICAgIGxldCBoYXNoID0gNTM4MTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiByZXZlcnNlQXJyYXkodGhpcy50b2tlbnMpKSB7XG4gICAgICAgICAgICBsZXQgY3VycmVudFN0cjogc3RyaW5nO1xuICAgICAgICAgICAgaWYgKFBhdGhUb2tlbnMuaXNTaW1wbGVUb2tlbih0b2tlbikpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50U3RyID0gdG9rZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChlYWNoQ3VycmVudENvbGxpc2lvbiA9PT0gRWFjaEN1cnJlbnRDb2xsaXNpb24uQXJlRGlmZmVyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdHIgPSB0b2tlbiA9PT0gUGF0aFRva2Vucy5lYWNoID8gXCIqXCIgOiBcIiFcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RyID0gXCIqXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHN0cmluZ0luZGV4ID0gY3VycmVudFN0ci5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoc3RyaW5nSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYml0d2lzZVxuICAgICAgICAgICAgICAgIGhhc2ggPSAoaGFzaCAqIDMzKSBeIGN1cnJlbnRTdHIuY2hhckNvZGVBdCgtLXN0cmluZ0luZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAgICB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYml0d2lzZVxuICAgICAgICAgICAgSmF2YVNjcmlwdCBkb2VzIGJpdHdpc2Ugb3BlcmF0aW9ucyAobGlrZSBYT1IsIGFib3ZlKSBvbiAzMi1iaXQgc2lnbmVkXG4gICAgICAgICAgICBpbnRlZ2Vycy4gU2luY2Ugd2Ugd2FudCB0aGUgcmVzdWx0cyB0byBiZSBhbHdheXMgcG9zaXRpdmUsIGNvbnZlcnQgdGhlXG4gICAgICAgICAgICBzaWduZWQgaW50IHRvIGFuIHVuc2lnbmVkIGJ5IGRvaW5nIGFuIHVuc2lnbmVkIGJpdHNoaWZ0LlxuICAgICAgKi9cbiAgICAgICAgcmV0dXJuIGhhc2ggPj4+IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGlzSW5jbHVkZXMobW9kZWxQYXRoOiBNb2RlbFBhdGgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMudG9rZW5zLmxlbmd0aCAhPT0gbW9kZWxQYXRoLnRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBsZWZ0UGFydCA9IHRoaXMudG9rZW5zW2ldO1xuICAgICAgICAgICAgY29uc3QgcmlnaHRQYXJ0ID0gbW9kZWxQYXRoLnRva2Vuc1tpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGVmdFBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJpZ2h0UGFydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdFBhcnQgIT09IHJpZ2h0UGFydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxlZnRQYXJ0ID09PSBQYXRoVG9rZW5zLmN1cnJlbnQgfHwgbGVmdFBhcnQgPT09IFBhdGhUb2tlbnMuZWFjaCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmlnaHRQYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNGaW5pdGUoTnVtYmVyKHJpZ2h0UGFydCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0UGFydCAhPT0gUGF0aFRva2Vucy5jdXJyZW50ICYmIHJpZ2h0UGFydCAhPT0gUGF0aFRva2Vucy5lYWNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJdGVyYXRpb25SYW5rKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBjb3VudChJdGVyYXRvci5mcm9tKHRoaXMudG9rZW5zKS5maWx0ZXIoeCA9PiB4ID09PSBQYXRoVG9rZW5zLmVhY2gpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zLmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbWF0Y2hGb3IobW9kZWxQYXRoOiBNb2RlbFBhdGgpOiBQYXRoTWF0Y2hpbmcge1xuICAgICAgICBpZiAoIXRoaXMuaXNBYnNvbHV0ZSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtYXRjaCBub24gYWJzb2x1dGUgcGF0aCAnJHt0aGlzLnRvU3RyaW5nKCl9J2ApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbW9kZWxQYXRoLmlzQWJzb2x1dGUoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgbWF0Y2ggbm9uIGFic29sdXRlIHBhdGggJyR7bW9kZWxQYXRoLnRvU3RyaW5nKCl9J2ApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQYXRoTWF0Y2hlci5tYXRjaCh0aGlzLnRva2VucywgbW9kZWxQYXRoLnRva2Vucyk7XG4gICAgfVxuXG4gICAgcHVibGljICpzcGxpdEJ5TXVsdGlwbGljaXR5KCk6IEl0ZXJhYmxlPE1vZGVsUGF0aCB8IHR5cGVvZiBFYWNoU3ltYm9sIHwgdHlwZW9mIEN1cnJlbnRTeW1ib2w+IHtcbiAgICAgICAgbGV0IGxhc3RTaW1wbGVQYXJ0cyA9IE1vZGVsUGF0aC5idWlsZGVyKHRoaXMuaXNBYnNvbHV0ZSgpKTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0aGlzLnRva2Vucykge1xuICAgICAgICAgICAgaWYgKFBhdGhUb2tlbnMuaXNTaW1wbGVUb2tlbih0b2tlbikpIHtcbiAgICAgICAgICAgICAgICBsYXN0U2ltcGxlUGFydHMuYXBwZW5kKHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFsYXN0U2ltcGxlUGFydHMuZW1wdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgbGFzdFNpbXBsZVBhcnRzLnRvUGF0aCgpO1xuICAgICAgICAgICAgICAgICAgICBsYXN0U2ltcGxlUGFydHMgPSBNb2RlbFBhdGguYnVpbGRlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWxhc3RTaW1wbGVQYXJ0cy5lbXB0eSkge1xuICAgICAgICAgICAgeWllbGQgbGFzdFNpbXBsZVBhcnRzLnRvUGF0aCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5vcm1hbGl6ZSgpOiBNb2RlbFBhdGgge1xuICAgICAgICBjb25zdCByZXN1bHRUb2tlbnM6IFBhdGhUb2tlbltdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcGF0aFBhcnQgb2YgdGhpcy50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmIChwYXRoUGFydCA9PT0gXCIuLlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRUb2tlbnMucG9wKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBYnNvbHV0ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggaXMgaW52YWxpZCAnJHt0aGlzLnRvU3RyaW5nKCl9J2ApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0VG9rZW5zLnB1c2goXCIuLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBhdGhQYXJ0ID09PSBcIi5cIikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0VG9rZW5zLnB1c2gocGF0aFBhcnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoKHJlc3VsdFRva2VucywgdGhpcy5pc0Fic29sdXRlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5INCh0L/QtdGG0LjRhNC40LrQsNGC0L7RgNGLINC80L3QvtC20LXRgdGC0LLQtdC90L3QvtGB0YLQuCBFYWNoINC30LDQvNC10L3Rj9C10YIg0L3QsCBDdXJyZW50XG4gICAgICovXG4gICAgcHVibGljIHRvQ3VycmVudEl0ZXJhdGlvbigpOiBNb2RlbFBhdGgge1xuICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aChcbiAgICAgICAgICAgIHRoaXMudG9rZW5zLm1hcCh4ID0+ICh4ID09PSBQYXRoVG9rZW5zLmVhY2ggPyBQYXRoVG9rZW5zLmN1cnJlbnQgOiB4KSksXG4gICAgICAgICAgICB0aGlzLmlzQWJzb2x1dGUoKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0VhY2hJdGVyYXRpb24oKTogTW9kZWxQYXRoIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGgoXG4gICAgICAgICAgICB0aGlzLnRva2Vucy5tYXAoeCA9PiAoeCA9PT0gUGF0aFRva2Vucy5jdXJyZW50ID8gUGF0aFRva2Vucy5lYWNoIDogeCkpLFxuICAgICAgICAgICAgdGhpcy5pc0Fic29sdXRlKClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9BYnNvbHV0ZSgpOiBBYnNvbHV0ZU1vZGVsUGF0aCB7XG4gICAgICAgIGlmICghdGhpcy5hYnNvbHV0ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoICcke3RoaXMudG9MZWdhY3lQYXRoKCl9IGlzIG5vdCBhYnNvbHV0ZSdgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxQYXRoKHRoaXMudG9rZW5zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmdldEFsbFBhcmVudFBhdGhzKCk6IEl0ZXJhYmxlPE1vZGVsUGF0aD4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBNb2RlbFBhdGguYnVpbGRlcih0aGlzLmlzQWJzb2x1dGUoKSk7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgSXRlclV0aWxzLnNraXBMYXN0KHRoaXMuZ2V0UGF0aFBhcnRzKCksIDEpKSB7XG4gICAgICAgICAgICByZXN1bHQuYXBwZW5kKHRva2VuKTtcbiAgICAgICAgICAgIHlpZWxkIHJlc3VsdC50b1BhdGgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0cmltTGFzdFN0YXJJZkxhc3RUb2tlbigpOiBNb2RlbFBhdGgge1xuICAgICAgICBjb25zdCBsYXN0SXRlbSA9IEl0ZXJVdGlscy5sYXN0KHRoaXMudG9rZW5zKTtcbiAgICAgICAgaWYgKGxhc3RJdGVtICE9IHVuZGVmaW5lZCAmJiBQYXRoVG9rZW5zLmlzTXVsdGlUb2tlbihsYXN0SXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoKHRoaXMudG9rZW5zLnNsaWNlKDAsIC0xKSwgdGhpcy5hYnNvbHV0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmVudFBhdGgoKTogTW9kZWxQYXRoIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gTW9kZWxQYXRoLmJ1aWxkZXIodGhpcy5pc0Fic29sdXRlKCkpO1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIEl0ZXJVdGlscy5za2lwTGFzdCh0aGlzLmdldFBhdGhQYXJ0cygpLCAxKSkge1xuICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC50b0Fic29sdXRlUGF0aCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhcHBseUluc3RhbmNlc0RpcnR5KGluc3RhbmNlczogU2ltcGxlUGF0aFRva2VuW10pOiBNb2RlbFBhdGgge1xuICAgICAgICBpZiAodGhpcy5pc1Jlc29sdmVkKCkgfHwgaW5zdGFuY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGluc3RhbmNlQ291bnRlciA9IDA7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE1vZGVsUGF0aC5idWlsZGVyKCk7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdGhpcy5nZXRQYXRoUGFydHMoKSkge1xuICAgICAgICAgICAgaWYgKFBhdGhUb2tlbnMuaXNNdWx0aVRva2VuKHRva2VuKSAmJiBpbnN0YW5jZUNvdW50ZXIgPCBpbnN0YW5jZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpbnN0YW5jZXNbaW5zdGFuY2VDb3VudGVyXSA/PyByZWplY3QoKSk7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VDb3VudGVyKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudG9BYnNvbHV0ZVBhdGgoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhdGhQYXJ0VG9TdHJpbmcocGF0aFBhcnQ6IFBhdGhUb2tlbik6IHN0cmluZyB7XG4gICAgICAgIGlmICh0eXBlb2YgcGF0aFBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoUGFydDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFBhcnQgPT09IFBhdGhUb2tlbnMuZWFjaCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiKlwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoUGFydCA9PT0gUGF0aFRva2Vucy5jdXJyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gXCIqXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHBhdGggcGFydCBzcGVjaWZpZWQ6ICR7ZW5zdXJlQW5kR2V0U3RyaW5nKHBhdGhQYXJ0KX1gKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBYnNvbHV0ZU1vZGVsUGF0aCBleHRlbmRzIE1vZGVsUGF0aCB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBhdGhQYXJ0czogcmVhZG9ubHkgUGF0aFRva2VuW10pIHtcbiAgICAgICAgc3VwZXIocGF0aFBhcnRzLCB0cnVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUFic29sdXRlRnJvbU1hc2socGF0aDogc3RyaW5nLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IE1vZGVsUGF0aCB7XG4gICAgICAgIGNvbnN0IHBhcnRQYXJ0U3RyaW5ncyA9IHBhdGguc3BsaXQoXCIvXCIpLm1hcCh4ID0+ICh4ID09PSBcIipcIiA/IG11bHRpcGxpY2l0eVN5bWJvbCA6IHgpKTtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbFBhdGgocGFydFBhcnRTdHJpbmdzLnNsaWNlKDEpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxQYXRoKHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVBYnNvbHV0ZShwYXRoOiBzdHJpbmcpOiBBYnNvbHV0ZU1vZGVsUGF0aCB7XG4gICAgICAgIGNvbnN0IHBhcnRQYXJ0U3RyaW5ncyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuICAgICAgICB0aGlzLmVuc3VyZVBsYWluUGF0aFBhcnRzRG9lc05vdENvbnRhaW5NdWx0aXBsaWNpdHkocGFydFBhcnRTdHJpbmdzKTtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbFBhdGgocGFydFBhcnRTdHJpbmdzLnNsaWNlKDEpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxQYXRoKHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgfVxuXG4gICAgcHVibGljIGpvaW5XaXRoKHBhdGg6IE1vZGVsUGF0aCB8IFBhdGhUb2tlbik6IEFic29sdXRlTW9kZWxQYXRoIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmpvaW5XaXRoKHBhdGgpLnRvQWJzb2x1dGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyZW50UGF0aCgpOiBBYnNvbHV0ZU1vZGVsUGF0aCB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE1vZGVsUGF0aC5idWlsZGVyKHRydWUpO1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIEl0ZXJVdGlscy5za2lwTGFzdCh0aGlzLmdldFBhdGhQYXJ0cygpLCAxKSkge1xuICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC50b0Fic29sdXRlUGF0aCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhcHBseUluc3RhbmNlc0RpcnR5KGluc3RhbmNlczogU2ltcGxlUGF0aFRva2VuW10pOiBBYnNvbHV0ZU1vZGVsUGF0aCB7XG4gICAgICAgIHJldHVybiBzdXBlci5hcHBseUluc3RhbmNlc0RpcnR5KGluc3RhbmNlcykudG9BYnNvbHV0ZSgpO1xuICAgIH1cbn1cbiJdfQ==
|
|
597
|
+
exports.ModelPathImpl = ModelPathImpl;
|
|
598
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL0NvbW1vbi9Nb2RlbFBhdGgvTW9kZWxQYXRoLnRzIl0sIm5hbWVzIjpbIkVhY2hTeW1ib2wiLCJTeW1ib2wiLCJmb3IiLCJDdXJyZW50U3ltYm9sIiwiUGF0aFRva2VucyIsImlzTXVsdGlUb2tlbiIsInBhcnQiLCJlYWNoIiwiY3VycmVudCIsImlzU2ltcGxlVG9rZW4iLCJpc0luc3RhbmNlVG9rZW4iLCJ0ZXN0IiwiaXNNb2RlbFBhdGgiLCJwYXRoIiwiTW9kZWxQYXRoSW1wbCIsImNvbnZlcnRUb0xlZ2FjeVBhdGgiLCJ0b0xlZ2FjeVBhdGgiLCJjb252ZXJ0VG9BYnNvbHV0TW9kZWxQYXRoIiwiY3JlYXRlQWJzb2x1dGVGcm9tTWFzayIsImVtcHR5TW9kZWxQYXRoIiwiZW1wdHlBYnNvbHV0ZU1vZGVsUGF0aCIsImNyZWF0ZU1vZGVsUGF0aCIsImFic29sdXRlIiwicGFydFBhcnRTdHJpbmdzIiwic3BsaXQiLCJlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5Iiwic3RhcnRzV2l0aCIsInNsaWNlIiwiY3JlYXRlRnJvbU1hc2siLCJtdWx0aXBsaWNpdHlTeW1ib2wiLCJtYXAiLCJ4IiwicGFydHMiLCJzb21lIiwiRXJyb3IiLCJjcmVhdGVBYnNvbHV0ZSIsImNyZWF0ZVJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGgiLCJjcmVhdGVBYnNvbHV0ZUZyb21Ub2tlbnMiLCJ0b2tlbnMiLCJjcmVhdGVBYnNvbHV0ZVJlc29sdmVkRnJvbVRva2VucyIsImNyZWF0ZVJlbGF0aXZlRnJvbVRva2VucyIsImpvaW5Nb2RlbFBhdGhzIiwicmVzdWx0UGFydHMiLCJqb2luSXRlbSIsInB1c2giLCJpc0Fic29sdXRlIiwiZ2V0UGF0aFBhcnRzQXNBcnJheSIsIkFycmF5IiwiaXNBcnJheSIsIkFic29sdXRlTW9kZWxGaWVsZFBhdGgiLCJjb25zdHJ1Y3RvciIsImZpZWxkTmFtZSIsImZpZWxkIiwiaXNFcXVhbHMiLCJtb2RlbFBhdGgiLCJlYWNoQ3VycmVudENvbGxpc2lvbiIsIkVhY2hDdXJyZW50Q29sbGlzaW9uIiwiQXJlU2FtZSIsImNyZWF0ZUZyb21TdHJpbmciLCJwYXRoV2l0aEZpZWxkTmFtZSIsImVuZHNXaXRoIiwicmVwbGFjZSIsImlzQWxsVG9rZW5zUmVzb2x2ZWQiLCJldmVyeSIsInBhdGhQYXJ0cyIsImxlZ2FjeVBhdGgiLCJmaWx0ZXIiLCJyZXNvbHZlZCIsImdldFBhdGhQYXJ0cyIsImdldFNpbXBsZVRva2Vuc1N0cmljdCIsInRva2VuIiwiZ2V0U2ltcGxlVG9rZW5zQXNBcnJheVN0cmljdCIsImpvaW5XaXRoIiwiaXNSZXNvbHZlZCIsInJlc29sdmVBbGwiLCJpbnN0YW5jZSIsImlzQ29udGFpbkl0ZXJhdGlvbiIsImlzQ29udGFpbkN1cnJlbnRJdGVyYXRpb24iLCJnZXRMYXN0TGlzdFBhdGgiLCJsYXN0SXRlcmF0aW9uSW5kZXgiLCJsYXN0SW5kZXhPZiIsInRvU3RyaW5nIiwibGVuZ3RoIiwicGF0aFBhcnRUb1N0cmluZyIsImpvaW4iLCJJdGVyYXRvciIsImZyb20iLCJJdGVyVXRpbHMiLCJ6aXAiLCJ0MSIsInQyIiwiZ2V0SGFzaCIsImhhc2giLCJjdXJyZW50U3RyIiwiQXJlRGlmZmVyZW50Iiwic3RyaW5nSW5kZXgiLCJjaGFyQ29kZUF0IiwiaXNJbmNsdWRlcyIsInRhcmdldFRva2VucyIsImkiLCJsZWZ0UGFydCIsInJpZ2h0UGFydCIsImlzRmluaXRlIiwiTnVtYmVyIiwiZ2V0SXRlcmF0aW9uUmFuayIsImlzRW1wdHkiLCJtYXRjaEZvciIsIlBhdGhNYXRjaGVyIiwibWF0Y2giLCJzcGxpdEJ5TXVsdGlwbGljaXR5IiwibGFzdFNpbXBsZVBhcnRzIiwiTW9kZWxQYXRoQnVpbGRlciIsImFwcGVuZCIsImVtcHR5IiwidG9SZXNvbHZlZFBhdGgiLCJub3JtYWxpemUiLCJyZXN1bHRUb2tlbnMiLCJwYXRoUGFydCIsInBvcCIsInRvQ3VycmVudEl0ZXJhdGlvbiIsInRvRWFjaEl0ZXJhdGlvbiIsInRvQWJzb2x1dGUiLCJnZXRBbGxQYXJlbnRQYXRocyIsInJlc3VsdCIsInNraXBMYXN0IiwidG9QYXRoIiwidHJpbUxhc3RTdGFySWZMYXN0VG9rZW4iLCJsYXN0SXRlbSIsImxhc3QiLCJ1bmRlZmluZWQiLCJnZXRQYXJlbnRQYXRoIiwiYXBwbHlJbnN0YW5jZXNEaXJ0eSIsImluc3RhbmNlcyIsImluc3RhbmNlQ291bnRlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsVUFBVSxHQUFHQyxNQUFNLENBQUNDLEdBQVAsQ0FBVyxVQUFYLENBQW5CO0FBQ0EsTUFBTUMsYUFBYSxHQUFHRixNQUFNLENBQUNDLEdBQVAsQ0FBVyxhQUFYLENBQXRCOztBQUVPLE1BQU1FLFVBQU4sQ0FBaUI7QUFJTSxTQUFaQyxZQUFZLENBQUNDLElBQUQsRUFBZ0Y7QUFDdEcsV0FBT0EsSUFBSSxLQUFLRixVQUFVLENBQUNHLElBQXBCLElBQTRCRCxJQUFJLEtBQUtGLFVBQVUsQ0FBQ0ksT0FBdkQ7QUFDSDs7QUFFMEIsU0FBYkMsYUFBYSxDQUFDSCxJQUFELEVBQThDO0FBQ3JFLFdBQU8sT0FBT0EsSUFBUCxLQUFnQixRQUF2QjtBQUNIOztBQUU0QixTQUFmSSxlQUFlLENBQUNKLElBQUQsRUFBOEM7QUFDdkUsV0FBTyxPQUFPQSxJQUFQLEtBQWdCLFFBQWhCLElBQTRCLFNBQVNLLElBQVQsQ0FBY0wsSUFBZCxDQUFuQztBQUNIOztBQWRtQjs7O0FBQVhGLFUsQ0FDS0csSSxHQUEwQlAsVTtBQUQvQkksVSxDQUVLSSxPLEdBQWdDTCxhOztBQW1CM0MsU0FBU1MsV0FBVCxDQUFxQkMsSUFBckIsRUFBaUY7QUFDcEYsU0FBTyxPQUFPQSxJQUFQLEtBQWdCLFFBQWhCLElBQTRCQSxJQUFJLFlBQVlDLGFBQW5EO0FBQ0g7O0FBRU0sU0FBU0MsbUJBQVQsQ0FBNkJGLElBQTdCLEVBQXlFO0FBQzVFLFNBQU9ELFdBQVcs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QUFDckMsVUFBSWhFLFVBQVUsQ0FBQ0MsWUFBWCxDQUF3QmlFLEtBQXhCLEtBQWtDK0QsZUFBZSxHQUFHRCxTQUFTLENBQUNsRCxNQUFsRSxFQUEwRTtBQUFBOztBQUN0RXlDLFFBQUFBLE1BQU0sQ0FBQ1gsTUFBUCwwQkFBY29CLFNBQVMsQ0FBQ0MsZUFBRCxDQUF2Qix5RUFBNEMsMEJBQTVDO0FBQ0FBLFFBQUFBLGVBQWU7QUFDbEIsT0FIRCxNQUdPO0FBQ0hWLFFBQUFBLE1BQU0sQ0FBQ1gsTUFBUCxDQUFjMUMsS0FBZDtBQUNIO0FBQ0osS0Fic0YsQ0FjdkY7QUFDQTs7O0FBQ0EsV0FBT3FELE1BQU0sQ0FBQ0UsTUFBUCxFQUFQO0FBQ0g7O0FBRU8xQyxFQUFBQSxnQkFBZ0IsQ0FBQ2tDLFFBQUQsRUFBOEI7QUFDbEQsUUFBSSxPQUFPQSxRQUFQLEtBQW9CLFFBQXhCLEVBQWtDO0FBQzlCLGFBQU9BLFFBQVA7QUFDSDs7QUFDRCxRQUFJQSxRQUFRLEtBQUtqSCxVQUFVLENBQUNHLElBQTVCLEVBQWtDO0FBQzlCLGFBQU8sR0FBUDtBQUNIOztBQUNELFFBQUk4RyxRQUFRLEtBQUtqSCxVQUFVLENBQUNJLE9BQTVCLEVBQXFDO0FBQ2pDLGFBQU8sR0FBUDtBQUNIOztBQUNELFVBQU0sSUFBSTBCLEtBQUosQ0FBVyxnQ0FBK0IscUNBQW1CbUYsUUFBbkIsQ0FBNkIsRUFBdkUsQ0FBTjtBQUNIOztBQS9VTCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJpbmRpbmdQYXRoLCBWaWV3TW9kZWxGaWVsZE5hbWUgfSBmcm9tIFwiLi4vLi4vRW5naW5lL3NyYy9FbmdpbmUvQ29yZS9Db3JlVHlwZXNcIjtcbmltcG9ydCB7IGNvdW50LCBJdGVyVXRpbHMsIHJldmVyc2VBcnJheSB9IGZyb20gXCIuLi9JdGVyYWJsZVV0aWxzXCI7XG5pbXBvcnQgeyBlbnN1cmVBbmRHZXRTdHJpbmcsIHJlamVjdCB9IGZyb20gXCIuLi9UeXBpbmdVdGlsc1wiO1xuXG5pbXBvcnQgeyBFYWNoQ3VycmVudENvbGxpc2lvbiB9IGZyb20gXCIuL0VhY2hDdXJyZW50Q29sbGlzaW9uXCI7XG5pbXBvcnQgeyBNb2RlbFBhdGhCdWlsZGVyIH0gZnJvbSBcIi4vTW9kZWxQYXRoQnVpbGRlclwiO1xuaW1wb3J0IHsgUGF0aE1hdGNoZXIsIFBhdGhNYXRjaGluZyB9IGZyb20gXCIuL1BhdGhNYXRjaGVyXCI7XG5pbXBvcnQgeyBJRXF1YXRhYmxlIH0gZnJvbSBcIi4vSUVxdWF0YWJsZVwiO1xuXG5jb25zdCBFYWNoU3ltYm9sID0gU3ltYm9sLmZvcihcIl9fRUFDSF9fXCIpO1xuY29uc3QgQ3VycmVudFN5bWJvbCA9IFN5bWJvbC5mb3IoXCJfX0NVUlJFTlRfX1wiKTtcblxuZXhwb3J0IGNsYXNzIFBhdGhUb2tlbnMge1xuICAgIHB1YmxpYyBzdGF0aWMgZWFjaDogdHlwZW9mIEVhY2hTeW1ib2wgPSBFYWNoU3ltYm9sO1xuICAgIHB1YmxpYyBzdGF0aWMgY3VycmVudDogdHlwZW9mIEN1cnJlbnRTeW1ib2wgPSBDdXJyZW50U3ltYm9sO1xuXG4gICAgcHVibGljIHN0YXRpYyBpc011bHRpVG9rZW4ocGFydDogdW5kZWZpbmVkIHwgUGF0aFRva2VuKTogcGFydCBpcyB0eXBlb2YgRWFjaFN5bWJvbCB8IHR5cGVvZiBDdXJyZW50U3ltYm9sIHtcbiAgICAgICAgcmV0dXJuIHBhcnQgPT09IFBhdGhUb2tlbnMuZWFjaCB8fCBwYXJ0ID09PSBQYXRoVG9rZW5zLmN1cnJlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc1NpbXBsZVRva2VuKHBhcnQ6IHVuZGVmaW5lZCB8IFBhdGhUb2tlbik6IHBhcnQgaXMgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNJbnN0YW5jZVRva2VuKHBhcnQ6IHVuZGVmaW5lZCB8IFBhdGhUb2tlbik6IHBhcnQgaXMgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiICYmIC9eXFxkKyQvaS50ZXN0KHBhcnQpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgU2ltcGxlUGF0aFRva2VuID0gc3RyaW5nO1xuXG5leHBvcnQgdHlwZSBQYXRoVG9rZW4gPSBTaW1wbGVQYXRoVG9rZW4gfCB0eXBlb2YgRWFjaFN5bWJvbCB8IHR5cGVvZiBDdXJyZW50U3ltYm9sO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNNb2RlbFBhdGgocGF0aDogQmluZGluZ1BhdGggfCBNb2RlbFBhdGggfCB1bmtub3duKTogcGF0aCBpcyBNb2RlbFBhdGgge1xuICAgIHJldHVybiB0eXBlb2YgcGF0aCAhPT0gXCJzdHJpbmdcIiAmJiBwYXRoIGluc3RhbmNlb2YgTW9kZWxQYXRoSW1wbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb0xlZ2FjeVBhdGgocGF0aDogQmluZGluZ1BhdGggfCBNb2RlbFBhdGgpOiBCaW5kaW5nUGF0aCB7XG4gICAgcmV0dXJuIGlzTW9kZWxQYXRoKHBhdGgpID8gcGF0aC50b0xlZ2FjeVBhdGgoKSA6IHBhdGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9BYnNvbHV0TW9kZWxQYXRoPFIgZXh0ZW5kcyBib29sZWFuLCBBIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgcGF0aDogQmluZGluZ1BhdGggfCBJTW9kZWxQYXRoPFIsIEE+XG4pOiBJTW9kZWxQYXRoPFIsIHRydWU+O1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb0Fic29sdXRNb2RlbFBhdGgocGF0aDogQmluZGluZ1BhdGggfCBBYnNvbHV0ZU1vZGVsUGF0aCk6IEFic29sdXRlTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gaXNNb2RlbFBhdGgocGF0aCkgPyBwYXRoIDogY3JlYXRlQWJzb2x1dGVGcm9tTWFzayhwYXRoLCBQYXRoVG9rZW5zLmVhY2gpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlNb2RlbFBhdGgoKTogUmVsYXRpdmVSZXNvbHZlZE1vZGVsUGF0aCB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIGZhbHNlPihbXSwgZmFsc2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlBYnNvbHV0ZU1vZGVsUGF0aCgpOiBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgdHJ1ZT4oW10sIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9kZWxQYXRoKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IHRydWUpOiBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vZGVsUGF0aChwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBmYWxzZSk6IFJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9kZWxQYXRoKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IFwiYXV0b1wiKTogUmVzb2x2ZWRNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9kZWxQYXRoKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IGJvb2xlYW4gfCBcImF1dG9cIik6IFJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgICBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgaWYgKGFic29sdXRlID09PSBcImF1dG9cIikge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIHRydWU+KHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgZmFsc2U+KHBhcnRQYXJ0U3RyaW5ncywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChhYnNvbHV0ZSAmJiBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCB0cnVlPihwYXJ0UGFydFN0cmluZ3Muc2xpY2UoMSksIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgYm9vbGVhbj4ocGFydFBhcnRTdHJpbmdzLCBhYnNvbHV0ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGcm9tTWFzayhwYXRoOiBzdHJpbmcsIGFic29sdXRlOiB0cnVlLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IEFic29sdXRlTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyb21NYXNrKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IGZhbHNlLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IFJlc29sdmVkTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyb21NYXNrKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IFwiYXV0b1wiLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IE1vZGVsUGF0aDtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGcm9tTWFzayhwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBib29sZWFuIHwgXCJhdXRvXCIsIG11bHRpcGxpY2l0eVN5bWJvbDogUGF0aFRva2VuKTogTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKS5tYXAoeCA9PiAoeCA9PT0gXCIqXCIgPyBtdWx0aXBsaWNpdHlTeW1ib2wgOiB4KSk7XG4gICAgaWYgKGFic29sdXRlID09PSBcImF1dG9cIikge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwocGFydFBhcnRTdHJpbmdzLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFic29sdXRlICYmIHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbChwYXJ0UGFydFN0cmluZ3MsIGFic29sdXRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFic29sdXRlRnJvbU1hc2socGF0aDogc3RyaW5nLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IEFic29sdXRlTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKS5tYXAoeCA9PiAoeCA9PT0gXCIqXCIgPyBtdWx0aXBsaWNpdHlTeW1ib2wgOiB4KSk7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbChwYXJ0UGFydFN0cmluZ3MsIHRydWUpO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmIChwYXJ0cy5zb21lKHggPT4geCA9PT0gXCIqXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhdGggbXVzdCBub3QgY29udGFpbiAqIHN5bWJvbFwiKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBYnNvbHV0ZShwYXRoOiBzdHJpbmcpOiBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgICBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIHRydWU+KHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCB0cnVlPihwYXJ0UGFydFN0cmluZ3MsIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVsYXRpdmVSZXNvbHZlZE1vZGVsUGF0aChwYXRoOiBzdHJpbmcpOiBSZWxhdGl2ZVJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICBjb25zdCBwYXJ0UGFydFN0cmluZ3MgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgICBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHBhcnRQYXJ0U3RyaW5ncyk7XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIGZhbHNlPihwYXJ0UGFydFN0cmluZ3MsIGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFic29sdXRlRnJvbVRva2Vucyh0b2tlbnM6IFBhdGhUb2tlbltdKTogQWJzb2x1dGVNb2RlbFBhdGgge1xuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDxmYWxzZSwgdHJ1ZT4odG9rZW5zLCB0cnVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFic29sdXRlUmVzb2x2ZWRGcm9tVG9rZW5zKHRva2Vuczogc3RyaW5nW10pOiBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICBlbnN1cmVQbGFpblBhdGhQYXJ0c0RvZXNOb3RDb250YWluTXVsdGlwbGljaXR5KHRva2Vucyk7XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIHRydWU+KHRva2VucywgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWxhdGl2ZUZyb21Ub2tlbnModG9rZW5zOiByZWFkb25seSBzdHJpbmdbXSk6IFJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVsYXRpdmVGcm9tVG9rZW5zKHRva2VuczogcmVhZG9ubHkgUGF0aFRva2VuW10pOiBSZWxhdGl2ZU1vZGVsUGF0aDtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWxhdGl2ZUZyb21Ub2tlbnModG9rZW5zOiByZWFkb25seSBQYXRoVG9rZW5bXSk6IFJlbGF0aXZlTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8ZmFsc2UsIGZhbHNlPih0b2tlbnMsIGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpvaW5Nb2RlbFBhdGhzKC4uLnBhcnRzOiBBcnJheTxNb2RlbFBhdGggfCBQYXRoVG9rZW4gfCBQYXRoVG9rZW5bXT4pOiBNb2RlbFBhdGgge1xuICAgIGxldCBhYnNvbHV0ZSA9IGZhbHNlO1xuICAgIGxldCByZXN1bHRQYXJ0czogUGF0aFRva2VuW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGpvaW5JdGVtIG9mIHBhcnRzKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygam9pbkl0ZW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJlc3VsdFBhcnRzLnB1c2goam9pbkl0ZW0pO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTW9kZWxQYXRoKGpvaW5JdGVtKSkge1xuICAgICAgICAgICAgaWYgKGpvaW5JdGVtLmlzQWJzb2x1dGUoKSkge1xuICAgICAgICAgICAgICAgIGFic29sdXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXN1bHRQYXJ0cyA9IFsuLi5qb2luSXRlbS5nZXRQYXRoUGFydHNBc0FycmF5KCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHRQYXJ0cy5wdXNoKC4uLmpvaW5JdGVtLmdldFBhdGhQYXJ0c0FzQXJyYXkoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqb2luSXRlbSkpIHtcbiAgICAgICAgICAgIHJlc3VsdFBhcnRzLnB1c2goLi4uam9pbkl0ZW0pO1xuICAgICAgICB9IGVsc2UgaWYgKFBhdGhUb2tlbnMuaXNNdWx0aVRva2VuKGpvaW5JdGVtKSkge1xuICAgICAgICAgICAgcmVzdWx0UGFydHMucHVzaChqb2luSXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwocmVzdWx0UGFydHMsIGFic29sdXRlKTtcbn1cblxuZXhwb3J0IGNsYXNzIEFic29sdXRlTW9kZWxGaWVsZFBhdGgge1xuICAgIHB1YmxpYyByZWFkb25seSBwYXRoOiBBYnNvbHV0ZU1vZGVsUGF0aDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmllbGQ6IFZpZXdNb2RlbEZpZWxkTmFtZSB8IFwiJGVycm9yQ291bnRcIiB8IFwiJHdhcm5pbmdDb3VudFwiO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBhdGg6IEFic29sdXRlTW9kZWxQYXRoLCBmaWVsZE5hbWU6IFZpZXdNb2RlbEZpZWxkTmFtZSB8IFwiJGVycm9yQ291bnRcIiB8IFwiJHdhcm5pbmdDb3VudFwiKSB7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZE5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRXF1YWxzKFxuICAgICAgICBtb2RlbFBhdGg6IEFic29sdXRlTW9kZWxGaWVsZFBhdGgsXG4gICAgICAgIGVhY2hDdXJyZW50Q29sbGlzaW9uOiBFYWNoQ3VycmVudENvbGxpc2lvbiA9IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZVNhbWVcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGF0aC5pc0VxdWFscyhtb2RlbFBhdGgucGF0aCwgZWFjaEN1cnJlbnRDb2xsaXNpb24pICYmIHRoaXMuZmllbGQgPT09IG1vZGVsUGF0aC5maWVsZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUZyb21TdHJpbmcocGF0aFdpdGhGaWVsZE5hbWU6IHN0cmluZyk6IEFic29sdXRlTW9kZWxGaWVsZFBhdGgge1xuICAgICAgICBpZiAocGF0aFdpdGhGaWVsZE5hbWUuZW5kc1dpdGgoXCIuJGVycm9yQ291bnRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChcbiAgICAgICAgICAgICAgICBjcmVhdGVBYnNvbHV0ZShwYXRoV2l0aEZpZWxkTmFtZS5yZXBsYWNlKFwiLiRlcnJvckNvdW50XCIsIFwiXCIpKSxcbiAgICAgICAgICAgICAgICBcIiRlcnJvckNvdW50XCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGhXaXRoRmllbGROYW1lLmVuZHNXaXRoKFwiLiR3YXJuaW5nQ291bnRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChcbiAgICAgICAgICAgICAgICBjcmVhdGVBYnNvbHV0ZShwYXRoV2l0aEZpZWxkTmFtZS5yZXBsYWNlKFwiLiR3YXJuaW5nQ291bnRcIiwgXCJcIikpLFxuICAgICAgICAgICAgICAgIFwiJHdhcm5pbmdDb3VudFwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChjcmVhdGVBYnNvbHV0ZShwYXRoV2l0aEZpZWxkTmFtZSksIFwidmFsdWVcIik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVGcm9tTWFzayhwYXRoV2l0aEZpZWxkTmFtZTogc3RyaW5nLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IEFic29sdXRlTW9kZWxGaWVsZFBhdGgge1xuICAgICAgICBpZiAocGF0aFdpdGhGaWVsZE5hbWUuZW5kc1dpdGgoXCIuJGVycm9yQ291bnRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChcbiAgICAgICAgICAgICAgICBjcmVhdGVBYnNvbHV0ZUZyb21NYXNrKHBhdGhXaXRoRmllbGROYW1lLnJlcGxhY2UoXCIuJGVycm9yQ291bnRcIiwgXCJcIiksIG11bHRpcGxpY2l0eVN5bWJvbCksXG4gICAgICAgICAgICAgICAgXCIkZXJyb3JDb3VudFwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoV2l0aEZpZWxkTmFtZS5lbmRzV2l0aChcIi4kd2FybmluZ0NvdW50XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxGaWVsZFBhdGgoXG4gICAgICAgICAgICAgICAgY3JlYXRlQWJzb2x1dGVGcm9tTWFzayhwYXRoV2l0aEZpZWxkTmFtZS5yZXBsYWNlKFwiLiR3YXJuaW5nQ291bnRcIiwgXCJcIiksIG11bHRpcGxpY2l0eVN5bWJvbCksXG4gICAgICAgICAgICAgICAgXCIkd2FybmluZ0NvdW50XCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGhXaXRoRmllbGROYW1lLmVuZHNXaXRoKFwiLmVycm9yc0NvdW50XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFic29sdXRlTW9kZWxGaWVsZFBhdGgoXG4gICAgICAgICAgICAgICAgY3JlYXRlQWJzb2x1dGVGcm9tTWFzayhwYXRoV2l0aEZpZWxkTmFtZS5yZXBsYWNlKFwiLmVycm9yc0NvdW50XCIsIFwiXCIpLCBtdWx0aXBsaWNpdHlTeW1ib2wpLFxuICAgICAgICAgICAgICAgIFwiZXJyb3JzQ291bnRcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFdpdGhGaWVsZE5hbWUuZW5kc1dpdGgoXCIud2FybmluZ3NDb3VudFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnNvbHV0ZU1vZGVsRmllbGRQYXRoKFxuICAgICAgICAgICAgICAgIGNyZWF0ZUFic29sdXRlRnJvbU1hc2socGF0aFdpdGhGaWVsZE5hbWUucmVwbGFjZShcIi53YXJuaW5nc0NvdW50XCIsIFwiXCIpLCBtdWx0aXBsaWNpdHlTeW1ib2wpLFxuICAgICAgICAgICAgICAgIFwid2FybmluZ3NDb3VudFwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQWJzb2x1dGVNb2RlbEZpZWxkUGF0aChjcmVhdGVBYnNvbHV0ZUZyb21NYXNrKHBhdGhXaXRoRmllbGROYW1lLCBtdWx0aXBsaWNpdHlTeW1ib2wpLCBcInZhbHVlXCIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTW9kZWxQYXRoPFRSZXNvbHZlZCBleHRlbmRzIGJvb2xlYW4sIFRBYnNvbHV0ZSBleHRlbmRzIGJvb2xlYW4+XG4gICAgZXh0ZW5kcyBJRXF1YXRhYmxlPElNb2RlbFBhdGg8Ym9vbGVhbiwgYm9vbGVhbj4+IHtcbiAgICByZWFkb25seSByZXNvbHZlZDogVFJlc29sdmVkO1xuICAgIHJlYWRvbmx5IGFic29sdXRlOiBUQWJzb2x1dGU7XG5cbiAgICBpc0VxdWFscyhtb2RlbFBhdGg6IE1vZGVsUGF0aCwgZWFjaEN1cnJlbnRDb2xsaXNpb24/OiBFYWNoQ3VycmVudENvbGxpc2lvbik6IGJvb2xlYW47XG4gICAgZ2V0SGFzaChlYWNoQ3VycmVudENvbGxpc2lvbj86IEVhY2hDdXJyZW50Q29sbGlzaW9uKTogbnVtYmVyO1xuXG4gICAgaXNSZXNvbHZlZCgpOiB0aGlzIGlzIElNb2RlbFBhdGg8dHJ1ZSwgVEFic29sdXRlPjtcbiAgICBpc0Fic29sdXRlKCk6IHRoaXMgaXMgSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIHRydWU+O1xuICAgIHRvQWJzb2x1dGUoKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIHRydWU+O1xuXG4gICAgam9pbldpdGgoLi4ucGF0aDogc3RyaW5nW10pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBqb2luV2l0aCguLi5wYXRoOiBQYXRoVG9rZW5bXSk6IElNb2RlbFBhdGg8Ym9vbGVhbiwgVEFic29sdXRlPjtcbiAgICBqb2luV2l0aCguLi5wYXRoOiBBcnJheTxSZXNvbHZlZE1vZGVsUGF0aCB8IHN0cmluZz4pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBqb2luV2l0aCguLi5wYXRoOiBBcnJheTxBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHwgc3RyaW5nPik6IElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPjtcbiAgICBqb2luV2l0aCguLi5wYXRoOiBBcnJheTxNb2RlbFBhdGggfCBQYXRoVG9rZW4+KTogSU1vZGVsUGF0aDxib29sZWFuLCBUQWJzb2x1dGU+O1xuXG4gICAgZ2V0UGF0aFBhcnRzKCk6IEl0ZXJhYmxlPFBhdGhUb2tlblNwZWM8VFJlc29sdmVkPj47XG4gICAgZ2V0UGF0aFBhcnRzQXNBcnJheSgpOiBSZWFkb25seUFycmF5PFBhdGhUb2tlblNwZWM8VFJlc29sdmVkPj47XG4gICAgZ2V0U2ltcGxlVG9rZW5zU3RyaWN0KCk6IEl0ZXJhYmxlPFNpbXBsZVBhdGhUb2tlbj47XG4gICAgZ2V0U2ltcGxlVG9rZW5zQXNBcnJheVN0cmljdCgpOiByZWFkb25seSBTaW1wbGVQYXRoVG9rZW5bXTtcblxuICAgIHJlc29sdmVBbGwoaW5zdGFuY2U6IHN0cmluZyk6IE1vZGVsUGF0aDtcbiAgICBpc0NvbnRhaW5JdGVyYXRpb24oKTogYm9vbGVhbjtcbiAgICBpc0NvbnRhaW5DdXJyZW50SXRlcmF0aW9uKCk6IGJvb2xlYW47XG4gICAgZ2V0TGFzdExpc3RQYXRoKCk6IFBhdGhUb2tlbltdO1xuICAgIGlzSW5jbHVkZXMobW9kZWxQYXRoOiBNb2RlbFBhdGgpOiBib29sZWFuO1xuICAgIGdldEl0ZXJhdGlvblJhbmsoKTogbnVtYmVyO1xuICAgIGlzRW1wdHkoKTogYm9vbGVhbjtcbiAgICBtYXRjaEZvcihtb2RlbFBhdGg6IE1vZGVsUGF0aCk6IFBhdGhNYXRjaGluZztcbiAgICBzcGxpdEJ5TXVsdGlwbGljaXR5KCk6IEl0ZXJhYmxlPFJlc29sdmVkTW9kZWxQYXRoIHwgdHlwZW9mIEVhY2hTeW1ib2wgfCB0eXBlb2YgQ3VycmVudFN5bWJvbD47XG4gICAgbm9ybWFsaXplKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuICAgIHRvQ3VycmVudEl0ZXJhdGlvbigpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICB0b0VhY2hJdGVyYXRpb24oKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgZ2V0QWxsUGFyZW50UGF0aHMoKTogSXRlcmFibGU8TW9kZWxQYXRoPjtcbiAgICB0cmltTGFzdFN0YXJJZkxhc3RUb2tlbigpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBnZXRQYXJlbnRQYXRoKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuICAgIGFwcGx5SW5zdGFuY2VzRGlydHkoaW5zdGFuY2VzOiBTaW1wbGVQYXRoVG9rZW5bXSk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nO1xuICAgIHRvTGVnYWN5UGF0aCgpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIE1vZGVsUGF0aCA9IElNb2RlbFBhdGg8Ym9vbGVhbiwgYm9vbGVhbj47XG5leHBvcnQgdHlwZSBSZXNvbHZlZE1vZGVsUGF0aCA9IElNb2RlbFBhdGg8dHJ1ZSwgYm9vbGVhbj47XG5leHBvcnQgdHlwZSBBYnNvbHV0ZU1vZGVsUGF0aCA9IElNb2RlbFBhdGg8Ym9vbGVhbiwgdHJ1ZT47XG5leHBvcnQgdHlwZSBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoID0gSU1vZGVsUGF0aDx0cnVlLCB0cnVlPjtcblxuZXhwb3J0IHR5cGUgUmVsYXRpdmVNb2RlbFBhdGggPSBJTW9kZWxQYXRoPGJvb2xlYW4sIGZhbHNlPjtcbmV4cG9ydCB0eXBlIFJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGggPSBJTW9kZWxQYXRoPHRydWUsIGZhbHNlPjtcblxudHlwZSBQYXRoVG9rZW5TcGVjPFRSZXNvbHZlZCBleHRlbmRzIGJvb2xlYW4+ID0gVFJlc29sdmVkIGV4dGVuZHMgdHJ1ZSA/IHN0cmluZyA6IFBhdGhUb2tlbjtcblxudHlwZSBQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuPiA9IEFycmF5PFBhdGhUb2tlblNwZWM8VFJlc29sdmVkPj47XG5cbnR5cGUgUmVhZG9ubHlQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuPiA9IFJlYWRvbmx5QXJyYXk8UGF0aFRva2VuU3BlYzxUUmVzb2x2ZWQ+PjtcblxuZnVuY3Rpb24gaXNBbGxUb2tlbnNSZXNvbHZlZDxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuPih0b2tlbnM6IFJlYWRvbmx5UGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkPik6IFRSZXNvbHZlZCB7XG4gICAgLy8g0K8g0YfRgtC+LdGC0L4g0L3QtdC80L7Qs9GDINGB0L7QvtCx0YDQsNC30LjRgtGMINC60LDQuiDRgtGD0YIg0LLRgdGRINGB0YLRgNC+0LPQviDQvdCw0L/QuNGB0LDRgtGMLi4uXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHJldHVybiB0b2tlbnMuZXZlcnkoUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vZGVsUGF0aEltcGw8VFJlc29sdmVkIGV4dGVuZHMgYm9vbGVhbiwgVEFic29sdXRlIGV4dGVuZHMgYm9vbGVhbj5cbiAgICBpbXBsZW1lbnRzIElFcXVhdGFibGU8TW9kZWxQYXRoPiwgSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT5cbntcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRva2VuczogUmVhZG9ubHlQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQ+O1xuICAgIHB1YmxpYyByZWFkb25seSBhYnNvbHV0ZTogVEFic29sdXRlO1xuICAgIHByaXZhdGUgbGVnYWN5UGF0aDogdW5kZWZpbmVkIHwgc3RyaW5nO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBhdGhQYXJ0czogUmVhZG9ubHlQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQ+LCBhYnNvbHV0ZTogVEFic29sdXRlKSB7XG4gICAgICAgIHRoaXMudG9rZW5zID0gcGF0aFBhcnRzLmZpbHRlcih4ID0+IHggIT09IFwiXCIpO1xuICAgICAgICB0aGlzLmFic29sdXRlID0gYWJzb2x1dGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXNvbHZlZCgpOiBUUmVzb2x2ZWQge1xuICAgICAgICByZXR1cm4gaXNBbGxUb2tlbnNSZXNvbHZlZCh0aGlzLnRva2Vucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhdGhQYXJ0cygpOiBJdGVyYWJsZTxQYXRoVG9rZW5TcGVjPFRSZXNvbHZlZD4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXRoUGFydHNBc0FycmF5KCk6IFJlYWRvbmx5QXJyYXk8UGF0aFRva2VuU3BlYzxUUmVzb2x2ZWQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgICB9XG5cbiAgICBwdWJsaWMgKmdldFNpbXBsZVRva2Vuc1N0cmljdCgpOiBJdGVyYWJsZTxTaW1wbGVQYXRoVG9rZW4+IHtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0aGlzLnRva2Vucykge1xuICAgICAgICAgICAgaWYgKCFQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4odG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGF0aCBtdXN0IG5vdCBjb250YWluIHNwZWMgdG9rZW5zXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgdG9rZW47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2ltcGxlVG9rZW5zQXNBcnJheVN0cmljdCgpOiByZWFkb25seSBTaW1wbGVQYXRoVG9rZW5bXSB7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdGhpcy50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmICghUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKHRva2VuKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhdGggbXVzdCBub3QgY29udGFpbiBzcGVjIHRva2Vuc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyDQn9GA0L7QstC10YDQutCwINCy0YvRiNC1INCz0LDRgNCw0LXQvdGC0LjRgNGD0LXRgiDRh9GC0L4g0LHRg9C00YPRgiDRgtC+0LvRjNC60L4gU2ltcGxlUGF0aFRva2VuLlxuICAgICAgICAvLyDQktGB0LUgbWFwINC4IGZpbHRlciDRg9Cx0YDQsNC90Ysg0LTQu9GPINC/0YDQvtC40LfQstC+0LTQuNGC0LXQu9GM0L3QvtGB0YLQuFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgICB9XG5cbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogc3RyaW5nW10pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogUGF0aFRva2VuW10pOiBJTW9kZWxQYXRoPGJvb2xlYW4sIFRBYnNvbHV0ZT47XG4gICAgcHVibGljIGpvaW5XaXRoKC4uLnBhdGg6IEFycmF5PFJlc29sdmVkTW9kZWxQYXRoIHwgc3RyaW5nPik6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuICAgIHB1YmxpYyBqb2luV2l0aCguLi5wYXRoOiBBcnJheTxBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHwgc3RyaW5nPik6IElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPjtcbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8TW9kZWxQYXRoIHwgUGF0aFRva2VuPik6IElNb2RlbFBhdGg8Ym9vbGVhbiwgVEFic29sdXRlPjtcbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8TW9kZWxQYXRoIHwgUGF0aFRva2VuPik6IElNb2RlbFBhdGg8Ym9vbGVhbiwgYm9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gam9pbk1vZGVsUGF0aHModGhpcywgLi4ucGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzUmVzb2x2ZWQoKTogdGhpcyBpcyBJTW9kZWxQYXRoPHRydWUsIFRBYnNvbHV0ZT4ge1xuICAgICAgICByZXR1cm4gaXNBbGxUb2tlbnNSZXNvbHZlZCh0aGlzLnRva2Vucyk7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2Vucy5ldmVyeShQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXNvbHZlQWxsKGluc3RhbmNlOiBzdHJpbmcpOiBNb2RlbFBhdGgge1xuICAgICAgICBjb25zdCB0b2tlbnMgPSB0aGlzLnRva2Vucy5tYXAodG9rZW4gPT4ge1xuICAgICAgICAgICAgaWYgKFBhdGhUb2tlbnMuaXNTaW1wbGVUb2tlbih0b2tlbikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHRva2VucywgdGhpcy5hYnNvbHV0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29udGFpbkl0ZXJhdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zLnNvbWUoeCA9PiB4ID09PSBQYXRoVG9rZW5zLmVhY2gpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0NvbnRhaW5DdXJyZW50SXRlcmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc29tZSh4ID0+IHggPT09IFBhdGhUb2tlbnMuY3VycmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldExhc3RMaXN0UGF0aCgpOiBQYXRoVG9rZW5bXSB7XG4gICAgICAgIGlmICghdGhpcy5pc0NvbnRhaW5JdGVyYXRpb24oKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGF0aCBtdXN0IGNvbnRhaW4gaXRlcmF0aW9uXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g0J/RgNC+0LLQtdGA0LrQsCDQstGL0YjQtSDQs9Cw0YDQsNC90YLQuNGA0YPQtdGCLCDRh9GC0L4g0LHRg9C00LXRgiBQYXRoVG9rZW5zLmVhY2hcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBsYXN0SXRlcmF0aW9uSW5kZXggPSB0aGlzLnRva2Vucy5sYXN0SW5kZXhPZihQYXRoVG9rZW5zLmVhY2gpO1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc2xpY2UoMCwgbGFzdEl0ZXJhdGlvbkluZGV4KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBYnNvbHV0ZSgpOiB0aGlzIGlzIElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFic29sdXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy50b2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMuYWJzb2x1dGUgPyBcIi9cIiA6IFwiXCIpICsgdGhpcy50b2tlbnMubWFwKHggPT4gdGhpcy5wYXRoUGFydFRvU3RyaW5nKHgpKS5qb2luKFwiL1wiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9MZWdhY3lQYXRoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlZ2FjeVBhdGggPz8gKHRoaXMubGVnYWN5UGF0aCA9IHRoaXMudG9rZW5zLm1hcCh4ID0+IHRoaXMucGF0aFBhcnRUb1N0cmluZyh4KSkuam9pbihcIi9cIikpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VxdWFscyhcbiAgICAgICAgbW9kZWxQYXRoOiBNb2RlbFBhdGgsXG4gICAgICAgIGVhY2hDdXJyZW50Q29sbGlzaW9uOiBFYWNoQ3VycmVudENvbGxpc2lvbiA9IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZVNhbWVcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGVhY2hDdXJyZW50Q29sbGlzaW9uID09PSBFYWNoQ3VycmVudENvbGxpc2lvbi5BcmVTYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b0xlZ2FjeVBhdGgoKSA9PT0gbW9kZWxQYXRoLnRvTGVnYWN5UGF0aCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLmlzQWJzb2x1dGUoKSA9PT0gbW9kZWxQYXRoLmlzQWJzb2x1dGUoKSAmJlxuICAgICAgICAgICAgICAgIEl0ZXJhdG9yLmZyb20oSXRlclV0aWxzLnppcCh0aGlzLmdldFBhdGhQYXJ0cygpLCBtb2RlbFBhdGguZ2V0UGF0aFBhcnRzKCkpKS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgKFt0MSwgdDJdKSA9PiB0MSA9PT0gdDJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLRgdC10LPQtNCwINGG0LXQu9C+0LUg0L/QvtC70L7QttC40YLQtdC70YzQvdC+0LUg0LHQtdC30LfQvdCw0LrQvtCy0L7QtSAzMi3QsdC40YLQvdC+0LUg0YfQuNGB0LvQvlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRIYXNoKGVhY2hDdXJyZW50Q29sbGlzaW9uOiBFYWNoQ3VycmVudENvbGxpc2lvbiA9IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZVNhbWUpOiBudW1iZXIge1xuICAgICAgICBsZXQgaGFzaCA9IDUzODE7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgcmV2ZXJzZUFycmF5KHRoaXMudG9rZW5zKSkge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRTdHI6IHN0cmluZztcbiAgICAgICAgICAgIGlmIChQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4odG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFN0ciA9IHRva2VuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZWFjaEN1cnJlbnRDb2xsaXNpb24gPT09IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZURpZmZlcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RyID0gdG9rZW4gPT09IFBhdGhUb2tlbnMuZWFjaCA/IFwiKlwiIDogXCIhXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0ciA9IFwiKlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzdHJpbmdJbmRleCA9IGN1cnJlbnRTdHIubGVuZ3RoO1xuICAgICAgICAgICAgd2hpbGUgKHN0cmluZ0luZGV4KSB7XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2VcbiAgICAgICAgICAgICAgICBoYXNoID0gKGhhc2ggKiAzMykgXiBjdXJyZW50U3RyLmNoYXJDb2RlQXQoLS1zdHJpbmdJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgICAgdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2VcbiAgICAgICAgICAgIEphdmFTY3JpcHQgZG9lcyBiaXR3aXNlIG9wZXJhdGlvbnMgKGxpa2UgWE9SLCBhYm92ZSkgb24gMzItYml0IHNpZ25lZFxuICAgICAgICAgICAgaW50ZWdlcnMuIFNpbmNlIHdlIHdhbnQgdGhlIHJlc3VsdHMgdG8gYmUgYWx3YXlzIHBvc2l0aXZlLCBjb252ZXJ0IHRoZVxuICAgICAgICAgICAgc2lnbmVkIGludCB0byBhbiB1bnNpZ25lZCBieSBkb2luZyBhbiB1bnNpZ25lZCBiaXRzaGlmdC5cbiAgICAgICovXG4gICAgICAgIHJldHVybiBoYXNoID4+PiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0luY2x1ZGVzKG1vZGVsUGF0aDogTW9kZWxQYXRoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFRva2VucyA9IG1vZGVsUGF0aC5nZXRQYXRoUGFydHNBc0FycmF5KCk7XG4gICAgICAgIGlmICh0aGlzLnRva2Vucy5sZW5ndGggIT09IHRhcmdldFRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBsZWZ0UGFydCA9IHRoaXMudG9rZW5zW2ldO1xuICAgICAgICAgICAgY29uc3QgcmlnaHRQYXJ0ID0gdGFyZ2V0VG9rZW5zW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBsZWZ0UGFydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmlnaHRQYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0UGFydCAhPT0gcmlnaHRQYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGVmdFBhcnQgPT09IFBhdGhUb2tlbnMuY3VycmVudCB8fCBsZWZ0UGFydCA9PT0gUGF0aFRva2Vucy5lYWNoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByaWdodFBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShOdW1iZXIocmlnaHRQYXJ0KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHRQYXJ0ICE9PSBQYXRoVG9rZW5zLmN1cnJlbnQgJiYgcmlnaHRQYXJ0ICE9PSBQYXRoVG9rZW5zLmVhY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEl0ZXJhdGlvblJhbmsoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIGNvdW50KEl0ZXJhdG9yLmZyb20odGhpcy50b2tlbnMpLmZpbHRlcih4ID0+IHggPT09IFBhdGhUb2tlbnMuZWFjaCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBtYXRjaEZvcihtb2RlbFBhdGg6IE1vZGVsUGF0aCk6IFBhdGhNYXRjaGluZyB7XG4gICAgICAgIGlmICghdGhpcy5pc0Fic29sdXRlKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1hdGNoIG5vbiBhYnNvbHV0ZSBwYXRoICcke3RoaXMudG9TdHJpbmcoKX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtb2RlbFBhdGguaXNBYnNvbHV0ZSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtYXRjaCBub24gYWJzb2x1dGUgcGF0aCAnJHttb2RlbFBhdGgudG9TdHJpbmcoKX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBhdGhNYXRjaGVyLm1hdGNoKHRoaXMudG9rZW5zLCBtb2RlbFBhdGguZ2V0UGF0aFBhcnRzQXNBcnJheSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKnNwbGl0QnlNdWx0aXBsaWNpdHkoKTogSXRlcmFibGU8UmVzb2x2ZWRNb2RlbFBhdGggfCB0eXBlb2YgRWFjaFN5bWJvbCB8IHR5cGVvZiBDdXJyZW50U3ltYm9sPiB7XG4gICAgICAgIGxldCBsYXN0U2ltcGxlUGFydHMgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcih0aGlzLmlzQWJzb2x1dGUoKSk7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdGhpcy50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmIChQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4odG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgbGFzdFNpbXBsZVBhcnRzLmFwcGVuZCh0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghbGFzdFNpbXBsZVBhcnRzLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGxhc3RTaW1wbGVQYXJ0cy50b1Jlc29sdmVkUGF0aCgpO1xuICAgICAgICAgICAgICAgICAgICBsYXN0U2ltcGxlUGFydHMgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcihmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbGFzdFNpbXBsZVBhcnRzLmVtcHR5KSB7XG4gICAgICAgICAgICB5aWVsZCBsYXN0U2ltcGxlUGFydHMudG9SZXNvbHZlZFBhdGgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBub3JtYWxpemUoKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ge1xuICAgICAgICBjb25zdCByZXN1bHRUb2tlbnM6IFBhdGhUb2tlbnNTcGVjPFRSZXNvbHZlZD4gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwYXRoUGFydCBvZiB0aGlzLnRva2Vucykge1xuICAgICAgICAgICAgaWYgKHBhdGhQYXJ0ID09PSBcIi4uXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdFRva2Vucy5wb3AoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Fic29sdXRlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCBpcyBpbnZhbGlkICcke3RoaXMudG9TdHJpbmcoKX0nYCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRUb2tlbnMucHVzaChcIi4uXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGF0aFBhcnQgPT09IFwiLlwiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHRUb2tlbnMucHVzaChwYXRoUGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPFRSZXNvbHZlZCwgVEFic29sdXRlPihyZXN1bHRUb2tlbnMsIHRoaXMuYWJzb2x1dGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5INCh0L/QtdGG0LjRhNC40LrQsNGC0L7RgNGLINC80L3QvtC20LXRgdGC0LLQtdC90L3QvtGB0YLQuCBFYWNoINC30LDQvNC10L3Rj9C10YIg0L3QsCBDdXJyZW50XG4gICAgICovXG4gICAgcHVibGljIHRvQ3VycmVudEl0ZXJhdGlvbigpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPiB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVzb2x2ZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOT1RFINCi0YPRgiDQvdC1INC/0L7Qu9GD0YfQsNC10YLRgdGPINC90LDQu9C+0LbQuNGC0Ywg0LTQuNGB0LrRgNC40LzQuNC90LDRgtC+0YBcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0czogUGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkPiA9IHRoaXMudG9rZW5zLm1hcCh4ID0+XG4gICAgICAgICAgICAgICAgeCA9PT0gUGF0aFRva2Vucy5lYWNoID8gUGF0aFRva2Vucy5jdXJyZW50IDogeFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ocGF0aFBhcnRzLCB0aGlzLmFic29sdXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0b0VhY2hJdGVyYXRpb24oKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ge1xuICAgICAgICBpZiAodGhpcy5pc1Jlc29sdmVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTk9URSDQotGD0YIg0L3QtSDQv9C+0LvRg9GH0LDQtdGC0YHRjyDQvdCw0LvQvtC20LjRgtGMINC00LjRgdC60YDQuNC80LjQvdCw0YLQvtGAXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICBjb25zdCBwYXRoUGFydHM6IFBhdGhUb2tlbnNTcGVjPFRSZXNvbHZlZD4gPSB0aGlzLnRva2Vucy5tYXAoeCA9PlxuICAgICAgICAgICAgICAgIHggPT09IFBhdGhUb2tlbnMuY3VycmVudCA/IFBhdGhUb2tlbnMuZWFjaCA6IHhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8VFJlc29sdmVkLCBUQWJzb2x1dGU+KHBhdGhQYXJ0cywgdGhpcy5hYnNvbHV0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdG9BYnNvbHV0ZSgpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgdHJ1ZT4ge1xuICAgICAgICBpZiAoIXRoaXMuYWJzb2x1dGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCAnJHt0aGlzLnRvTGVnYWN5UGF0aCgpfSBpcyBub3QgYWJzb2x1dGUnYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPFRSZXNvbHZlZCwgdHJ1ZT4odGhpcy50b2tlbnMsIHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqZ2V0QWxsUGFyZW50UGF0aHMoKTogSXRlcmFibGU8TW9kZWxQYXRoPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNb2RlbFBhdGhCdWlsZGVyKHRoaXMuaXNBYnNvbHV0ZSgpKTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiBJdGVyVXRpbHMuc2tpcExhc3QodGhpcy5nZXRQYXRoUGFydHMoKSwgMSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodG9rZW4pO1xuICAgICAgICAgICAgeWllbGQgcmVzdWx0LnRvUGF0aCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRyaW1MYXN0U3RhcklmTGFzdFRva2VuKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+IHtcbiAgICAgICAgY29uc3QgbGFzdEl0ZW0gPSBJdGVyVXRpbHMubGFzdCh0aGlzLnRva2Vucyk7XG4gICAgICAgIGlmIChsYXN0SXRlbSAhPSB1bmRlZmluZWQgJiYgUGF0aFRva2Vucy5pc011bHRpVG9rZW4obGFzdEl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwodGhpcy50b2tlbnMuc2xpY2UoMCwgLTEpLCB0aGlzLmFic29sdXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyZW50UGF0aCgpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNb2RlbFBhdGhCdWlsZGVyKHRoaXMuYWJzb2x1dGUpO1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIEl0ZXJVdGlscy5za2lwTGFzdCh0aGlzLmdldFBhdGhQYXJ0cygpLCAxKSkge1xuICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgLy8g0KLRg9GCINC/0L7Qu9GD0YfQsNC10YLRgdGPINGC0LDQuiwg0YfRgtC+INC/0L4g0LTRgNGD0LPQvtC80YMg0L3QuNC60LDQulxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIHJldHVybiByZXN1bHQudG9QYXRoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFwcGx5SW5zdGFuY2VzRGlydHkoaW5zdGFuY2VzOiBTaW1wbGVQYXRoVG9rZW5bXSk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXNvbHZlZCgpIHx8IGluc3RhbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbnN0YW5jZUNvdW50ZXIgPSAwO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcih0cnVlKTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0aGlzLmdldFBhdGhQYXJ0cygpKSB7XG4gICAgICAgICAgICBpZiAoUGF0aFRva2Vucy5pc011bHRpVG9rZW4odG9rZW4pICYmIGluc3RhbmNlQ291bnRlciA8IGluc3RhbmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGluc3RhbmNlc1tpbnN0YW5jZUNvdW50ZXJdID8/IHJlamVjdCgpKTtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50ZXIrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g0KLRg9GCINC/0L7Qu9GD0YfQsNC10YLRgdGPINGC0LDQuiwg0YfRgtC+INC/0L4g0LTRgNGD0LPQvtC80YMg0L3QuNC60LDQulxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIHJldHVybiByZXN1bHQudG9QYXRoKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXRoUGFydFRvU3RyaW5nKHBhdGhQYXJ0OiBQYXRoVG9rZW4pOiBzdHJpbmcge1xuICAgICAgICBpZiAodHlwZW9mIHBhdGhQYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0aFBhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGhQYXJ0ID09PSBQYXRoVG9rZW5zLmVhY2gpIHtcbiAgICAgICAgICAgIHJldHVybiBcIipcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFBhcnQgPT09IFBhdGhUb2tlbnMuY3VycmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiKlwiO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXRoIHBhcnQgc3BlY2lmaWVkOiAke2Vuc3VyZUFuZEdldFN0cmluZyhwYXRoUGFydCl9YCk7XG4gICAgfVxufVxuIl19
|