@decaf-ts/ui-decorators 0.20.7 → 0.20.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ui-decorators.cjs +2 -1059
- package/dist/ui-decorators.cjs.map +1 -0
- package/dist/ui-decorators.js +2 -1090
- package/dist/ui-decorators.js.map +1 -0
- package/lib/cjs/dashboard/constants.cjs +2 -2
- package/lib/cjs/dashboard/constants.cjs.map +1 -0
- package/lib/cjs/dashboard/decorators.cjs +2 -2
- package/lib/cjs/dashboard/decorators.cjs.map +1 -0
- package/lib/cjs/dashboard/index.cjs +2 -2
- package/lib/cjs/dashboard/index.cjs.map +1 -0
- package/lib/cjs/dashboard/reader.cjs +2 -2
- package/lib/cjs/dashboard/reader.cjs.map +1 -0
- package/lib/cjs/dashboard/registry.cjs +2 -2
- package/lib/cjs/dashboard/registry.cjs.map +1 -0
- package/lib/cjs/dashboard/types.cjs +2 -2
- package/lib/cjs/dashboard/types.cjs.map +1 -0
- package/lib/cjs/graph/GraphExecutionStateMapper.cjs +2 -2
- package/lib/cjs/graph/GraphExecutionStateMapper.cjs.map +1 -0
- package/lib/cjs/graph/GraphResolution.cjs +2 -2
- package/lib/cjs/graph/GraphResolution.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphConnectionPolicy.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphConnectionPolicy.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphCredentialReference.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphCredentialReference.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphCredentialRequirement.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphCredentialRequirement.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphDynamicPortRule.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphDynamicPortRule.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphIconReference.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphIconReference.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphManifestCompiler.cjs +11 -2
- package/lib/cjs/graph/catalog/GraphManifestCompiler.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphNodeCapability.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphNodeCapability.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphNodeDisplayManifest.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphNodeDisplayManifest.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphNodeManifest.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphNodeManifest.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphNodeManifestSerialization.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphNodeManifestSerialization.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphNodeMethodManifest.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphNodeMethodManifest.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphNodePolicyManifest.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphNodePolicyManifest.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphParameterBase.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphParameterBase.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphParameterDefinition.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphParameterDefinition.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphParameterOption.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphParameterOption.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphParameterValidation.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphParameterValidation.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphPortManifest.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphPortManifest.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphResourceLocatorMode.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphResourceLocatorMode.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphValueSchema.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphValueSchema.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphValueSchemaDerivation.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphValueSchemaDerivation.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphVisibilityExpression.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphVisibilityExpression.cjs.map +1 -0
- package/lib/cjs/graph/catalog/index.cjs +2 -2
- package/lib/cjs/graph/catalog/index.cjs.map +1 -0
- package/lib/cjs/graph/constants.cjs +76 -11
- package/lib/cjs/graph/constants.cjs.map +1 -0
- package/lib/cjs/graph/decorators.cjs +2 -2
- package/lib/cjs/graph/decorators.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphDecoratedWorkflowCompiler.cjs +2 -2
- package/lib/cjs/graph/document/GraphDecoratedWorkflowCompiler.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphEdgeInstance.cjs +2 -2
- package/lib/cjs/graph/document/GraphEdgeInstance.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphEndpoint.cjs +2 -2
- package/lib/cjs/graph/document/GraphEndpoint.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphJsonValue.cjs +2 -2
- package/lib/cjs/graph/document/GraphJsonValue.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphLoopConfiguration.cjs +2 -2
- package/lib/cjs/graph/document/GraphLoopConfiguration.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphNodeBinding.cjs +2 -2
- package/lib/cjs/graph/document/GraphNodeBinding.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphNodeInstance.cjs +2 -2
- package/lib/cjs/graph/document/GraphNodeInstance.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphWorkflowDocument.cjs +2 -2
- package/lib/cjs/graph/document/GraphWorkflowDocument.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphWorkflowDocumentBuilder.cjs +2 -2
- package/lib/cjs/graph/document/GraphWorkflowDocumentBuilder.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphWorkflowDocumentReader.cjs +2 -2
- package/lib/cjs/graph/document/GraphWorkflowDocumentReader.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphWorkflowDocumentSerializer.cjs +2 -2
- package/lib/cjs/graph/document/GraphWorkflowDocumentSerializer.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphWorkflowUiState.cjs +2 -2
- package/lib/cjs/graph/document/GraphWorkflowUiState.cjs.map +1 -0
- package/lib/cjs/graph/document/index.cjs +2 -2
- package/lib/cjs/graph/document/index.cjs.map +1 -0
- package/lib/cjs/graph/index.cjs +2 -2
- package/lib/cjs/graph/index.cjs.map +1 -0
- package/lib/cjs/graph/nodes/agents/agent.cjs +2 -2
- package/lib/cjs/graph/nodes/agents/agent.cjs.map +1 -0
- package/lib/cjs/graph/nodes/base.cjs +2 -2
- package/lib/cjs/graph/nodes/base.cjs.map +1 -0
- package/lib/cjs/graph/nodes/boundary/input-value.cjs +2 -2
- package/lib/cjs/graph/nodes/boundary/input-value.cjs.map +1 -0
- package/lib/cjs/graph/nodes/category-styles.cjs +2 -2
- package/lib/cjs/graph/nodes/category-styles.cjs.map +1 -0
- package/lib/cjs/graph/nodes/flow-control/break.cjs +3 -3
- package/lib/cjs/graph/nodes/flow-control/break.cjs.map +1 -0
- package/lib/cjs/graph/nodes/flow-control/error-boundary.cjs +3 -3
- package/lib/cjs/graph/nodes/flow-control/error-boundary.cjs.map +1 -0
- package/lib/cjs/graph/nodes/flow-control/human-approval.cjs +3 -3
- package/lib/cjs/graph/nodes/flow-control/human-approval.cjs.map +1 -0
- package/lib/cjs/graph/nodes/flow-control/if.cjs +2 -2
- package/lib/cjs/graph/nodes/flow-control/if.cjs.map +1 -0
- package/lib/cjs/graph/nodes/flow-control/parallel.cjs +3 -3
- package/lib/cjs/graph/nodes/flow-control/parallel.cjs.map +1 -0
- package/lib/cjs/graph/nodes/flow-control/switch.cjs +12 -7
- package/lib/cjs/graph/nodes/flow-control/switch.cjs.map +1 -0
- package/lib/cjs/graph/nodes/index.cjs +2 -2
- package/lib/cjs/graph/nodes/index.cjs.map +1 -0
- package/lib/cjs/graph/nodes/loops/foreach.cjs +2 -2
- package/lib/cjs/graph/nodes/loops/foreach.cjs.map +1 -0
- package/lib/cjs/graph/nodes/loops/until.cjs +3 -3
- package/lib/cjs/graph/nodes/loops/until.cjs.map +1 -0
- package/lib/cjs/graph/nodes/loops/while.cjs +3 -3
- package/lib/cjs/graph/nodes/loops/while.cjs.map +1 -0
- package/lib/cjs/graph/nodes/manifests.cjs +17 -13
- package/lib/cjs/graph/nodes/manifests.cjs.map +1 -0
- package/lib/cjs/graph/nodes/triggers/chat.cjs +3 -3
- package/lib/cjs/graph/nodes/triggers/chat.cjs.map +1 -0
- package/lib/cjs/graph/nodes/triggers/event.cjs +3 -3
- package/lib/cjs/graph/nodes/triggers/event.cjs.map +1 -0
- package/lib/cjs/graph/nodes/triggers/form.cjs +3 -3
- package/lib/cjs/graph/nodes/triggers/form.cjs.map +1 -0
- package/lib/cjs/graph/nodes/triggers/manual.cjs +2 -2
- package/lib/cjs/graph/nodes/triggers/manual.cjs.map +1 -0
- package/lib/cjs/graph/nodes/triggers/schedule.cjs +3 -3
- package/lib/cjs/graph/nodes/triggers/schedule.cjs.map +1 -0
- package/lib/cjs/graph/nodes/triggers/webhook.cjs +3 -3
- package/lib/cjs/graph/nodes/triggers/webhook.cjs.map +1 -0
- package/lib/cjs/graph/nodes/utility/code.cjs +3 -3
- package/lib/cjs/graph/nodes/utility/code.cjs.map +1 -0
- package/lib/cjs/graph/nodes/utility/delay.cjs +3 -3
- package/lib/cjs/graph/nodes/utility/delay.cjs.map +1 -0
- package/lib/cjs/graph/nodes/utility/log.cjs +3 -3
- package/lib/cjs/graph/nodes/utility/log.cjs.map +1 -0
- package/lib/cjs/graph/nodes/utility/map.cjs +3 -3
- package/lib/cjs/graph/nodes/utility/map.cjs.map +1 -0
- package/lib/cjs/graph/nodes/utility/merge.cjs +2 -2
- package/lib/cjs/graph/nodes/utility/merge.cjs.map +1 -0
- package/lib/cjs/graph/nodes/utility/return.cjs +3 -3
- package/lib/cjs/graph/nodes/utility/return.cjs.map +1 -0
- package/lib/cjs/graph/nodes/utility/utility-log.cjs +3 -3
- package/lib/cjs/graph/nodes/utility/utility-log.cjs.map +1 -0
- package/lib/cjs/graph/overrides/Metadata.cjs +2 -2
- package/lib/cjs/graph/overrides/Metadata.cjs.map +1 -0
- package/lib/cjs/graph/overrides/Rendering.cjs +2 -2
- package/lib/cjs/graph/overrides/Rendering.cjs.map +1 -0
- package/lib/cjs/graph/overrides/index.cjs +2 -2
- package/lib/cjs/graph/overrides/index.cjs.map +1 -0
- package/lib/cjs/graph/overrides/overrides.cjs +2 -2
- package/lib/cjs/graph/overrides/overrides.cjs.map +1 -0
- package/lib/cjs/graph/reader.cjs +5 -2
- package/lib/cjs/graph/reader.cjs.map +1 -0
- package/lib/cjs/graph/registry.cjs +2 -2
- package/lib/cjs/graph/registry.cjs.map +1 -0
- package/lib/cjs/graph/snapshot.cjs +2 -2
- package/lib/cjs/graph/snapshot.cjs.map +1 -0
- package/lib/cjs/graph/types.cjs +2 -2
- package/lib/cjs/graph/types.cjs.map +1 -0
- package/lib/cjs/index.cjs +5 -5
- package/lib/cjs/index.cjs.map +1 -0
- package/lib/cjs/model/Renderable.cjs +2 -2
- package/lib/cjs/model/Renderable.cjs.map +1 -0
- package/lib/cjs/model/decorators.cjs +2 -2
- package/lib/cjs/model/decorators.cjs.map +1 -0
- package/lib/cjs/model/index.cjs +2 -2
- package/lib/cjs/model/index.cjs.map +1 -0
- package/lib/cjs/model/model.cjs +2 -2
- package/lib/cjs/model/model.cjs.map +1 -0
- package/lib/cjs/model/overrides.cjs +2 -2
- package/lib/cjs/model/overrides.cjs.map +1 -0
- package/lib/cjs/overrides/ModelBuilderExtensions.cjs +2 -2
- package/lib/cjs/overrides/ModelBuilderExtensions.cjs.map +1 -0
- package/lib/cjs/overrides/index.cjs +2 -2
- package/lib/cjs/overrides/index.cjs.map +1 -0
- package/lib/cjs/ui/DecafComponent.cjs +2 -2
- package/lib/cjs/ui/DecafComponent.cjs.map +1 -0
- package/lib/cjs/ui/DecafEventHandler.cjs +2 -2
- package/lib/cjs/ui/DecafEventHandler.cjs.map +1 -0
- package/lib/cjs/ui/DecafTranslateService.cjs +2 -2
- package/lib/cjs/ui/DecafTranslateService.cjs.map +1 -0
- package/lib/cjs/ui/Rendering.cjs +2 -2
- package/lib/cjs/ui/Rendering.cjs.map +1 -0
- package/lib/cjs/ui/UIValidator.cjs +2 -2
- package/lib/cjs/ui/UIValidator.cjs.map +1 -0
- package/lib/cjs/ui/constants.cjs +2 -2
- package/lib/cjs/ui/constants.cjs.map +1 -0
- package/lib/cjs/ui/decorators.cjs +2 -2
- package/lib/cjs/ui/decorators.cjs.map +1 -0
- package/lib/cjs/ui/errors.cjs +2 -2
- package/lib/cjs/ui/errors.cjs.map +1 -0
- package/lib/cjs/ui/index.cjs +2 -2
- package/lib/cjs/ui/index.cjs.map +1 -0
- package/lib/cjs/ui/interfaces/IDecafModal.cjs +2 -2
- package/lib/cjs/ui/interfaces/IDecafModal.cjs.map +1 -0
- package/lib/cjs/ui/interfaces/IDecafRouter.cjs +2 -2
- package/lib/cjs/ui/interfaces/IDecafRouter.cjs.map +1 -0
- package/lib/cjs/ui/interfaces/IDecafSpinner.cjs +2 -2
- package/lib/cjs/ui/interfaces/IDecafSpinner.cjs.map +1 -0
- package/lib/cjs/ui/interfaces/IDecafToast.cjs +2 -2
- package/lib/cjs/ui/interfaces/IDecafToast.cjs.map +1 -0
- package/lib/cjs/ui/interfaces/index.cjs +2 -2
- package/lib/cjs/ui/interfaces/index.cjs.map +1 -0
- package/lib/cjs/ui/overrides.cjs +2 -2
- package/lib/cjs/ui/overrides.cjs.map +1 -0
- package/lib/cjs/ui/types.cjs +2 -2
- package/lib/cjs/ui/types.cjs.map +1 -0
- package/lib/cjs/ui/utils.cjs +2 -2
- package/lib/cjs/ui/utils.cjs.map +1 -0
- package/lib/cjs/ui/validator.cjs +2 -2
- package/lib/cjs/ui/validator.cjs.map +1 -0
- package/lib/cjs/user-requests/UserRequestHandler.cjs +2 -2
- package/lib/cjs/user-requests/UserRequestHandler.cjs.map +1 -0
- package/lib/cjs/user-requests/constants.cjs +2 -2
- package/lib/cjs/user-requests/constants.cjs.map +1 -0
- package/lib/cjs/user-requests/decorators.cjs +2 -2
- package/lib/cjs/user-requests/decorators.cjs.map +1 -0
- package/lib/cjs/user-requests/errors.cjs +2 -2
- package/lib/cjs/user-requests/errors.cjs.map +1 -0
- package/lib/cjs/user-requests/index.cjs +2 -2
- package/lib/cjs/user-requests/index.cjs.map +1 -0
- package/lib/cjs/user-requests/types.cjs +2 -2
- package/lib/cjs/user-requests/types.cjs.map +1 -0
- package/lib/esm/dashboard/constants.js +1 -1
- package/lib/esm/dashboard/constants.js.map +1 -0
- package/lib/esm/dashboard/decorators.js +1 -1
- package/lib/esm/dashboard/decorators.js.map +1 -0
- package/lib/esm/dashboard/index.js +1 -1
- package/lib/esm/dashboard/index.js.map +1 -0
- package/lib/esm/dashboard/reader.js +1 -1
- package/lib/esm/dashboard/reader.js.map +1 -0
- package/lib/esm/dashboard/registry.js +1 -1
- package/lib/esm/dashboard/registry.js.map +1 -0
- package/lib/esm/dashboard/types.js +1 -1
- package/lib/esm/dashboard/types.js.map +1 -0
- package/lib/esm/graph/GraphExecutionStateMapper.js +1 -1
- package/lib/esm/graph/GraphExecutionStateMapper.js.map +1 -0
- package/lib/esm/graph/GraphResolution.js +1 -1
- package/lib/esm/graph/GraphResolution.js.map +1 -0
- package/lib/esm/graph/catalog/GraphConnectionPolicy.js +1 -1
- package/lib/esm/graph/catalog/GraphConnectionPolicy.js.map +1 -0
- package/lib/esm/graph/catalog/GraphCredentialReference.js +1 -1
- package/lib/esm/graph/catalog/GraphCredentialReference.js.map +1 -0
- package/lib/esm/graph/catalog/GraphCredentialRequirement.js +1 -1
- package/lib/esm/graph/catalog/GraphCredentialRequirement.js.map +1 -0
- package/lib/esm/graph/catalog/GraphDynamicPortRule.js +1 -1
- package/lib/esm/graph/catalog/GraphDynamicPortRule.js.map +1 -0
- package/lib/esm/graph/catalog/GraphIconReference.js +1 -1
- package/lib/esm/graph/catalog/GraphIconReference.js.map +1 -0
- package/lib/esm/graph/catalog/GraphManifestCompiler.js +10 -1
- package/lib/esm/graph/catalog/GraphManifestCompiler.js.map +1 -0
- package/lib/esm/graph/catalog/GraphNodeCapability.js +1 -1
- package/lib/esm/graph/catalog/GraphNodeCapability.js.map +1 -0
- package/lib/esm/graph/catalog/GraphNodeDisplayManifest.js +1 -1
- package/lib/esm/graph/catalog/GraphNodeDisplayManifest.js.map +1 -0
- package/lib/esm/graph/catalog/GraphNodeManifest.js +1 -1
- package/lib/esm/graph/catalog/GraphNodeManifest.js.map +1 -0
- package/lib/esm/graph/catalog/GraphNodeManifestSerialization.js +1 -1
- package/lib/esm/graph/catalog/GraphNodeManifestSerialization.js.map +1 -0
- package/lib/esm/graph/catalog/GraphNodeMethodManifest.js +1 -1
- package/lib/esm/graph/catalog/GraphNodeMethodManifest.js.map +1 -0
- package/lib/esm/graph/catalog/GraphNodePolicyManifest.js +1 -1
- package/lib/esm/graph/catalog/GraphNodePolicyManifest.js.map +1 -0
- package/lib/esm/graph/catalog/GraphParameterBase.js +1 -1
- package/lib/esm/graph/catalog/GraphParameterBase.js.map +1 -0
- package/lib/esm/graph/catalog/GraphParameterDefinition.js +1 -1
- package/lib/esm/graph/catalog/GraphParameterDefinition.js.map +1 -0
- package/lib/esm/graph/catalog/GraphParameterOption.js +1 -1
- package/lib/esm/graph/catalog/GraphParameterOption.js.map +1 -0
- package/lib/esm/graph/catalog/GraphParameterValidation.js +1 -1
- package/lib/esm/graph/catalog/GraphParameterValidation.js.map +1 -0
- package/lib/esm/graph/catalog/GraphPortManifest.js +1 -1
- package/lib/esm/graph/catalog/GraphPortManifest.js.map +1 -0
- package/lib/esm/graph/catalog/GraphResourceLocatorMode.js +1 -1
- package/lib/esm/graph/catalog/GraphResourceLocatorMode.js.map +1 -0
- package/lib/esm/graph/catalog/GraphValueSchema.js +1 -1
- package/lib/esm/graph/catalog/GraphValueSchema.js.map +1 -0
- package/lib/esm/graph/catalog/GraphValueSchemaDerivation.js +1 -1
- package/lib/esm/graph/catalog/GraphValueSchemaDerivation.js.map +1 -0
- package/lib/esm/graph/catalog/GraphVisibilityExpression.js +1 -1
- package/lib/esm/graph/catalog/GraphVisibilityExpression.js.map +1 -0
- package/lib/esm/graph/catalog/index.js +1 -1
- package/lib/esm/graph/catalog/index.js.map +1 -0
- package/lib/esm/graph/constants.js +73 -9
- package/lib/esm/graph/constants.js.map +1 -0
- package/lib/esm/graph/decorators.js +1 -1
- package/lib/esm/graph/decorators.js.map +1 -0
- package/lib/esm/graph/document/GraphDecoratedWorkflowCompiler.js +1 -1
- package/lib/esm/graph/document/GraphDecoratedWorkflowCompiler.js.map +1 -0
- package/lib/esm/graph/document/GraphEdgeInstance.js +1 -1
- package/lib/esm/graph/document/GraphEdgeInstance.js.map +1 -0
- package/lib/esm/graph/document/GraphEndpoint.js +1 -1
- package/lib/esm/graph/document/GraphEndpoint.js.map +1 -0
- package/lib/esm/graph/document/GraphJsonValue.js +1 -1
- package/lib/esm/graph/document/GraphJsonValue.js.map +1 -0
- package/lib/esm/graph/document/GraphLoopConfiguration.js +1 -1
- package/lib/esm/graph/document/GraphLoopConfiguration.js.map +1 -0
- package/lib/esm/graph/document/GraphNodeBinding.js +1 -1
- package/lib/esm/graph/document/GraphNodeBinding.js.map +1 -0
- package/lib/esm/graph/document/GraphNodeInstance.js +1 -1
- package/lib/esm/graph/document/GraphNodeInstance.js.map +1 -0
- package/lib/esm/graph/document/GraphWorkflowDocument.js +1 -1
- package/lib/esm/graph/document/GraphWorkflowDocument.js.map +1 -0
- package/lib/esm/graph/document/GraphWorkflowDocumentBuilder.js +1 -1
- package/lib/esm/graph/document/GraphWorkflowDocumentBuilder.js.map +1 -0
- package/lib/esm/graph/document/GraphWorkflowDocumentReader.js +1 -1
- package/lib/esm/graph/document/GraphWorkflowDocumentReader.js.map +1 -0
- package/lib/esm/graph/document/GraphWorkflowDocumentSerializer.js +1 -1
- package/lib/esm/graph/document/GraphWorkflowDocumentSerializer.js.map +1 -0
- package/lib/esm/graph/document/GraphWorkflowUiState.js +1 -1
- package/lib/esm/graph/document/GraphWorkflowUiState.js.map +1 -0
- package/lib/esm/graph/document/index.js +1 -1
- package/lib/esm/graph/document/index.js.map +1 -0
- package/lib/esm/graph/index.js +1 -1
- package/lib/esm/graph/index.js.map +1 -0
- package/lib/esm/graph/nodes/agents/agent.js +1 -1
- package/lib/esm/graph/nodes/agents/agent.js.map +1 -0
- package/lib/esm/graph/nodes/base.js +1 -1
- package/lib/esm/graph/nodes/base.js.map +1 -0
- package/lib/esm/graph/nodes/boundary/input-value.js +1 -1
- package/lib/esm/graph/nodes/boundary/input-value.js.map +1 -0
- package/lib/esm/graph/nodes/category-styles.js +1 -1
- package/lib/esm/graph/nodes/category-styles.js.map +1 -0
- package/lib/esm/graph/nodes/flow-control/break.js +2 -2
- package/lib/esm/graph/nodes/flow-control/break.js.map +1 -0
- package/lib/esm/graph/nodes/flow-control/error-boundary.js +2 -2
- package/lib/esm/graph/nodes/flow-control/error-boundary.js.map +1 -0
- package/lib/esm/graph/nodes/flow-control/human-approval.js +2 -2
- package/lib/esm/graph/nodes/flow-control/human-approval.js.map +1 -0
- package/lib/esm/graph/nodes/flow-control/if.js +1 -1
- package/lib/esm/graph/nodes/flow-control/if.js.map +1 -0
- package/lib/esm/graph/nodes/flow-control/parallel.js +2 -2
- package/lib/esm/graph/nodes/flow-control/parallel.js.map +1 -0
- package/lib/esm/graph/nodes/flow-control/switch.js +12 -7
- package/lib/esm/graph/nodes/flow-control/switch.js.map +1 -0
- package/lib/esm/graph/nodes/index.js +1 -1
- package/lib/esm/graph/nodes/index.js.map +1 -0
- package/lib/esm/graph/nodes/loops/foreach.js +1 -1
- package/lib/esm/graph/nodes/loops/foreach.js.map +1 -0
- package/lib/esm/graph/nodes/loops/until.js +2 -2
- package/lib/esm/graph/nodes/loops/until.js.map +1 -0
- package/lib/esm/graph/nodes/loops/while.js +2 -2
- package/lib/esm/graph/nodes/loops/while.js.map +1 -0
- package/lib/esm/graph/nodes/manifests.js +16 -12
- package/lib/esm/graph/nodes/manifests.js.map +1 -0
- package/lib/esm/graph/nodes/triggers/chat.js +2 -2
- package/lib/esm/graph/nodes/triggers/chat.js.map +1 -0
- package/lib/esm/graph/nodes/triggers/event.js +2 -2
- package/lib/esm/graph/nodes/triggers/event.js.map +1 -0
- package/lib/esm/graph/nodes/triggers/form.js +2 -2
- package/lib/esm/graph/nodes/triggers/form.js.map +1 -0
- package/lib/esm/graph/nodes/triggers/manual.js +1 -1
- package/lib/esm/graph/nodes/triggers/manual.js.map +1 -0
- package/lib/esm/graph/nodes/triggers/schedule.js +2 -2
- package/lib/esm/graph/nodes/triggers/schedule.js.map +1 -0
- package/lib/esm/graph/nodes/triggers/webhook.js +2 -2
- package/lib/esm/graph/nodes/triggers/webhook.js.map +1 -0
- package/lib/esm/graph/nodes/utility/code.js +2 -2
- package/lib/esm/graph/nodes/utility/code.js.map +1 -0
- package/lib/esm/graph/nodes/utility/delay.js +2 -2
- package/lib/esm/graph/nodes/utility/delay.js.map +1 -0
- package/lib/esm/graph/nodes/utility/log.js +2 -2
- package/lib/esm/graph/nodes/utility/log.js.map +1 -0
- package/lib/esm/graph/nodes/utility/map.js +2 -2
- package/lib/esm/graph/nodes/utility/map.js.map +1 -0
- package/lib/esm/graph/nodes/utility/merge.js +1 -1
- package/lib/esm/graph/nodes/utility/merge.js.map +1 -0
- package/lib/esm/graph/nodes/utility/return.js +2 -2
- package/lib/esm/graph/nodes/utility/return.js.map +1 -0
- package/lib/esm/graph/nodes/utility/utility-log.js +2 -2
- package/lib/esm/graph/nodes/utility/utility-log.js.map +1 -0
- package/lib/esm/graph/overrides/Metadata.js +1 -1
- package/lib/esm/graph/overrides/Metadata.js.map +1 -0
- package/lib/esm/graph/overrides/Rendering.js +1 -1
- package/lib/esm/graph/overrides/Rendering.js.map +1 -0
- package/lib/esm/graph/overrides/index.js +1 -1
- package/lib/esm/graph/overrides/index.js.map +1 -0
- package/lib/esm/graph/overrides/overrides.js +1 -1
- package/lib/esm/graph/overrides/overrides.js.map +1 -0
- package/lib/esm/graph/reader.js +4 -1
- package/lib/esm/graph/reader.js.map +1 -0
- package/lib/esm/graph/registry.js +1 -1
- package/lib/esm/graph/registry.js.map +1 -0
- package/lib/esm/graph/snapshot.js +1 -1
- package/lib/esm/graph/snapshot.js.map +1 -0
- package/lib/esm/graph/types.js +1 -1
- package/lib/esm/graph/types.js.map +1 -0
- package/lib/esm/index.js +4 -4
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/model/Renderable.js +1 -1
- package/lib/esm/model/Renderable.js.map +1 -0
- package/lib/esm/model/decorators.js +1 -1
- package/lib/esm/model/decorators.js.map +1 -0
- package/lib/esm/model/index.js +1 -1
- package/lib/esm/model/index.js.map +1 -0
- package/lib/esm/model/model.js +1 -1
- package/lib/esm/model/model.js.map +1 -0
- package/lib/esm/model/overrides.js +1 -1
- package/lib/esm/model/overrides.js.map +1 -0
- package/lib/esm/overrides/ModelBuilderExtensions.js +1 -1
- package/lib/esm/overrides/ModelBuilderExtensions.js.map +1 -0
- package/lib/esm/overrides/index.js +1 -1
- package/lib/esm/overrides/index.js.map +1 -0
- package/lib/esm/ui/DecafComponent.js +1 -1
- package/lib/esm/ui/DecafComponent.js.map +1 -0
- package/lib/esm/ui/DecafEventHandler.js +1 -1
- package/lib/esm/ui/DecafEventHandler.js.map +1 -0
- package/lib/esm/ui/DecafTranslateService.js +1 -1
- package/lib/esm/ui/DecafTranslateService.js.map +1 -0
- package/lib/esm/ui/Rendering.js +1 -1
- package/lib/esm/ui/Rendering.js.map +1 -0
- package/lib/esm/ui/UIValidator.js +1 -1
- package/lib/esm/ui/UIValidator.js.map +1 -0
- package/lib/esm/ui/constants.js +1 -1
- package/lib/esm/ui/constants.js.map +1 -0
- package/lib/esm/ui/decorators.js +1 -1
- package/lib/esm/ui/decorators.js.map +1 -0
- package/lib/esm/ui/errors.js +1 -1
- package/lib/esm/ui/errors.js.map +1 -0
- package/lib/esm/ui/index.js +1 -1
- package/lib/esm/ui/index.js.map +1 -0
- package/lib/esm/ui/interfaces/IDecafModal.js +1 -1
- package/lib/esm/ui/interfaces/IDecafModal.js.map +1 -0
- package/lib/esm/ui/interfaces/IDecafRouter.js +1 -1
- package/lib/esm/ui/interfaces/IDecafRouter.js.map +1 -0
- package/lib/esm/ui/interfaces/IDecafSpinner.js +1 -1
- package/lib/esm/ui/interfaces/IDecafSpinner.js.map +1 -0
- package/lib/esm/ui/interfaces/IDecafToast.js +1 -1
- package/lib/esm/ui/interfaces/IDecafToast.js.map +1 -0
- package/lib/esm/ui/interfaces/index.js +1 -1
- package/lib/esm/ui/interfaces/index.js.map +1 -0
- package/lib/esm/ui/overrides.js +1 -1
- package/lib/esm/ui/overrides.js.map +1 -0
- package/lib/esm/ui/types.js +1 -1
- package/lib/esm/ui/types.js.map +1 -0
- package/lib/esm/ui/utils.js +1 -1
- package/lib/esm/ui/utils.js.map +1 -0
- package/lib/esm/ui/validator.js +1 -1
- package/lib/esm/ui/validator.js.map +1 -0
- package/lib/esm/user-requests/UserRequestHandler.js +1 -1
- package/lib/esm/user-requests/UserRequestHandler.js.map +1 -0
- package/lib/esm/user-requests/constants.js +1 -1
- package/lib/esm/user-requests/constants.js.map +1 -0
- package/lib/esm/user-requests/decorators.js +1 -1
- package/lib/esm/user-requests/decorators.js.map +1 -0
- package/lib/esm/user-requests/errors.js +1 -1
- package/lib/esm/user-requests/errors.js.map +1 -0
- package/lib/esm/user-requests/index.js +1 -1
- package/lib/esm/user-requests/index.js.map +1 -0
- package/lib/esm/user-requests/types.js +1 -1
- package/lib/esm/user-requests/types.js.map +1 -0
- package/lib/types/graph/catalog/GraphNodeDisplayManifest.d.cts +17 -0
- package/lib/types/graph/catalog/GraphNodeDisplayManifest.d.mts +17 -0
- package/lib/types/graph/constants.d.cts +101 -6
- package/lib/types/graph/constants.d.mts +101 -6
- package/lib/types/graph/document/GraphNodeInstance.d.cts +20 -0
- package/lib/types/graph/document/GraphNodeInstance.d.mts +20 -0
- package/lib/types/graph/document/GraphWorkflowUiState.d.cts +8 -0
- package/lib/types/graph/document/GraphWorkflowUiState.d.mts +8 -0
- package/lib/types/index.d.cts +3 -3
- package/lib/types/index.d.mts +3 -3
- package/package.json +3 -1
package/dist/ui-decorators.js
CHANGED
|
@@ -1,1090 +1,2 @@
|
|
|
1
|
-
import { ValidationKeys, PasswordValidator, DateValidator, URLValidator, EmailValidator, GreaterThanOrEqualValidator, GreaterThanValidator, LessThanOrEqualValidator, LessThanValidator, DiffValidator, EqualsValidator, PatternValidator, MaxLengthValidator, MinLengthValidator, StepValidator, MaxValidator, MinValidator, RequiredValidator, formatDate, ReservedModels, parseDate, Model, Primitives, Validator, ModelBuilder } from "@decaf-ts/decorator-validation";
|
|
2
|
-
|
|
3
|
-
import { OperationKeys, InternalError, NotFoundError } from "@decaf-ts/db-decorators";
|
|
4
|
-
|
|
5
|
-
import { Metadata, DecorationKeys, propMetadata, metadata, apply, Decoration } from "@decaf-ts/decoration";
|
|
6
|
-
|
|
7
|
-
import { LoggedClass } from "@decaf-ts/logging";
|
|
8
|
-
|
|
9
|
-
var UIMediaBreakPoints;
|
|
10
|
-
|
|
11
|
-
(function(UIMediaBreakPoints) {
|
|
12
|
-
UIMediaBreakPoints["SMALL"] = "small";
|
|
13
|
-
UIMediaBreakPoints["MEDIUM"] = "medium";
|
|
14
|
-
UIMediaBreakPoints["LARGE"] = "large";
|
|
15
|
-
UIMediaBreakPoints["XLARGE"] = "xlarge";
|
|
16
|
-
})(UIMediaBreakPoints || (UIMediaBreakPoints = {}));
|
|
17
|
-
|
|
18
|
-
const UIKeys = {
|
|
19
|
-
REFLECT: `ui`,
|
|
20
|
-
UIMODEL: "uimodel",
|
|
21
|
-
RENDERED_BY: "rendered-by",
|
|
22
|
-
ELEMENT: "uielement",
|
|
23
|
-
PROP: "uiprop",
|
|
24
|
-
CHILD: "uichild",
|
|
25
|
-
NAME: "name",
|
|
26
|
-
NAME_PREFIX: "input-",
|
|
27
|
-
VALIDATION_MESSAGE: "validationMessage",
|
|
28
|
-
UILISTMODEL: "uilistmodel",
|
|
29
|
-
UILISTPROP: "uilistprop",
|
|
30
|
-
UILAYOUT: "uilayout",
|
|
31
|
-
UILAYOUTPROP: "uilayoutprop",
|
|
32
|
-
HANDLERS: "handlers",
|
|
33
|
-
TYPE: "type",
|
|
34
|
-
SUB_TYPE: "subType",
|
|
35
|
-
HIDDEN: "hidden",
|
|
36
|
-
HIDE_FOR: "hide-for",
|
|
37
|
-
SHOW_FOR: "show-for",
|
|
38
|
-
RENDER_IF: "render-if",
|
|
39
|
-
FORMAT: "format",
|
|
40
|
-
ORDER: "order",
|
|
41
|
-
PAGE: "page",
|
|
42
|
-
EVENTS: "events",
|
|
43
|
-
FIRST: "first",
|
|
44
|
-
LAST: "last",
|
|
45
|
-
READ_ONLY: "readonly",
|
|
46
|
-
SEQUENCE: "sequence",
|
|
47
|
-
REQUIRED: ValidationKeys.REQUIRED,
|
|
48
|
-
MIN: ValidationKeys.MIN,
|
|
49
|
-
MIN_LENGTH: ValidationKeys.MIN_LENGTH,
|
|
50
|
-
MAX: ValidationKeys.MAX,
|
|
51
|
-
MAX_LENGTH: ValidationKeys.MAX_LENGTH,
|
|
52
|
-
PATTERN: ValidationKeys.PATTERN,
|
|
53
|
-
URL: ValidationKeys.URL,
|
|
54
|
-
STEP: ValidationKeys.STEP,
|
|
55
|
-
DATE: ValidationKeys.DATE,
|
|
56
|
-
EMAIL: ValidationKeys.EMAIL,
|
|
57
|
-
PASSWORD: ValidationKeys.PASSWORD,
|
|
58
|
-
EQUALS: ValidationKeys.EQUALS,
|
|
59
|
-
DIFF: ValidationKeys.DIFF,
|
|
60
|
-
LESS_THAN: ValidationKeys.LESS_THAN,
|
|
61
|
-
LESS_THAN_OR_EQUAL: ValidationKeys.LESS_THAN_OR_EQUAL,
|
|
62
|
-
GREATER_THAN: ValidationKeys.GREATER_THAN,
|
|
63
|
-
GREATER_THAN_OR_EQUAL: ValidationKeys.GREATER_THAN_OR_EQUAL
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
const ValidatableByType = {
|
|
67
|
-
[UIKeys.EMAIL]: EmailValidator,
|
|
68
|
-
[UIKeys.URL]: URLValidator,
|
|
69
|
-
[UIKeys.DATE]: DateValidator,
|
|
70
|
-
[UIKeys.PASSWORD]: PasswordValidator
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
const ValidatableByAttribute = {
|
|
74
|
-
[UIKeys.REQUIRED]: RequiredValidator,
|
|
75
|
-
[UIKeys.MIN]: MinValidator,
|
|
76
|
-
[UIKeys.MAX]: MaxValidator,
|
|
77
|
-
[UIKeys.STEP]: StepValidator,
|
|
78
|
-
[UIKeys.MIN_LENGTH]: MinLengthValidator,
|
|
79
|
-
[UIKeys.MAX_LENGTH]: MaxLengthValidator,
|
|
80
|
-
[UIKeys.PATTERN]: PatternValidator,
|
|
81
|
-
[UIKeys.EQUALS]: EqualsValidator,
|
|
82
|
-
[UIKeys.DIFF]: DiffValidator,
|
|
83
|
-
[UIKeys.LESS_THAN]: LessThanValidator,
|
|
84
|
-
[UIKeys.LESS_THAN_OR_EQUAL]: LessThanOrEqualValidator,
|
|
85
|
-
[UIKeys.GREATER_THAN]: GreaterThanValidator,
|
|
86
|
-
[UIKeys.GREATER_THAN_OR_EQUAL]: GreaterThanOrEqualValidator
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
const HTML5DateFormat = "yyyy-MM-dd";
|
|
90
|
-
|
|
91
|
-
const HTML5InputTypes = {
|
|
92
|
-
BUTTON: "button",
|
|
93
|
-
CHECKBOX: "checkbox",
|
|
94
|
-
COLOR: "color",
|
|
95
|
-
DATE: UIKeys.DATE,
|
|
96
|
-
DATETIME_LOCAL: "datetime-local",
|
|
97
|
-
EMAIL: UIKeys.EMAIL,
|
|
98
|
-
FILE: "file",
|
|
99
|
-
HIDDEN: "hidden",
|
|
100
|
-
IMAGE: "image",
|
|
101
|
-
MONTH: "month",
|
|
102
|
-
NUMBER: "number",
|
|
103
|
-
PASSWORD: UIKeys.PASSWORD,
|
|
104
|
-
RADIO: "radio",
|
|
105
|
-
RANGE: "range",
|
|
106
|
-
RESET: "reset",
|
|
107
|
-
SEARCH: "search",
|
|
108
|
-
SUBMIT: "submit",
|
|
109
|
-
TEL: "tel",
|
|
110
|
-
TEXT: "text",
|
|
111
|
-
TEXTAREA: "textarea",
|
|
112
|
-
SELECT: "select",
|
|
113
|
-
TIME: "time",
|
|
114
|
-
URL: UIKeys.URL,
|
|
115
|
-
WEEK: "week"
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
const HTML5CheckTypes = [ HTML5InputTypes.CHECKBOX, HTML5InputTypes.RADIO ];
|
|
119
|
-
|
|
120
|
-
const ComponentEventNames = {
|
|
121
|
-
Render: "render",
|
|
122
|
-
BackButtonClickEvent: "backButtonNavigationEndEvent",
|
|
123
|
-
Refresh: "RefreshEvent",
|
|
124
|
-
Click: "ClickEvent",
|
|
125
|
-
Change: "ChangeEvent",
|
|
126
|
-
Submit: "SubmitEvent",
|
|
127
|
-
ValidationError: "validationErrorEvent",
|
|
128
|
-
ThemeChange: "themeChangeEvent",
|
|
129
|
-
FormGroupLoaded: "formGroupLoadedEvent"
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
const TransactionHooks = {
|
|
133
|
-
BeforeRead: "beforeRead",
|
|
134
|
-
AfterRead: "afterRead",
|
|
135
|
-
BeforeCreate: "beforeCreate",
|
|
136
|
-
AfterCreate: "afterCreate",
|
|
137
|
-
BeforeUpdate: "beforeUpdate",
|
|
138
|
-
AfterUpdate: "afterUpdate",
|
|
139
|
-
BeforeDelete: "beforeDelete",
|
|
140
|
-
AfterDelete: "afterDelete"
|
|
141
|
-
};
|
|
142
|
-
|
|
143
|
-
const ElementSizes = {
|
|
144
|
-
xsmall: "xsmall",
|
|
145
|
-
small: "small",
|
|
146
|
-
medium: "medium",
|
|
147
|
-
default: "default",
|
|
148
|
-
large: "large",
|
|
149
|
-
xLarge: "xlarge",
|
|
150
|
-
"2xLarge": "2xlarge",
|
|
151
|
-
auto: "auto",
|
|
152
|
-
expand: "expand",
|
|
153
|
-
block: "block",
|
|
154
|
-
half: "half",
|
|
155
|
-
full: "full"
|
|
156
|
-
};
|
|
157
|
-
|
|
158
|
-
const ElementPositions = {
|
|
159
|
-
left: "left",
|
|
160
|
-
center: "center",
|
|
161
|
-
right: "right",
|
|
162
|
-
top: "top",
|
|
163
|
-
bottom: "bottom"
|
|
164
|
-
};
|
|
165
|
-
|
|
166
|
-
const LayoutGridGaps = {
|
|
167
|
-
small: "small",
|
|
168
|
-
medium: "medium",
|
|
169
|
-
large: "large",
|
|
170
|
-
collapse: "collapse",
|
|
171
|
-
none: ""
|
|
172
|
-
};
|
|
173
|
-
|
|
174
|
-
const ActionRoles = {
|
|
175
|
-
cancel: "cancel",
|
|
176
|
-
confirm: "confirm",
|
|
177
|
-
submit: "submit",
|
|
178
|
-
clear: "clear",
|
|
179
|
-
back: "back",
|
|
180
|
-
[OperationKeys.CREATE]: OperationKeys.CREATE,
|
|
181
|
-
[OperationKeys.READ]: OperationKeys.READ,
|
|
182
|
-
[OperationKeys.UPDATE]: OperationKeys.UPDATE,
|
|
183
|
-
[OperationKeys.DELETE]: OperationKeys.DELETE
|
|
184
|
-
};
|
|
185
|
-
|
|
186
|
-
const WindowColorSchemes = {
|
|
187
|
-
light: "light",
|
|
188
|
-
dark: "dark",
|
|
189
|
-
undefined: "undefined"
|
|
190
|
-
};
|
|
191
|
-
|
|
192
|
-
class RenderingError extends InternalError {
|
|
193
|
-
constructor(msg) {
|
|
194
|
-
super(msg, RenderingError.name);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
const isClassConstructor = fn => typeof fn === "function" && /^class\s/.test(String(fn));
|
|
199
|
-
|
|
200
|
-
function getUIAttributeKey(prop, key) {
|
|
201
|
-
return Metadata.key(UIKeys.REFLECT, DecorationKeys.PROPERTIES, prop, key);
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
function formatByType(type, value, ...args) {
|
|
205
|
-
if (type === UIKeys.DATE) {
|
|
206
|
-
if (!value) return "";
|
|
207
|
-
const format = args.shift() || HTML5DateFormat;
|
|
208
|
-
return formatDate(new Date(value), format);
|
|
209
|
-
}
|
|
210
|
-
return value;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
function parseValueByType(type, value, fieldProps) {
|
|
214
|
-
let result = undefined;
|
|
215
|
-
switch (type) {
|
|
216
|
-
case Array.name:
|
|
217
|
-
{
|
|
218
|
-
const parsed = Array.isArray(value) ? value.map(v => parseValueByType(ReservedModels.STRING.name.toLowerCase(), v, fieldProps)) : [ value ];
|
|
219
|
-
result = parsed.join(",");
|
|
220
|
-
break;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
case HTML5InputTypes.NUMBER:
|
|
224
|
-
result = parseToNumber(value);
|
|
225
|
-
break;
|
|
226
|
-
|
|
227
|
-
case HTML5InputTypes.DATE:
|
|
228
|
-
{
|
|
229
|
-
const format = fieldProps.format;
|
|
230
|
-
if (value && `${value}`.trim().length) {
|
|
231
|
-
result = typeof value === ReservedModels.NUMBER.name.toLowerCase() ? new Date(value) : value ? format ? parseDate(format, value) : new Date(value) : undefined;
|
|
232
|
-
}
|
|
233
|
-
break;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
default:
|
|
237
|
-
result = typeof value === ReservedModels.OBJECT.name.toLowerCase() ? Array.isArray(value) ? value.join(",") : JSON.stringify(value) : typeof value === ReservedModels.BOOLEAN.name.toLowerCase() ? value : typeof value === ReservedModels.STRING.name.toLowerCase() ? escapeHtml(value) : result;
|
|
238
|
-
}
|
|
239
|
-
if (typeof result === "undefined") {
|
|
240
|
-
throw new InternalError(`Failed to parse value of type ${type} from ${typeof value} - ${value}`);
|
|
241
|
-
}
|
|
242
|
-
return result;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
function parseToNumber(value) {
|
|
246
|
-
if (typeof value === "number" && !isNaN(value)) return value;
|
|
247
|
-
const parsed = Number(value);
|
|
248
|
-
if (!isNaN(parsed)) return parsed;
|
|
249
|
-
return undefined;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
function escapeHtml(value) {
|
|
253
|
-
if (!value) return value;
|
|
254
|
-
const tagsToReplace = {
|
|
255
|
-
"&": "&",
|
|
256
|
-
"<": "<",
|
|
257
|
-
">": ">"
|
|
258
|
-
};
|
|
259
|
-
return `${value}`.replace(/[&<>]/g, tag => tagsToReplace[tag] || tag);
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
function revertHtml(value) {
|
|
263
|
-
const tagsToReplace = {
|
|
264
|
-
"&": "&",
|
|
265
|
-
"<": "<",
|
|
266
|
-
">": ">"
|
|
267
|
-
};
|
|
268
|
-
return `${value}`.replace(/<|>|&/g, tag => tagsToReplace[tag] || tag);
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
function generateUIModelID(model) {
|
|
272
|
-
let id = Date.now();
|
|
273
|
-
try {
|
|
274
|
-
const pk = Model.pk(model.constructor);
|
|
275
|
-
if (pk) id = model[Model.pk(model.constructor)];
|
|
276
|
-
} catch (e) {}
|
|
277
|
-
const name = model.constructor.name;
|
|
278
|
-
return `${name}-${id}`;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
class RenderingEngine {
|
|
282
|
-
static {
|
|
283
|
-
this.cache = {};
|
|
284
|
-
}
|
|
285
|
-
constructor(flavour) {
|
|
286
|
-
this.flavour = flavour;
|
|
287
|
-
this.initialized = false;
|
|
288
|
-
RenderingEngine.register(this);
|
|
289
|
-
console.log(`decaf's ${flavour} rendering engine loaded`);
|
|
290
|
-
}
|
|
291
|
-
translate(key, toView = true) {
|
|
292
|
-
if (toView) {
|
|
293
|
-
switch (key) {
|
|
294
|
-
case ReservedModels.STRING.name.toLowerCase():
|
|
295
|
-
return HTML5InputTypes.TEXT;
|
|
296
|
-
|
|
297
|
-
case ReservedModels.NUMBER.name.toLowerCase():
|
|
298
|
-
case ReservedModels.BIGINT.name.toLowerCase():
|
|
299
|
-
return HTML5InputTypes.NUMBER;
|
|
300
|
-
|
|
301
|
-
case ReservedModels.BOOLEAN.name.toLowerCase():
|
|
302
|
-
return HTML5InputTypes.CHECKBOX;
|
|
303
|
-
|
|
304
|
-
case ReservedModels.DATE.name.toLowerCase():
|
|
305
|
-
return HTML5InputTypes.DATE;
|
|
306
|
-
}
|
|
307
|
-
} else {
|
|
308
|
-
switch (key) {
|
|
309
|
-
case HTML5InputTypes.SELECT:
|
|
310
|
-
case HTML5InputTypes.TEXT:
|
|
311
|
-
case HTML5InputTypes.EMAIL:
|
|
312
|
-
case HTML5InputTypes.COLOR:
|
|
313
|
-
case HTML5InputTypes.PASSWORD:
|
|
314
|
-
case HTML5InputTypes.TEL:
|
|
315
|
-
case HTML5InputTypes.URL:
|
|
316
|
-
case HTML5InputTypes.SEARCH:
|
|
317
|
-
case HTML5InputTypes.HIDDEN:
|
|
318
|
-
case HTML5InputTypes.TEXTAREA:
|
|
319
|
-
case HTML5InputTypes.RADIO:
|
|
320
|
-
return ReservedModels.STRING.name.toLowerCase();
|
|
321
|
-
|
|
322
|
-
case HTML5InputTypes.NUMBER:
|
|
323
|
-
return ReservedModels.NUMBER.name.toLowerCase();
|
|
324
|
-
|
|
325
|
-
case HTML5InputTypes.CHECKBOX:
|
|
326
|
-
return ReservedModels.BOOLEAN.name.toLowerCase();
|
|
327
|
-
|
|
328
|
-
case HTML5InputTypes.DATE:
|
|
329
|
-
case HTML5InputTypes.DATETIME_LOCAL:
|
|
330
|
-
case HTML5InputTypes.TIME:
|
|
331
|
-
return ReservedModels.DATE.name.toLowerCase();
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
return key;
|
|
335
|
-
}
|
|
336
|
-
getClassDecoratorsMetadata(model) {
|
|
337
|
-
return [ Model.uiModelOf(model.constructor), Model.uiListModelOf(model.constructor), Model.uiHandlersFor(model.constructor), Model.uiLayoutOf(model.constructor) ].filter(Boolean);
|
|
338
|
-
}
|
|
339
|
-
sortChildrenByOrder(children = []) {
|
|
340
|
-
return children.sort((a, b) => {
|
|
341
|
-
const aOrder = a.props?.order ?? 0;
|
|
342
|
-
const bOrder = b.props?.order ?? 0;
|
|
343
|
-
const weight = v => v === UIKeys.FIRST ? 0 : typeof v === Primitives.NUMBER ? 1 : v === UIKeys.LAST ? children.length + children.indexOf(b) : 1;
|
|
344
|
-
const aWeight = weight(aOrder);
|
|
345
|
-
const bWeight = weight(bOrder);
|
|
346
|
-
if (aWeight !== bWeight) {
|
|
347
|
-
return aWeight - bWeight;
|
|
348
|
-
}
|
|
349
|
-
if (aWeight === 1 && typeof aOrder === Primitives.NUMBER && typeof bOrder === Primitives.NUMBER) {
|
|
350
|
-
return aOrder - bOrder;
|
|
351
|
-
}
|
|
352
|
-
return 0;
|
|
353
|
-
});
|
|
354
|
-
}
|
|
355
|
-
isCustomValidator(key) {
|
|
356
|
-
return !Object.values(ValidationKeys).includes(key) && !Object.values(UIKeys).includes(key);
|
|
357
|
-
}
|
|
358
|
-
isValidatableByType(key) {
|
|
359
|
-
return Object.keys(ValidatableByType).includes(key);
|
|
360
|
-
}
|
|
361
|
-
isValidatableByAttribute(key) {
|
|
362
|
-
return Object.keys(ValidatableByAttribute).includes(key);
|
|
363
|
-
}
|
|
364
|
-
toAttributeValue(key, value) {
|
|
365
|
-
if (!Object.keys(ValidatableByAttribute).includes(key)) throw new Error(`Invalid attribute key "${key}". Expected one of: ${Object.keys(ValidatableByAttribute).join(", ")}.`);
|
|
366
|
-
return key === UIKeys.REQUIRED ? true : value[key];
|
|
367
|
-
}
|
|
368
|
-
toFieldDefinition(model, globalProps = {}, generateId = true) {
|
|
369
|
-
const {inheritProps: inheritProps, ...globalPropsWithoutInherits} = globalProps;
|
|
370
|
-
globalProps = globalPropsWithoutInherits;
|
|
371
|
-
const classDecorators = this.getClassDecoratorsMetadata(model);
|
|
372
|
-
if (!classDecorators.length) throw new RenderingError(`No ui definitions set for model ${model.constructor.name}. Did you use @uimodel?`);
|
|
373
|
-
const classDecorator = Object.assign({}, ...classDecorators, inheritProps ? inheritProps : {});
|
|
374
|
-
const {tag: tag, props: props, item: item, handlers: handlers} = classDecorator;
|
|
375
|
-
const uiDecorators = Model.uiPropertiesOf(model.constructor);
|
|
376
|
-
let children;
|
|
377
|
-
let childProps = item?.props || {};
|
|
378
|
-
let mapper = {};
|
|
379
|
-
const getPath = (parent, prop) => parent ? [ parent, prop ].join(".") : prop;
|
|
380
|
-
if (uiDecorators) {
|
|
381
|
-
const validationDecorators = Metadata.get(model.constructor, ValidationKeys.REFLECT) || {};
|
|
382
|
-
for (const key of uiDecorators) {
|
|
383
|
-
const decs = Model.uiDecorationOf(model.constructor, key);
|
|
384
|
-
let type;
|
|
385
|
-
try {
|
|
386
|
-
type = Model.uiTypeOf(model.constructor, key);
|
|
387
|
-
} catch (e) {
|
|
388
|
-
if (!(e instanceof NotFoundError)) throw e;
|
|
389
|
-
}
|
|
390
|
-
const hasHideOnDecorator = Model.uiIsHidden(model.constructor, key);
|
|
391
|
-
if (hasHideOnDecorator) {
|
|
392
|
-
const hasUiElementDecorator = Model.uiElementOf(model.constructor, key);
|
|
393
|
-
if (!hasUiElementDecorator) throw new RenderingError(`@uielement no found in "${key}". It is required to use hiddenOn decorator.`);
|
|
394
|
-
}
|
|
395
|
-
const sorted = Object.entries(decs).map(([k, v]) => ({
|
|
396
|
-
key: k,
|
|
397
|
-
props: v
|
|
398
|
-
})).sort(a => [ UIKeys.ELEMENT, UIKeys.CHILD ].includes(a.key) ? -1 : 1);
|
|
399
|
-
sorted.forEach(dec => {
|
|
400
|
-
if (!dec) throw new RenderingError(`No decorator found`);
|
|
401
|
-
switch (dec.key) {
|
|
402
|
-
case UIKeys.PROP:
|
|
403
|
-
{
|
|
404
|
-
childProps[key] = dec.props;
|
|
405
|
-
break;
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
case UIKeys.CHILD:
|
|
409
|
-
{
|
|
410
|
-
const modelName = dec.props?.props?.name || key;
|
|
411
|
-
try {
|
|
412
|
-
const isPropertyModel = Model.isModel(Model.build({}, modelName)) || Model.isPropertyModel(model, modelName);
|
|
413
|
-
if (!isPropertyModel) throw new RenderingError(`Child "${modelName}" must be a model.`);
|
|
414
|
-
} catch (e) {
|
|
415
|
-
throw new RenderingError(`Child "${modelName}" must be a model.`);
|
|
416
|
-
}
|
|
417
|
-
let Clazz;
|
|
418
|
-
const submodel = model[key];
|
|
419
|
-
const constructable = typeof submodel === "object" && submodel !== null && !Array.isArray(submodel);
|
|
420
|
-
if (!constructable) {
|
|
421
|
-
const clazzName = dec.props.props?.name;
|
|
422
|
-
Clazz = new (Model.get(clazzName));
|
|
423
|
-
}
|
|
424
|
-
children = children || [];
|
|
425
|
-
const childrenGlobalProps = Object.assign({}, globalProps || {}, {
|
|
426
|
-
model: Clazz
|
|
427
|
-
}, {
|
|
428
|
-
inheritProps: dec.props,
|
|
429
|
-
childOf: getPath(globalProps?.childOf, key)
|
|
430
|
-
});
|
|
431
|
-
const childDefinition = this.toFieldDefinition(submodel || Clazz, childrenGlobalProps, false);
|
|
432
|
-
const {inheritProps: inheritProps} = childrenGlobalProps;
|
|
433
|
-
if (inheritProps) childDefinition.props = Object.assign({}, childDefinition.props, inheritProps.props || {});
|
|
434
|
-
children.push(childDefinition);
|
|
435
|
-
break;
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
case UIKeys.UILISTPROP:
|
|
439
|
-
{
|
|
440
|
-
mapper = mapper || {};
|
|
441
|
-
const decProps = dec.props;
|
|
442
|
-
if (decProps.name) mapper[decProps.name] = typeof decProps?.props === "object" && UIKeys.SEQUENCE in decProps.props ? decProps.props : key;
|
|
443
|
-
const props = Object.assign({}, classDecorator.props?.item || {}, item?.props || {}, decProps?.props || {}, globalProps);
|
|
444
|
-
childProps = {
|
|
445
|
-
tag: item?.tag || props.render || "",
|
|
446
|
-
props: Object.assign({}, childProps?.props, {
|
|
447
|
-
mapper: mapper
|
|
448
|
-
}, props)
|
|
449
|
-
};
|
|
450
|
-
break;
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
case UIKeys.EVENTS:
|
|
454
|
-
case UIKeys.HIDDEN:
|
|
455
|
-
case UIKeys.HIDE_FOR:
|
|
456
|
-
case UIKeys.SHOW_FOR:
|
|
457
|
-
case UIKeys.PAGE:
|
|
458
|
-
case UIKeys.ORDER:
|
|
459
|
-
case UIKeys.UILAYOUTPROP:
|
|
460
|
-
case UIKeys.ELEMENT:
|
|
461
|
-
{
|
|
462
|
-
children = children || [];
|
|
463
|
-
const uiProps = dec.props;
|
|
464
|
-
const visibilityProps = dec.key === UIKeys.HIDE_FOR ? {
|
|
465
|
-
hideFor: dec.props
|
|
466
|
-
} : dec.key === UIKeys.SHOW_FOR ? {
|
|
467
|
-
showFor: dec.props
|
|
468
|
-
} : {};
|
|
469
|
-
const props = Object.assign({}, childProps?.props, uiProps.props || {}, visibilityProps, uiProps?.props?.name ? {
|
|
470
|
-
path: getPath(globalProps?.childOf, uiProps.props.name),
|
|
471
|
-
childOf: undefined
|
|
472
|
-
} : {}, globalProps, {
|
|
473
|
-
name: uiProps.props?.name || key
|
|
474
|
-
});
|
|
475
|
-
if (dec.key === UIKeys.ELEMENT) {
|
|
476
|
-
const childDefinition = {
|
|
477
|
-
tag: uiProps.tag || childProps?.tag || tag || "",
|
|
478
|
-
props: props
|
|
479
|
-
};
|
|
480
|
-
const validationDecs = validationDecorators[key];
|
|
481
|
-
if (validationDecs) {
|
|
482
|
-
for (const dec of Object.entries(validationDecs).map(([k, v]) => ({
|
|
483
|
-
key: k,
|
|
484
|
-
props: v
|
|
485
|
-
}))) {
|
|
486
|
-
if (this.isValidatableByAttribute(dec.key)) {
|
|
487
|
-
childDefinition.props[this.translate(dec.key)] = this.toAttributeValue(dec.key, dec.props);
|
|
488
|
-
continue;
|
|
489
|
-
}
|
|
490
|
-
if (this.isValidatableByType(dec.key)) {
|
|
491
|
-
if (dec.key === HTML5InputTypes.DATE) {
|
|
492
|
-
childDefinition.props[UIKeys.FORMAT] = dec.props.format || HTML5DateFormat;
|
|
493
|
-
}
|
|
494
|
-
childDefinition.props[UIKeys.TYPE] = dec.key;
|
|
495
|
-
continue;
|
|
496
|
-
}
|
|
497
|
-
if (this.isCustomValidator(dec.key)) {
|
|
498
|
-
props[UIKeys.SUB_TYPE] = dec.key;
|
|
499
|
-
if (dec.props?.message) {
|
|
500
|
-
props[UIKeys.VALIDATION_MESSAGE] = dec.props.message;
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
if (!childDefinition.props[UIKeys.TYPE]) {
|
|
506
|
-
const basicType = Metadata.type(model.constructor, key).name;
|
|
507
|
-
childDefinition.props[UIKeys.TYPE] = this.translate(basicType.toLowerCase(), true);
|
|
508
|
-
}
|
|
509
|
-
childDefinition.props.value = formatByType(childDefinition.props[UIKeys.TYPE], model[key], childDefinition.props[UIKeys.FORMAT]);
|
|
510
|
-
children.push(childDefinition);
|
|
511
|
-
} else {
|
|
512
|
-
const child = children.find(c => c.props?.name === key || [ UIKeys.UILAYOUTPROP, UIKeys.PAGE, UIKeys.EVENTS ].includes(dec.key) && (c.props?.childOf === key || c.props?.childOf?.endsWith(`.${key}`)));
|
|
513
|
-
if (child) {
|
|
514
|
-
if (dec.key === UIKeys.HIDE_FOR || dec.key === UIKeys.SHOW_FOR) {
|
|
515
|
-
child.props = Object.assign({}, child.props, visibilityProps);
|
|
516
|
-
} else if (dec.key !== UIKeys.UILAYOUTPROP) {
|
|
517
|
-
child.props = Object.assign({}, child.props, {
|
|
518
|
-
[dec.key]: uiProps
|
|
519
|
-
});
|
|
520
|
-
} else {
|
|
521
|
-
const {row: row, col: col, props: props} = dec.props;
|
|
522
|
-
child.props = Object.assign({}, props || {}, child.props, row, col);
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
break;
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
default:
|
|
530
|
-
throw new RenderingError(`Invalid key: ${dec.key}`);
|
|
531
|
-
}
|
|
532
|
-
});
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
globalProps = Object.assign({}, props, globalProps, {
|
|
536
|
-
handlers: handlers || {}
|
|
537
|
-
});
|
|
538
|
-
const currentNamespaces = new Set([ ...Array.isArray(globalProps?.namespaces) ? globalProps.namespaces : [], ...typeof globalProps?.namespace === "string" ? [ globalProps.namespace ] : [] ].filter(Boolean));
|
|
539
|
-
const operation = globalProps?.operation;
|
|
540
|
-
children = this.sortChildrenByOrder(children).filter(item => {
|
|
541
|
-
const hiddenOn = item?.props?.hidden || [];
|
|
542
|
-
if (hiddenOn.length > 0 && hiddenOn.includes(operation)) {
|
|
543
|
-
return false;
|
|
544
|
-
}
|
|
545
|
-
const hideFor = item?.props?.hideFor || [];
|
|
546
|
-
const showFor = item?.props?.showFor || [];
|
|
547
|
-
if (hideFor.length > 0 && [ ...currentNamespaces ].some(namespace => hideFor.includes(namespace))) {
|
|
548
|
-
return false;
|
|
549
|
-
}
|
|
550
|
-
if (showFor.length > 0 && ![ ...currentNamespaces ].some(namespace => showFor.includes(namespace))) {
|
|
551
|
-
return false;
|
|
552
|
-
}
|
|
553
|
-
return true;
|
|
554
|
-
});
|
|
555
|
-
const result = {
|
|
556
|
-
tag: tag,
|
|
557
|
-
item: childProps,
|
|
558
|
-
props: globalProps,
|
|
559
|
-
children: children?.length ? children : undefined
|
|
560
|
-
};
|
|
561
|
-
if (generateId) result.rendererId = generateUIModelID(model);
|
|
562
|
-
return result;
|
|
563
|
-
}
|
|
564
|
-
static register(engine) {
|
|
565
|
-
if (engine.flavour in this.cache) throw new InternalError(`Rendering engine under ${engine.flavour} already exists`);
|
|
566
|
-
this.cache[engine.flavour] = engine;
|
|
567
|
-
this.current = engine;
|
|
568
|
-
}
|
|
569
|
-
static getOrBoot(obj) {
|
|
570
|
-
if (obj instanceof RenderingEngine) return obj;
|
|
571
|
-
const engine = new obj;
|
|
572
|
-
engine.initialize();
|
|
573
|
-
return engine;
|
|
574
|
-
}
|
|
575
|
-
static get(flavour) {
|
|
576
|
-
if (!flavour) return this.getOrBoot(this.current);
|
|
577
|
-
if (!(flavour in this.cache)) throw new InternalError(`Rendering engine under ${flavour} does not exist`);
|
|
578
|
-
return this.getOrBoot(this.cache[flavour]);
|
|
579
|
-
}
|
|
580
|
-
static render(model, ...args) {
|
|
581
|
-
const constructor = Model.get(model.constructor.name) || Model.fromObject(model);
|
|
582
|
-
if (!constructor) throw new InternalError("No model registered found");
|
|
583
|
-
const flavour = Model.renderedBy(model.constructor);
|
|
584
|
-
return RenderingEngine.get(flavour).render(model, ...args);
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
function hideOn(...operations) {
|
|
589
|
-
return function hideOn(object, propertyKey) {
|
|
590
|
-
return propMetadata(getUIAttributeKey(propertyKey, UIKeys.HIDDEN), operations)(object, propertyKey);
|
|
591
|
-
};
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
function hideFor(...namespaces) {
|
|
595
|
-
return function hideFor(object, propertyKey) {
|
|
596
|
-
return propMetadata(getUIAttributeKey(propertyKey, UIKeys.HIDE_FOR), namespaces)(object, propertyKey);
|
|
597
|
-
};
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
function showFor(...namespaces) {
|
|
601
|
-
return function showFor(object, propertyKey) {
|
|
602
|
-
return propMetadata(getUIAttributeKey(propertyKey, UIKeys.SHOW_FOR), namespaces)(object, propertyKey);
|
|
603
|
-
};
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
function renderIf(...namespaces) {
|
|
607
|
-
return showFor(...namespaces);
|
|
608
|
-
}
|
|
609
|
-
|
|
610
|
-
function uiorder(order = UIKeys.FIRST) {
|
|
611
|
-
return function uiorder(object, propertyKey) {
|
|
612
|
-
return propMetadata(getUIAttributeKey(propertyKey, UIKeys.ORDER), order)(object, propertyKey);
|
|
613
|
-
};
|
|
614
|
-
}
|
|
615
|
-
|
|
616
|
-
function hidden() {
|
|
617
|
-
return hideOn(OperationKeys.CREATE, OperationKeys.READ, OperationKeys.UPDATE, OperationKeys.DELETE);
|
|
618
|
-
}
|
|
619
|
-
|
|
620
|
-
function uielement(tag, props, serialize = false) {
|
|
621
|
-
return (original, propertyKey) => {
|
|
622
|
-
if (typeof tag === "object") {
|
|
623
|
-
props = tag;
|
|
624
|
-
tag = "";
|
|
625
|
-
}
|
|
626
|
-
const metadata = {
|
|
627
|
-
tag: tag,
|
|
628
|
-
serialize: serialize,
|
|
629
|
-
props: Object.assign({}, props || {}, {
|
|
630
|
-
name: propertyKey
|
|
631
|
-
})
|
|
632
|
-
};
|
|
633
|
-
return propMetadata(getUIAttributeKey(propertyKey, UIKeys.ELEMENT), metadata)(original, propertyKey);
|
|
634
|
-
};
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
function uiprop(propName = undefined, stringify = false) {
|
|
638
|
-
return (target, propertyKey) => {
|
|
639
|
-
const metadata = {
|
|
640
|
-
name: propName || propertyKey,
|
|
641
|
-
stringify: stringify
|
|
642
|
-
};
|
|
643
|
-
propMetadata(getUIAttributeKey(propertyKey, UIKeys.PROP), metadata)(target, propertyKey);
|
|
644
|
-
};
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
function uichild(clazz, tag, props = {}, isArray = false, serialize = false) {
|
|
648
|
-
return (target, propertyKey) => {
|
|
649
|
-
const metadata = {
|
|
650
|
-
tag: tag,
|
|
651
|
-
serialize: serialize,
|
|
652
|
-
props: Object.assign({}, props || {}, {
|
|
653
|
-
name: clazz || propertyKey
|
|
654
|
-
}, isArray ? {
|
|
655
|
-
customTypes: [ Array.name ],
|
|
656
|
-
multiple: true
|
|
657
|
-
} : {
|
|
658
|
-
multiple: props?.multiple || false
|
|
659
|
-
})
|
|
660
|
-
};
|
|
661
|
-
propMetadata(getUIAttributeKey(propertyKey, UIKeys.CHILD), metadata)(target, propertyKey);
|
|
662
|
-
};
|
|
663
|
-
}
|
|
664
|
-
|
|
665
|
-
function uilistprop(propName = undefined, props) {
|
|
666
|
-
return (target, propertyKey) => {
|
|
667
|
-
const metadata = {
|
|
668
|
-
name: propName || propertyKey,
|
|
669
|
-
props: props || {}
|
|
670
|
-
};
|
|
671
|
-
propMetadata(getUIAttributeKey(propertyKey, UIKeys.UILISTPROP), metadata)(target, propertyKey);
|
|
672
|
-
};
|
|
673
|
-
}
|
|
674
|
-
|
|
675
|
-
function uilayoutprop(col = 1, row = 1) {
|
|
676
|
-
return (target, propertyKey) => {
|
|
677
|
-
const metadata = {
|
|
678
|
-
name: propertyKey,
|
|
679
|
-
props: Object.assign({}, {
|
|
680
|
-
row: row,
|
|
681
|
-
col: col
|
|
682
|
-
})
|
|
683
|
-
};
|
|
684
|
-
propMetadata(getUIAttributeKey(propertyKey, UIKeys.UILAYOUTPROP), metadata)(target, propertyKey);
|
|
685
|
-
};
|
|
686
|
-
}
|
|
687
|
-
|
|
688
|
-
function uipageprop(page = 1) {
|
|
689
|
-
return function uipageprop(original, propertyKey) {
|
|
690
|
-
return propMetadata(getUIAttributeKey(propertyKey, UIKeys.PAGE), page)(original, propertyKey);
|
|
691
|
-
};
|
|
692
|
-
}
|
|
693
|
-
|
|
694
|
-
function uion(event, handler) {
|
|
695
|
-
return function uion(original, propertyKey) {
|
|
696
|
-
propMetadata(getUIAttributeKey(propertyKey, UIKeys.EVENTS), {
|
|
697
|
-
...typeof event === "object" ? event : {
|
|
698
|
-
[event]: handler
|
|
699
|
-
}
|
|
700
|
-
})(original, propertyKey);
|
|
701
|
-
};
|
|
702
|
-
}
|
|
703
|
-
|
|
704
|
-
function uionclick(handler) {
|
|
705
|
-
return uion("handleClick", handler);
|
|
706
|
-
}
|
|
707
|
-
|
|
708
|
-
function uionrender(handler) {
|
|
709
|
-
return uion("render", handler);
|
|
710
|
-
}
|
|
711
|
-
|
|
712
|
-
function uitablecol(sequence = UIKeys.LAST, valueParserFn) {
|
|
713
|
-
return (target, propertyKey) => {
|
|
714
|
-
const metadata = {
|
|
715
|
-
name: propertyKey,
|
|
716
|
-
props: {
|
|
717
|
-
sequence: sequence,
|
|
718
|
-
...!valueParserFn ? {} : {
|
|
719
|
-
valueParserFn: valueParserFn
|
|
720
|
-
}
|
|
721
|
-
}
|
|
722
|
-
};
|
|
723
|
-
propMetadata(getUIAttributeKey(propertyKey, UIKeys.UILISTPROP), metadata)(target, propertyKey);
|
|
724
|
-
};
|
|
725
|
-
}
|
|
726
|
-
|
|
727
|
-
class UIValidator extends Validator {
|
|
728
|
-
getMessage(message, ...args) {
|
|
729
|
-
if (UIValidator.translateService) return UIValidator.translateService.translate(message, ...args);
|
|
730
|
-
return super.getMessage(message, ...args);
|
|
731
|
-
}
|
|
732
|
-
}
|
|
733
|
-
|
|
734
|
-
class DecafComponent extends LoggedClass {
|
|
735
|
-
constructor() {
|
|
736
|
-
super();
|
|
737
|
-
this.enableDarkMode = true;
|
|
738
|
-
this.isDarkMode = false;
|
|
739
|
-
this.item = {
|
|
740
|
-
tag: ""
|
|
741
|
-
};
|
|
742
|
-
this.props = {};
|
|
743
|
-
this.route = "";
|
|
744
|
-
this.borders = false;
|
|
745
|
-
this.OperationKeys = OperationKeys;
|
|
746
|
-
this.initialized = false;
|
|
747
|
-
this.events = {};
|
|
748
|
-
this.handlers = {};
|
|
749
|
-
}
|
|
750
|
-
get repository() {
|
|
751
|
-
return this._repository;
|
|
752
|
-
}
|
|
753
|
-
set repository(repository) {
|
|
754
|
-
this._repository = repository;
|
|
755
|
-
}
|
|
756
|
-
async render(...args) {
|
|
757
|
-
this.log.for(this.render).info(`render for ${this.componentName} with ${JSON.stringify(args)}`);
|
|
758
|
-
}
|
|
759
|
-
async refresh(...args) {
|
|
760
|
-
this.log.for(this.refresh).info(`Refresh called with args: ${args}`);
|
|
761
|
-
}
|
|
762
|
-
async initialize(...args) {
|
|
763
|
-
this.initialized = true;
|
|
764
|
-
}
|
|
765
|
-
async translate(...args) {
|
|
766
|
-
this.log.for(this.translate).info(`translate for ${this.componentName} with ${JSON.stringify(args)}`);
|
|
767
|
-
}
|
|
768
|
-
async preview(...args) {
|
|
769
|
-
this.log.for(this.preview).debug(`Preview called with args: ${args}`);
|
|
770
|
-
}
|
|
771
|
-
async submit(...args) {
|
|
772
|
-
this.log.for(this.submit).info(`submit for ${this.componentName} with ${JSON.stringify(args)}`);
|
|
773
|
-
}
|
|
774
|
-
parseHandlers(handlers, instance) {
|
|
775
|
-
const result = {};
|
|
776
|
-
Object.entries(handlers).forEach(([key, fn]) => {
|
|
777
|
-
if (isClassConstructor(fn)) {
|
|
778
|
-
const clazz = new fn;
|
|
779
|
-
const event = key in clazz ? clazz[key] : clazz.handle;
|
|
780
|
-
result[key] = event;
|
|
781
|
-
instance.handlers[key] = event;
|
|
782
|
-
} else {
|
|
783
|
-
result[key] = fn;
|
|
784
|
-
instance.handlers[key] = fn;
|
|
785
|
-
}
|
|
786
|
-
});
|
|
787
|
-
return result;
|
|
788
|
-
}
|
|
789
|
-
parseEvents(events, instance) {
|
|
790
|
-
const result = {};
|
|
791
|
-
Object.entries(events).forEach(([key, fn]) => {
|
|
792
|
-
const name = key;
|
|
793
|
-
const evt = fn();
|
|
794
|
-
if (isClassConstructor(evt)) {
|
|
795
|
-
const fn = (new evt)[key];
|
|
796
|
-
if (fn) {
|
|
797
|
-
result[name] = fn;
|
|
798
|
-
instance.events[name] = fn;
|
|
799
|
-
}
|
|
800
|
-
} else {
|
|
801
|
-
result[name] = fn;
|
|
802
|
-
instance.events[name] = fn;
|
|
803
|
-
}
|
|
804
|
-
});
|
|
805
|
-
return result;
|
|
806
|
-
}
|
|
807
|
-
}
|
|
808
|
-
|
|
809
|
-
class DecafEventHandler extends DecafComponent {
|
|
810
|
-
constructor() {
|
|
811
|
-
super();
|
|
812
|
-
}
|
|
813
|
-
handle(...args) {
|
|
814
|
-
this.log.for(this.handle).info(`component ${this.componentName} handling ${JSON.stringify(args)}`);
|
|
815
|
-
}
|
|
816
|
-
handleClick(...args) {
|
|
817
|
-
this.log.for(this.handleClick).info(`component ${this.componentName} handling click ${JSON.stringify(args)}`);
|
|
818
|
-
}
|
|
819
|
-
handleAction(...args) {
|
|
820
|
-
this.log.for(this.handleAction).info(`component ${this.componentName} handling action ${JSON.stringify(args)}`);
|
|
821
|
-
}
|
|
822
|
-
}
|
|
823
|
-
|
|
824
|
-
class DecafTranslateService extends LoggedClass {
|
|
825
|
-
translate(key, params) {
|
|
826
|
-
this.log.for(this.translate).info(`Must translate ${key} with params ${JSON.stringify(params || {})}`);
|
|
827
|
-
}
|
|
828
|
-
instant(key, params) {
|
|
829
|
-
this.log.for(this.instant).info(`Must translate ${key} with params ${JSON.stringify(params || {})}`);
|
|
830
|
-
}
|
|
831
|
-
}
|
|
832
|
-
|
|
833
|
-
Model.prototype.render = function(...args) {
|
|
834
|
-
return RenderingEngine.render(this, ...args);
|
|
835
|
-
};
|
|
836
|
-
|
|
837
|
-
Model.renderedBy = function(model) {
|
|
838
|
-
return Metadata.get(model, Metadata.key(UIKeys.REFLECT, UIKeys.RENDERED_BY));
|
|
839
|
-
}.bind(Model);
|
|
840
|
-
|
|
841
|
-
Model.uiPropertiesOf = function(model) {
|
|
842
|
-
const meta = Metadata.get(model, Metadata.key(UIKeys.REFLECT, DecorationKeys.PROPERTIES));
|
|
843
|
-
if (!meta) return undefined;
|
|
844
|
-
return Object.keys(meta);
|
|
845
|
-
}.bind(Model);
|
|
846
|
-
|
|
847
|
-
Model.uiDecorationOf = function(model, prop, key) {
|
|
848
|
-
const meta = Metadata.get(model, Metadata.key(UIKeys.REFLECT, DecorationKeys.PROPERTIES, prop));
|
|
849
|
-
if (!meta) return undefined;
|
|
850
|
-
if (!key) return meta;
|
|
851
|
-
return meta[key];
|
|
852
|
-
};
|
|
853
|
-
|
|
854
|
-
Model.uiModelOf = function(model) {
|
|
855
|
-
return Metadata.get(model, Metadata.key(UIKeys.REFLECT, UIKeys.UIMODEL));
|
|
856
|
-
};
|
|
857
|
-
|
|
858
|
-
Model.uiElementOf = function(model, prop) {
|
|
859
|
-
return Metadata.get(model, getUIAttributeKey(prop, UIKeys.ELEMENT));
|
|
860
|
-
};
|
|
861
|
-
|
|
862
|
-
Model.uiListModelOf = function(model) {
|
|
863
|
-
return Metadata.get(model, Metadata.key(UIKeys.REFLECT, UIKeys.UILISTMODEL));
|
|
864
|
-
};
|
|
865
|
-
|
|
866
|
-
Model.uiHandlersFor = function(model) {
|
|
867
|
-
return Metadata.get(model, Metadata.key(UIKeys.REFLECT, UIKeys.HANDLERS));
|
|
868
|
-
};
|
|
869
|
-
|
|
870
|
-
Model.uiLayoutOf = function(model) {
|
|
871
|
-
return Metadata.get(model, Metadata.key(UIKeys.REFLECT, UIKeys.UILAYOUT));
|
|
872
|
-
};
|
|
873
|
-
|
|
874
|
-
Model.uiIsHidden = function(model, prop) {
|
|
875
|
-
return !!Metadata.get(model, getUIAttributeKey(prop, UIKeys.HIDDEN));
|
|
876
|
-
};
|
|
877
|
-
|
|
878
|
-
Model.uiIsHiddenOn = function(model, prop, op) {
|
|
879
|
-
const meta = Metadata.get(model, getUIAttributeKey(prop, UIKeys.HIDDEN));
|
|
880
|
-
if (!meta) return false;
|
|
881
|
-
if (!op) return meta;
|
|
882
|
-
return meta.includes(op);
|
|
883
|
-
};
|
|
884
|
-
|
|
885
|
-
Model.uiTypeOf = function(model, prop) {
|
|
886
|
-
const meta = Metadata.get(model, Metadata.key(UIKeys.REFLECT, DecorationKeys.PROPERTIES, prop));
|
|
887
|
-
if (!meta) throw new NotFoundError(`No metadata found for property '${prop}' on model '${model.name}'`);
|
|
888
|
-
const keys = Object.keys(meta).filter(k => [ UIKeys.PROP, UIKeys.ELEMENT, UIKeys.CHILD ].includes(k));
|
|
889
|
-
if (keys.length === 0) throw new NotFoundError(`No UI type metadata found for property '${prop}' on model '${model.name}'`);
|
|
890
|
-
if (keys.length > 1) throw new RenderingError(`Only one type of decoration is allowed. Please choose between @uiprop, @uichild or @uielement`);
|
|
891
|
-
return meta[keys[0]];
|
|
892
|
-
};
|
|
893
|
-
|
|
894
|
-
Model.uiListItems = function(model) {
|
|
895
|
-
const meta = Metadata.get(model, Metadata.key(UIKeys.REFLECT, DecorationKeys.PROPERTIES));
|
|
896
|
-
if (!meta) return undefined;
|
|
897
|
-
return Object.keys(meta);
|
|
898
|
-
}.bind(Model);
|
|
899
|
-
|
|
900
|
-
function uimodel(tag, props) {
|
|
901
|
-
return (original, propertyKey) => {
|
|
902
|
-
const meta = {
|
|
903
|
-
tag: tag || original.name,
|
|
904
|
-
props: props
|
|
905
|
-
};
|
|
906
|
-
return metadata(Metadata.key(UIKeys.REFLECT, UIKeys.UIMODEL), meta)(original);
|
|
907
|
-
};
|
|
908
|
-
}
|
|
909
|
-
|
|
910
|
-
function renderedBy(engine) {
|
|
911
|
-
return apply(metadata(Metadata.key(UIKeys.REFLECT, UIKeys.RENDERED_BY), engine));
|
|
912
|
-
}
|
|
913
|
-
|
|
914
|
-
function uilistmodel(name, props) {
|
|
915
|
-
return (original, propertyKey) => {
|
|
916
|
-
const meta = {
|
|
917
|
-
item: {
|
|
918
|
-
tag: name || original.name,
|
|
919
|
-
props: props
|
|
920
|
-
}
|
|
921
|
-
};
|
|
922
|
-
return metadata(Metadata.key(UIKeys.REFLECT, UIKeys.UILISTMODEL), meta)(original);
|
|
923
|
-
};
|
|
924
|
-
}
|
|
925
|
-
|
|
926
|
-
function uihandlers(props) {
|
|
927
|
-
return original => {
|
|
928
|
-
const meta = {
|
|
929
|
-
handlers: props
|
|
930
|
-
};
|
|
931
|
-
return metadata(Metadata.key(UIKeys.REFLECT, UIKeys.HANDLERS), meta)(original);
|
|
932
|
-
};
|
|
933
|
-
}
|
|
934
|
-
|
|
935
|
-
function uilayout(tag, colsMode = 1, rows = 1, props = {}) {
|
|
936
|
-
const config = Object.assign({
|
|
937
|
-
...typeof colsMode === "boolean" ? {
|
|
938
|
-
flexMode: colsMode,
|
|
939
|
-
cols: 1
|
|
940
|
-
} : {
|
|
941
|
-
flexMode: false,
|
|
942
|
-
cols: colsMode
|
|
943
|
-
},
|
|
944
|
-
rows: rows,
|
|
945
|
-
...Object.assign({
|
|
946
|
-
breakpoint: UIMediaBreakPoints.LARGE
|
|
947
|
-
}, props)
|
|
948
|
-
});
|
|
949
|
-
return (original, propertyKey) => {
|
|
950
|
-
metadata(Metadata.key(UIKeys.REFLECT, UIKeys.UILAYOUT), config)(original);
|
|
951
|
-
return uimodel(tag, config)(original, propertyKey);
|
|
952
|
-
};
|
|
953
|
-
}
|
|
954
|
-
|
|
955
|
-
function uisteppedmodel(tag, pages = 1, paginated = false, props = {}) {
|
|
956
|
-
let pageTitles = [];
|
|
957
|
-
if (typeof pages === "object") {
|
|
958
|
-
pageTitles = pages;
|
|
959
|
-
pages = pageTitles.length;
|
|
960
|
-
}
|
|
961
|
-
return uimodel(tag, {
|
|
962
|
-
pages: pages,
|
|
963
|
-
paginated: paginated,
|
|
964
|
-
pageTitles: pageTitles,
|
|
965
|
-
props: props
|
|
966
|
-
});
|
|
967
|
-
}
|
|
968
|
-
|
|
969
|
-
const prototype = ModelBuilder.prototype;
|
|
970
|
-
|
|
971
|
-
if (!prototype.decorateClass) {
|
|
972
|
-
prototype.decorateClass = function(decorator) {
|
|
973
|
-
if (!this._classDecorators) {
|
|
974
|
-
this._classDecorators = [];
|
|
975
|
-
}
|
|
976
|
-
this._classDecorators.push(decorator);
|
|
977
|
-
return this;
|
|
978
|
-
};
|
|
979
|
-
}
|
|
980
|
-
|
|
981
|
-
prototype.uimodel = function(tag, props) {
|
|
982
|
-
return this.decorateClass(uimodel(tag, props));
|
|
983
|
-
};
|
|
984
|
-
|
|
985
|
-
prototype.renderedBy = function(engine) {
|
|
986
|
-
return this.decorateClass(renderedBy(engine));
|
|
987
|
-
};
|
|
988
|
-
|
|
989
|
-
prototype.uilistmodel = function(name, props) {
|
|
990
|
-
return this.decorateClass(uilistmodel(name, props));
|
|
991
|
-
};
|
|
992
|
-
|
|
993
|
-
prototype.uihandlers = function(props) {
|
|
994
|
-
return this.decorateClass(uihandlers(props));
|
|
995
|
-
};
|
|
996
|
-
|
|
997
|
-
prototype.uilayout = function(tag, colsMode, rows, props) {
|
|
998
|
-
return this.decorateClass(uilayout(tag, colsMode, rows, props));
|
|
999
|
-
};
|
|
1000
|
-
|
|
1001
|
-
prototype.uisteppedmodel = function(tag, pages, paginated, props) {
|
|
1002
|
-
return this.decorateClass(uisteppedmodel(tag, pages, paginated, props));
|
|
1003
|
-
};
|
|
1004
|
-
|
|
1005
|
-
var DashKeys;
|
|
1006
|
-
|
|
1007
|
-
(function(DashKeys) {
|
|
1008
|
-
DashKeys["ROOT"] = "dashboard";
|
|
1009
|
-
DashKeys["COMPONENT"] = "dashboard.component";
|
|
1010
|
-
})(DashKeys || (DashKeys = {}));
|
|
1011
|
-
|
|
1012
|
-
const DASH_COMPONENT_REGISTRY = new Set;
|
|
1013
|
-
|
|
1014
|
-
function registerDashComponent(ctor) {
|
|
1015
|
-
DASH_COMPONENT_REGISTRY.add(ctor);
|
|
1016
|
-
}
|
|
1017
|
-
|
|
1018
|
-
function dashComponents() {
|
|
1019
|
-
return [ ...DASH_COMPONENT_REGISTRY ];
|
|
1020
|
-
}
|
|
1021
|
-
|
|
1022
|
-
function resetDashComponentRegistry() {
|
|
1023
|
-
DASH_COMPONENT_REGISTRY.clear();
|
|
1024
|
-
}
|
|
1025
|
-
|
|
1026
|
-
function dashcomponent(tag, dash, props) {
|
|
1027
|
-
function dashcomponent(tag, dash, props) {
|
|
1028
|
-
const meta = {
|
|
1029
|
-
tag: dash?.tag || tag,
|
|
1030
|
-
...dash,
|
|
1031
|
-
defaultSize: dash?.defaultSize ?? {
|
|
1032
|
-
cols: 1,
|
|
1033
|
-
rows: 1
|
|
1034
|
-
}
|
|
1035
|
-
};
|
|
1036
|
-
return function innerDashComponent(target) {
|
|
1037
|
-
const result = apply(uimodel(tag, props), metadata(DashKeys.COMPONENT, meta))(target);
|
|
1038
|
-
registerDashComponent(target);
|
|
1039
|
-
return result;
|
|
1040
|
-
};
|
|
1041
|
-
}
|
|
1042
|
-
return Decoration.for(DashKeys.COMPONENT).define({
|
|
1043
|
-
decorator: dashcomponent,
|
|
1044
|
-
args: [ tag, dash, props ]
|
|
1045
|
-
}).apply();
|
|
1046
|
-
}
|
|
1047
|
-
|
|
1048
|
-
function resolveModel(model) {
|
|
1049
|
-
const resolved = Metadata.constr(model);
|
|
1050
|
-
if (typeof resolved === "function") return resolved;
|
|
1051
|
-
const fallback = model.constructor;
|
|
1052
|
-
if (typeof fallback === "function") return fallback;
|
|
1053
|
-
return model;
|
|
1054
|
-
}
|
|
1055
|
-
|
|
1056
|
-
function dashComponentMetadataOf(model) {
|
|
1057
|
-
const resolved = resolveModel(model);
|
|
1058
|
-
return Metadata.get(resolved, DashKeys.COMPONENT);
|
|
1059
|
-
}
|
|
1060
|
-
|
|
1061
|
-
function dashComponentDefinitionOf(model) {
|
|
1062
|
-
const resolved = resolveModel(model);
|
|
1063
|
-
const meta = dashComponentMetadataOf(resolved) || {};
|
|
1064
|
-
const tag = meta.tag || resolved.name;
|
|
1065
|
-
return {
|
|
1066
|
-
name: resolved.name,
|
|
1067
|
-
tag: tag,
|
|
1068
|
-
label: meta.label,
|
|
1069
|
-
defaultSize: meta.defaultSize ?? {
|
|
1070
|
-
cols: 1,
|
|
1071
|
-
rows: 1
|
|
1072
|
-
},
|
|
1073
|
-
model: meta.model,
|
|
1074
|
-
props: meta.props,
|
|
1075
|
-
metadata: meta.metadata
|
|
1076
|
-
};
|
|
1077
|
-
}
|
|
1078
|
-
|
|
1079
|
-
const VERSION = "0.20.7";
|
|
1080
|
-
|
|
1081
|
-
const COMMIT = "f92e8d1";
|
|
1082
|
-
|
|
1083
|
-
const FULL_VERSION = "0.20.7-f92e8d1";
|
|
1084
|
-
|
|
1085
|
-
const PACKAGE_NAME = "@decaf-ts/ui-decorators";
|
|
1086
|
-
|
|
1087
|
-
Metadata.registerLibrary(PACKAGE_NAME, VERSION);
|
|
1088
|
-
|
|
1089
|
-
export { ActionRoles, COMMIT, ComponentEventNames, DashKeys, DecafComponent, DecafEventHandler, DecafTranslateService, ElementPositions, ElementSizes, FULL_VERSION, HTML5CheckTypes, HTML5DateFormat, HTML5InputTypes, LayoutGridGaps, PACKAGE_NAME, RenderingEngine, RenderingError, TransactionHooks, UIKeys, UIMediaBreakPoints, UIValidator, VERSION, ValidatableByAttribute, ValidatableByType, WindowColorSchemes, dashComponentDefinitionOf, dashComponentMetadataOf, dashComponents, dashcomponent, escapeHtml, formatByType, generateUIModelID, getUIAttributeKey, hidden, hideFor, hideOn, isClassConstructor, parseToNumber, parseValueByType, registerDashComponent, renderIf, renderedBy, resetDashComponentRegistry, revertHtml, showFor, uichild, uielement, uihandlers, uilayout, uilayoutprop, uilistmodel, uilistprop, uimodel, uion, uionclick, uionrender, uiorder, uipageprop, uiprop, uisteppedmodel, uitablecol };
|
|
1090
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktZGVjb3JhdG9ycy5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3VpL2NvbnN0YW50cy50cyIsIi4uL3NyYy91aS9lcnJvcnMudHMiLCIuLi9zcmMvdWkvdXRpbHMudHMiLCIuLi9zcmMvdWkvUmVuZGVyaW5nLnRzIiwiLi4vc3JjL3VpL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvdWkvVUlWYWxpZGF0b3IudHMiLCIuLi9zcmMvdWkvRGVjYWZDb21wb25lbnQudHMiLCIuLi9zcmMvdWkvRGVjYWZFdmVudEhhbmRsZXIudHMiLCIuLi9zcmMvdWkvRGVjYWZUcmFuc2xhdGVTZXJ2aWNlLnRzIiwiLi4vc3JjL21vZGVsL292ZXJyaWRlcy50cyIsIi4uL3NyYy9tb2RlbC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9Nb2RlbEJ1aWxkZXJFeHRlbnNpb25zLnRzIiwiLi4vc3JjL2Rhc2hib2FyZC9jb25zdGFudHMudHMiLCIuLi9zcmMvZGFzaGJvYXJkL3JlZ2lzdHJ5LnRzIiwiLi4vc3JjL2Rhc2hib2FyZC9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2Rhc2hib2FyZC9yZWFkZXIudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29uc3RhbnRzIGFuZCBlbnVtcyBmb3IgVUkgcmVuZGVyaW5nIGFuZCB2YWxpZGF0aW9uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGtleXMsIG1hcHBpbmdzLCBhbmQgSFRNTDUgaW5wdXQgdHlwZXMgZm9yIFVJIGNvbXBvbmVudHNcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGNvbnN0YW50cyB1c2VkIHRocm91Z2hvdXQgdGhlIFVJIGRlY29yYXRvcnMgbGlicmFyeSBmb3JcbiAqIHJlbmRlcmluZywgdmFsaWRhdGlvbiwgYW5kIEhUTUwgZWxlbWVudCBnZW5lcmF0aW9uLlxuICogQG1vZHVsZSB1aS9jb25zdGFudHNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5cbmltcG9ydCB7XG4gIERhdGVWYWxpZGF0b3IsXG4gIERpZmZWYWxpZGF0b3IsXG4gIEVtYWlsVmFsaWRhdG9yLFxuICBFcXVhbHNWYWxpZGF0b3IsXG4gIEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvcixcbiAgR3JlYXRlclRoYW5WYWxpZGF0b3IsXG4gIExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvcixcbiAgTGVzc1RoYW5WYWxpZGF0b3IsXG4gIE1heExlbmd0aFZhbGlkYXRvcixcbiAgTWF4VmFsaWRhdG9yLFxuICBNaW5MZW5ndGhWYWxpZGF0b3IsXG4gIE1pblZhbGlkYXRvcixcbiAgUGFzc3dvcmRWYWxpZGF0b3IsXG4gIFBhdHRlcm5WYWxpZGF0b3IsXG4gIFJlcXVpcmVkVmFsaWRhdG9yLFxuICBTdGVwVmFsaWRhdG9yLFxuICBVUkxWYWxpZGF0b3IsXG4gIFZhbGlkYXRpb25LZXlzLFxuICBWYWxpZGF0b3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCBlbnVtIFVJTWVkaWFCcmVha1BvaW50cyB7XG4gIFNNQUxMID0gXCJzbWFsbFwiLFxuICBNRURJVU0gPSBcIm1lZGl1bVwiLFxuICBMQVJHRSA9IFwibGFyZ2VcIixcbiAgWExBUkdFID0gXCJ4bGFyZ2VcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5IGNvbnN0YW50cyB1c2VkIGZvciBVSSBtZXRhZGF0YSBhbmQgcmVuZGVyaW5nXG4gKiBAc3VtbWFyeSBDb2xsZWN0aW9uIG9mIHN0cmluZyBjb25zdGFudHMgdXNlZCBhcyBrZXlzIGZvciBVSS1yZWxhdGVkIG1ldGFkYXRhXG4gKiBUaGVzZSBrZXlzIGFyZSB1c2VkIHRocm91Z2hvdXQgdGhlIGxpYnJhcnkgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhIHJlbGF0ZWQgdG9cbiAqIFVJIG1vZGVscywgZWxlbWVudHMsIHByb3BlcnRpZXMsIGFuZCB2YWxpZGF0aW9uIHJ1bGVzLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFVJS2V5c1R5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUZMRUNUIC0gQmFzZSByZWZsZWN0aW9uIGtleSBmb3IgVUkgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBVSU1PREVMIC0gS2V5IGZvciBVSSBtb2RlbCBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFTkRFUkVEX0JZIC0gS2V5IGZvciBzcGVjaWZ5aW5nIHJlbmRlcmluZyBlbmdpbmVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBFTEVNRU5UIC0gS2V5IGZvciBlbGVtZW50IG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUFJPUCAtIEtleSBmb3IgcHJvcGVydHkgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOQU1FIC0gS2V5IGZvciBuYW1lIGF0dHJpYnV0ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE5BTUVfUFJFRklYIC0gUHJlZml4IGZvciBpbnB1dCBuYW1lc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IENVU1RPTV9QUk9QUyAtIEtleSBmb3IgY3VzdG9tIHZhbGlkYXRpb24gcHJvcGVydGllc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFVJTElTVE1PREVMIC0gS2V5IGZvciBsaXN0IGl0ZW0gbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBVSUxJU1RQUk9QIC0gS2V5IGZvciBsaXN0IHByb3BlcnR5IG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVFlQRSAtIEtleSBmb3IgdHlwZSBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNVQl9UWVBFIC0gS2V5IGZvciBzdWJ0eXBlIG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSElEREVOIC0gS2V5IGZvciBoaWRkZW4gYXR0cmlidXRlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRk9STUFUIC0gS2V5IGZvciBmb3JtYXQgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUFEX09OTFkgLSBLZXkgZm9yIHJlYWRvbmx5IGF0dHJpYnV0ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFUVVJUkVEIC0gS2V5IGZvciByZXF1aXJlZCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUlOIC0gS2V5IGZvciBtaW5pbXVtIHZhbHVlIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNSU5fTEVOR1RIIC0gS2V5IGZvciBtaW5pbXVtIGxlbmd0aCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFYIC0gS2V5IGZvciBtYXhpbXVtIHZhbHVlIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNQVhfTEVOR1RIIC0gS2V5IGZvciBtYXhpbXVtIGxlbmd0aCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUEFUVEVSTiAtIEtleSBmb3IgcGF0dGVybiB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVVJMIC0gS2V5IGZvciBVUkwgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNURVAgLSBLZXkgZm9yIHN0ZXAgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IERBVEUgLSBLZXkgZm9yIGRhdGUgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IEVNQUlMIC0gS2V5IGZvciBlbWFpbCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUEFTU1dPUkQgLSBLZXkgZm9yIHBhc3N3b3JkIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBFUVVBTFMgLSBLZXkgZm9yIGVxdWFsaXR5IHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBESUZGIC0gS2V5IGZvciBkaWZmZXJlbmNlIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBMRVNTX1RIQU4gLSBLZXkgZm9yIGxlc3MgdGhhbiB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTEVTU19USEFOX09SX0VRVUFMIC0gS2V5IGZvciBsZXNzIHRoYW4gb3IgZXF1YWwgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IEdSRUFURVJfVEhBTiAtIEtleSBmb3IgZ3JlYXRlciB0aGFuIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBHUkVBVEVSX1RIQU5fT1JfRVFVQUwgLSBLZXkgZm9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB2YWxpZGF0aW9uXG4gKlxuICogQGNvbnN0IFVJS2V5c1xuICogQHR5cGUge1VJS2V5c1R5cGV9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgVUlLZXlzID0ge1xuICBSRUZMRUNUOiBgdWlgLFxuICBVSU1PREVMOiBcInVpbW9kZWxcIixcbiAgUkVOREVSRURfQlk6IFwicmVuZGVyZWQtYnlcIixcbiAgRUxFTUVOVDogXCJ1aWVsZW1lbnRcIixcbiAgUFJPUDogXCJ1aXByb3BcIixcbiAgQ0hJTEQ6IFwidWljaGlsZFwiLFxuICBOQU1FOiBcIm5hbWVcIixcbiAgTkFNRV9QUkVGSVg6IFwiaW5wdXQtXCIsXG4gIFZBTElEQVRJT05fTUVTU0FHRTogXCJ2YWxpZGF0aW9uTWVzc2FnZVwiLFxuXG4gIFVJTElTVE1PREVMOiBcInVpbGlzdG1vZGVsXCIsXG4gIFVJTElTVFBST1A6IFwidWlsaXN0cHJvcFwiLFxuICBVSUxBWU9VVDogXCJ1aWxheW91dFwiLFxuICBVSUxBWU9VVFBST1A6IFwidWlsYXlvdXRwcm9wXCIsXG4gIEhBTkRMRVJTOiBcImhhbmRsZXJzXCIsXG5cbiAgVFlQRTogXCJ0eXBlXCIsXG4gIFNVQl9UWVBFOiBcInN1YlR5cGVcIixcblxuICBISURERU46IFwiaGlkZGVuXCIsXG4gIEhJREVfRk9SOiBcImhpZGUtZm9yXCIsXG4gIFNIT1dfRk9SOiBcInNob3ctZm9yXCIsXG4gIFJFTkRFUl9JRjogXCJyZW5kZXItaWZcIixcbiAgRk9STUFUOiBcImZvcm1hdFwiLFxuICBPUkRFUjogXCJvcmRlclwiLFxuICBQQUdFOiBcInBhZ2VcIixcbiAgRVZFTlRTOiBcImV2ZW50c1wiLFxuXG4gIEZJUlNUOiBcImZpcnN0XCIsXG4gIExBU1Q6IFwibGFzdFwiLFxuXG4gIFJFQURfT05MWTogXCJyZWFkb25seVwiLFxuICBTRVFVRU5DRTogXCJzZXF1ZW5jZVwiLFxuICBSRVFVSVJFRDogVmFsaWRhdGlvbktleXMuUkVRVUlSRUQsXG4gIE1JTjogVmFsaWRhdGlvbktleXMuTUlOLFxuICBNSU5fTEVOR1RIOiBWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RILFxuICBNQVg6IFZhbGlkYXRpb25LZXlzLk1BWCxcbiAgTUFYX0xFTkdUSDogVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSCxcbiAgUEFUVEVSTjogVmFsaWRhdGlvbktleXMuUEFUVEVSTixcbiAgVVJMOiBWYWxpZGF0aW9uS2V5cy5VUkwsXG4gIFNURVA6IFZhbGlkYXRpb25LZXlzLlNURVAsXG4gIERBVEU6IFZhbGlkYXRpb25LZXlzLkRBVEUsXG4gIEVNQUlMOiBWYWxpZGF0aW9uS2V5cy5FTUFJTCxcbiAgUEFTU1dPUkQ6IFZhbGlkYXRpb25LZXlzLlBBU1NXT1JELFxuICBFUVVBTFM6IFZhbGlkYXRpb25LZXlzLkVRVUFMUyxcbiAgRElGRjogVmFsaWRhdGlvbktleXMuRElGRixcbiAgTEVTU19USEFOOiBWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU4sXG4gIExFU1NfVEhBTl9PUl9FUVVBTDogVmFsaWRhdGlvbktleXMuTEVTU19USEFOX09SX0VRVUFMLFxuICBHUkVBVEVSX1RIQU46IFZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTixcbiAgR1JFQVRFUl9USEFOX09SX0VRVUFMOiBWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU5fT1JfRVFVQUwsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBwaW5nIG9mIGlucHV0IHR5cGVzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsaWRhdG9yc1xuICogQHN1bW1hcnkgTWFwcyBzcGVjaWFsIGlucHV0IHR5cGVzIHRvIHRoZWlyIHZhbGlkYXRvciBjbGFzc2VzXG4gKiBUaGlzIGNvbnN0YW50IG1hcHMgaW5wdXQgdHlwZXMgbGlrZSBlbWFpbCwgVVJMLCBkYXRlLCBhbmQgcGFzc3dvcmQgdG8gdGhlaXJcbiAqIGNvcnJlc3BvbmRpbmcgdmFsaWRhdG9yIGNsYXNzZXMgZnJvbSB0aGUgZGVjb3JhdG9yLXZhbGlkYXRpb24gbGlicmFyeS5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0LjxzdHJpbmcsIENvbnN0cnVjdG9yPFZhbGlkYXRvcj4+fSBWYWxpZGF0YWJsZUJ5VHlwZU1hcFxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxFbWFpbFZhbGlkYXRvcj59IGVtYWlsIC0gVmFsaWRhdG9yIGZvciBlbWFpbCBpbnB1dHNcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8VVJMVmFsaWRhdG9yPn0gdXJsIC0gVmFsaWRhdG9yIGZvciBVUkwgaW5wdXRzXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPERhdGVWYWxpZGF0b3I+fSBkYXRlIC0gVmFsaWRhdG9yIGZvciBkYXRlIGlucHV0c1xuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxQYXNzd29yZFZhbGlkYXRvcj59IHBhc3N3b3JkIC0gVmFsaWRhdG9yIGZvciBwYXNzd29yZCBpbnB1dHNcbiAqXG4gKiBAY29uc3QgVmFsaWRhdGFibGVCeVR5cGVcbiAqIEB0eXBlIHtWYWxpZGF0YWJsZUJ5VHlwZU1hcH1cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBWYWxpZGF0YWJsZUJ5VHlwZTogUmVjb3JkPHN0cmluZywgQ29uc3RydWN0b3I8VmFsaWRhdG9yPj4gPSB7XG4gIFtVSUtleXMuRU1BSUxdOiBFbWFpbFZhbGlkYXRvcixcbiAgW1VJS2V5cy5VUkxdOiBVUkxWYWxpZGF0b3IsXG4gIFtVSUtleXMuREFURV06IERhdGVWYWxpZGF0b3IsXG4gIFtVSUtleXMuUEFTU1dPUkRdOiBQYXNzd29yZFZhbGlkYXRvcixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1hcHBpbmcgb2YgdmFsaWRhdGlvbiBhdHRyaWJ1dGVzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsaWRhdG9yc1xuICogQHN1bW1hcnkgTWFwcyBIVE1MIHZhbGlkYXRpb24gYXR0cmlidXRlcyB0byB0aGVpciB2YWxpZGF0b3IgY2xhc3Nlc1xuICogVGhpcyBjb25zdGFudCBtYXBzIEhUTUwgdmFsaWRhdGlvbiBhdHRyaWJ1dGVzIGxpa2UgcmVxdWlyZWQsIG1pbiwgbWF4LCBwYXR0ZXJuLCBldGMuXG4gKiB0byB0aGVpciBjb3JyZXNwb25kaW5nIHZhbGlkYXRvciBjbGFzc2VzIGZyb20gdGhlIGRlY29yYXRvci12YWxpZGF0aW9uIGxpYnJhcnkuXG4gKlxuICogQHR5cGVkZWYge09iamVjdC48c3RyaW5nLCBDb25zdHJ1Y3RvcjxWYWxpZGF0b3I+Pn0gVmFsaWRhdGFibGVCeUF0dHJpYnV0ZU1hcFxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxSZXF1aXJlZFZhbGlkYXRvcj59IHJlcXVpcmVkIC0gVmFsaWRhdG9yIGZvciByZXF1aXJlZCBmaWVsZHNcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8TWluVmFsaWRhdG9yPn0gbWluIC0gVmFsaWRhdG9yIGZvciBtaW5pbXVtIHZhbHVlXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPE1heFZhbGlkYXRvcj59IG1heCAtIFZhbGlkYXRvciBmb3IgbWF4aW11bSB2YWx1ZVxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxTdGVwVmFsaWRhdG9yPn0gc3RlcCAtIFZhbGlkYXRvciBmb3Igc3RlcCB2YWx1ZVxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxNaW5MZW5ndGhWYWxpZGF0b3I+fSBtaW5sZW5ndGggLSBWYWxpZGF0b3IgZm9yIG1pbmltdW0gbGVuZ3RoXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPE1heExlbmd0aFZhbGlkYXRvcj59IG1heGxlbmd0aCAtIFZhbGlkYXRvciBmb3IgbWF4aW11bSBsZW5ndGhcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8UGF0dGVyblZhbGlkYXRvcj59IHBhdHRlcm4gLSBWYWxpZGF0b3IgZm9yIHJlZ2V4IHBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8RXF1YWxzVmFsaWRhdG9yPn0gZXF1YWxzIC0gVmFsaWRhdG9yIGZvciBlcXVhbGl0eVxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxEaWZmVmFsaWRhdG9yPn0gZGlmZiAtIFZhbGlkYXRvciBmb3IgZGlmZmVyZW5jZVxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxMZXNzVGhhblZhbGlkYXRvcj59IGxlc3N0aGFuIC0gVmFsaWRhdG9yIGZvciBsZXNzIHRoYW4gY29tcGFyaXNvblxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3I+fSBsZXNzdGhhbm9yZXF1YWwgLSBWYWxpZGF0b3IgZm9yIGxlc3MgdGhhbiBvciBlcXVhbCBjb21wYXJpc29uXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPEdyZWF0ZXJUaGFuVmFsaWRhdG9yPn0gZ3JlYXRlcnRoYW4gLSBWYWxpZGF0b3IgZm9yIGdyZWF0ZXIgdGhhbiBjb21wYXJpc29uXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvcj59IGdyZWF0ZXJ0aGFub3JlcXVhbCAtIFZhbGlkYXRvciBmb3IgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIGNvbXBhcmlzb25cbiAqXG4gKiBAY29uc3QgVmFsaWRhdGFibGVCeUF0dHJpYnV0ZVxuICogQHR5cGUge1ZhbGlkYXRhYmxlQnlBdHRyaWJ1dGVNYXB9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgVmFsaWRhdGFibGVCeUF0dHJpYnV0ZTogUmVjb3JkPHN0cmluZywgQ29uc3RydWN0b3I8VmFsaWRhdG9yPj4gPSB7XG4gIFtVSUtleXMuUkVRVUlSRURdOiBSZXF1aXJlZFZhbGlkYXRvcixcbiAgW1VJS2V5cy5NSU5dOiBNaW5WYWxpZGF0b3IsXG4gIFtVSUtleXMuTUFYXTogTWF4VmFsaWRhdG9yLFxuICBbVUlLZXlzLlNURVBdOiBTdGVwVmFsaWRhdG9yLFxuICBbVUlLZXlzLk1JTl9MRU5HVEhdOiBNaW5MZW5ndGhWYWxpZGF0b3IsXG4gIFtVSUtleXMuTUFYX0xFTkdUSF06IE1heExlbmd0aFZhbGlkYXRvcixcbiAgW1VJS2V5cy5QQVRURVJOXTogUGF0dGVyblZhbGlkYXRvcixcbiAgW1VJS2V5cy5FUVVBTFNdOiBFcXVhbHNWYWxpZGF0b3IsXG4gIFtVSUtleXMuRElGRl06IERpZmZWYWxpZGF0b3IsXG4gIFtVSUtleXMuTEVTU19USEFOXTogTGVzc1RoYW5WYWxpZGF0b3IsXG4gIFtVSUtleXMuTEVTU19USEFOX09SX0VRVUFMXTogTGVzc1RoYW5PckVxdWFsVmFsaWRhdG9yLFxuICBbVUlLZXlzLkdSRUFURVJfVEhBTl06IEdyZWF0ZXJUaGFuVmFsaWRhdG9yLFxuICBbVUlLZXlzLkdSRUFURVJfVEhBTl9PUl9FUVVBTF06IEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvcixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0YW5kYXJkIGRhdGUgZm9ybWF0IHN0cmluZyBmb3IgSFRNTDUgZGF0ZSBpbnB1dHNcbiAqIEBzdW1tYXJ5IEZvcm1hdCBzdHJpbmcgZm9yIEhUTUw1IGRhdGUgaW5wdXRzICh5eXl5LU1NLWRkKVxuICogVGhpcyBjb25zdGFudCBkZWZpbmVzIHRoZSBzdGFuZGFyZCBkYXRlIGZvcm1hdCBzdHJpbmcgdXNlZCBmb3IgSFRNTDUgZGF0ZSBpbnB1dHMuXG4gKlxuICogQGNvbnN0IEhUTUw1RGF0ZUZvcm1hdFxuICogQHR5cGUge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBIVE1MNURhdGVGb3JtYXQgPSBcInl5eXktTU0tZGRcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29sbGVjdGlvbiBvZiBIVE1MNSBpbnB1dCB0eXBlIHZhbHVlc1xuICogQHN1bW1hcnkgTWFwcyBpbnB1dCB0eXBlIGNvbnN0YW50cyB0byB0aGVpciBIVE1MIGF0dHJpYnV0ZSB2YWx1ZXNcbiAqIFRoaXMgY29uc3RhbnQgcHJvdmlkZXMgYSBtYXBwaW5nIG9mIGlucHV0IHR5cGUgY29uc3RhbnRzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmdcbiAqIEhUTUwgYXR0cmlidXRlIHZhbHVlcyBmb3IgdXNlIGluIGZvcm0gZWxlbWVudHMuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gSFRNTDVJbnB1dFR5cGVzTWFwXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQlVUVE9OIC0gQnV0dG9uIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBDSEVDS0JPWCAtIENoZWNrYm94IGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBDT0xPUiAtIENvbG9yIHBpY2tlciBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gREFURSAtIERhdGUgcGlja2VyIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBEQVRFVElNRV9MT0NBTCAtIExvY2FsIGRhdGV0aW1lIHBpY2tlciBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRU1BSUwgLSBFbWFpbCBpbnB1dCB0eXBlIHdpdGggdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IEZJTEUgLSBGaWxlIHVwbG9hZCBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSElEREVOIC0gSGlkZGVuIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTUFHRSAtIEltYWdlIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNT05USCAtIE1vbnRoIHBpY2tlciBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTlVNQkVSIC0gTnVtZXJpYyBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUEFTU1dPUkQgLSBQYXNzd29yZCBpbnB1dCB0eXBlIHdpdGggbWFza2VkIHRleHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSQURJTyAtIFJhZGlvIGJ1dHRvbiBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkFOR0UgLSBSYW5nZSBzbGlkZXIgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFU0VUIC0gRm9ybSByZXNldCBidXR0b24gaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNFQVJDSCAtIFNlYXJjaCBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU1VCTUlUIC0gRm9ybSBzdWJtaXQgYnV0dG9uIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBURUwgLSBUZWxlcGhvbmUgbnVtYmVyIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBURVhUIC0gQmFzaWMgdGV4dCBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVElNRSAtIFRpbWUgcGlja2VyIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBVUkwgLSBVUkwgaW5wdXQgdHlwZSB3aXRoIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBXRUVLIC0gV2VlayBwaWNrZXIgaW5wdXQgdHlwZVxuICpcbiAqIEBjb25zdCBIVE1MNUlucHV0VHlwZXNcbiAqIEB0eXBlIHtIVE1MNUlucHV0VHlwZXNNYXB9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgSFRNTDVJbnB1dFR5cGVzID0ge1xuICBCVVRUT046IFwiYnV0dG9uXCIsXG4gIENIRUNLQk9YOiBcImNoZWNrYm94XCIsXG4gIENPTE9SOiBcImNvbG9yXCIsXG4gIERBVEU6IFVJS2V5cy5EQVRFLFxuICBEQVRFVElNRV9MT0NBTDogXCJkYXRldGltZS1sb2NhbFwiLFxuICBFTUFJTDogVUlLZXlzLkVNQUlMLFxuICBGSUxFOiBcImZpbGVcIixcbiAgSElEREVOOiBcImhpZGRlblwiLFxuICBJTUFHRTogXCJpbWFnZVwiLFxuICBNT05USDogXCJtb250aFwiLFxuICBOVU1CRVI6IFwibnVtYmVyXCIsXG4gIFBBU1NXT1JEOiBVSUtleXMuUEFTU1dPUkQsXG4gIFJBRElPOiBcInJhZGlvXCIsXG4gIFJBTkdFOiBcInJhbmdlXCIsXG4gIFJFU0VUOiBcInJlc2V0XCIsXG4gIFNFQVJDSDogXCJzZWFyY2hcIixcbiAgU1VCTUlUOiBcInN1Ym1pdFwiLFxuICBURUw6IFwidGVsXCIsXG4gIFRFWFQ6IFwidGV4dFwiLFxuICBURVhUQVJFQTogXCJ0ZXh0YXJlYVwiLFxuICBTRUxFQ1Q6IFwic2VsZWN0XCIsXG4gIFRJTUU6IFwidGltZVwiLFxuICBVUkw6IFVJS2V5cy5VUkwsXG4gIFdFRUs6IFwid2Vla1wiLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQXJyYXkgb2YgSFRNTDUgaW5wdXQgdHlwZXMgdGhhdCB1c2UgY2hlY2tib3hlc1xuICogQHN1bW1hcnkgTGlzdCBvZiBpbnB1dCB0eXBlcyB0aGF0IHJlcHJlc2VudCBjaGVja2FibGUgY29udHJvbHNcbiAqIFRoaXMgY29uc3RhbnQgZGVmaW5lcyBhbiBhcnJheSBvZiBIVE1MNSBpbnB1dCB0eXBlcyB0aGF0IHJlcHJlc2VudFxuICogY2hlY2thYmxlIGNvbnRyb2xzIChjaGVja2JveCBhbmQgcmFkaW8pLlxuICpcbiAqIEBjb25zdCBIVE1MNUNoZWNrVHlwZXNcbiAqIEB0eXBlIHtzdHJpbmdbXX1cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBIVE1MNUNoZWNrVHlwZXM6IHN0cmluZ1tdID0gW1xuICBIVE1MNUlucHV0VHlwZXMuQ0hFQ0tCT1gsXG4gIEhUTUw1SW5wdXRUeXBlcy5SQURJTyxcbl07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEV2ZW50IG5hbWUgY29uc3RhbnRzLlxuICogQHN1bW1hcnkgQ29udGFpbnMgY29uc3RhbnRzIGZvciBzdGFuZGFyZGl6ZWQgZXZlbnQgbmFtZXMgdXNlZCB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbi5cbiAqIFRoZXNlIGNvbnN0YW50cyBlbnN1cmUgY29uc2lzdGVudCBldmVudCBuYW1pbmcgYWNyb3NzIGNvbXBvbmVudHMgYW5kIG1ha2UgaXQgZWFzaWVyIHRvXG4gKiB0cmFjayBhbmQgaGFuZGxlIGV2ZW50cy4gRWFjaCBjb25zdGFudCByZXByZXNlbnRzIGEgc3BlY2lmaWMgYXBwbGljYXRpb24gZXZlbnQgdHlwZS5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IENvbXBvbmVudEV2ZW50TmFtZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCYWNrQnV0dG9uQ2xpY2tFdmVudCAtIEV2ZW50IGZpcmVkIHdoZW4gYmFjayBidXR0b24gbmF2aWdhdGlvbiBlbmRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUmVuZGVyIC0gRXZlbnQgYWZ0ZXIgY29tcG9uZW50IGluaXRpYWxpemUgYWN0aW9uIG9jY3Vyc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFJlZnJlc2ggLSBFdmVudCBmaXJlZCB3aGVuIGEgcmVmcmVzaCBhY3Rpb24gb2NjdXJzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQ2xpY2sgLSBFdmVudCBmaXJlZCB3aGVuIGEgY2xpY2sgYWN0aW9uIG9jY3Vyc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IENoYW5nZSAtIEV2ZW50IGZpcmVkIHdoZW4gYSBjaGFuZ2UgYWN0aW9uIG9jY3Vyc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFN1Ym1pdCAtIEV2ZW50IGZpcmVkIHdoZW4gYSBmb3JtIHN1Ym1pc3Npb24gb2NjdXJzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVmFsaWRhdGlvbkVycm9yIC0gRXZlbnQgZmlyZWQgd2hlbiBhIHZhbGlkYXRpb24gZXJyb3Igb2NjdXJzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVGhlbWVDaGFuZ2UgLSBFdmVudCBmaXJlZCB3aGVuIGEgdGhlbWUgY2hhbmdlIG9jY3Vyc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IEZvcm1Hcm91cExvYWRlZCAtIEV2ZW50IGZpcmVkIHdoZW4gYSByZWFjdHZlIGZvcm0gZ3JvdXAgaXMgbG9hZGVkXG4gKiBAY29uc3QgQ29tcG9uZW50RXZlbnROYW1lc1xuICovXG5leHBvcnQgY29uc3QgQ29tcG9uZW50RXZlbnROYW1lcyA9IHtcbiAgUmVuZGVyOiBcInJlbmRlclwiLFxuICBCYWNrQnV0dG9uQ2xpY2tFdmVudDogXCJiYWNrQnV0dG9uTmF2aWdhdGlvbkVuZEV2ZW50XCIsXG4gIFJlZnJlc2g6IFwiUmVmcmVzaEV2ZW50XCIsXG4gIENsaWNrOiBcIkNsaWNrRXZlbnRcIixcbiAgQ2hhbmdlOiBcIkNoYW5nZUV2ZW50XCIsXG4gIFN1Ym1pdDogXCJTdWJtaXRFdmVudFwiLFxuICBWYWxpZGF0aW9uRXJyb3I6IFwidmFsaWRhdGlvbkVycm9yRXZlbnRcIixcbiAgVGhlbWVDaGFuZ2U6IFwidGhlbWVDaGFuZ2VFdmVudFwiLFxuICBGb3JtR3JvdXBMb2FkZWQ6IFwiZm9ybUdyb3VwTG9hZGVkRXZlbnRcIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIExpZmVjeWNsZSBob29rIGxhYmVscyBmb3IgcmVwb3NpdG9yeSB0cmFuc2FjdGlvbnMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBjYW5vbmljYWwgbmFtZXMgZm9yIENSVUQgbGlmZWN5Y2xlIGNhbGxiYWNrcyBzbyBkZWNvcmF0b3JzIGFuZFxuICogY29tcG9uZW50cyBjYW4gcmVnaXN0ZXIgd29yayBiZWZvcmUgb3IgYWZ0ZXIgcmVwb3NpdG9yeSBvcGVyYXRpb25zIGluIGEgY29uc2lzdGVudCB3YXkuXG4gKiBFYWNoIGtleSBtYXBzIHRvIHRoZSBzdHJpbmcgdXNlZCB3aGVuIHdpcmluZyB0cmFuc2FjdGlvbiBtaWRkbGV3YXJlLlxuICogQGNvbnN0IFRyYW5zYWN0aW9uSG9va3NcbiAqL1xuZXhwb3J0IGNvbnN0IFRyYW5zYWN0aW9uSG9va3MgPSB7XG4gIEJlZm9yZVJlYWQ6IFwiYmVmb3JlUmVhZFwiLFxuICBBZnRlclJlYWQ6IFwiYWZ0ZXJSZWFkXCIsXG4gIEJlZm9yZUNyZWF0ZTogXCJiZWZvcmVDcmVhdGVcIixcbiAgQWZ0ZXJDcmVhdGU6IFwiYWZ0ZXJDcmVhdGVcIixcbiAgQmVmb3JlVXBkYXRlOiBcImJlZm9yZVVwZGF0ZVwiLFxuICBBZnRlclVwZGF0ZTogXCJhZnRlclVwZGF0ZVwiLFxuICBCZWZvcmVEZWxldGU6IFwiYmVmb3JlRGVsZXRlXCIsXG4gIEFmdGVyRGVsZXRlOiBcImFmdGVyRGVsZXRlXCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdGFuZGFyZGl6ZWQgc2l6ZSB0b2tlbnMgZm9yIFVJIGVsZW1lbnRzLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgc2VtYW50aWMgc2l6ZSBrZXl3b3JkcyBzdXBwb3J0ZWQgYnkgbGF5b3V0IGFuZCBmb3JtIGRlY29yYXRvcnMuXG4gKiBUaGVzZSB2YWx1ZXMgZmVlZCByZW5kZXJpbmcgZW5naW5lcyBzbyBjb21wb25lbnRzIGNhbiBleHByZXNzIHNpemluZyBpbiBhIHVuaWZvcm0gdm9jYWJ1bGFyeS5cbiAqIEBjb25zdCBFbGVtZW50U2l6ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IEVsZW1lbnRTaXplcyA9IHtcbiAgeHNtYWxsOiBcInhzbWFsbFwiLFxuICBzbWFsbDogXCJzbWFsbFwiLFxuICBtZWRpdW06IFwibWVkaXVtXCIsXG4gIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICBsYXJnZTogXCJsYXJnZVwiLFxuICB4TGFyZ2U6IFwieGxhcmdlXCIsXG4gIFwiMnhMYXJnZVwiOiBcIjJ4bGFyZ2VcIixcbiAgYXV0bzogXCJhdXRvXCIsXG4gIGV4cGFuZDogXCJleHBhbmRcIixcbiAgYmxvY2s6IFwiYmxvY2tcIixcbiAgaGFsZjogXCJoYWxmXCIsXG4gIGZ1bGw6IFwiZnVsbFwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWxpZ25tZW50IGtleXdvcmRzIGZvciBlbGVtZW50IHBvc2l0aW9uaW5nLlxuICogQHN1bW1hcnkgU3VwcGxpZXMgY2Fub25pY2FsIHBvc2l0aW9uIHZhbHVlcyAoaG9yaXpvbnRhbCBhbmQgdmVydGljYWwpIHRoYXQgZGVjb3JhdG9ycyBjYW5cbiAqIHVzZSB3aGVuIGFsaWduaW5nIGxhYmVscywgY29udHJvbHMsIG9yIGhlbHBlciB0ZXh0IGFjcm9zcyBjb21wb25lbnRzLlxuICogQGNvbnN0IEVsZW1lbnRQb3NpdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IEVsZW1lbnRQb3NpdGlvbnMgPSB7XG4gIGxlZnQ6IFwibGVmdFwiLFxuICBjZW50ZXI6IFwiY2VudGVyXCIsXG4gIHJpZ2h0OiBcInJpZ2h0XCIsXG4gIHRvcDogXCJ0b3BcIixcbiAgYm90dG9tOiBcImJvdHRvbVwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR3JpZCBzcGFjaW5nIHByZXNldHMgZm9yIGxheW91dCBkZWNvcmF0b3JzLlxuICogQHN1bW1hcnkgTWFwcyBodW1hbi1yZWFkYWJsZSBnYXAgc2l6ZXMgdG8gdGhlIHRva2VucyBpbnRlcnByZXRlZCBieSB0aGUgcmVuZGVyaW5nIGVuZ2luZVxuICogd2hlbiBidWlsZGluZyBDU1MgZ3JpZCBsYXlvdXRzLCBlbmFibGluZyBwcmVkaWN0YWJsZSBzcGFjaW5nIGFjcm9zcyBjb21wb25lbnRzLlxuICogQGNvbnN0IExheW91dEdyaWRHYXBzXG4gKi9cbmV4cG9ydCBjb25zdCBMYXlvdXRHcmlkR2FwcyA9IHtcbiAgc21hbGw6IFwic21hbGxcIixcbiAgbWVkaXVtOiBcIm1lZGl1bVwiLFxuICBsYXJnZTogXCJsYXJnZVwiLFxuICBjb2xsYXBzZTogXCJjb2xsYXBzZVwiLFxuICBub25lOiBcIlwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2Fub25pY2FsIGFjdGlvbiByb2xlIGlkZW50aWZpZXJzIGZvciBVSSBjb250cm9scy5cbiAqIEBzdW1tYXJ5IEVudW1lcmF0ZXMgdGhlIHNlbWFudGljIHJvbGVzIGEgYnV0dG9uIG9yIGFjdGlvbiBtYXkgcmVwcmVzZW50IHNvIGRlY29yYXRvcnMgYW5kXG4gKiByZW5kZXJlcnMgY2FuIGF0dGFjaCBjb25zaXN0ZW50IGJlaGF2aW9ycyBhbmQgc3R5bGluZyAoaW5jbHVkaW5nIENSVUQgdmVyYnMgdGllZCB0b1xuICogYE9wZXJhdGlvbktleXNgKS5cbiAqIEBjb25zdCBBY3Rpb25Sb2xlc1xuICovXG5leHBvcnQgY29uc3QgQWN0aW9uUm9sZXMgPSB7XG4gIGNhbmNlbDogXCJjYW5jZWxcIixcbiAgY29uZmlybTogXCJjb25maXJtXCIsXG4gIHN1Ym1pdDogXCJzdWJtaXRcIixcbiAgY2xlYXI6IFwiY2xlYXJcIixcbiAgYmFjazogXCJiYWNrXCIsXG4gIFtPcGVyYXRpb25LZXlzLkNSRUFURV06IE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICBbT3BlcmF0aW9uS2V5cy5SRUFEXTogT3BlcmF0aW9uS2V5cy5SRUFELFxuICBbT3BlcmF0aW9uS2V5cy5VUERBVEVdOiBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgW09wZXJhdGlvbktleXMuREVMRVRFXTogT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBbGxvd2VkIGNvbG9yIHNjaGVtZSB0b2tlbnMgZm9yIHdpbmRvd2VkIHN1cmZhY2VzLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgdGhlIHN1cHBvcnRlZCB0aGVtZSBpZGVudGlmaWVycyBleHBvc2VkIHRvIGNvbnN1bWluZyBhcHBzIHNvIHRoZXlcbiAqIGNhbiB0YXJnZXQgbGlnaHQsIGRhcmssIG9yIHVuc2V0IHdpbmRvdyBjb2xvciBzY2hlbWVzIGluIGEgcHJlZGljdGFibGUgd2F5LlxuICogQGNvbnN0IFdpbmRvd0NvbG9yU2NoZW1lc1xuICovXG5leHBvcnQgY29uc3QgV2luZG93Q29sb3JTY2hlbWVzID0ge1xuICBsaWdodDogXCJsaWdodFwiLFxuICBkYXJrOiBcImRhcmtcIixcbiAgdW5kZWZpbmVkOiBcInVuZGVmaW5lZFwiLFxufSBhcyBjb25zdDtcbiIsImltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYSByZW5kZXJpbmcgb3BlcmF0aW9uIGZhaWxzXG4gKiBAc3VtbWFyeSBTcGVjaWFsaXplZCBlcnJvciBmb3IgcmVuZGVyaW5nIGZhaWx1cmVzIGluIFVJIGNvbXBvbmVudHNcbiAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gdGhlIHJlbmRlcmluZyBlbmdpbmUgZW5jb3VudGVycyBhbiBlcnJvciB3aGlsZVxuICogYXR0ZW1wdGluZyB0byByZW5kZXIgYSBVSSBjb21wb25lbnQgb3IgbW9kZWwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyBUaGUgZXJyb3IgbWVzc2FnZSBvciBvcmlnaW5hbCBlcnJvclxuICpcbiAqIEBjbGFzcyBSZW5kZXJpbmdFcnJvclxuICogQGV4dGVuZHMgQmFzZUVycm9yXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRocm93aW5nIGEgcmVuZGVyaW5nIGVycm9yXG4gKiB0cnkge1xuICogICAvLyBSZW5kZXJpbmcgY29kZSB0aGF0IG1pZ2h0IGZhaWxcbiAqICAgaWYgKCFjb21wb25lbnQuY2FuUmVuZGVyKCkpIHtcbiAqICAgICB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoJ0NvbXBvbmVudCBjYW5ub3QgYmUgcmVuZGVyZWQnKTtcbiAqICAgfVxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgY29uc29sZS5lcnJvcignUmVuZGVyaW5nIGZhaWxlZDonLCBlcnJvci5tZXNzYWdlKTtcbiAqIH1cbiAqL1xuZXhwb3J0IGNsYXNzIFJlbmRlcmluZ0Vycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBSZW5kZXJpbmdFcnJvciBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyB0aGUgZXJyb3Igd2l0aCBhIG1lc3NhZ2Ugb3Igb3JpZ2luYWwgZXJyb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyBUaGUgZXJyb3IgbWVzc2FnZSBvciBvcmlnaW5hbCBlcnJvclxuICAgKi9cbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgUmVuZGVyaW5nRXJyb3IubmFtZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIGZvcm1hdERhdGUsXG4gIE1vZGVsLFxuICBwYXJzZURhdGUsXG4gIFJlc2VydmVkTW9kZWxzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBIVE1MNURhdGVGb3JtYXQsIEhUTUw1SW5wdXRUeXBlcywgVUlLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBGaWVsZFByb3BlcnRpZXMsIFVJRnVuY3Rpb25MaWtlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBEZWNvcmF0aW9uS2V5cywgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuLyoqXG4gKlxuICogVHlwZSBndWFyZCB0aGF0IHZlcmlmaWVzIGlmIGEgcHJvdmlkZWQgVUkgZnVuY3Rpb24tbGlrZSB2YWx1ZSBpcyBhIGNsYXNzIGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgY29uc3QgaXNDbGFzc0NvbnN0cnVjdG9yID0gPEM+KFxuICBmbjogVUlGdW5jdGlvbkxpa2UgfCBDb25zdHJ1Y3RvcjxDPlxuKTogZm4gaXMgQ29uc3RydWN0b3I8Qz4gPT4ge1xuICByZXR1cm4gdHlwZW9mIGZuID09PSBcImZ1bmN0aW9uXCIgJiYgL15jbGFzc1xccy8udGVzdChTdHJpbmcoZm4pKTtcbn07XG5cbi8qKlxuICogRGVyaXZlcyB0aGUgbWV0YWRhdGEga2V5IGZvciBhIFVJIGF0dHJpYnV0ZSBvbiBhIGRlY29yYXRlZCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0gcHJvcCAtIFByb3BlcnR5IG5hbWUgZGVjb3JhdGVkIG9uIHRoZSBVSSBtb2RlbC5cbiAqIEBwYXJhbSBrZXkgLSBBdHRyaWJ1dGUgaWRlbnRpZmllciBzdG9yZWQgdW5kZXIgdGhlIHByb3BlcnR5IG1ldGFkYXRhLlxuICogQHJldHVybnMgRnVsbHkgcXVhbGlmaWVkIG1ldGFkYXRhIGtleSBzY29wZWQgdG8gYFVJS2V5cy5SRUZMRUNUYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVJQXR0cmlidXRlS2V5KHByb3A6IHN0cmluZywga2V5OiBzdHJpbmcpIHtcbiAgcmV0dXJuIE1ldGFkYXRhLmtleShVSUtleXMuUkVGTEVDVCwgRGVjb3JhdGlvbktleXMuUFJPUEVSVElFUywgcHJvcCwga2V5KTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb24gZm9ybWF0QnlUeXBlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCeVR5cGUoXG4gIHR5cGU6IGFueSxcbiAgdmFsdWU6IGFueSxcbiAgLi4uYXJnczogdW5rbm93bltdXG4pOiBzdHJpbmcgfCBudW1iZXIge1xuICBpZiAodHlwZSA9PT0gVUlLZXlzLkRBVEUpIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gXCJcIjtcbiAgICBjb25zdCBmb3JtYXQ6IHN0cmluZyA9IChhcmdzLnNoaWZ0KCkgYXMgc3RyaW5nKSB8fCBIVE1MNURhdGVGb3JtYXQ7XG4gICAgcmV0dXJuIGZvcm1hdERhdGUobmV3IERhdGUodmFsdWUpLCBmb3JtYXQpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmFsdWVCeVR5cGUoXG4gIHR5cGU6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyB8IG51bWJlcixcbiAgZmllbGRQcm9wczogRmllbGRQcm9wZXJ0aWVzXG4pOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlIHtcbiAgbGV0IHJlc3VsdDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBBcnJheS5uYW1lOiB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICA/IHZhbHVlLm1hcCgodikgPT5cbiAgICAgICAgICAgIHBhcnNlVmFsdWVCeVR5cGUoXG4gICAgICAgICAgICAgIFJlc2VydmVkTW9kZWxzLlNUUklORy5uYW1lLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgIHYsXG4gICAgICAgICAgICAgIGZpZWxkUHJvcHNcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIDogW3ZhbHVlXTtcbiAgICAgIHJlc3VsdCA9IHBhcnNlZC5qb2luKFwiLFwiKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5OVU1CRVI6XG4gICAgICByZXN1bHQgPSBwYXJzZVRvTnVtYmVyKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkRBVEU6IHtcbiAgICAgIGNvbnN0IGZvcm1hdDogc3RyaW5nIHwgdW5kZWZpbmVkID0gZmllbGRQcm9wcy5mb3JtYXQ7XG4gICAgICBpZiAodmFsdWUgJiYgYCR7dmFsdWV9YC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdCA9XG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBSZXNlcnZlZE1vZGVscy5OVU1CRVIubmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICA/IG5ldyBEYXRlKHZhbHVlKVxuICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgICAgICAgICA/IGZvcm1hdFxuICAgICAgICAgICAgICAgID8gcGFyc2VEYXRlKGZvcm1hdCwgdmFsdWUpXG4gICAgICAgICAgICAgICAgOiBuZXcgRGF0ZSh2YWx1ZSlcbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHJlc3VsdCA9XG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gUmVzZXJ2ZWRNb2RlbHMuT0JKRUNULm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgID8gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICAgID8gdmFsdWUuam9pbihcIixcIilcbiAgICAgICAgICAgIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gICAgICAgICAgOiB0eXBlb2YgdmFsdWUgPT09IFJlc2VydmVkTW9kZWxzLkJPT0xFQU4ubmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gUmVzZXJ2ZWRNb2RlbHMuU1RSSU5HLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICA/IGVzY2FwZUh0bWwodmFsdWUgYXMgc3RyaW5nKVxuICAgICAgICAgICAgICA6IHJlc3VsdDtcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYEZhaWxlZCB0byBwYXJzZSB2YWx1ZSBvZiB0eXBlICR7dHlwZX0gZnJvbSAke3R5cGVvZiB2YWx1ZX0gLSAke3ZhbHVlfWBcbiAgICApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRvTnVtYmVyKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiAhaXNOYU4odmFsdWUpKSByZXR1cm4gdmFsdWU7XG5cbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlKTtcbiAgaWYgKCFpc05hTihwYXJzZWQpKSByZXR1cm4gcGFyc2VkO1xuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVIdG1sKHZhbHVlOiBzdHJpbmcpIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHZhbHVlO1xuXG4gIGNvbnN0IHRhZ3NUb1JlcGxhY2U6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgXCImXCI6IFwiJmFtcDtcIixcbiAgICBcIjxcIjogXCImbHQ7XCIsXG4gICAgXCI+XCI6IFwiJmd0O1wiLFxuICB9O1xuICByZXR1cm4gYCR7dmFsdWV9YC5yZXBsYWNlKC9bJjw+XS9nLCAodGFnKSA9PiB7XG4gICAgcmV0dXJuIHRhZ3NUb1JlcGxhY2VbdGFnXSB8fCB0YWc7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmV2ZXJ0SHRtbCh2YWx1ZTogc3RyaW5nKSB7XG4gIGNvbnN0IHRhZ3NUb1JlcGxhY2U6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgXCImYW1wO1wiOiBcIiZcIixcbiAgICBcIiZsdDtcIjogXCI8XCIsXG4gICAgXCImZ3Q7XCI6IFwiPlwiLFxuICB9O1xuXG4gIHJldHVybiBgJHt2YWx1ZX1gLnJlcGxhY2UoLyZsdDt8Jmd0O3wmYW1wOy9nLCAodGFnKSA9PiB7XG4gICAgcmV0dXJuIHRhZ3NUb1JlcGxhY2VbdGFnXSB8fCB0YWc7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVVSU1vZGVsSUQ8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSkge1xuICBsZXQgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCA9IERhdGUubm93KCk7XG4gIHRyeSB7XG4gICAgY29uc3QgcGsgPSBNb2RlbC5wayhtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPik7XG4gICAgaWYgKHBrKVxuICAgICAgaWQgPSBtb2RlbFtcbiAgICAgICAgTW9kZWwucGsobW9kZWwuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pIGFzIGtleW9mIHR5cGVvZiBtb2RlbFxuICAgICAgXSBhcyBzdHJpbmcgfCBudW1iZXI7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgLy8gZG8gbm90aGluZztcbiAgfVxuICBjb25zdCBuYW1lID0gbW9kZWwuY29uc3RydWN0b3IubmFtZTtcbiAgcmV0dXJuIGAke25hbWV9LSR7aWR9YDtcbn1cbiIsImltcG9ydCB7IEludGVybmFsRXJyb3IsIE5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIEhUTUw1RGF0ZUZvcm1hdCxcbiAgSFRNTDVJbnB1dFR5cGVzLFxuICBVSUtleXMsXG4gIFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUsXG4gIFZhbGlkYXRhYmxlQnlUeXBlLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIENydWRPcGVyYXRpb25LZXlzLFxuICBEZWNhZlNwaW5uZXJPcHRpb25zLFxuICBEZWNhZlRvYXN0T3B0aW9ucyxcbiAgRmllbGREZWZpbml0aW9uLFxuICBGaWVsZFByb3BlcnRpZXMsXG4gIFVJQ2xhc3NNZXRhZGF0YSxcbiAgVUlFbGVtZW50TWV0YWRhdGEsXG4gIFVJTGlzdEl0ZW1FbGVtZW50TWV0YWRhdGEsXG4gIFVJTGlzdFByb3BNZXRhZGF0YSxcbiAgVUlNb2RlbE1ldGFkYXRhLFxuICBVSVByb3BNZXRhZGF0YSxcbiAgSVBhZ2VkQ29tcG9uZW50UHJvcGVydGllcyxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFJlbmRlcmluZ0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBmb3JtYXRCeVR5cGUsIGdlbmVyYXRlVUlNb2RlbElEIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHtcbiAgTW9kZWwsXG4gIE1vZGVsQ29uc3RydWN0b3IsXG4gIFByaW1pdGl2ZXMsXG4gIFJlc2VydmVkTW9kZWxzLFxuICBWYWxpZGF0aW9uS2V5cyxcbiAgVmFsaWRhdGlvbk1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBJRGVjYWZNb2RhbCB9IGZyb20gXCIuL2ludGVyZmFjZXMvSURlY2FmTW9kYWxcIjtcbmltcG9ydCB7IERlY2FmQ29tcG9uZW50IH0gZnJvbSBcIi4vRGVjYWZDb21wb25lbnRcIjtcblxuaW1wb3J0IHsgSURlY2FmU3Bpbm5lciB9IGZyb20gXCIuL2ludGVyZmFjZXMvSURlY2FmU3Bpbm5lclwiO1xuaW1wb3J0IHsgSURlY2FmUm91dGVyIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9JRGVjYWZSb3V0ZXJcIjtcbmltcG9ydCB7IElEZWNhZlRvYXN0IH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9JRGVjYWZUb2FzdFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBjbGFzcyBmb3IgcmVuZGVyaW5nIFVJIGNvbXBvbmVudHMgYmFzZWQgb24gbW9kZWwgbWV0YWRhdGEuXG4gKiBAc3VtbWFyeSBUaGUgUmVuZGVyaW5nRW5naW5lIGNsYXNzIHByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciBjb252ZXJ0aW5nIG1vZGVsIG1ldGFkYXRhIGludG8gVUkgZmllbGQgZGVmaW5pdGlvbnMuXG4gKiBJdCBoYW5kbGVzIHRoZSB0cmFuc2xhdGlvbiBvZiBtb2RlbCBwcm9wZXJ0aWVzIHRvIFVJIGVsZW1lbnRzLCBhcHBsaWVzIHZhbGlkYXRpb24gcnVsZXMsIGFuZCBtYW5hZ2VzIGRpZmZlcmVudCByZW5kZXJpbmcgZmxhdm9ycy5cbiAqIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gYmUgZXh0ZW5kZWQgYnkgc3BlY2lmaWMgcmVuZGVyaW5nIGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgcmVuZGVyaW5nIHJlc3VsdCwgZGVmYXVsdHMgdG8gdm9pZFxuICogQHRlbXBsYXRlIFIgVGhlIHR5cGUgb2YgdGhlIGZpZWxkIGRlZmluaXRpb24sIGRlZmF1bHRzIHRvIEZpZWxkRGVmaW5pdGlvbjxUPlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGZsYXZvciBvZiB0aGUgcmVuZGVyaW5nIGVuZ2luZS5cbiAqXG4gKiBAY2xhc3MgUmVuZGVyaW5nRW5naW5lXG4gKi9cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgYmFzZSBhYnN0cmFjdGlvbiBmb3IgZGVjYWYgcmVuZGVyaW5nIGVuZ2luZXMsIGhhbmRsaW5nIGVuZ2luZSByZWdpc3RyYXRpb24sXG4gKiBpbml0aWFsaXphdGlvbiwgbW9kZWwtdG8tZmllbGQgdHJhbnNsYXRpb24sIGFuZCBydW50aW1lIHJlbmRlcmluZyBvcmNoZXN0cmF0aW9uLlxuICogSW1wbGVtZW50YXRpb25zIG11c3QgcHJvdmlkZSBpbml0aWFsaXphdGlvbiBhbmQgcmVuZGVyaW5nIGxvZ2ljIHdoaWxlIGxldmVyYWdpbmcgdGhlIHNoYXJlZFxuICogbWV0YWRhdGEtZHJpdmVuIGNvbnZlcnNpb24gdXRpbGl0aWVzIHN1cHBsaWVkIGhlcmUuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZW5kZXJpbmdFbmdpbmU8VCA9IHZvaWQsIFIgPSBGaWVsZERlZmluaXRpb248VD4+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDYWNoZSBmb3Igc3RvcmluZyByZW5kZXJpbmcgZW5naW5lIGluc3RhbmNlcyBvciBjb25zdHJ1Y3RvcnMuXG4gICAqIEBwcml2YXRlXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGNhY2hlOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHwgQ29uc3RydWN0b3I8UmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+PlxuICAgIHwgUmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+XG4gID4gPSB7fTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjdXJyZW50bHkgYWN0aXZlIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqIEBwcml2YXRlXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGN1cnJlbnQ6XG4gICAgfCBDb25zdHJ1Y3RvcjxSZW5kZXJpbmdFbmdpbmU8dW5rbm93biwgdW5rbm93bj4+XG4gICAgfCBSZW5kZXJpbmdFbmdpbmU8dW5rbm93biwgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSByZW5kZXJpbmcgZW5naW5lIGhhcyBiZWVuIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGluaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGZsYXZvdXI6IHN0cmluZykge1xuICAgIFJlbmRlcmluZ0VuZ2luZS5yZWdpc3Rlcih0aGlzKTtcbiAgICBjb25zb2xlLmxvZyhgZGVjYWYncyAke2ZsYXZvdXJ9IHJlbmRlcmluZyBlbmdpbmUgbG9hZGVkYCk7XG4gIH1cblxuICBhYnN0cmFjdCBnZXRNb2RhbDxDIGV4dGVuZHMgRGVjYWZDb21wb25lbnQ8TW9kZWw+PihcbiAgICBjb21wb25lbnQ6IFBhcnRpYWw8Qz4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxJRGVjYWZNb2RhbD47XG5cbiAgYWJzdHJhY3QgZ2V0VG9hc3Qob3B0aW9uczogRGVjYWZUb2FzdE9wdGlvbnMpOiBQcm9taXNlPElEZWNhZlRvYXN0PjtcblxuICBhYnN0cmFjdCBnZXRTcGlubmVyKG9wdGlvbnM6IERlY2FmU3Bpbm5lck9wdGlvbnMpOiBQcm9taXNlPElEZWNhZlNwaW5uZXI+O1xuXG4gIGFic3RyYWN0IHJvdXRlcigpOiBJRGVjYWZSb3V0ZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgcmVuZGVyaW5nIGVuZ2luZS5cbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRvIGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgZm9yIHNwZWNpZmljIGluaXRpYWxpemF0aW9uIGxvZ2ljLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIG5lZWRlZCBmb3IgaW5pdGlhbGl6YXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIGFic3RyYWN0IGluaXRpYWxpemUoLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVHJhbnNsYXRlcyBiZXR3ZWVuIG1vZGVsIHR5cGVzIGFuZCBIVE1MIGlucHV0IHR5cGVzLlxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBtb2RlbCBkYXRhIHR5cGVzIHRvIGFwcHJvcHJpYXRlIEhUTUwgaW5wdXQgdHlwZXMgYW5kIHZpY2UgdmVyc2EuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IHRvIHRyYW5zbGF0ZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbdG9WaWV3PXRydWVdIC0gRGlyZWN0aW9uIG9mIHRyYW5zbGF0aW9uICh0cnVlIGZvciBtb2RlbCB0byB2aWV3LCBmYWxzZSBmb3IgdmlldyB0byBtb2RlbCkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSB0cmFuc2xhdGVkIHR5cGUuXG4gICAqL1xuICB0cmFuc2xhdGUoa2V5OiBzdHJpbmcsIHRvVmlldzogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcge1xuICAgIGlmICh0b1ZpZXcpIHtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgUmVzZXJ2ZWRNb2RlbHMuU1RSSU5HLm5hbWUudG9Mb3dlckNhc2UoKTpcbiAgICAgICAgICByZXR1cm4gSFRNTDVJbnB1dFR5cGVzLlRFWFQ7XG4gICAgICAgIGNhc2UgUmVzZXJ2ZWRNb2RlbHMuTlVNQkVSLm5hbWUudG9Mb3dlckNhc2UoKTpcbiAgICAgICAgY2FzZSBSZXNlcnZlZE1vZGVscy5CSUdJTlQubmFtZS50b0xvd2VyQ2FzZSgpOlxuICAgICAgICAgIHJldHVybiBIVE1MNUlucHV0VHlwZXMuTlVNQkVSO1xuICAgICAgICBjYXNlIFJlc2VydmVkTW9kZWxzLkJPT0xFQU4ubmFtZS50b0xvd2VyQ2FzZSgpOlxuICAgICAgICAgIHJldHVybiBIVE1MNUlucHV0VHlwZXMuQ0hFQ0tCT1g7XG4gICAgICAgIGNhc2UgUmVzZXJ2ZWRNb2RlbHMuREFURS5uYW1lLnRvTG93ZXJDYXNlKCk6XG4gICAgICAgICAgcmV0dXJuIEhUTUw1SW5wdXRUeXBlcy5EQVRFO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5TRUxFQ1Q6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlRFWFQ6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkVNQUlMOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5DT0xPUjpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuUEFTU1dPUkQ6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlRFTDpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuVVJMOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5TRUFSQ0g6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkhJRERFTjpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuVEVYVEFSRUE6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlJBRElPOlxuICAgICAgICAgIHJldHVybiBSZXNlcnZlZE1vZGVscy5TVFJJTkcubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5OVU1CRVI6XG4gICAgICAgICAgcmV0dXJuIFJlc2VydmVkTW9kZWxzLk5VTUJFUi5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkNIRUNLQk9YOlxuICAgICAgICAgIHJldHVybiBSZXNlcnZlZE1vZGVscy5CT09MRUFOLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuREFURTpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuREFURVRJTUVfTE9DQUw6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlRJTUU6XG4gICAgICAgICAgcmV0dXJuIFJlc2VydmVkTW9kZWxzLkRBVEUubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgY2xhc3MgZGVjb3JhdG9yIG1ldGFkYXRhIGZvciBhIG1vZGVsIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEV4dHJhY3RzIFVJLXJlbGF0ZWQgY2xhc3MgZGVjb3JhdG9ycyBmcm9tIGEgbW9kZWwgYW5kIHJldHVybnMgdGhlbSBhcyBhbiBhcnJheVxuICAgKiBUaGlzIG1ldGhvZCBjb2xsZWN0cyBtZXRhZGF0YSBmcm9tIHZhcmlvdXMgVUkgY2xhc3MgZGVjb3JhdG9ycyBpbmNsdWRpbmcgQHVpbW9kZWwsXG4gICAqIEB1aWxpc3Rtb2RlbCwgQHVpaGFuZGxlcnMsIGFuZCBAdWlsYXlvdXQgYXBwbGllZCB0byB0aGUgbW9kZWwgY2xhc3MuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBNIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gZXh0cmFjdCBtZXRhZGF0YSBmcm9tXG4gICAqIEByZXR1cm5zIHtVSUNsYXNzTWV0YWRhdGFbXX0gQXJyYXkgb2YgVUkgY2xhc3MgbWV0YWRhdGEgb2JqZWN0c1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDbGFzc0RlY29yYXRvcnNNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNXG4gICk6IFVJQ2xhc3NNZXRhZGF0YVtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgTW9kZWwudWlNb2RlbE9mKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KSxcbiAgICAgIE1vZGVsLnVpTGlzdE1vZGVsT2YobW9kZWwuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pLFxuICAgICAgTW9kZWwudWlIYW5kbGVyc0Zvcihtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPiksXG4gICAgICBNb2RlbC51aUxheW91dE9mKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KSxcbiAgICBdLmZpbHRlcihCb29sZWFuKSBhcyBVSUNsYXNzTWV0YWRhdGFbXTtcbiAgfVxuXG4gIHByaXZhdGUgc29ydENoaWxkcmVuQnlPcmRlcihjaGlsZHJlbjogRmllbGREZWZpbml0aW9uPGFueT5bXSA9IFtdKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGFPcmRlciA9IGEucHJvcHM/Lm9yZGVyID8/IDA7XG4gICAgICBjb25zdCBiT3JkZXIgPSBiLnByb3BzPy5vcmRlciA/PyAwO1xuICAgICAgY29uc3Qgd2VpZ2h0ID0gKHY6IG51bWJlciB8IHN0cmluZykgPT5cbiAgICAgICAgdiA9PT0gVUlLZXlzLkZJUlNUXG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiB0eXBlb2YgdiA9PT0gUHJpbWl0aXZlcy5OVU1CRVJcbiAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgOiB2ID09PSBVSUtleXMuTEFTVFxuICAgICAgICAgICAgICA/IC8vVE9ETzogcmV2aWV3IHRoaXNcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5sZW5ndGggKyBjaGlsZHJlbi5pbmRleE9mKGIpXG4gICAgICAgICAgICAgIDogMTtcblxuICAgICAgY29uc3QgYVdlaWdodCA9IHdlaWdodChhT3JkZXIpO1xuICAgICAgY29uc3QgYldlaWdodCA9IHdlaWdodChiT3JkZXIpO1xuICAgICAgaWYgKGFXZWlnaHQgIT09IGJXZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIGFXZWlnaHQgLSBiV2VpZ2h0O1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGFXZWlnaHQgPT09IDEgJiZcbiAgICAgICAgdHlwZW9mIGFPcmRlciA9PT0gUHJpbWl0aXZlcy5OVU1CRVIgJiZcbiAgICAgICAgdHlwZW9mIGJPcmRlciA9PT0gUHJpbWl0aXZlcy5OVU1CRVJcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gYU9yZGVyIC0gYk9yZGVyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHZhbGlkYXRpb24ga2V5IHJlcHJlc2VudHMgYSBjdXN0b20gdmFsaWRhdG9yIChpLmUuLCBub3QgYSBidWlsdC1pbiB2YWxpZGF0aW9uIG9yIFVJIGtleSkuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgd2hldGhlciB0aGUgcHJvdmlkZWQga2V5IGNvcnJlc3BvbmRzIHRvIGEgdXNlci1kZWZpbmVkIHZhbGlkYXRvciBieSBleGNsdWRpbmcgYWxsIGJ1aWx0LWluIFZhbGlkYXRpb25LZXlzIGFuZCBVSUtleXMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgdmFsaWRhdGlvbiBrZXkgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBrZXkgaXMgYSBjdXN0b20gdmFsaWRhdG9yLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBrZXkgaXMgbm90IGEgYnVpbHQtaW4gdmFsaWRhdGlvbiBrZXkgb3IgVUkga2V5IChpLmUuIGlzIGN1c3RvbSksIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHByb3RlY3RlZCBpc0N1c3RvbVZhbGlkYXRvcihrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhT2JqZWN0LnZhbHVlcyhWYWxpZGF0aW9uS2V5cykuaW5jbHVkZXMoXG4gICAgICAgIGtleSBhcyAodHlwZW9mIFZhbGlkYXRpb25LZXlzKVtrZXlvZiB0eXBlb2YgVmFsaWRhdGlvbktleXNdXG4gICAgICApICYmICFPYmplY3QudmFsdWVzKFVJS2V5cykuaW5jbHVkZXMoa2V5KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHR5cGUgaXMgdmFsaWRhdGFibGUgYnkgaXRzIG5hdHVyZS5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIFVJIGtleSByZXByZXNlbnRzIGEgdHlwZSB0aGF0IGlzIGluaGVyZW50bHkgdmFsaWRhdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgVUkga2V5IHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdHlwZSBpcyB2YWxpZGF0YWJsZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGlzVmFsaWRhdGFibGVCeVR5cGUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoVmFsaWRhdGFibGVCeVR5cGUpLmluY2x1ZGVzKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHR5cGUgaXMgdmFsaWRhdGFibGUgYnkgYXR0cmlidXRlLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gVUkga2V5IHJlcHJlc2VudHMgYSB2YWxpZGF0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgYXMgYW4gYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIFVJIGtleSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHR5cGUgaXMgdmFsaWRhdGFibGUgYnkgYXR0cmlidXRlLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNWYWxpZGF0YWJsZUJ5QXR0cmlidXRlKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUpLmluY2x1ZGVzKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIHZhbGlkYXRpb24gbWV0YWRhdGEgdG8gYW4gYXR0cmlidXRlIHZhbHVlLlxuICAgKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHZhbGlkYXRpb24gbWV0YWRhdGEgaW50byBhIHZhbHVlIHN1aXRhYmxlIGZvciB1c2UgYXMgYW4gSFRNTCBhdHRyaWJ1dGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgdmFsaWRhdGlvbiBrZXkuXG4gICAqIEBwYXJhbSB7VmFsaWRhdGlvbk1ldGFkYXRhfSB2YWx1ZSAtIFRoZSB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbn0gVGhlIGNvbnZlcnRlZCBhdHRyaWJ1dGUgdmFsdWUuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZ2l2ZW4ga2V5IGlzIG5vdCB2YWxpZGF0YWJsZSBieSBhdHRyaWJ1dGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgdG9BdHRyaWJ1dGVWYWx1ZShcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogVmFsaWRhdGlvbk1ldGFkYXRhXG4gICk6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4ge1xuICAgIGlmICghT2JqZWN0LmtleXMoVmFsaWRhdGFibGVCeUF0dHJpYnV0ZSkuaW5jbHVkZXMoa2V5KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgYXR0cmlidXRlIGtleSBcIiR7a2V5fVwiLiBFeHBlY3RlZCBvbmUgb2Y6ICR7T2JqZWN0LmtleXMoVmFsaWRhdGFibGVCeUF0dHJpYnV0ZSkuam9pbihcIiwgXCIpfS5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGtleSA9PT0gVUlLZXlzLlJFUVVJUkVEID8gdHJ1ZSA6IHZhbHVlW2tleV07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgbW9kZWwgdG8gYSBmaWVsZCBkZWZpbml0aW9uLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBtb2RlbCBpbnN0YW5jZSwgZXh0cmFjdGluZyBVSS1yZWxhdGVkIG1ldGFkYXRhIGFuZCB2YWxpZGF0aW9uIHJ1bGVzIHRvIGNyZWF0ZSBhIGZpZWxkIGRlZmluaXRpb24uXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBNIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEB0ZW1wbGF0ZSBUIFR5cGUgcmVmZXJlbmNpbmcgdGhlIHNwZWNpZmljIFJlbmRlcmluZyBlbmdpbmUgZmllbGQgcHJvcGVydGllcy9pbnB1dHNcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBjb252ZXJ0LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBbZ2xvYmFsUHJvcHM9e31dIC0gR2xvYmFsIHByb3BlcnRpZXMgdG8gYXBwbHkgdG8gYWxsIGNoaWxkIGVsZW1lbnRzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtnZW5lcmF0ZUlkPXRydWVdIC0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gcG9wdWxhdGUgdGhlIHJlbmRlcmVySWQgcHJvcGVydHkuXG4gICAqIEByZXR1cm5zIHtGaWVsZERlZmluaXRpb248VD59IEEgZmllbGQgZGVmaW5pdGlvbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBVSSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsLlxuICAgKiBAdGhyb3dzIHtSZW5kZXJpbmdFcnJvcn0gSWYgbm8gVUkgZGVmaW5pdGlvbnMgYXJlIHNldCBmb3IgdGhlIG1vZGVsIG9yIGlmIHRoZXJlIGFyZSBpbnZhbGlkIGRlY29yYXRvcnMuXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAgICogIHBhcnRpY2lwYW50IFJFIGFzIFJlbmRlcmluZ0VuZ2luZVxuICAgKiAgcGFydGljaXBhbnQgUiBhcyBSZWZsZWN0aW9uXG4gICAqICBwYXJ0aWNpcGFudCBNIGFzIE1vZGVsXG4gICAqICBDLT4+UkU6IHRvRmllbGREZWZpbml0aW9uKG1vZGVsLCBnbG9iYWxQcm9wcylcbiAgICogIFJFLT4+UjogZ2V0TWV0YWRhdGEoVUlLZXlzLlVJTU9ERUwsIG1vZGVsLmNvbnN0cnVjdG9yKVxuICAgKiAgUi0tPj5SRTogVUlNb2RlbE1ldGFkYXRhXG4gICAqICBSRS0+PlI6IGdldEFsbFByb3BlcnR5RGVjb3JhdG9ycyhtb2RlbCwgVUlLZXlzLlJFRkxFQ1QpXG4gICAqICBSLS0+PlJFOiBSZWNvcmQ8c3RyaW5nLCBEZWNvcmF0b3JNZXRhZGF0YVtdPlxuICAgKiAgUkUtPj5SOiBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMobW9kZWwsIFZhbGlkYXRpb25LZXlzLlJFRkxFQ1QpXG4gICAqICBSLS0+PlJFOiBSZWNvcmQ8c3RyaW5nLCBEZWNvcmF0b3JNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+W10+XG4gICAqICBsb29wIEZvciBlYWNoIHByb3BlcnR5XG4gICAqICAgIFJFLT4+UkU6IFByb2Nlc3MgVUkgZGVjb3JhdG9yc1xuICAgKiAgICBSRS0+PlJFOiBBcHBseSB2YWxpZGF0aW9uIHJ1bGVzXG4gICAqICBlbmRcbiAgICogIFJFLS0+PkM6IEZpZWxkRGVmaW5pdGlvbjxUPlxuICAgKi9cbiAgcHJvdGVjdGVkIHRvRmllbGREZWZpbml0aW9uPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgZ2xvYmFsUHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30sXG4gICAgZ2VuZXJhdGVJZDogYm9vbGVhbiA9IHRydWVcbiAgKTogRmllbGREZWZpbml0aW9uPFQ+IHtcbiAgICBjb25zdCB7IGluaGVyaXRQcm9wcywgLi4uZ2xvYmFsUHJvcHNXaXRob3V0SW5oZXJpdHMgfSA9IGdsb2JhbFByb3BzO1xuICAgIGdsb2JhbFByb3BzID0gZ2xvYmFsUHJvcHNXaXRob3V0SW5oZXJpdHM7XG5cbiAgICBjb25zdCBjbGFzc0RlY29yYXRvcnMgPSB0aGlzLmdldENsYXNzRGVjb3JhdG9yc01ldGFkYXRhPE0+KG1vZGVsKTtcblxuICAgIGlmICghY2xhc3NEZWNvcmF0b3JzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihcbiAgICAgICAgYE5vIHVpIGRlZmluaXRpb25zIHNldCBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfS4gRGlkIHlvdSB1c2UgQHVpbW9kZWw/YFxuICAgICAgKTtcblxuICAgIGNvbnN0IGNsYXNzRGVjb3JhdG9yID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHt9LFxuICAgICAgLi4uY2xhc3NEZWNvcmF0b3JzLFxuICAgICAgaW5oZXJpdFByb3BzID8gaW5oZXJpdFByb3BzIDoge30gLy8gb3ZlcnJpZGUgdGFnIGFuZCBwcm9wZXJ0aWVzIHdoZW4gaXQgaXMgYSBjb21wb25lbnQgdGhhdCBzaG91bGQgaW5oZXJpdCBwcm9wZXJ0aWVzIGZyb20gaXRzIHBhcmVudC5cbiAgICApO1xuICAgIGNvbnN0IHsgdGFnLCBwcm9wcywgaXRlbSwgaGFuZGxlcnMgfSA9IGNsYXNzRGVjb3JhdG9yO1xuXG4gICAgY29uc3QgdWlEZWNvcmF0b3JzID0gTW9kZWwudWlQcm9wZXJ0aWVzT2YoXG4gICAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPlxuICAgICkgYXMgKGtleW9mIE0pW107XG5cbiAgICAvLyBjb25zdCB1aURlY29yYXRvcnM6IFJlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhW10+ID1cbiAgICAvLyAgIFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKG1vZGVsLCBVSUtleXMuUkVGTEVDVCkgYXMgUmVjb3JkPFxuICAgIC8vICAgICBzdHJpbmcsXG4gICAgLy8gICAgIERlY29yYXRvck1ldGFkYXRhW11cbiAgICAvLyAgID47XG4gICAgbGV0IGNoaWxkcmVuOiBGaWVsZERlZmluaXRpb248UmVjb3JkPHN0cmluZywgYW55Pj5bXSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgY2hpbGRQcm9wczogUmVjb3JkPHN0cmluZywgYW55PiA9IGl0ZW0/LnByb3BzIHx8IHt9O1xuICAgIGxldCBtYXBwZXI6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBnZXRQYXRoID0gKHBhcmVudDogc3RyaW5nIHwgdW5kZWZpbmVkLCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgIHJldHVybiBwYXJlbnQgPyBbcGFyZW50LCBwcm9wXS5qb2luKFwiLlwiKSA6IHByb3A7XG4gICAgfTtcblxuICAgIGlmICh1aURlY29yYXRvcnMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25EZWNvcmF0b3JzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID1cbiAgICAgICAgTWV0YWRhdGEuZ2V0KFxuICAgICAgICAgIG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yLFxuICAgICAgICAgIFZhbGlkYXRpb25LZXlzLlJFRkxFQ1RcbiAgICAgICAgKSB8fCB7fTtcbiAgICAgIC8vIGNvbnN0IHZhbGlkYXRpb25EZWNvcmF0b3JzOiBSZWNvcmQ8XG4gICAgICAvLyAgIHN0cmluZyxcbiAgICAgIC8vICAgRGVjb3JhdG9yTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPltdXG4gICAgICAvLyA+ID0gUmVmbGVjdGlvbi5nZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICAvLyAgIG1vZGVsLFxuICAgICAgLy8gICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNUXG4gICAgICAvLyApIGFzIFJlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT5bXT47XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiB1aURlY29yYXRvcnMpIHtcbiAgICAgICAgY29uc3QgZGVjcyA9IE1vZGVsLnVpRGVjb3JhdGlvbk9mKFxuICAgICAgICAgIG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+LFxuICAgICAgICAgIGtleVxuICAgICAgICApO1xuICAgICAgICBsZXQgdHlwZTogYW55O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICB0eXBlID0gTW9kZWwudWlUeXBlT2YobW9kZWwuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4sIGtleSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgTm90Rm91bmRFcnJvcikpIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc3QgdHlwZXMgPSBPYmplY3QudmFsdWVzKGRlY3MpLmZpbHRlcigoeyBrZXkgfSkgPT5cbiAgICAgICAgLy8gICBbVUlLZXlzLlBST1AsIFVJS2V5cy5FTEVNRU5ULCBVSUtleXMuQ0hJTERdLmluY2x1ZGVzKGtleSlcbiAgICAgICAgLy8gKTtcbiAgICAgICAgLy8gaWYgKCF0eXBlKVxuICAgICAgICAvLyAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihcbiAgICAgICAgLy8gICAgIGBPbmx5IG9uZSB0eXBlIG9mIGRlY29yYXRpb24gaXMgYWxsb3dlZC4gUGxlYXNlIGNob29zZSBiZXR3ZWVuIEB1aXByb3AsIEB1aWNoaWxkIG9yIEB1aWVsZW1lbnRgXG4gICAgICAgIC8vICAgKTtcbiAgICAgICAgY29uc3QgaGFzSGlkZU9uRGVjb3JhdG9yID0gTW9kZWwudWlJc0hpZGRlbihcbiAgICAgICAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPixcbiAgICAgICAgICBrZXlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGhhc0hpZGVPbkRlY29yYXRvcikge1xuICAgICAgICAgIGNvbnN0IGhhc1VpRWxlbWVudERlY29yYXRvciA9IE1vZGVsLnVpRWxlbWVudE9mKFxuICAgICAgICAgICAgbW9kZWwuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4sXG4gICAgICAgICAgICBrZXlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghaGFzVWlFbGVtZW50RGVjb3JhdG9yKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJlbmRlcmluZ0Vycm9yKFxuICAgICAgICAgICAgICBgQHVpZWxlbWVudCBubyBmb3VuZCBpbiBcIiR7a2V5IGFzIHN0cmluZ31cIi4gSXQgaXMgcmVxdWlyZWQgdG8gdXNlIGhpZGRlbk9uIGRlY29yYXRvci5gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvcnRlZCA9IE9iamVjdC5lbnRyaWVzKGRlY3MpXG4gICAgICAgICAgLm1hcCgoW2ssIHZdKSA9PiAoe1xuICAgICAgICAgICAga2V5OiBrLFxuICAgICAgICAgICAgcHJvcHM6IHYsXG4gICAgICAgICAgfSkpXG4gICAgICAgICAgLnNvcnQoKGEpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbVUlLZXlzLkVMRU1FTlQsIFVJS2V5cy5DSElMRF0uaW5jbHVkZXMoYS5rZXkpID8gLTEgOiAxO1xuICAgICAgICAgIH0pO1xuICAgICAgICBzb3J0ZWQuZm9yRWFjaCgoZGVjKSA9PiB7XG4gICAgICAgICAgaWYgKCFkZWMpIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihgTm8gZGVjb3JhdG9yIGZvdW5kYCk7XG5cbiAgICAgICAgICBzd2l0Y2ggKGRlYy5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLlBST1A6IHtcbiAgICAgICAgICAgICAgY2hpbGRQcm9wc1trZXkgYXMgYW55XSA9IGRlYy5wcm9wcyBhcyBVSVByb3BNZXRhZGF0YTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5DSElMRDoge1xuICAgICAgICAgICAgICBjb25zdCBtb2RlbE5hbWUgPVxuICAgICAgICAgICAgICAgIChkZWMucHJvcHMgYXMgVUlNb2RlbE1ldGFkYXRhKT8ucHJvcHM/Lm5hbWUgfHwgKGtleSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzUHJvcGVydHlNb2RlbCA9XG4gICAgICAgICAgICAgICAgICBNb2RlbC5pc01vZGVsKE1vZGVsLmJ1aWxkKHt9LCBtb2RlbE5hbWUpKSB8fFxuICAgICAgICAgICAgICAgICAgTW9kZWwuaXNQcm9wZXJ0eU1vZGVsKG1vZGVsLCBtb2RlbE5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICghaXNQcm9wZXJ0eU1vZGVsKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlbmRlcmluZ0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICBgQ2hpbGQgXCIke21vZGVsTmFtZSBhcyBzdHJpbmd9XCIgbXVzdCBiZSBhIG1vZGVsLmBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlbmRlcmluZ0Vycm9yKFxuICAgICAgICAgICAgICAgICAgYENoaWxkIFwiJHttb2RlbE5hbWUgYXMgc3RyaW5nfVwiIG11c3QgYmUgYSBtb2RlbC5gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGxldCBDbGF6ejtcbiAgICAgICAgICAgICAgY29uc3Qgc3VibW9kZWwgPSAobW9kZWwgYXMgUmVjb3JkPHN0cmluZywgYW55PilbXG4gICAgICAgICAgICAgICAga2V5IGFzIGFueVxuICAgICAgICAgICAgICBdIGFzIE1vZGVsO1xuICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RhYmxlID1cbiAgICAgICAgICAgICAgICB0eXBlb2Ygc3VibW9kZWwgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICAgICBzdWJtb2RlbCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICFBcnJheS5pc0FycmF5KHN1Ym1vZGVsKTtcbiAgICAgICAgICAgICAgLy8gY3JlYXRlIGluc3RhbmNlIGlmIHVuZGVmaW5lZFxuICAgICAgICAgICAgICBpZiAoIWNvbnN0cnVjdGFibGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGF6ek5hbWUgPSAoXG4gICAgICAgICAgICAgICAgICAoZGVjLnByb3BzIGFzIGFueSkucHJvcHMgYXMgUmVjb3JkPHN0cmluZywgYW55PlxuICAgICAgICAgICAgICAgICk/Lm5hbWUgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgIENsYXp6ID0gbmV3IChNb2RlbC5nZXQoY2xhenpOYW1lKSBhcyBNb2RlbENvbnN0cnVjdG9yPE1vZGVsPikoKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gfHwgW107XG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuR2xvYmFsUHJvcHMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgIGdsb2JhbFByb3BzIHx8IHt9LFxuICAgICAgICAgICAgICAgIHsgbW9kZWw6IENsYXp6IH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaW5oZXJpdFByb3BzOiBkZWMucHJvcHMgYXMgVUlNb2RlbE1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgY2hpbGRPZjogZ2V0UGF0aChcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsUHJvcHM/LmNoaWxkT2YgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBrZXkgYXMgc3RyaW5nXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY29uc3QgY2hpbGREZWZpbml0aW9uID0gdGhpcy50b0ZpZWxkRGVmaW5pdGlvbihcbiAgICAgICAgICAgICAgICBzdWJtb2RlbCB8fCBDbGF6eiwgLy8gTXVzdCBhdm9pZCB1bmRlZmluZWQgdmFsdWVzIOKAlCBhbiBpbnN0YW5jZSBpcyByZXF1aXJlZCB0byByZXRyaWV2ZSBwcm9wZXJ0aWVzLlxuICAgICAgICAgICAgICAgIGNoaWxkcmVuR2xvYmFsUHJvcHMsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY29uc3QgeyBpbmhlcml0UHJvcHMgfSA9IGNoaWxkcmVuR2xvYmFsUHJvcHM7XG4gICAgICAgICAgICAgIGlmIChpbmhlcml0UHJvcHMpXG4gICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzLFxuICAgICAgICAgICAgICAgICAgaW5oZXJpdFByb3BzLnByb3BzIHx8IHt9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcbiAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24gYXMgRmllbGREZWZpbml0aW9uPFJlY29yZDxzdHJpbmcsIGFueT4+XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBVSUtleXMuVUlMSVNUUFJPUDoge1xuICAgICAgICAgICAgICBtYXBwZXIgPSBtYXBwZXIgfHwge307XG4gICAgICAgICAgICAgIGNvbnN0IGRlY1Byb3BzID0gZGVjLnByb3BzIGFzIFVJTGlzdFByb3BNZXRhZGF0YTtcbiAgICAgICAgICAgICAgaWYgKGRlY1Byb3BzLm5hbWUpXG4gICAgICAgICAgICAgICAgbWFwcGVyW2RlY1Byb3BzLm5hbWVdID1cbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBkZWNQcm9wcz8ucHJvcHMgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICAgICAgIFVJS2V5cy5TRVFVRU5DRSBpbiBkZWNQcm9wcy5wcm9wc1xuICAgICAgICAgICAgICAgICAgICA/IGRlY1Byb3BzLnByb3BzXG4gICAgICAgICAgICAgICAgICAgIDoga2V5O1xuXG4gICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICBjbGFzc0RlY29yYXRvci5wcm9wcz8uaXRlbSB8fCB7fSxcbiAgICAgICAgICAgICAgICBpdGVtPy5wcm9wcyB8fCB7fSxcbiAgICAgICAgICAgICAgICBkZWNQcm9wcz8ucHJvcHMgfHwge30sXG4gICAgICAgICAgICAgICAgZ2xvYmFsUHJvcHNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY2hpbGRQcm9wcyA9IHtcbiAgICAgICAgICAgICAgICB0YWc6IGl0ZW0/LnRhZyB8fCBwcm9wcy5yZW5kZXIgfHwgXCJcIixcbiAgICAgICAgICAgICAgICBwcm9wczogT2JqZWN0LmFzc2lnbih7fSwgY2hpbGRQcm9wcz8ucHJvcHMsIHsgbWFwcGVyIH0sIHByb3BzKSxcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLkVWRU5UUzpcbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLkhJRERFTjpcbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLkhJREVfRk9SOlxuICAgICAgICAgICAgY2FzZSBVSUtleXMuU0hPV19GT1I6XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5QQUdFOlxuICAgICAgICAgICAgY2FzZSBVSUtleXMuT1JERVI6XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5VSUxBWU9VVFBST1A6XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5FTEVNRU5UOiB7XG4gICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gfHwgW107XG4gICAgICAgICAgICAgIGNvbnN0IHVpUHJvcHM6IFVJRWxlbWVudE1ldGFkYXRhID0gZGVjLnByb3BzIGFzIFVJRWxlbWVudE1ldGFkYXRhO1xuICAgICAgICAgICAgICBjb25zdCB2aXNpYmlsaXR5UHJvcHMgPVxuICAgICAgICAgICAgICAgIGRlYy5rZXkgPT09IFVJS2V5cy5ISURFX0ZPUlxuICAgICAgICAgICAgICAgICAgPyB7IGhpZGVGb3I6IGRlYy5wcm9wcyBhcyBzdHJpbmdbXSB9XG4gICAgICAgICAgICAgICAgICA6IGRlYy5rZXkgPT09IFVJS2V5cy5TSE9XX0ZPUlxuICAgICAgICAgICAgICAgICAgICA/IHsgc2hvd0ZvcjogZGVjLnByb3BzIGFzIHN0cmluZ1tdIH1cbiAgICAgICAgICAgICAgICAgICAgOiB7fTtcbiAgICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgIGNoaWxkUHJvcHM/LnByb3BzLFxuICAgICAgICAgICAgICAgIHVpUHJvcHMucHJvcHMgfHwge30sXG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eVByb3BzLFxuICAgICAgICAgICAgICAgIHVpUHJvcHM/LnByb3BzPy5uYW1lXG4gICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBnZXRQYXRoKFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsUHJvcHM/LmNoaWxkT2YgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdWlQcm9wcy5wcm9wcyEubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgY2hpbGRPZjogdW5kZWZpbmVkLCAvLyBUaGUgY2hpbGRPZiBwcm9wIGlzIHBhc3NlZCBieSBnbG9iYWxQcm9wcyB3aGVuIGl0IGlzIGEgbmVzdGVkIHByb3BcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgOiB7fSxcbiAgICAgICAgICAgICAgICBnbG9iYWxQcm9wcyxcbiAgICAgICAgICAgICAgICB7IG5hbWU6IHVpUHJvcHMucHJvcHM/Lm5hbWUgfHwga2V5IH1cbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBpZiAoZGVjLmtleSA9PT0gVUlLZXlzLkVMRU1FTlQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZERlZmluaXRpb246IEZpZWxkRGVmaW5pdGlvbjxSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IHtcbiAgICAgICAgICAgICAgICAgIHRhZzogdWlQcm9wcy50YWcgfHwgY2hpbGRQcm9wcz8udGFnIHx8IHRhZyB8fCBcIlwiLFxuICAgICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uRGVjcyA9IHZhbGlkYXRpb25EZWNvcmF0b3JzW1xuICAgICAgICAgICAgICAgICAga2V5IGFzIGFueVxuICAgICAgICAgICAgICAgIF0gYXMgVmFsaWRhdGlvbk1ldGFkYXRhW107XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25EZWNzKSB7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlYyBvZiBPYmplY3QuZW50cmllcyh2YWxpZGF0aW9uRGVjcykubWFwKFxuICAgICAgICAgICAgICAgICAgICAoW2ssIHZdKSA9PiAoeyBrZXk6IGssIHByb3BzOiB2IH0pXG4gICAgICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWRhdGFibGVCeUF0dHJpYnV0ZShkZWMua2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wc1t0aGlzLnRyYW5zbGF0ZShkZWMua2V5KV0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b0F0dHJpYnV0ZVZhbHVlKGRlYy5rZXksIGRlYy5wcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZGF0YWJsZUJ5VHlwZShkZWMua2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWMua2V5ID09PSBIVE1MNUlucHV0VHlwZXMuREFURSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5GT1JNQVRdID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjLnByb3BzLmZvcm1hdCB8fCBIVE1MNURhdGVGb3JtYXQ7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wc1tVSUtleXMuVFlQRV0gPSBkZWMua2V5O1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ3VzdG9tVmFsaWRhdG9yKGRlYy5rZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcHJvcHNbVUlLZXlzLlNVQl9UWVBFXSA9IGRlYy5rZXk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYy5wcm9wcz8ubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHNbVUlLZXlzLlZBTElEQVRJT05fTUVTU0FHRV0gPSBkZWMucHJvcHMubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWNoaWxkRGVmaW5pdGlvbi5wcm9wc1tVSUtleXMuVFlQRV0pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljVHlwZSA9IE1ldGFkYXRhLnR5cGUoXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBrZXkgYXMgc3RyaW5nXG4gICAgICAgICAgICAgICAgICApLm5hbWU7XG4gICAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbVUlLZXlzLlRZUEVdID0gdGhpcy50cmFuc2xhdGUoXG4gICAgICAgICAgICAgICAgICAgIGJhc2ljVHlwZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wcy52YWx1ZSA9IGZvcm1hdEJ5VHlwZShcbiAgICAgICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wc1tVSUtleXMuVFlQRV0sXG4gICAgICAgICAgICAgICAgICBtb2RlbFtrZXkgYXMga2V5b2YgTV0sXG4gICAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbVUlLZXlzLkZPUk1BVF1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGREZWZpbml0aW9uKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbi5maW5kKFxuICAgICAgICAgICAgICAgIChjKSA9PlxuICAgICAgICAgICAgICAgICAgYy5wcm9wcz8ubmFtZSA9PT0ga2V5IHx8XG4gICAgICAgICAgICAgICAgICAoW1VJS2V5cy5VSUxBWU9VVFBST1AsIFVJS2V5cy5QQUdFLCBVSUtleXMuRVZFTlRTXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgZGVjLmtleVxuICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICAoYy5wcm9wcz8uY2hpbGRPZiA9PT0ga2V5IHx8XG4gICAgICAgICAgICAgICAgICAgICAgYy5wcm9wcz8uY2hpbGRPZj8uZW5kc1dpdGgoYC4ke2tleSBhcyBzdHJpbmd9YCkpKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgZGVjLmtleSA9PT0gVUlLZXlzLkhJREVfRk9SIHx8XG4gICAgICAgICAgICAgICAgICAgIGRlYy5rZXkgPT09IFVJS2V5cy5TSE9XX0ZPUlxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgY2hpbGQucHJvcHMsIHZpc2liaWxpdHlQcm9wcyk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlYy5rZXkgIT09IFVJS2V5cy5VSUxBWU9VVFBST1ApIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQucHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBjaGlsZC5wcm9wcywge1xuICAgICAgICAgICAgICAgICAgICAgIFtkZWMua2V5XTogdWlQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHJvdywgY29sLCBwcm9wcyB9ID0gZGVjLnByb3BzIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQucHJvcHMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgICAgIHByb3BzIHx8IHt9LFxuICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgIHJvdyxcbiAgICAgICAgICAgICAgICAgICAgICBjb2xcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoYEludmFsaWQga2V5OiAke2RlYy5rZXl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBnbG9iYWxQcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCBnbG9iYWxQcm9wcywge1xuICAgICAgaGFuZGxlcnM6IGhhbmRsZXJzIHx8IHt9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgY3VycmVudE5hbWVzcGFjZXMgPSBuZXcgU2V0KFxuICAgICAgW1xuICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShnbG9iYWxQcm9wcz8ubmFtZXNwYWNlcylcbiAgICAgICAgICA/IChnbG9iYWxQcm9wcy5uYW1lc3BhY2VzIGFzIHN0cmluZ1tdKVxuICAgICAgICAgIDogW10pLFxuICAgICAgICAuLi4odHlwZW9mIGdsb2JhbFByb3BzPy5uYW1lc3BhY2UgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IFtnbG9iYWxQcm9wcy5uYW1lc3BhY2UgYXMgc3RyaW5nXVxuICAgICAgICAgIDogW10pLFxuICAgICAgXS5maWx0ZXIoQm9vbGVhbilcbiAgICApO1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IGdsb2JhbFByb3BzPy5vcGVyYXRpb247XG4gICAgY2hpbGRyZW4gPSB0aGlzLnNvcnRDaGlsZHJlbkJ5T3JkZXIoY2hpbGRyZW4pLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgaGlkZGVuT24gPSAoaXRlbT8ucHJvcHM/LmhpZGRlbiBhcyBDcnVkT3BlcmF0aW9uS2V5c1tdKSB8fCBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgaGlkZGVuT24ubGVuZ3RoID4gMCAmJlxuICAgICAgICBoaWRkZW5Pbi5pbmNsdWRlcyhvcGVyYXRpb24gYXMgQ3J1ZE9wZXJhdGlvbktleXMpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBoaWRlRm9yID0gKGl0ZW0/LnByb3BzPy5oaWRlRm9yIGFzIHN0cmluZ1tdKSB8fCBbXTtcbiAgICAgIGNvbnN0IHNob3dGb3IgPSAoaXRlbT8ucHJvcHM/LnNob3dGb3IgYXMgc3RyaW5nW10pIHx8IFtdO1xuICAgICAgaWYgKFxuICAgICAgICBoaWRlRm9yLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgWy4uLmN1cnJlbnROYW1lc3BhY2VzXS5zb21lKChuYW1lc3BhY2UpID0+IGhpZGVGb3IuaW5jbHVkZXMobmFtZXNwYWNlKSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHNob3dGb3IubGVuZ3RoID4gMCAmJlxuICAgICAgICAhWy4uLmN1cnJlbnROYW1lc3BhY2VzXS5zb21lKChuYW1lc3BhY2UpID0+IHNob3dGb3IuaW5jbHVkZXMobmFtZXNwYWNlKSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHQ6IEZpZWxkRGVmaW5pdGlvbjxUPiA9IHtcbiAgICAgIHRhZzogdGFnLFxuICAgICAgaXRlbTogY2hpbGRQcm9wcyBhcyBVSUxpc3RJdGVtRWxlbWVudE1ldGFkYXRhLFxuICAgICAgcHJvcHM6IGdsb2JhbFByb3BzIGFzIFQgJiBGaWVsZFByb3BlcnRpZXMgJiBJUGFnZWRDb21wb25lbnRQcm9wZXJ0aWVzLFxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuPy5sZW5ndGhcbiAgICAgICAgPyAoY2hpbGRyZW4gYXMgRmllbGREZWZpbml0aW9uPGFueT5bXSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfTtcblxuICAgIGlmIChnZW5lcmF0ZUlkKSByZXN1bHQucmVuZGVyZXJJZCA9IGdlbmVyYXRlVUlNb2RlbElEKG1vZGVsKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW5kZXJzIGEgbW9kZWwgd2l0aCBnbG9iYWwgcHJvcGVydGllcyBhbmQgYWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0byBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIHRvIGRlZmluZSBzcGVjaWZpYyByZW5kZXJpbmcgYmVoYXZpb3IuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBNIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEB0ZW1wbGF0ZSBSIFJlbmRlcmluZyBlbmdpbmUgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgb3V0cHV0IHR5cGVcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byBiZSByZW5kZXJlZC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gZ2xvYmFsUHJvcHMgLSBHbG9iYWwgcHJvcGVydGllcyB0byBiZSBhcHBsaWVkIHRvIGFsbCBlbGVtZW50cyBkdXJpbmcgcmVuZGVyaW5nLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCBtYXkgYmUgcmVxdWlyZWQgZm9yIHNwZWNpZmljIHJlbmRlcmluZyBpbXBsZW1lbnRhdGlvbnMuXG4gICAqIEByZXR1cm5zIHtSfSBUaGUgcmVuZGVyZWQgcmVzdWx0LCB0eXBlIGRlcGVuZHMgb24gdGhlIHNwZWNpZmljIGltcGxlbWVudGF0aW9uLlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIGFic3RyYWN0IHJlbmRlcjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIGdsb2JhbFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBSO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGEgcmVuZGVyaW5nIGVuZ2luZSBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgQWRkcyBhIHJlbmRlcmluZyBlbmdpbmUgdG8gdGhlIHN0YXRpYyBjYWNoZSBhbmQgc2V0cyBpdCBhcyB0aGUgY3VycmVudCBlbmdpbmUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+fSBlbmdpbmUgLSBUaGUgcmVuZGVyaW5nIGVuZ2luZSB0byByZWdpc3Rlci5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgYW4gZW5naW5lIHdpdGggdGhlIHNhbWUgZmxhdm9yIGFscmVhZHkgZXhpc3RzLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXIoZW5naW5lOiBSZW5kZXJpbmdFbmdpbmU8dW5rbm93biwgdW5rbm93bj4pIHtcbiAgICBpZiAoZW5naW5lLmZsYXZvdXIgaW4gdGhpcy5jYWNoZSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgUmVuZGVyaW5nIGVuZ2luZSB1bmRlciAke2VuZ2luZS5mbGF2b3VyfSBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICk7XG4gICAgdGhpcy5jYWNoZVtlbmdpbmUuZmxhdm91cl0gPSBlbmdpbmU7XG4gICAgdGhpcy5jdXJyZW50ID0gZW5naW5lO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgb3IgaW5pdGlhbGl6ZXMgYSByZW5kZXJpbmcgZW5naW5lLlxuICAgKiBAc3VtbWFyeSBHZXRzIGFuIGV4aXN0aW5nIGVuZ2luZSBpbnN0YW5jZSBvciBjcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIG5ldyBvbmUgaWYgZ2l2ZW4gYSBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogQHRlbXBsYXRlIE8gVGhlIHR5cGUgb2YgdGhlIHJlbmRlcmluZyBlbmdpbmUgb3V0cHV0XG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8UmVuZGVyaW5nRW5naW5lPE8+PiB8IFJlbmRlcmluZ0VuZ2luZTxPPn0gb2JqIC0gVGhlIGVuZ2luZSBpbnN0YW5jZSBvciBjb25zdHJ1Y3Rvci5cbiAgICogQHJldHVybnMge1JlbmRlcmluZ0VuZ2luZTxPPn0gVGhlIGluaXRpYWxpemVkIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldE9yQm9vdDxPPihcbiAgICBvYmo6IENvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTxPPj4gfCBSZW5kZXJpbmdFbmdpbmU8Tz5cbiAgKTogUmVuZGVyaW5nRW5naW5lPE8+IHtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVuZGVyaW5nRW5naW5lKSByZXR1cm4gb2JqIGFzIFJlbmRlcmluZ0VuZ2luZTxPPjtcbiAgICBjb25zdCBlbmdpbmU6IFJlbmRlcmluZ0VuZ2luZTxPPiA9IG5ldyBvYmooKTtcbiAgICBlbmdpbmUuaW5pdGlhbGl6ZSgpOyAvLyBtYWtlIHRoZSBib290aW5nIGFzeW5jLiB1c2UgdGhlIGluaXRpYWxpemVkIGZsYWcgdG8gY29udHJvbCBpdFxuICAgIHJldHVybiBlbmdpbmUgYXMgUmVuZGVyaW5nRW5naW5lPE8+O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZW5kZXJpbmcgZW5naW5lIGJ5IGZsYXZvci5cbiAgICogQHN1bW1hcnkgR2V0cyB0aGUgY3VycmVudCByZW5kZXJpbmcgZW5naW5lIG9yIGEgc3BlY2lmaWMgb25lIGJ5IGZsYXZvci5cbiAgICpcbiAgICogQHRlbXBsYXRlIE8gVGhlIHR5cGUgb2YgdGhlIHJlbmRlcmluZyBlbmdpbmUgb3V0cHV0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cl0gLSBUaGUgZmxhdm9yIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lIHRvIHJldHJpZXZlLlxuICAgKiBAcmV0dXJucyB7UmVuZGVyaW5nRW5naW5lPE8+fSBUaGUgcmVxdWVzdGVkIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSByZXF1ZXN0ZWQgZmxhdm9yIGRvZXMgbm90IGV4aXN0LlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgZ2V0PE8+KGZsYXZvdXI/OiBzdHJpbmcpOiBSZW5kZXJpbmdFbmdpbmU8Tz4ge1xuICAgIGlmICghZmxhdm91cilcbiAgICAgIHJldHVybiB0aGlzLmdldE9yQm9vdDxPPihcbiAgICAgICAgdGhpcy5jdXJyZW50IGFzIENvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTxPPj4gfCBSZW5kZXJpbmdFbmdpbmU8Tz5cbiAgICAgICk7XG4gICAgaWYgKCEoZmxhdm91ciBpbiB0aGlzLmNhY2hlKSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgUmVuZGVyaW5nIGVuZ2luZSB1bmRlciAke2ZsYXZvdXJ9IGRvZXMgbm90IGV4aXN0YFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5nZXRPckJvb3Q8Tz4oXG4gICAgICB0aGlzLmNhY2hlW2ZsYXZvdXJdIGFzXG4gICAgICAgIHwgQ29uc3RydWN0b3I8UmVuZGVyaW5nRW5naW5lPE8+PlxuICAgICAgICB8IFJlbmRlcmluZ0VuZ2luZTxPPlxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlbmRlcnMgYSBtb2RlbCB1c2luZyB0aGUgYXBwcm9wcmlhdGUgcmVuZGVyaW5nIGVuZ2luZS5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB0aGUgY29ycmVjdCByZW5kZXJpbmcgZW5naW5lIGZvciBhIG1vZGVsIGFuZCBpbnZva2VzIGl0cyByZW5kZXIgbWV0aG9kLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgTSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIHRvIHJlbmRlci5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHJlbmRlciBtZXRob2QuXG4gICAqIEByZXR1cm5zIHthbnl9IFRoZSByZXN1bHQgb2YgdGhlIHJlbmRlcmluZyBwcm9jZXNzLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBubyByZWdpc3RlcmVkIG1vZGVsIGlzIGZvdW5kLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgcmVuZGVyPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0sIC4uLmFyZ3M6IGFueVtdKTogYW55IHtcbiAgICBjb25zdCBjb25zdHJ1Y3RvciA9XG4gICAgICBNb2RlbC5nZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSkgfHwgTW9kZWwuZnJvbU9iamVjdChtb2RlbCk7XG4gICAgaWYgKCFjb25zdHJ1Y3RvcikgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJObyBtb2RlbCByZWdpc3RlcmVkIGZvdW5kXCIpO1xuICAgIGNvbnN0IGZsYXZvdXIgPSBNb2RlbC5yZW5kZXJlZEJ5KG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KTtcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgZm9yIHRoZSB2YXIgYXJncyB0eXBlIGNoZWNrXG4gICAgcmV0dXJuIFJlbmRlcmluZ0VuZ2luZS5nZXQoZmxhdm91cikucmVuZGVyKG1vZGVsLCAuLi5hcmdzKTtcbiAgfVxufVxuLy9cbi8vIERlY29yYXRpb24uZm9yKERCS2V5cy5JRClcbi8vICAgLmV4dGVuZCh7XG4vLyAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBwayhvcHRpb25zOiB7IGdlbmVyYXRlZDogYm9vbGVhbiB9KSB7XG4vLyAgICAgICByZXR1cm4gZnVuY3Rpb24gaW5uZXJQayh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbi8vICAgICAgICAgaWYgKG9wdGlvbnMuZ2VuZXJhdGVkKVxuLy8gICAgICAgICAgIGhpZGVPbihPcGVyYXRpb25LZXlzLkNSRUFURSwgT3BlcmF0aW9uS2V5cy5VUERBVEUpKFxuLy8gICAgICAgICAgICAgdGFyZ2V0LFxuLy8gICAgICAgICAgICAgcHJvcGVydHlLZXlcbi8vICAgICAgICAgICApO1xuLy8gICAgICAgfTtcbi8vICAgICB9LFxuLy8gICB9KVxuLy8gICAuYXBwbHkoKTtcbi8vXG4vLyBEZWNvcmF0aW9uLmZvcihEQktleXMuVElNRVNUQU1QKVxuLy8gICAuZXh0ZW5kKHtcbi8vICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIHRpbWVzdGFtcChvcHM6IE9wZXJhdGlvbktleXNbXSkge1xuLy8gICAgICAgcmV0dXJuIGhpZGVPbiguLi4ob3BzIGFzIGFueVtdKSk7XG4vLyAgICAgfSxcbi8vICAgfSlcbi8vICAgLmFwcGx5KCk7XG4vL1xuLy8gRGVjb3JhdGlvbi5mb3IoREJLZXlzLkNPTVBPU0VEKVxuLy8gICAuZXh0ZW5kKHtcbi8vICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGNvbXBvc2VkKCkge1xuLy8gICAgICAgcmV0dXJuIGhpZGVPbihPcGVyYXRpb25LZXlzLkNSRUFURSwgT3BlcmF0aW9uS2V5cy5VUERBVEUpO1xuLy8gICAgIH0sXG4vLyAgIH0pXG4vLyAgIC5hcHBseSgpO1xuLy9cbi8vIERlY29yYXRpb24uZm9yKFwiY3JlYXRlZEJ5XCIpXG4vLyAgIC5leHRlbmQoe1xuLy8gICAgIGRlY29yYXRvcjogZnVuY3Rpb24gY3JlYXRlZEJ5KCkge1xuLy8gICAgICAgcmV0dXJuIGhpZGVPbihPcGVyYXRpb25LZXlzLkNSRUFURSwgT3BlcmF0aW9uS2V5cy5VUERBVEUpO1xuLy8gICAgIH0sXG4vLyAgIH0pXG4vLyAgIC5hcHBseSgpO1xuLy9cbi8vIERlY29yYXRpb24uZm9yKFwidXBkYXRlZEJ5XCIpXG4vLyAgIC5leHRlbmQoe1xuLy8gICAgIGRlY29yYXRvcjogZnVuY3Rpb24gY3JlYXRlZEJ5KCkge1xuLy8gICAgICAgcmV0dXJuIGhpZGVPbihPcGVyYXRpb25LZXlzLkNSRUFURSwgT3BlcmF0aW9uS2V5cy5VUERBVEUpO1xuLy8gICAgIH0sXG4vLyAgIH0pXG4vLyAgIC5hcHBseSgpO1xuIiwiaW1wb3J0IHsgVUlLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBwcm9wTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIENydWRPcGVyYXRpb25LZXlzLFxuICBVSUVsZW1lbnRNZXRhZGF0YSxcbiAgVUlFdmVudEhhbmRsZXIsXG4gIFVJRXZlbnROYW1lLFxuICBVSUZ1bmN0aW9uTGlrZSxcbiAgVUlMYXlvdXRDb2wsXG4gIFVJTGF5b3V0UHJvcE1ldGFkYXRhLFxuICBVSUxpc3RQcm9wTWV0YWRhdGEsXG4gIFVJUHJvcE1ldGFkYXRhLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgZ2V0VUlBdHRyaWJ1dGVLZXkgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBoaWRlcyBhIHByb3BlcnR5IGR1cmluZyBzcGVjaWZpYyBDUlVEIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IENvbnRyb2xzIHByb3BlcnR5IHZpc2liaWxpdHkgYmFzZWQgb24gb3BlcmF0aW9uIHR5cGVcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB3aGljaCBDUlVEIG9wZXJhdGlvbnMgc2hvdWxkIGhpZGUgYSBwcm9wZXJ0eVxuICogaW4gdGhlIFVJLiBUaGUgcHJvcGVydHkgd2lsbCBvbmx5IGJlIHZpc2libGUgZHVyaW5nIG9wZXJhdGlvbnMgbm90IHNwZWNpZmllZC5cbiAqXG4gKiBAcGFyYW0gb3BlcmF0aW9ucyAtIFRoZSBDUlVEIG9wZXJhdGlvbnMgZHVyaW5nIHdoaWNoIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgaGlkZGVuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gaGlkZU9uXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIaWRlIHRoZSBwYXNzd29yZCBmaWVsZCBkdXJpbmcgUkVBRCBvcGVyYXRpb25zXG4gKiBjbGFzcyBVc2VyIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQGhpZGVPbihPcGVyYXRpb25LZXlzLlJFQUQpXG4gKiAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBoaWRlT25cbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IFVJXG4gKiAgIE1vZGVsLT4+aGlkZU9uOiBBcHBseSB0byBwcm9wZXJ0eVxuICogICBoaWRlT24tPj5Nb2RlbDogQWRkIGhpZGRlbiBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogQ2hlY2sgaWYgcHJvcGVydHkgc2hvdWxkIGJlIGhpZGRlblxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIGhpZGRlbiBvcGVyYXRpb25zXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlVJOiBSZW5kZXIgb3IgaGlkZSBiYXNlZCBvbiBjdXJyZW50IG9wZXJhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlkZU9uKC4uLm9wZXJhdGlvbnM6IENydWRPcGVyYXRpb25LZXlzW10pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGhpZGVPbihvYmplY3Q6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICByZXR1cm4gcHJvcE1ldGFkYXRhKFxuICAgICAgZ2V0VUlBdHRyaWJ1dGVLZXkocHJvcGVydHlLZXksIFVJS2V5cy5ISURERU4pLFxuICAgICAgb3BlcmF0aW9uc1xuICAgICkob2JqZWN0LCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IGhpZGVzIGEgcHJvcGVydHkgZm9yIHNwZWNpZmljIG5hbWVzcGFjZXMuXG4gKiBAc3VtbWFyeSBDb250cm9scyBwcm9wZXJ0eSB2aXNpYmlsaXR5IGJhc2VkIG9uIG5hbWVzcGFjZSBtZW1iZXJzaGlwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlkZUZvciguLi5uYW1lc3BhY2VzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gZnVuY3Rpb24gaGlkZUZvcihvYmplY3Q6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICByZXR1cm4gcHJvcE1ldGFkYXRhKFxuICAgICAgZ2V0VUlBdHRyaWJ1dGVLZXkocHJvcGVydHlLZXksIFVJS2V5cy5ISURFX0ZPUiksXG4gICAgICBuYW1lc3BhY2VzXG4gICAgKShvYmplY3QsIHByb3BlcnR5S2V5KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgc2hvd3MgYSBwcm9wZXJ0eSBvbmx5IGZvciBzcGVjaWZpYyBuYW1lc3BhY2VzLlxuICogQHN1bW1hcnkgTmFtZXNwYWNlLWF3YXJlIGNvdW50ZXJwYXJ0IHRvIGBoaWRlRm9yYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3dGb3IoLi4ubmFtZXNwYWNlczogc3RyaW5nW10pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNob3dGb3Iob2JqZWN0OiBhbnksIHByb3BlcnR5S2V5PzogYW55KSB7XG4gICAgcmV0dXJuIHByb3BNZXRhZGF0YShcbiAgICAgIGdldFVJQXR0cmlidXRlS2V5KHByb3BlcnR5S2V5LCBVSUtleXMuU0hPV19GT1IpLFxuICAgICAgbmFtZXNwYWNlc1xuICAgICkob2JqZWN0LCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IHJlbmRlcnMgYSBwcm9wZXJ0eSBvbmx5IHdoZW4gdGhlIG5hbWVzcGFjZSBtYXRjaGVzLlxuICogQHN1bW1hcnkgQ29udmVuaWVuY2UgYWxpYXMgZm9yIG5hbWVzcGFjZS1zY29wZWQgdmlzaWJpbGl0eSBjb250cm9sLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVySWYoLi4ubmFtZXNwYWNlczogc3RyaW5nW10pIHtcbiAgcmV0dXJuIHNob3dGb3IoLi4ubmFtZXNwYWNlcyk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IHNldHMgdGhlIG9yZGVyIG9mIGEgVUkgZWxlbWVudFxuICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSByZW5kZXJpbmcgb3JkZXIgZm9yIFVJIGNvbXBvbmVudHNcbiAqIFRoaXMgZGVjb3JhdG9yIGFwcGxpZXMgbWV0YWRhdGEgdG8gdGhlIHByb3BlcnR5IG9yIGNsYXNzLCBpbmRpY2F0aW5nIGl0cyBvcmRlciBpbiB0aGUgVUkgcmVuZGVyaW5nIHNlcXVlbmNlLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3JkZXI9MV0gVGhlIG9yZGVyIHZhbHVlIGZvciB0aGUgVUkgZWxlbWVudCAoZGVmYXVsdCBpcyAxKVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgb3IgY2xhc3MgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpb3JkZXJcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCBvcmRlciBmb3IgYSBmaWVsZFxuICogQHVpb3JkZXIoMilcbiAqIGZpZWxkTmFtZTogc3RyaW5nO1xuICpcbiAqIC8vIFNldCBvcmRlciBmb3IgYSBjbGFzc1xuICogQHVpb3JkZXIoMSlcbiAqIGNsYXNzIFVzZXJQcm9maWxlIHsgLi4uIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFN5c3RlbVxuICogICBwYXJ0aWNpcGFudCB1aW9yZGVyXG4gKiAgIHBhcnRpY2lwYW50IHByb3BlcnR5XG4gKiAgIFN5c3RlbS0+PnVpb3JkZXI6ZG8ocHJvcGVydHkpXG4gKiAgIHVpb3JkZXItPj5wcm9wZXJ0eTogc2V0cyBvcmRlciBtZXRhZGF0YVxuICogICB1aW9yZGVyLT4+U3lzdGVtOiByZXR1cm5zIGRlY29yYXRlZCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gdWlvcmRlcihcbiAgb3JkZXI6IG51bWJlciB8IHR5cGVvZiBVSUtleXMuRklSU1QgfCB0eXBlb2YgVUlLZXlzLkxBU1QgPSBVSUtleXMuRklSU1Rcbikge1xuICByZXR1cm4gZnVuY3Rpb24gdWlvcmRlcihvYmplY3Q6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICByZXR1cm4gcHJvcE1ldGFkYXRhKGdldFVJQXR0cmlidXRlS2V5KHByb3BlcnR5S2V5LCBVSUtleXMuT1JERVIpLCBvcmRlcikoXG4gICAgICBvYmplY3QsXG4gICAgICBwcm9wZXJ0eUtleVxuICAgICk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IGNvbXBsZXRlbHkgaGlkZXMgYSBwcm9wZXJ0eSBpbiBhbGwgVUkgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgTWFrZXMgYSBwcm9wZXJ0eSBpbnZpc2libGUgaW4gYWxsIENSVUQgb3BlcmF0aW9uc1xuICogVGhpcyBkZWNvcmF0b3IgaXMgYSBjb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCBoaWRlT24gdGhhdCBoaWRlcyBhIHByb3BlcnR5XG4gKiBkdXJpbmcgYWxsIENSVUQgb3BlcmF0aW9ucyAoQ1JFQVRFLCBSRUFELCBVUERBVEUsIERFTEVURSkuXG4gKlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIGhpZGRlblxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29tcGxldGVseSBoaWRlIHRoZSBpbnRlcm5hbElkIGZpZWxkIGluIHRoZSBVSVxuICogY2xhc3MgUHJvZHVjdCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBuYW1lOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQGhpZGRlbigpXG4gKiAgIGludGVybmFsSWQ6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IGhpZGRlblxuICogICBwYXJ0aWNpcGFudCBoaWRlT25cbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIE1vZGVsLT4+aGlkZGVuOiBBcHBseSB0byBwcm9wZXJ0eVxuICogICBoaWRkZW4tPj5oaWRlT246IENhbGwgd2l0aCBhbGwgb3BlcmF0aW9uc1xuICogICBoaWRlT24tPj5Nb2RlbDogQWRkIGhpZGRlbiBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogQ2hlY2sgaWYgcHJvcGVydHkgc2hvdWxkIGJlIGhpZGRlblxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIGFsbCBvcGVyYXRpb25zXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlVJOiBBbHdheXMgaGlkZSBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlkZGVuKCkge1xuICByZXR1cm4gaGlkZU9uKFxuICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICBPcGVyYXRpb25LZXlzLkRFTEVURVxuICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBzcGVjaWZpZXMgaG93IGEgcHJvcGVydHkgc2hvdWxkIGJlIHJlbmRlcmVkIGFzIGEgVUkgZWxlbWVudFxuICogQHN1bW1hcnkgTWFwcyBhIG1vZGVsIHByb3BlcnR5IHRvIGEgc3BlY2lmaWMgVUkgZWxlbWVudCB3aXRoIGN1c3RvbSBwcm9wZXJ0aWVzXG4gKiBUaGlzIGRlY29yYXRvciBhbGxvd3MgeW91IHRvIGRlZmluZSB3aGljaCBIVE1MIGVsZW1lbnQgb3IgY29tcG9uZW50IHNob3VsZCBiZSB1c2VkXG4gKiB0byByZW5kZXIgYSBzcGVjaWZpYyBwcm9wZXJ0eSwgYWxvbmcgd2l0aCBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhhdCBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIEhUTUwgZWxlbWVudCBvciBjb21wb25lbnQgdGFnIG5hbWUgdG8gdXNlIGZvciByZW5kZXJpbmdcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3Byb3BzXSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgZWxlbWVudFxuICogQHBhcmFtIHtib29sZWFufSBbc2VyaWFsaXplPWZhbHNlXSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgc2VyaWFsaXplZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpZWxlbWVudFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUmVuZGVyIGEgcHJvcGVydHkgYXMgYSB0ZXh0IGlucHV0XG4gKiBjbGFzcyBMb2dpbkZvcm0ge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpZWxlbWVudCgnaW5wdXQnLCB7IHR5cGU6ICd0ZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciB1c2VybmFtZScgfSlcbiAqICAgdXNlcm5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWllbGVtZW50KCdpbnB1dCcsIHsgdHlwZTogJ3Bhc3N3b3JkJywgcGxhY2Vob2xkZXI6ICdFbnRlciBwYXNzd29yZCcgfSlcbiAqICAgcGFzc3dvcmQ6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWllbGVtZW50KCdidXR0b24nLCB7IGNsYXNzOiAnYnRuLXByaW1hcnknIH0pXG4gKiAgIHN1Ym1pdDogc3RyaW5nID0gJ0xvZ2luJztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IHVpZWxlbWVudFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgVUlcbiAqICAgTW9kZWwtPj51aWVsZW1lbnQ6IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIHVpZWxlbWVudC0+Pk1vZGVsOiBBZGQgZWxlbWVudCBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogR2V0IGVsZW1lbnQgbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiB0YWcgYW5kIHByb3BzXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlVJOiBSZW5kZXIgd2l0aCBzcGVjaWZpZWQgZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gdWllbGVtZW50KFxuICB0YWc6IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgc2VyaWFsaXplOiBib29sZWFuID0gZmFsc2Vcbikge1xuICByZXR1cm4gKG9yaWdpbmFsOiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgaWYgKHR5cGVvZiB0YWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHByb3BzID0gdGFnO1xuICAgICAgdGFnID0gXCJcIjtcbiAgICB9XG4gICAgY29uc3QgbWV0YWRhdGE6IFVJRWxlbWVudE1ldGFkYXRhID0ge1xuICAgICAgdGFnOiB0YWcgYXMgc3RyaW5nLFxuICAgICAgc2VyaWFsaXplOiBzZXJpYWxpemUsXG4gICAgICBwcm9wczogT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMgfHwge30sIHtcbiAgICAgICAgbmFtZTogcHJvcGVydHlLZXksXG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHByb3BNZXRhZGF0YShcbiAgICAgIGdldFVJQXR0cmlidXRlS2V5KHByb3BlcnR5S2V5LCBVSUtleXMuRUxFTUVOVCksXG4gICAgICBtZXRhZGF0YVxuICAgICkob3JpZ2luYWwsIHByb3BlcnR5S2V5KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFwcyBhIG1vZGVsIHByb3BlcnR5IHRvIGEgVUkgY29tcG9uZW50IHByb3BlcnR5XG4gKiBAc3VtbWFyeSBTcGVjaWZpZXMgaG93IGEgcHJvcGVydHkgc2hvdWxkIGJlIHBhc3NlZCB0byBhIFVJIGNvbXBvbmVudFxuICogVGhpcyBkZWNvcmF0b3IgYWxsb3dzIHlvdSB0byBkZWZpbmUgaG93IGEgbW9kZWwgcHJvcGVydHkgc2hvdWxkIGJlIG1hcHBlZCB0b1xuICogYSBwcm9wZXJ0eSBvZiB0aGUgVUkgY29tcG9uZW50IHdoZW4gcmVuZGVyaW5nLiBJdCByZXF1aXJlcyB0aGUgY2xhc3MgdG8gYmVcbiAqIGRlY29yYXRlZCB3aXRoIEB1aW1vZGVsLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcE5hbWVdIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBwYXNzIHRvIHRoZSBjb21wb25lbnQgKGRlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBrZXkpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtzdHJpbmdpZnk9ZmFsc2VdIFdoZXRoZXIgdG8gc3RyaW5naWZ5IHRoZSBwcm9wZXJ0eSB2YWx1ZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpcHJvcFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTWFwIG1vZGVsIHByb3BlcnRpZXMgdG8gY29tcG9uZW50IHByb3BlcnRpZXNcbiAqIEB1aW1vZGVsKCd1c2VyLXByb2ZpbGUnKVxuICogY2xhc3MgVXNlclByb2ZpbGUge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcHJvcCgpIC8vIFdpbGwgYmUgcGFzc2VkIGFzICdmdWxsTmFtZScgdG8gdGhlIGNvbXBvbmVudFxuICogICBmdWxsTmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXByb3AoJ3VzZXJFbWFpbCcpIC8vIFdpbGwgYmUgcGFzc2VkIGFzICd1c2VyRW1haWwnIHRvIHRoZSBjb21wb25lbnRcbiAqICAgZW1haWw6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwcm9wKCd1c2VyRGF0YScsIHRydWUpIC8vIFdpbGwgYmUgcGFzc2VkIGFzIHN0cmluZ2lmaWVkIEpTT05cbiAqICAgdXNlckRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aXByb3BcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IENvbXBvbmVudFxuICogICBNb2RlbC0+PnVpcHJvcDogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWlwcm9wLT4+TW9kZWw6IEFkZCBwcm9wIG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBHZXQgcHJvcCBtZXRhZGF0YVxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIHByb3AgbmFtZSBhbmQgc3RyaW5naWZ5IGZsYWdcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+Q29tcG9uZW50OiBQYXNzIHByb3BlcnR5IHdpdGggc3BlY2lmaWVkIG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpcHJvcChcbiAgcHJvcE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgc3RyaW5naWZ5OiBib29sZWFuID0gZmFsc2Vcbikge1xuICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBVSVByb3BNZXRhZGF0YSA9IHtcbiAgICAgIG5hbWU6IHByb3BOYW1lIHx8IHByb3BlcnR5S2V5LFxuICAgICAgc3RyaW5naWZ5OiBzdHJpbmdpZnksXG4gICAgfTtcbiAgICBwcm9wTWV0YWRhdGEoZ2V0VUlBdHRyaWJ1dGVLZXkocHJvcGVydHlLZXksIFVJS2V5cy5QUk9QKSwgbWV0YWRhdGEpKFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXBzIGEgbmVzdGVkIG1vZGVsIHByb3BlcnR5IHRvIGEgVUkgY29tcG9uZW50IHByb3BlcnR5LlxuICogQHN1bW1hcnkgRGVmaW5lcyBob3cgYSBwYXJlbnQgY29tcG9uZW50IHNob3VsZCByZW5kZXIgdGhlIGNoaWxkIG1vZGVsIHdoZW4gbmVzdGVkLlxuICpcbiAqIFRoaXMgZGVjb3JhdG9yIGlzIHVzZWQgdG8gZGVjb3JhdGUgcHJvcGVydGllcyB0aGF0IGFyZSBuZXN0ZWQgbW9kZWxzLlxuICogV2hlbiBhcHBsaWVkLCBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCB0YWcgb2YgdGhlIGNoaWxkIG1vZGVsIHdpdGggdGhlIHByb3ZpZGVkIG9uZSxcbiAqIGVuYWJsaW5nIGRpZmZlcmVudCByZW5kZXJpbmcgYmVoYXZpb3Igd2hlbiB0aGUgbW9kZWwgYWN0cyBhcyBhIGNoaWxkIChuZXN0ZWQpXG4gKiBjb21wYXJlZCB0byB3aGVuIGl0IGlzIHJlbmRlcmVkIGFzIHRoZSBwYXJlbnQgbW9kZWwuXG4gKlxuICogSXQgcmVxdWlyZXMgdGhlIGNsYXNzIHRvIGJlIGRlY29yYXRlZCB3aXRoIGBAdWltb2RlbGAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IFRoZSBtb2RlbCBjbGFzcyBuYW1lIHRvIHBhc3MgdG8gdGhlIGNvbXBvbmVudCAoZGVmYXVsdHMgdG8gdGhlIHByb3BlcnR5IGtleSkuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBIVE1MIGVsZW1lbnQgb3IgY29tcG9uZW50IHRhZyBuYW1lIHRvIG92ZXJyaWRlIHRoZSBVSSB0YWcgb2YgdGhlIG5lc3RlZCBtb2RlbFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHNdIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSBlbGVtZW50XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtzZXJpYWxpemU9ZmFsc2VdIFdoZXRoZXIgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBzZXJpYWxpemVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIHVpY2hpbGRcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE1hcCBhIG5lc3RlZCBtb2RlbCB0byBhIGNvbXBvbmVudCBwcm9wZXJ0eSB3aXRoIGEgZGlmZmVyZW50IHRhZyB3aGVuIG5lc3RlZFxuICogQHVpbW9kZWwoJ2FkZHJlc3MtY29tcG9uZW50JylcbiAqIGNsYXNzIEFkZHJlc3Mge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgc3RyZWV0OiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgY2l0eTogc3RyaW5nO1xuICogfVxuICpcbiAqIEB1aW1vZGVsKCd1c2VyLXByb2ZpbGUnKVxuICogY2xhc3MgVXNlclByb2ZpbGUge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpY2hpbGQoQWRkcmVzcy5uYW1lLCAnYWRkcmVzcy1jaGlsZC1jb21wb25lbnQnKVxuICogICBhZGRyZXNzOiBBZGRyZXNzO1xuICogfVxuICpcbiAqIC8vIEluIHRoaXMgZXhhbXBsZSwgdGhlIEFkZHJlc3MgbW9kZWwgaGFzIHRoZSBkZWZhdWx0IHRhZyAnYWRkcmVzcy1jb21wb25lbnQnIHdoZW4gcmVuZGVyZWQgYXMgYSByb290IGNvbXBvbmVudCxcbiAqIC8vIGJ1dCB3aGVuIHVzZWQgaW5zaWRlIFVzZXJQcm9maWxlLCBpdCBpcyByZW5kZXJlZCB3aXRoIHRoZSBvdmVycmlkZGVuIHRhZyAnYWRkcmVzcy1jaGlsZC1jb21wb25lbnQnXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aWNoaWxkXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBDb21wb25lbnRcbiAqICAgTW9kZWwtPj51aWNoaWxkOiBBcHBseSB0byBwcm9wZXJ0eVxuICogICB1aWNoaWxkLT4+TW9kZWw6IEFkZCBjaGlsZCBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogR2V0IGNoaWxkIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gcHJvcCBuYW1lLCBzdHJpbmdpZnkgZmxhZywgYW5kIGNoaWxkIHRhZyBvdmVycmlkZVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Db21wb25lbnQ6IFBhc3MgcHJvcGVydHkgd2l0aCBzcGVjaWZpZWQgbmFtZSBhbmQgcmVuZGVyIHdpdGggb3ZlcnJpZGRlbiB0YWcgaWYgbmVzdGVkXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHVpY2hpbGQoXG4gIGNsYXp6OiBzdHJpbmcsXG4gIHRhZzogc3RyaW5nLFxuICBwcm9wczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICBpc0FycmF5OiBib29sZWFuID0gZmFsc2UsXG4gIHNlcmlhbGl6ZTogYm9vbGVhbiA9IGZhbHNlXG4pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBjb25zdCBtZXRhZGF0YTogVUlFbGVtZW50TWV0YWRhdGEgPSB7XG4gICAgICB0YWc6IHRhZyxcbiAgICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplLFxuICAgICAgcHJvcHM6IE9iamVjdC5hc3NpZ24oXG4gICAgICAgIHt9LFxuICAgICAgICBwcm9wcyB8fCB7fSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IGNsYXp6IHx8IHByb3BlcnR5S2V5LFxuICAgICAgICB9LFxuICAgICAgICBpc0FycmF5XG4gICAgICAgICAgPyB7IGN1c3RvbVR5cGVzOiBbQXJyYXkubmFtZV0sIG11bHRpcGxlOiB0cnVlIH1cbiAgICAgICAgICA6IHsgbXVsdGlwbGU6IHByb3BzPy5tdWx0aXBsZSB8fCBmYWxzZSB9XG4gICAgICApLFxuICAgIH07XG5cbiAgICBwcm9wTWV0YWRhdGEoZ2V0VUlBdHRyaWJ1dGVLZXkocHJvcGVydHlLZXksIFVJS2V5cy5DSElMRCksIG1ldGFkYXRhKShcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFwcyBhIG1vZGVsIHByb3BlcnR5IHRvIGEgbGlzdCBpdGVtIGNvbXBvbmVudFxuICogQHN1bW1hcnkgU3BlY2lmaWVzIGhvdyBhIHByb3BlcnR5IHNob3VsZCBiZSByZW5kZXJlZCBpbiBhIGxpc3QgY29udGV4dFxuICogVGhpcyBkZWNvcmF0b3IgYWxsb3dzIHlvdSB0byBkZWZpbmUgaG93IGEgbW9kZWwgcHJvcGVydHkgY29udGFpbmluZyBhIGxpc3RcbiAqIHNob3VsZCBiZSByZW5kZXJlZC4gSXQgcmVxdWlyZXMgdGhlIGNsYXNzIHRvIGJlIGRlY29yYXRlZCB3aXRoIEB1aWxpc3Rtb2RlbC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BOYW1lXSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcGFzcyB0byB0aGUgbGlzdCBjb21wb25lbnQgKGRlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBrZXkpXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtwcm9wc10gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIGxpc3QgY29udGFpbmVyXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWlsaXN0cHJvcFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRGVmaW5lIGEgbGlzdCBwcm9wZXJ0eSB3aXRoIGN1c3RvbSByZW5kZXJpbmdcbiAqIEB1aW1vZGVsKCd0b2RvLWxpc3QnKVxuICogY2xhc3MgVG9kb0xpc3Qge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdGl0bGU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsaXN0cHJvcCgnaXRlbXMnLCB7IGNsYXNzOiAndG9kby1pdGVtcy1jb250YWluZXInIH0pXG4gKiAgIGl0ZW1zOiBUb2RvSXRlbVtdO1xuICogfVxuICpcbiAqIEB1aWxpc3Rtb2RlbCgnbGknLCB7IGNsYXNzOiAndG9kby1pdGVtJyB9KVxuICogY2xhc3MgVG9kb0l0ZW0gZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB0ZXh0OiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgY29tcGxldGVkOiBib29sZWFuO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgdWlsaXN0cHJvcFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgTGlzdENvbnRhaW5lclxuICogICBwYXJ0aWNpcGFudCBMaXN0SXRlbXNcbiAqICAgTW9kZWwtPj51aWxpc3Rwcm9wOiBBcHBseSB0byBwcm9wZXJ0eVxuICogICB1aWxpc3Rwcm9wLT4+TW9kZWw6IEFkZCBsaXN0IHByb3AgbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IEdldCBsaXN0IHByb3AgbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBwcm9wIG5hbWUgYW5kIGNvbnRhaW5lciBwcm9wc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5MaXN0Q29udGFpbmVyOiBDcmVhdGUgY29udGFpbmVyIHdpdGggcHJvcHNcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TGlzdEl0ZW1zOiBSZW5kZXIgZWFjaCBpdGVtIHVzaW5nIEB1aWxpc3Rtb2RlbFxuICogICBMaXN0Q29udGFpbmVyLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gcmVuZGVyZWQgbGlzdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdWlsaXN0cHJvcChcbiAgcHJvcE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBjb25zdCBtZXRhZGF0YTogUGFydGlhbDxVSUxpc3RQcm9wTWV0YWRhdGE+ID0ge1xuICAgICAgbmFtZTogcHJvcE5hbWUgfHwgcHJvcGVydHlLZXksXG4gICAgICBwcm9wczogcHJvcHMgfHwge30sXG4gICAgfTtcbiAgICBwcm9wTWV0YWRhdGEoZ2V0VUlBdHRyaWJ1dGVLZXkocHJvcGVydHlLZXksIFVJS2V5cy5VSUxJU1RQUk9QKSwgbWV0YWRhdGEpKFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBwb3NpdGlvbnMgYSBwcm9wZXJ0eSBpbiBhIHNwZWNpZmljIGdyaWQgbGF5b3V0IHBvc2l0aW9uXG4gKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGNvbHVtbiBhbmQgcm93IHBvc2l0aW9uIGZvciBhIHByb3BlcnR5IGluIGEgVUkgbGF5b3V0IGdyaWRcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gZGVmaW5lIHRoZSBzcGVjaWZpYyBwb3NpdGlvbiBvZiBhIHByb3BlcnR5IHdpdGhpblxuICogYSBncmlkLWJhc2VkIGxheW91dCBzeXN0ZW0uIEl0IHNwZWNpZmllcyB3aGljaCBjb2x1bW4gYW5kIHJvdyB0aGUgcHJvcGVydHlcbiAqIHNob3VsZCBvY2N1cHkgd2hlbiByZW5kZXJlZCBpbiB0aGUgVUkuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGNvbCBUaGUgY29sdW1uIHBvc2l0aW9uIGluIHRoZSBncmlkIGxheW91dFxuICogQHBhcmFtIHtudW1iZXJ9IFtyb3c9MV0gVGhlIHJvdyBwb3NpdGlvbiBpbiB0aGUgZ3JpZCBsYXlvdXQgKGRlZmF1bHRzIHRvIDEpXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtwcm9wcz17fV0gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIGxheW91dCBpdGVtXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWlsYXlvdXRwcm9wXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBQb3NpdGlvbiBwcm9wZXJ0aWVzIGluIGEgZ3JpZCBsYXlvdXRcbiAqIEB1aWxheW91dCgndXNlci1mb3JtJywgMiwgMykgLy8gMiBjb2x1bW5zLCAzIHJvd3NcbiAqIEBtb2RlbCgpXG4gKiBjbGFzcyBVc2VyRm9ybSB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsYXlvdXRwcm9wKDEsIDEpIC8vIE9uZSBjb2x1bW4sIGZpcnN0IHJvd1xuICogICBmaXJzdE5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsYXlvdXRwcm9wKDIsIDEpIC8vIE9uZSBjb2x1bW4sIGZpcnN0IHJvd1xuICogICBsYXN0TmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxheW91dHByb3AoMSwgMikgLy8gT25lIGNvbHVtbiwgc2Vjb25kIHJvd1xuICogICBlbWFpbDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxheW91dHByb3AoMiwgMykgLy8gQWxsIGNvbHVtbnMsIHRoaXJkIHJvd1xuICogICBiaW86IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IHVpbGF5b3V0cHJvcFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgTGF5b3V0Q29udGFpbmVyXG4gKiAgIE1vZGVsLT4+dWlsYXlvdXRwcm9wOiBBcHBseSB0byBwcm9wZXJ0eVxuICogICB1aWxheW91dHByb3AtPj5Nb2RlbDogQWRkIGxheW91dCBpdGVtIG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBHZXQgbGF5b3V0IGl0ZW0gbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBjb2x1bW4sIHJvdywgYW5kIHByb3BzXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PkxheW91dENvbnRhaW5lcjogUG9zaXRpb24gZWxlbWVudCBhdCBncmlkIGNvb3JkaW5hdGVzXG4gKiAgIExheW91dENvbnRhaW5lci0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIHBvc2l0aW9uZWQgZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gdWlsYXlvdXRwcm9wKGNvbDogVUlMYXlvdXRDb2wgPSAxLCByb3c6IG51bWJlciA9IDEpIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBjb25zdCBtZXRhZGF0YTogVUlMYXlvdXRQcm9wTWV0YWRhdGEgPSB7XG4gICAgICBuYW1lOiBwcm9wZXJ0eUtleSxcbiAgICAgIC8vIGNvbCxcbiAgICAgIC8vIHJvdyxcbiAgICAgIHByb3BzOiBPYmplY3QuYXNzaWduKHt9LCB7IHJvdywgY29sIH0pLFxuICAgIH07XG4gICAgcHJvcE1ldGFkYXRhKGdldFVJQXR0cmlidXRlS2V5KHByb3BlcnR5S2V5LCBVSUtleXMuVUlMQVlPVVRQUk9QKSwgbWV0YWRhdGEpKFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBhc3NpZ25zIGEgcHJvcGVydHkgdG8gYSBzcGVjaWZpYyBwYWdlIGluIG11bHRpLXBhZ2UgZm9ybXNcbiAqIEBzdW1tYXJ5IFNwZWNpZmllcyB3aGljaCBwYWdlIGEgcHJvcGVydHkgc2hvdWxkIGFwcGVhciBvbiBpbiBwYWdpbmF0ZWQgVUkgbGF5b3V0c1xuICogVGhpcyBkZWNvcmF0b3IgYXBwbGllcyBtZXRhZGF0YSB0byB0aGUgcHJvcGVydHksIGluZGljYXRpbmcgd2hpY2ggcGFnZSBudW1iZXIgaXQgYmVsb25ncyB0b1xuICogaW4gYSBtdWx0aS1wYWdlIGZvcm0gb3Igd2l6YXJkLiBQcm9wZXJ0aWVzIHdpdGggdGhlIHNhbWUgcGFnZSBudW1iZXIgYXJlIGdyb3VwZWQgdG9nZXRoZXJcbiAqIGFuZCByZW5kZXJlZCBvbiB0aGUgc2FtZSBwYWdlLiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggQHVpc3RlcHBlZG1vZGVsIHRvXG4gKiBvcmdhbml6ZSBsYXJnZSBmb3JtcyBpbnRvIG1hbmFnZWFibGUgc2VjdGlvbnMuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtwYWdlPTFdIFRoZSBwYWdlIG51bWJlciB3aGVyZSB0aGUgcHJvcGVydHkgc2hvdWxkIGFwcGVhciAoZGVmYXVsdCBpcyAxKVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpcGFnZXByb3BcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIG11bHRpLXN0ZXAgcmVnaXN0cmF0aW9uIGZvcm0gd2l0aCBwYWdlLWJhc2VkIGxheW91dFxuICogQHVpc3RlcHBlZG1vZGVsKCdyZWdpc3RyYXRpb24tZm9ybScsIDIsIHRydWUpXG4gKiBAbW9kZWwoKVxuICogY2xhc3MgUmVnaXN0cmF0aW9uRm9ybSB7XG4gKiAgIC8vIFBhZ2UgMTogUGVyc29uYWwgSW5mb3JtYXRpb25cbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXBhZ2Vwcm9wKDEpXG4gKiAgIGZpcnN0TmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXBhZ2Vwcm9wKDEpXG4gKiAgIGxhc3ROYW1lOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcGFnZXByb3AoMSlcbiAqICAgZGF0ZU9mQmlydGg6IERhdGU7XG4gKlxuICogICAvLyBQYWdlIDI6IENvbnRhY3QgSW5mb3JtYXRpb25cbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXBhZ2Vwcm9wKDIpXG4gKiAgIGVtYWlsOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcGFnZXByb3AoMilcbiAqICAgcGhvbmU6IHN0cmluZztcbiAqXG4gKiAgIC8vIFBhZ2UgMzogQ29uZmlybWF0aW9uXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwYWdlcHJvcCgzKVxuICogICBhY2NlcHRUZXJtczogYm9vbGVhbjtcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IHVpcGFnZXByb3BcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IFBhZ2luYXRpb25Db250cm9sbGVyXG4gKiAgIHBhcnRpY2lwYW50IFVJXG4gKiAgIE1vZGVsLT4+dWlwYWdlcHJvcDogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWlwYWdlcHJvcC0+Pk1vZGVsOiBBZGQgcGFnZSBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogR2V0IHBhZ2UgbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBwYWdlIG51bWJlclxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5QYWdpbmF0aW9uQ29udHJvbGxlcjogR3JvdXAgcHJvcGVydGllcyBieSBwYWdlXG4gKiAgIFBhZ2luYXRpb25Db250cm9sbGVyLT4+VUk6IFJlbmRlciBjdXJyZW50IHBhZ2UgcHJvcGVydGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdWlwYWdlcHJvcChwYWdlOiBudW1iZXIgPSAxKSB7XG4gIHJldHVybiBmdW5jdGlvbiB1aXBhZ2Vwcm9wKG9yaWdpbmFsOiBhbnksIHByb3BlcnR5S2V5PzogYW55KSB7XG4gICAgcmV0dXJuIHByb3BNZXRhZGF0YShnZXRVSUF0dHJpYnV0ZUtleShwcm9wZXJ0eUtleSwgVUlLZXlzLlBBR0UpLCBwYWdlKShcbiAgICAgIG9yaWdpbmFsLFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEEgZGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBiaW5kcyBhIFVJIGV2ZW50IHRvIGEgc3BlY2lmaWVkIGhhbmRsZXIgZnVuY3Rpb24uXG4gKiBUaGlzIGlzIHVzZWQgdG8gYXR0YWNoIGV2ZW50IGhhbmRsZXJzIHRvIHNwZWNpZmljIGxpZmVjeWNsZSBldmVudHMgb2YgYSBgRGVjYWZDb21wb25lbnRgLFxuICogc3VjaCBhcyBgcmVuZGVyYCB8IGBpbml0aWFsaXplYCB8IGBoYW5kbGVDbGlja2AgfCBgcmVmcmVzaGBcbiAqXG4gKiBAcGFyYW0gZXZlbnQgLSBUaGUgbmFtZSBvZiB0aGUgbGlmZWN5Y2xlIGV2ZW50IHRvIGJpbmQgdGhlIGhhbmRsZXIgdG8uXG4gKiAgICAgICAgICAgICAgICBNdXN0IGJlIG9uZSBvZiB0aGUga2V5cyBpbiBgUGljazxEZWNhZkNvbXBvbmVudCwgJ3JlbmRlcicgfCAnaW5pdGlhbGl6ZSc+YC5cbiAqIEBwYXJhbSBoYW5kbGVyIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIHNwZWNpZmllZCBldmVudCBvY2N1cnMuXG4gKlxuICogQHJldHVybnMgQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBhcHBsaWVzIHRoZSBldmVudC1oYW5kbGVyIGJpbmRpbmcgdG8gdGhlIHRhcmdldCBvYmplY3QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgQHVpb24oJ3JlbmRlcicsICgpID0+IGNvbnNvbGUubG9nKCdSZW5kZXJpbmcuLi4nKSlcbiAqICAgc29tZVByb3BlcnR5OiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpb24oXG4gIGV2ZW50OiBVSUV2ZW50TmFtZSxcbiAgaGFuZGxlcjogVUlFdmVudEhhbmRsZXJcbik6IChvcmlnaW5hbDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IHN0cmluZykgPT4gdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiB1aW9uKFxuICBldmVudHM6IFJlY29yZDxzdHJpbmcsIFVJRXZlbnRIYW5kbGVyPlxuKTogKG9yaWdpbmFsOiBvYmplY3QsIHByb3BlcnR5S2V5Pzogc3RyaW5nKSA9PiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIHVpb24oXG4gIGV2ZW50OiBVSUV2ZW50TmFtZSB8IFJlY29yZDxzdHJpbmcsIFVJRXZlbnRIYW5kbGVyPixcbiAgaGFuZGxlcj86IFVJRXZlbnRIYW5kbGVyXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVpb24ob3JpZ2luYWw6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBzdHJpbmcpIHtcbiAgICBwcm9wTWV0YWRhdGEoZ2V0VUlBdHRyaWJ1dGVLZXkocHJvcGVydHlLZXkgYXMgc3RyaW5nLCBVSUtleXMuRVZFTlRTKSwge1xuICAgICAgLi4uKHR5cGVvZiBldmVudCA9PT0gXCJvYmplY3RcIiA/IGV2ZW50IDogeyBbZXZlbnRdOiBoYW5kbGVyIH0pLFxuICAgIH0pKG9yaWdpbmFsLCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG5cbi8qKlxuICogQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBhc3NvY2lhdGVzIGEgVUkgY2xpY2sgaGFuZGxlciB3aXRoIHRoZSAnaGFuZGxlQ2xpY2snIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBoYW5kbGVyIC0gQSBmdW5jdGlvbiB0aGF0IGNvbmZvcm1zIHRvIHRoZSBgVUlFdmVudEhhbmRsZXJgIHR5cGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWRcbiAqICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgJ2hhbmRsZUNsaWNrJyBldmVudCBpcyB0cmlnZ2VyZWQuXG4gKiBAcmV0dXJucyBBIGRlY29yYXRlZCBmdW5jdGlvbiB0aGF0IGJpbmRzIHRoZSBoYW5kbGVyIHRvIHRoZSAnaGFuZGxlQ2xpY2snIGV2ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdWlvbmNsaWNrKGhhbmRsZXI6IFVJRXZlbnRIYW5kbGVyKSB7XG4gIHJldHVybiB1aW9uKFwiaGFuZGxlQ2xpY2tcIiwgaGFuZGxlcik7XG59XG5cbi8qKlxuICogQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBhc3NvY2lhdGVzIGEgVUkgcmVuZGVyaW5nIGhhbmRsZXIgd2l0aCB0aGUgJ3JlbmRlcicgZXZlbnQuXG4gKlxuICogQHBhcmFtIGhhbmRsZXIgLSBBIGZ1bmN0aW9uIHRoYXQgY29uZm9ybXMgdG8gdGhlIGBVSUV2ZW50SGFuZGxlciBgIHR5cGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWRcbiAqICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgJ3JlbmRlcicgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICogQHJldHVybnMgQSBkZWNvcmF0ZWQgZnVuY3Rpb24gdGhhdCBiaW5kcyB0aGUgaGFuZGxlciB0byB0aGUgJ3JlbmRlcicgZXZlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aW9ucmVuZGVyKGhhbmRsZXI6IFVJRXZlbnRIYW5kbGVyKSB7XG4gIHJldHVybiB1aW9uKFwicmVuZGVyXCIsIGhhbmRsZXIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIHByb3BlcnR5IGFzIGEgY29sdW1uIGluIGEgVUkgdGFibGVcbiAqIEBzdW1tYXJ5IENvbnRyb2xzIGNvbHVtbiBvcmRlcmluZyBhbmQgb3B0aW9uYWwgdmFsdWUgcGFyc2luZyBmb3IgdGFibGUgcHJvcHNcbiAqIFVzZSB0aGlzIGRlY29yYXRvciB0byByZWdpc3RlciBsaXN0IHByb3BlcnRpZXMgYXMgdGFibGUgY29sdW1ucywgZGVmaW5lIHRoZVxuICogc2VxdWVuY2UgaW4gd2hpY2ggdGhleSBhcHBlYXIsIGFuZCBvcHRpb25hbGx5IHByb3ZpZGUgYSBwYXJzZXIgdGhhdCBmb3JtYXRzXG4gKiB0aGUgdmFsdWUgYmVmb3JlIHJlbmRlcmluZy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gc2VxdWVuY2UgVGhlIGRpc3BsYXkgb3JkZXIgZm9yIHRoZSBjb2x1bW4gKGxvd2VyIG1lYW5zIGZpcnN0KVxuICogQHBhcmFtIHtVSUZ1bmN0aW9uTGlrZX0gW3ZhbHVlUGFyc2VyRm5dIE9wdGlvbmFsIGZvcm1hdHRlciBleGVjdXRlZCBwZXIgY2VsbFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpdGFibGVjb2xcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIGNsYXNzIE9yZGVyIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXRhYmxlY29sKDEpXG4gKiAgIG9yZGVyTnVtYmVyOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpdGFibGVjb2woMiwgKHZhbHVlKSA9PiBgJCR7dmFsdWU/LnRvRml4ZWQoMil9YClcbiAqICAgdG90YWw6IG51bWJlcjtcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IHVpdGFibGVjb2xcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IFRhYmxlXG4gKiAgIE1vZGVsLT4+dWl0YWJsZWNvbDogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWl0YWJsZWNvbC0+Pk1vZGVsOiBTdG9yZSBjb2x1bW4gbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IFJldHJpZXZlIGNvbHVtbiBwcm9wc1xuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIG9yZGVyIGFuZCBwYXJzZXJcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+VGFibGU6IFJlbmRlciBjb2x1bW4gaW4gc2VxdWVuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpdGFibGVjb2woXG4gIHNlcXVlbmNlOiBudW1iZXIgfCB0eXBlb2YgVUlLZXlzLkZJUlNUIHwgdHlwZW9mIFVJS2V5cy5MQVNUID0gVUlLZXlzLkxBU1QsXG4gIHZhbHVlUGFyc2VyRm4/OiBVSUZ1bmN0aW9uTGlrZVxuKSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFBhcnRpYWw8VUlMaXN0UHJvcE1ldGFkYXRhPiA9IHtcbiAgICAgIG5hbWU6IHByb3BlcnR5S2V5LFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgc2VxdWVuY2UsXG4gICAgICAgIC4uLighdmFsdWVQYXJzZXJGbiA/IHt9IDogeyB2YWx1ZVBhcnNlckZuIH0pLFxuICAgICAgfSxcbiAgICB9O1xuICAgIHByb3BNZXRhZGF0YShnZXRVSUF0dHJpYnV0ZUtleShwcm9wZXJ0eUtleSwgVUlLZXlzLlVJTElTVFBST1ApLCBtZXRhZGF0YSkoXG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wZXJ0eUtleVxuICAgICk7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEZWNhZlRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tIFwiLi9EZWNhZlRyYW5zbGF0ZVNlcnZpY2VcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFVJVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yIHtcbiAgc3RhdGljIHRyYW5zbGF0ZVNlcnZpY2U6IERlY2FmVHJhbnNsYXRlU2VydmljZTtcblxuICBvdmVycmlkZSBnZXRNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBzdHJpbmcge1xuICAgIGlmIChVSVZhbGlkYXRvci50cmFuc2xhdGVTZXJ2aWNlKVxuICAgICAgcmV0dXJuIFVJVmFsaWRhdG9yLnRyYW5zbGF0ZVNlcnZpY2UudHJhbnNsYXRlKG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgIHJldHVybiBzdXBlci5nZXRNZXNzYWdlKG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBMb2dnZWRDbGFzcyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHtcbiAgQ3J1ZE9wZXJhdGlvbktleXMsXG4gIFVJRXZlbnRIYW5kbGVyLFxuICBVSUV2ZW50UHJvcGVydHksXG4gIFVJRnVuY3Rpb25MaWtlLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBJUmVwb3NpdG9yeSwgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgRGVjYWZFdmVudEhhbmRsZXIgfSBmcm9tIFwiLi9EZWNhZkV2ZW50SGFuZGxlclwiO1xuaW1wb3J0IHsgRGVjYWZUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSBcIi4vRGVjYWZUcmFuc2xhdGVTZXJ2aWNlXCI7XG5pbXBvcnQgeyBpc0NsYXNzQ29uc3RydWN0b3IgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG50eXBlIFByaW1hcnlLZXlUeXBlID0gc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNlIGNsYXNzIGZvciBhbGwgRGVjYWYgVUkgY29tcG9uZW50c1xuICogQHN1bW1hcnkgQmFzZSBjbGFzcyBmb3IgYWxsIERlY2FmIFVJIGNvbXBvbmVudHMsIHByb3ZpZGluZyBjb21tb24gc3RhdGUgbWFuYWdlbWVudCxcbiAqIGxvZ2dpbmcsIGxvY2FsaXphdGlvbiwgbmF2aWdhdGlvbiBob29rcywgQ1JVRCBjb250ZXh0IG1ldGFkYXRhLCBhbmRcbiAqIHJlcG9zaXRvcnkgaW50ZWdyYXRpb24gdXNlZCBieSBoaWdoZXItbGV2ZWwgZGVjb3JhdG9ycyBhbmQgcmVuZGVyZXJzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGVjYWZDb21wb25lbnQ8TSBleHRlbmRzIE1vZGVsPiBleHRlbmRzIExvZ2dlZENsYXNzIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEYXRhIG1vZGVsIG9yIG1vZGVsIG5hbWUgZm9yIGNvbXBvbmVudCBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBUaGUgZGF0YSBtb2RlbCB0aGF0IHRoaXMgY29tcG9uZW50IHdpbGwgdXNlIGZvciBDUlVEIG9wZXJhdGlvbnMuIFRoaXMgY2FuIGJlIHByb3ZpZGVkXG4gICAqIGFzIGEgTW9kZWwgaW5zdGFuY2UsIGEgbW9kZWwgY29uc3RydWN0b3IsIG9yIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbW9kZWwncyByZWdpc3RlcmVkIG5hbWUuXG4gICAqIFdoZW4gc2V0LCB0aGlzIHByb3BlcnR5IHByb3ZpZGVzIHRoZSBjb21wb25lbnQgd2l0aCBhY2Nlc3MgdG8gdGhlIG1vZGVsJ3Mgc2NoZW1hLCB2YWxpZGF0aW9uIHJ1bGVzLFxuICAgKiBhbmQgbWV0YWRhdGEgbmVlZGVkIGZvciByZW5kZXJpbmcgYW5kIGRhdGEgb3BlcmF0aW9ucy5cbiAgICovXG4gIG1vZGVsITogTSB8IE1vZGVsIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJpbWFyeSBrZXkgdmFsdWUgb2YgdGhlIGN1cnJlbnQgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgcHJpbWFyeSBrZXkgdmFsdWUgZm9yIHRoZSBjdXJyZW50IG1vZGVsIHJlY29yZCBiZWluZyBkaXNwbGF5ZWQgb3JcbiAgICogbWFuaXB1bGF0ZWQgYnkgdGhlIGNvbXBvbmVudC4gVGhpcyBpZGVudGlmaWVyIGlzIHVzZWQgZm9yIENSVUQgb3BlcmF0aW9ucyB0aGF0IHRhcmdldFxuICAgKiBzcGVjaWZpYyByZWNvcmRzLCBzdWNoIGFzIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZSBvcGVyYXRpb25zLiBUaGUgdmFsdWUgY29ycmVzcG9uZHMgdG9cbiAgICogdGhlIGZpZWxkIGRlc2lnbmF0ZWQgYXMgdGhlIHByaW1hcnkga2V5IGluIHRoZSBtb2RlbCBkZWZpbml0aW9uLlxuICAgKi9cbiAgbW9kZWxJZD86IFByaW1hcnlLZXlUeXBlIHwgUHJpbWFyeUtleVR5cGVbXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZS1idWlsdCBmaWx0ZXJpbmcgZXhwcmVzc2lvbiBhcHBsaWVkIHRvIHJlcG9zaXRvcnkgcXVlcmllcy5cbiAgICogQHN1bW1hcnkgU3VwcGx5IGEgY3VzdG9tIGBBdHRyaWJ1dGVPcHRpb25gIHRvIGNvbnRyb2wgaG93IHJlY29yZHMgYXJlIGNvbnN0cmFpbmVkLiBXaGVuIG9taXR0ZWQsXG4gICAqIHRoZSBkaXJlY3RpdmUgZGVyaXZlcyBhIGNvbmRpdGlvbiBmcm9tIGBmaWx0ZXJCeWAgb3IgYHBrYCwgY29tcGFyaW5nIGl0IGFnYWluc3QgYG1vZGVsSWRgLlxuICAgKi9cbiAgZmlsdGVyITogYW55O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTW9kZWwgZmllbGQgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIGRlZmF1bHQgY29uZGl0aW9uLlxuICAgKiBAc3VtbWFyeSBJbmRpY2F0ZXMgd2hpY2gga2V5IHNob3VsZCBiZSBjb21wYXJlZCB0byBgbW9kZWxJZGAgd2hlbiBgZmlsdGVyYCBpcyBub3QgcHJvdmlkZWQuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBjb25maWd1cmVkIHByaW1hcnkga2V5IHNvIG92ZXJyaWRlcyBhcmUgb25seSBuZWVkZWQgZm9yIGN1c3RvbSBsb29rdXBzLlxuICAgKi9cbiAgZmlsdGVyQnkhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgQ1JVRCBvcGVyYXRpb24gdHlwZSB0byBiZSBwZXJmb3JtZWQgb24gdGhlIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgd2hpY2ggb3BlcmF0aW9uIChDcmVhdGUsIFJlYWQsIFVwZGF0ZSwgRGVsZXRlKSB0aGlzIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgKiBzaG91bGQgcGVyZm9ybS4gVGhpcyBkZXRlcm1pbmVzIHRoZSBVSSBiZWhhdmlvciwgZm9ybSBjb25maWd1cmF0aW9uLCBhbmQgYXZhaWxhYmxlIGFjdGlvbnMuXG4gICAqIFRoZSBvcGVyYXRpb24gYWZmZWN0cyBmb3JtIHZhbGlkYXRpb24sIGZpZWxkIGF2YWlsYWJpbGl0eSwgYW5kIHRoZSBzcGVjaWZpYyByZXBvc2l0b3J5XG4gICAqIG1ldGhvZCBjYWxsZWQgZHVyaW5nIGRhdGEgc3VibWlzc2lvbi5cbiAgICpcbiAgICogQHR5cGUge09wZXJhdGlvbktleXN9XG4gICAqL1xuICBvcGVyYXRpb24/OiBPcGVyYXRpb25LZXlzO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUm91dGVyIGluc3RhbmNlIGZvciBwcm9ncmFtbWF0aWMgbmF2aWdhdGlvbi5cbiAgICogQHN1bW1hcnkgSW5qZWN0ZWQgUm91dGVyIHNlcnZpY2UgdXNlZCBmb3IgcHJvZ3JhbW1hdGljIG5hdmlnYXRpb24gYmV0d2VlbiByb3V0ZXNcbiAgICogaW4gdGhlIGFwcGxpY2F0aW9uLiBUaGlzIHNlcnZpY2UgZW5hYmxlcyBuYXZpZ2F0aW9uIHRvIGRpZmZlcmVudCB2aWV3cyBhbmQgb3BlcmF0aW9ucyxcbiAgICogaGFuZGxlcyByb3V0ZSBwYXJhbWV0ZXJzLCBhbmQgbWFuYWdlcyB0aGUgYnJvd3NlcidzIG5hdmlnYXRpb24gaGlzdG9yeS5cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcm91dGVyPzogYW55O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTmFtZSBpZGVudGlmaWVyIGZvciB0aGUgY29tcG9uZW50IGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIHN0cmluZyBpZGVudGlmaWVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gbmFtZSBvciBsYWJlbCB0aGUgY29tcG9uZW50XG4gICAqIGluc3RhbmNlLiBUaGlzIG5hbWUgY2FuIGJlIHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcywgbG9nZ2luZywgb3IgdG8gaWRlbnRpZnkgc3BlY2lmaWNcbiAgICogY29tcG9uZW50IGluc3RhbmNlcyB3aXRoaW4gYSBsYXJnZXIgYXBwbGljYXRpb24gc3RydWN0dXJlLiBJdCBzZXJ2ZXMgYXMgYSBodW1hbi1yZWFkYWJsZVxuICAgKiBpZGVudGlmaWVyIHRoYXQgaGVscHMgZGlzdGluZ3Vpc2ggYmV0d2VlbiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgY29tcG9uZW50IHR5cGUuXG4gICAqL1xuICBuYW1lITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyZW50IGNvbXBvbmVudCBpZGVudGlmaWVyIGZvciBoaWVyYXJjaGljYWwgY29tcG9uZW50IHJlbGF0aW9uc2hpcHMuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50IGNvbXBvbmVudCBpbiBhIGhpZXJhcmNoaWNhbCBjb21wb25lbnQgc3RydWN0dXJlLlxuICAgKiBUaGlzIHByb3BlcnR5IGVzdGFibGlzaGVzIGEgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvbXBvbmVudHMsIGFsbG93aW5nIGZvclxuICAgKiBwcm9wZXIgbmVzdGluZyBhbmQgb3JnYW5pemF0aW9uIG9mIGNvbXBvbmVudHMgd2l0aGluIGEgbGF5b3V0LiBJdCBjYW4gYmUgdXNlZCB0byB0cmFja1xuICAgKiBjb21wb25lbnQgZGVwZW5kZW5jaWVzIGFuZCBlc3RhYmxpc2ggY29tcG9uZW50IGhpZXJhcmNoaWVzIGZvciByZW5kZXJpbmcgYW5kIGV2ZW50IHByb3BhZ2F0aW9uLlxuICAgKi9cbiAgY2hpbGRPZiE6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY29tcG9uZW50IGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBBIHVuaXF1ZSBpZGVudGlmaWVyIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZvciBlYWNoIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgICogVGhpcyBVSUQgaXMgdXNlZCBmb3IgRE9NIGVsZW1lbnQgaWRlbnRpZmljYXRpb24sIGNvbXBvbmVudCB0cmFja2luZywgYW5kIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbiAgICogQnkgZGVmYXVsdCwgaXQgZ2VuZXJhdGVzIGEgcmFuZG9tIDE2LWNoYXJhY3RlciB2YWx1ZSwgYnV0IGl0IGNhbiBiZSBleHBsaWNpdGx5IHNldCB2aWEgaW5wdXQuXG4gICAqL1xuICB1aWQ/OiBQcmltYXJ5S2V5VHlwZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByaW1hcnkga2V5IGZpZWxkIG5hbWUgZm9yIHRoZSBkYXRhIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgd2hpY2ggZmllbGQgaW4gdGhlIG1vZGVsIHNob3VsZCBiZSB1c2VkIGFzIHRoZSBwcmltYXJ5IGtleS5cbiAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgaWRlbnRpZnlpbmcgdW5pcXVlIHJlY29yZHMgaW4gb3BlcmF0aW9ucyBsaWtlIHVwZGF0ZSBhbmQgZGVsZXRlLlxuICAgKiBJZiBub3QgZXhwbGljaXRseSBzZXQsIGl0IGRlZmF1bHRzIHRvIHRoZSByZXBvc2l0b3J5J3MgY29uZmlndXJlZCBwcmltYXJ5IGtleSBvciAnaWQnLlxuMSAgICovXG4gIHBrITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVHJhbnNsYXRpb24gc2VydmljZSBmb3IgYXBwbGljYXRpb24gaW50ZXJuYXRpb25hbGl6YXRpb24uXG4gICAqIEBzdW1tYXJ5IEluamVjdGVkIHNlcnZpY2UgdGhhdCBwcm92aWRlcyB0cmFuc2xhdGlvbiBjYXBhYmlsaXRpZXMgZm9yIFVJIHRleHQuXG4gICAqIFVzZWQgdG8gdHJhbnNsYXRlIGJ1dHRvbiBsYWJlbHMsIHZhbGlkYXRpb24gbWVzc2FnZXMsIGFuZCBvdGhlciB0ZXh0IGNvbnRlbnQgYmFzZWRcbiAgICogb24gdGhlIGN1cnJlbnQgbG9jYWxlIHNldHRpbmcsIGVuYWJsaW5nIG11bHRpbGluZ3VhbCBzdXBwb3J0IHRocm91Z2hvdXQgdGhlIGFwcGxpY2F0aW9uLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICB0cmFuc2xhdGVTZXJ2aWNlITogRGVjYWZUcmFuc2xhdGVTZXJ2aWNlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uIHNlcnZpY2UgZm9yIG1hbnVhbCBjaGFuZ2UgZGV0ZWN0aW9uIGNvbnRyb2wuXG4gICAqIEBzdW1tYXJ5IEluamVjdGVkIHNlcnZpY2UgdGhhdCBwcm92aWRlcyBtYW51YWwgY29udHJvbCBvdmVyIGNoYW5nZSBkZXRlY3Rpb24gY3ljbGVzLlxuICAgKiBUaGlzIGlzIGVzc2VudGlhbCBmb3IgZW5zdXJpbmcgdGhhdCBwcm9ncmFtbWF0aWMgRE9NIGNoYW5nZXMgKGxpa2Ugc2V0dGluZyBhY2NvcmRpb25cbiAgICogYXR0cmlidXRlcykgYXJlIHByb3Blcmx5IHJlZmxlY3RlZCBpbiB0aGUgY29tcG9uZW50J3Mgc3RhdGUgYW5kIHRyaWdnZXIgYXBwcm9wcmlhdGVcbiAgICogdmlldyB1cGRhdGVzIHdoZW4gbW9kaWZpY2F0aW9ucyBvY2N1ciBvdXRzaWRlIHRoZSBub3JtYWwgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uIGZsb3cuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBjaGFuZ2VEZXRlY3RvclJlZj86IGFueTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIGZpZWxkIHZpc2liaWxpdHkgYmFzZWQgb24gQ1JVRCBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBDYW4gYmUgYSBib29sZWFuIG9yIGFuIGFycmF5IG9mIG9wZXJhdGlvbiBrZXlzIHdoZXJlIHRoZSBmaWVsZCBzaG91bGQgYmUgaGlkZGVuLlxuICAgKi9cbiAgaGlkZGVuPzogYm9vbGVhbiB8IENydWRPcGVyYXRpb25LZXlzW107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMYWJlbCBmb3IgdGhlIGZpbGUgdXBsb2FkIGZpZWxkLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIHVzZXItZnJpZW5kbHkgbGFiZWwgZm9yIHRoZSBmaWxlIHVwbG9hZCBpbnB1dC5cbiAgICovXG4gIGxhYmVsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gV2hldGhlciB0aGUgZmllbGQgaXMgcmVhZC1vbmx5LlxuICAgKi9cbiAgcmVhZG9ubHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmxhZyB0byBlbmFibGUgb3IgZGlzYWJsZSBkYXJrIG1vZGUgc3VwcG9ydCBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgV2hlbiBlbmFibGVkLCB0aGUgY29tcG9uZW50IHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3QgdGhlIHN5c3RlbSdzIGRhcmsgbW9kZVxuICAgKiBwcmVmZXJlbmNlIHVzaW5nIHRoZSBtZWRpYSBzZXJ2aWNlIGFuZCBhcHBseSBhcHByb3ByaWF0ZSBzdHlsaW5nIGNsYXNzZXMuIFRoaXMgZmxhZ1xuICAgKiBjb250cm9scyB3aGV0aGVyIHRoZSBjb21wb25lbnQgc2hvdWxkIHJlc3BvbmQgdG8gZGFyayBtb2RlIGNoYW5nZXMgYW5kIGFwcGx5IHRoZVxuICAgKiBkYXJrIHBhbGV0dGUgY2xhc3MgdG8gaXRzIERPTSBlbGVtZW50LiBCeSBkZWZhdWx0LCBkYXJrIG1vZGUgc3VwcG9ydCBpcyBkaXNhYmxlZC5cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGVuYWJsZURhcmtNb2RlOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZsYWcgdG8gZW5hYmxlIG9yIGRpc2FibGUgZGFyayBtb2RlIHN1cHBvcnQgZm9yIHRoZSBjb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBvbmVudCB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSBzeXN0ZW0ncyBkYXJrIG1vZGVcbiAgICogcHJlZmVyZW5jZSB1c2luZyB0aGUgbWVkaWEgc2VydmljZSBhbmQgYXBwbHkgYXBwcm9wcmlhdGUgc3R5bGluZyBjbGFzc2VzLiBUaGlzIGZsYWdcbiAgICogY29udHJvbHMgd2hldGhlciB0aGUgY29tcG9uZW50IHNob3VsZCByZXNwb25kIHRvIGRhcmsgbW9kZSBjaGFuZ2VzIGFuZCBhcHBseSB0aGVcbiAgICogZGFyayBwYWxldHRlIGNsYXNzIHRvIGl0cyBET00gZWxlbWVudC4gQnkgZGVmYXVsdCwgZGFyayBtb2RlIHN1cHBvcnQgaXMgZGlzYWJsZWQuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBpc0RhcmtNb2RlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IGxvY2FsZSBpZGVudGlmaWVyIGZvciBjb21wb25lbnQgaW50ZXJuYXRpb25hbGl6YXRpb24uXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgbG9jYWxlIGNvZGUgKGUuZy4sICdlbi1VUycsICdwdC1CUicpIHVzZWQgZm9yIHRyYW5zbGF0aW5nIFVJIHRleHRcbiAgICogYW5kIGZvcm1hdHRpbmcgZGF0YSBhY2NvcmRpbmcgdG8gcmVnaW9uYWwgY29udmVudGlvbnMuIFRoaXMgcHJvcGVydHkgY2FuIGJlIHNldCB0byBvdmVycmlkZVxuICAgKiB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiBsb2NhbGUgZm9yIHRoaXMgc3BlY2lmaWMgY29tcG9uZW50IGluc3RhbmNlLCBlbmFibGluZyBwZXItY29tcG9uZW50XG4gICAqIGxvY2FsaXphdGlvbiB3aGVuIG5lZWRlZC5cbiAgICovXG4gIGxvY2FsZT86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyYXRpb24gZm9yIGxpc3QgaXRlbSByZW5kZXJpbmcgYmVoYXZpb3IuXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgaG93IGxpc3QgaXRlbXMgc2hvdWxkIGJlIHJlbmRlcmVkIGluIHRoZSBjb21wb25lbnQuXG4gICAqIFRoaXMgcHJvcGVydHkgaG9sZHMgYSBjb25maWd1cmF0aW9uIG9iamVjdCB0aGF0IHNwZWNpZmllcyB0aGUgdGFnIG5hbWVcbiAgICogYW5kIG90aGVyIHByb3BlcnRpZXMgbmVlZGVkIHRvIHJlbmRlciBsaXN0IGl0ZW1zIGNvcnJlY3RseS4gVGhlIHRhZyBwcm9wZXJ0eVxuICAgKiBpZGVudGlmaWVzIHdoaWNoIGNvbXBvbmVudCBzaG91bGQgYmUgdXNlZCB0byByZW5kZXIgZWFjaCBpdGVtIGluIGEgbGlzdC5cbiAgICogQWRkaXRpb25hbCBwcm9wZXJ0aWVzIGNhbiBiZSBpbmNsdWRlZCB0byBjdXN0b21pemUgdGhlIHJlbmRlcmluZyBiZWhhdmlvci5cbiAgICovXG4gIGl0ZW06IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyB0YWc6IFwiXCIgfTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIER5bmFtaWMgcHJvcGVydGllcyBjb25maWd1cmF0aW9uIGZvciBydW50aW1lIGN1c3RvbWl6YXRpb24uXG4gICAqIEBzdW1tYXJ5IENvbnRhaW5zIGtleS12YWx1ZSBwYWlycyBvZiBkeW5hbWljIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byB0aGUgY29tcG9uZW50XG4gICAqIGF0IHJ1bnRpbWUuIFRoaXMgZmxleGlibGUgY29uZmlndXJhdGlvbiBvYmplY3QgYWxsb3dzIGZvciBkeW5hbWljIHByb3BlcnR5IGFzc2lnbm1lbnQgd2l0aG91dFxuICAgKiByZXF1aXJpbmcgZXhwbGljaXQgaW5wdXQgYmluZGluZ3MgZm9yIGV2ZXJ5IHBvc3NpYmxlIGNvbmZpZ3VyYXRpb24gb3B0aW9uLiBQcm9wZXJ0aWVzIGZyb21cbiAgICogdGhpcyBvYmplY3QgYXJlIHBhcnNlZCBhbmQgYXBwbGllZCB0byB0aGUgY29tcG9uZW50IGluc3RhbmNlIHRocm91Z2ggdGhlIHBhcnNlUHJvcHMgbWV0aG9kLFxuICAgKiBlbmFibGluZyBjdXN0b21pemFibGUgY29tcG9uZW50IGJlaGF2aW9yIGJhc2VkIG9uIGV4dGVybmFsIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJhc2Ugcm91dGUgcGF0aCBmb3IgY29tcG9uZW50IG5hdmlnYXRpb24uXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGJhc2Ugcm91dGUgcGF0aCB1c2VkIGZvciBuYXZpZ2F0aW9uIGFjdGlvbnMgcmVsYXRlZCB0byB0aGlzIGNvbXBvbmVudC5cbiAgICogVGhpcyBpcyBvZnRlbiB1c2VkIGFzIGEgcHJlZml4IGZvciBjb25zdHJ1Y3RpbmcgbmF2aWdhdGlvbiBVUkxzIHdoZW4gdHJhbnNpdGlvbmluZyBiZXR3ZWVuXG4gICAqIGRpZmZlcmVudCBvcGVyYXRpb25zIG9yIHZpZXdzLiBUaGUgcm91dGUgaGVscHMgZXN0YWJsaXNoIHRoZSBjb21wb25lbnQncyBwb3NpdGlvbiBpbiB0aGVcbiAgICogYXBwbGljYXRpb24ncyByb3V0aW5nIGhpZXJhcmNoeS5cbiAgICovXG4gIHJvdXRlPzogc3RyaW5nID0gXCJcIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHdoZXRoZXIgYm9yZGVycyBhcmUgZGlzcGxheWVkIGFyb3VuZCB0aGUgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBCb29sZWFuIGZsYWcgdGhhdCBkZXRlcm1pbmVzIGlmIHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIHZpc3VhbGx5IG91dGxpbmVkIHdpdGggYm9yZGVycy5cbiAgICogV2hlbiB0cnVlLCBib3JkZXJzIGFyZSBzaG93biB0byB2aXN1YWxseSBzZXBhcmF0ZSB0aGUgY29tcG9uZW50IGZyb20gc3Vycm91bmRpbmcgY29udGVudC5cbiAgICovXG4gIGJvcmRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbXBvbmVudCBuYW1lIGlkZW50aWZpZXIgZm9yIGxvZ2dpbmcgYW5kIGxvY2FsaXphdGlvbiBjb250ZXh0cy5cbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSBjb21wb25lbnQncyBuYW1lIHdoaWNoIGlzIHVzZWQgYXMgYSBrZXkgZm9yIGxvZ2dpbmcgY29udGV4dHNcbiAgICogYW5kIGFzIGEgYmFzZSBmb3IgbG9jYWxlIHJlc29sdXRpb24uXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBjb21wb25lbnROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUm9vdCBrZXkgZm9yIGNvbXBvbmVudCBsb2NhbGUgY29udGV4dCByZXNvbHV0aW9uLlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBiYXNlIGtleSB1c2VkIHRvIHJlc29sdmUgbG9jYWxpemF0aW9uIGNvbnRleHRzIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICogSWYgbm90IGV4cGxpY2l0bHkgcHJvdmlkZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBjb21wb25lbnQncyBuYW1lLiBUaGlzIGtleSBpcyB1c2VkIHRvXG4gICAqIGxvYWQgYXBwcm9wcmlhdGUgdHJhbnNsYXRpb24gcmVzb3VyY2VzIGFuZCBsb2NhbGUtc3BlY2lmaWMgY29uZmlndXJhdGlvbnMuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBsb2NhbGVSb290Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3VycmVudCB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBDYW4gYmUgYSBzdHJpbmcsIG51bWJlciwgZGF0ZSwgb3IgYXJyYXkgb2Ygc3RyaW5nIG9yIG9iamVjdHMuXG4gICAqL1xuICB2YWx1ZT86IGFueTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZmVyZW5jZSB0byBDUlVEIG9wZXJhdGlvbiBjb25zdGFudHMgZm9yIHRlbXBsYXRlIHVzYWdlLlxuICAgKiBAc3VtbWFyeSBFeHBvc2VzIHRoZSBPcGVyYXRpb25LZXlzIGVudW0gdG8gdGhlIGNvbXBvbmVudCB0ZW1wbGF0ZSwgZW5hYmxpbmdcbiAgICogY29uZGl0aW9uYWwgcmVuZGVyaW5nIGFuZCBiZWhhdmlvciBiYXNlZCBvbiBvcGVyYXRpb24gdHlwZXMuIFRoaXMgcHJvdGVjdGVkXG4gICAqIHJlYWRvbmx5IHByb3BlcnR5IGVuc3VyZXMgdGhhdCB0ZW1wbGF0ZSBsb2dpYyBjYW4gYWNjZXNzIG9wZXJhdGlvbiBjb25zdGFudHNcbiAgICogd2hpbGUgbWFpbnRhaW5pbmcgZW5jYXBzdWxhdGlvbiBhbmQgcHJldmVudGluZyBhY2NpZGVudGFsIG1vZGlmaWNhdGlvbi5cbiAgICogQHByb3RlY3RlZFxuICAgKiBAcmVhZG9ubHlcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBPcGVyYXRpb25LZXlzID0gT3BlcmF0aW9uS2V5cztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFuZ3VsYXIgTG9jYXRpb24gc2VydmljZS5cbiAgICogQHN1bW1hcnkgSW5qZWN0ZWQgc2VydmljZSB0aGF0IHByb3ZpZGVzIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIGJyb3dzZXIncyBVUkwgYW5kIGhpc3RvcnkuXG4gICAqIFVubGlrZSB0aGUgUm91dGVyLCBMb2NhdGlvbiBhbGxvd3MgZm9yIGxvdy1sZXZlbCBtYW5pcHVsYXRpb24gb2YgdGhlIGJyb3dzZXIncyBoaXN0b3J5IHN0YWNrXG4gICAqIGFuZCBVUkwgcGF0aCwgc3VjaCBhcyBwcm9ncmFtbWF0aWNhbGx5IG5hdmlnYXRpbmcgYmFjayBvciBmb3J3YXJkLCBvciB1cGRhdGluZyB0aGUgVVJMIHdpdGhvdXRcbiAgICogdHJpZ2dlcmluZyBhIHJvdXRlIGNoYW5nZS4gVGhpcyBpcyB1c2VmdWwgZm9yIHNjZW5hcmlvcyB3aGVyZSB5b3UgbmVlZCB0byBpbnRlcmFjdCB3aXRoIHRoZVxuICAgKiBicm93c2VyIGhpc3Rvcnkgb3IgVVJMIG91dHNpZGUgb2YgQW5ndWxhcidzIHJvdXRpbmcgc3lzdGVtLCBzdWNoIGFzIGNsb3NpbmcgbW9kYWxzLCBoYW5kbGluZ1xuICAgKiBwb3BzdGF0ZSBldmVudHMsIG9yIHN1cHBvcnRpbmcgY3VzdG9tIG5hdmlnYXRpb24gbG9naWMuXG4gICAqXG4gICAqL1xuICBsb2NhdGlvbiE6IGFueTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgaW5zdGFuY2UgZm9yIGRhdGEgbGF5ZXIgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhIGxheWVyIGZvciByZXRyaWV2aW5nIGFuZCBtYW5pcHVsYXRpbmcgZGF0YS5cbiAgICogVGhpcyBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgRGVjYWZSZXBvc2l0b3J5IGNsYXNzLCBpbml0aWFsaXplZCBsYXppbHkgaW4gdGhlIHJlcG9zaXRvcnkgZ2V0dGVyLlxuICAgKiBUaGUgcmVwb3NpdG9yeSBpcyB1c2VkIHRvIHBlcmZvcm0gQ1JVRCAoQ3JlYXRlLCBSZWFkLCBVcGRhdGUsIERlbGV0ZSkgb3BlcmF0aW9ucyBvbiB0aGVcbiAgICogZGF0YSBtb2RlbCBhbmQgcHJvdmlkZXMgbWV0aG9kcyBmb3IgcXVlcnlpbmcgYW5kIGZpbHRlcmluZyBkYXRhIGJhc2VkIG9uIHNwZWNpZmljIGNyaXRlcmlhLlxuICAgKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgX3JlcG9zaXRvcnk/OiBJUmVwb3NpdG9yeTxNPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemF0aW9uIHN0YXR1cyBmbGFnIGZvciB0aGUgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBUcmFja3Mgd2hldGhlciB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWQgaXRzIGluaXRpYWxpemF0aW9uIHByb2Nlc3MuXG4gICAqIFRoaXMgZmxhZyBpcyB1c2VkIHRvIHByZXZlbnQgZHVwbGljYXRlIGluaXRpYWxpemF0aW9uIGFuZCB0byBkZXRlcm1pbmUgaWZcbiAgICogY2VydGFpbiBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBpbml0aWFsaXphdGlvbiBjYW4gYmUgcGVyZm9ybWVkLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcHJvdGVjdGVkIGluaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGV2ZW50czogVUlFdmVudFByb3BlcnR5ID0ge307XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJzOiBVSUV2ZW50UHJvcGVydHkgPSB7fTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGdldCByZXBvc2l0b3J5KCk6IElSZXBvc2l0b3J5PE0+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVwb3NpdG9yeSBhcyBJUmVwb3NpdG9yeTxNPjtcbiAgfVxuXG4gIHNldCByZXBvc2l0b3J5KHJlcG9zaXRvcnk6IElSZXBvc2l0b3J5PE0+KSB7XG4gICAgdGhpcy5fcmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7XG4gIH1cblxuICBhc3luYyByZW5kZXIoLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLnJlbmRlcilcbiAgICAgIC5pbmZvKGByZW5kZXIgZm9yICR7dGhpcy5jb21wb25lbnROYW1lfSB3aXRoICR7SlNPTi5zdHJpbmdpZnkoYXJncyl9YCk7XG4gIH1cblxuICBhc3luYyByZWZyZXNoKC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8YW55PiB7XG4gICAgdGhpcy5sb2cuZm9yKHRoaXMucmVmcmVzaCkuaW5mbyhgUmVmcmVzaCBjYWxsZWQgd2l0aCBhcmdzOiAke2FyZ3N9YCk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgaW5pdGlhbGl6ZXMgdGhlIGNvbXBvbmVudCB3aXRoIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGBpbml0aWFsaXplZGAgcHJvcGVydHkgdG8gYHRydWVgIG9uY2UgdGhlIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBAcGFyYW0gYXJncyAtIEEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBvZiB1bmtub3duIHR5cGVzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYXN5bmMgaW5pdGlhbGl6ZSguLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPGFueT4ge1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zbGF0ZXMgY29udGVudCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgKiBMb2dzIHRoZSB0cmFuc2xhdGlvbiByZXF1ZXN0IHdpdGggdGhlIGNvbXBvbmVudCBuYW1lIGFuZCBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSBhcmdzIC0gQSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzIHVzZWQgZm9yIHRyYW5zbGF0aW9uLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB0cmFuc2xhdGlvbiByZXN1bHQuXG4gICAqL1xuICBhc3luYyB0cmFuc2xhdGUoLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLnRyYW5zbGF0ZSlcbiAgICAgIC5pbmZvKGB0cmFuc2xhdGUgZm9yICR7dGhpcy5jb21wb25lbnROYW1lfSB3aXRoICR7SlNPTi5zdHJpbmdpZnkoYXJncyl9YCk7XG4gIH1cblxuICBhc3luYyBwcmV2aWV3KC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9nLmZvcih0aGlzLnByZXZpZXcpLmRlYnVnKGBQcmV2aWV3IGNhbGxlZCB3aXRoIGFyZ3M6ICR7YXJnc31gKTtcbiAgfVxuXG4gIC8vIGFzeW5jIHByb2Nlc3MoLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTxhbnk+IHtcbiAgLy8gICB0aGlzLmxvZy5mb3IodGhpcy5wcm9jZXNzKS5kZWJ1ZyhgUHJvY2VzcyBjYWxsZWQgd2l0aCBhcmdzOiAke2FyZ3N9YCk7XG4gIC8vIH1cblxuICAvLyBhc3luYyBiYXRjaE9wZXJhdGlvbiguLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPGFueT4ge1xuICAvLyAgIHRoaXMubG9nXG4gIC8vICAgICAuZm9yKHRoaXMuYmF0Y2hPcGVyYXRpb24pXG4gIC8vICAgICAuZGVidWcoYEJhdGNoT3BlcmF0aW9uIGNhbGxlZCB3aXRoIGFyZ3M6ICR7YXJnc31gKTtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIGRhdGEgb3IgcGVyZm9ybXMgYW4gYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gYXJncyAtIEEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBvZiBhbnkgdHlwZSB0byBiZSBwYXNzZWQgdG8gdGhlIHN1Ym1pdCBvcGVyYXRpb24uXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgc3VibWl0IG9wZXJhdGlvbi5cbiAgICovXG4gIGFzeW5jIHN1Ym1pdCguLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPGFueT4ge1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMuc3VibWl0KVxuICAgICAgLmluZm8oYHN1Ym1pdCBmb3IgJHt0aGlzLmNvbXBvbmVudE5hbWV9IHdpdGggJHtKU09OLnN0cmluZ2lmeShhcmdzKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTm9ybWFsaXplcyBoYW5kbGVyIGRlZmluaXRpb25zIGludG8gZXhlY3V0YWJsZSBmdW5jdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEl0ZXJhdGVzIHRocm91Z2ggYSBoYW5kbGVycyBtYXAgYW5kIGVuc3VyZXMgZWFjaCBlbnRyeSBpcyBzdG9yZWQgYXMgYSBjYWxsYWJsZVxuICAgKiBmdW5jdGlvbiBvbiB0aGUgY29tcG9uZW50LiBQbGFpbiBmdW5jdGlvbnMgYXJlIHN0b3JlZCBkaXJlY3RseSwgd2hpbGUgaGFuZGxlciBjbGFzc2VzIGFyZVxuICAgKiBpbnN0YW50aWF0ZWQgc28gdGhlaXIgYGhhbmRsZWAgbWV0aG9kIChvciBhIGtleWVkIG92ZXJyaWRlKSBiZWNvbWVzIHRoZSByZWdpc3RlcmVkIGhhbmRsZXIuXG4gICAqIFRoaXMgYWxsb3dzIGRlY29yYXRvcnMgdG8gYWNjZXB0IGVpdGhlciBpbmxpbmUgZnVuY3Rpb25zIG9yIGhhbmRsZXIgY2xhc3NlcyB0cmFuc3BhcmVudGx5LlxuICAgKiBAdGVtcGxhdGUgVCBFeHRlbmRzIGBEZWNhZkV2ZW50SGFuZGxlcmAgdG8gY29uc3RyYWluIGhhbmRsZXIgY2xhc3MgdHlwZXMuXG4gICAqIEBwYXJhbSBoYW5kbGVycyAtIERpY3Rpb25hcnkgb2YgaGFuZGxlciBuYW1lcyBtYXBwZWQgdG8gZnVuY3Rpb25zIG9yIGhhbmRsZXIgY29uc3RydWN0b3JzLlxuICAgKiBAcGFyYW0gaW5zdGFuY2UgLSBPcHRpb25hbCB0YXJnZXQgaGFuZGxlciBpbnN0YW5jZTsgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIHBhcnNlSGFuZGxlcnM8VCBleHRlbmRzIERlY2FmRXZlbnRIYW5kbGVyPihcbiAgICBoYW5kbGVyczogVUlFdmVudFByb3BlcnR5LFxuICAgIGluc3RhbmNlOiBUXG4gICk6IFVJRXZlbnRQcm9wZXJ0eSB7XG4gICAgY29uc3QgcmVzdWx0OiBVSUV2ZW50UHJvcGVydHkgPSB7fTtcbiAgICBPYmplY3QuZW50cmllcyhoYW5kbGVycykuZm9yRWFjaCgoW2tleSwgZm5dKSA9PiB7XG4gICAgICBpZiAoaXNDbGFzc0NvbnN0cnVjdG9yPERlY2FmRXZlbnRIYW5kbGVyPihmbikpIHtcbiAgICAgICAgY29uc3QgY2xhenogPSBuZXcgZm4oKSBhcyBEZWNhZkV2ZW50SGFuZGxlcjtcbiAgICAgICAgY29uc3QgZXZlbnQgPVxuICAgICAgICAgIGtleSBpbiBjbGF6eiA/IGNsYXp6W2tleSBhcyBrZXlvZiBEZWNhZkV2ZW50SGFuZGxlcl0gOiBjbGF6ei5oYW5kbGU7XG4gICAgICAgIHJlc3VsdFtrZXldID0gZXZlbnQ7XG4gICAgICAgIGluc3RhbmNlLmhhbmRsZXJzW2tleV0gPSBldmVudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gZm47XG4gICAgICAgIGluc3RhbmNlLmhhbmRsZXJzW2tleV0gPSBmbjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgZXZlbnQgY2FsbGJhY2tzIG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhbiBldmVudHMgbWFwIHByb2R1Y2VkIGJ5IGRlY29yYXRvcnMgd2hlcmUgZWFjaCB2YWx1ZSBjYW4gYmUgYSBmYWN0b3J5XG4gICAqIHJldHVybmluZyBhIGZ1bmN0aW9uIG9yIGEgY29tcG9uZW50IGNvbnN0cnVjdG9yLiBXaGVuIGEgY29uc3RydWN0b3IgaXMgcmV0dXJuZWQsIHRoZSBtZXRob2RcbiAgICogbWF0Y2hpbmcgdGhlIGV2ZW50IGtleSBpcyBpbnN0YW50aWF0ZWQgYW5kIHN0b3JlZDsgb3RoZXJ3aXNlIHRoZSBwcm9kdWNlZCBmdW5jdGlvbiBpc1xuICAgKiBhc3NpZ25lZCBkaXJlY3RseS4gVGhpcyBlbmFibGVzIGZsZXhpYmxlIGV2ZW50IGJpbmRpbmcgZGVmaW5pdGlvbnMgZm9yIGRlcml2ZWQgY29tcG9uZW50cy5cbiAgICogQHRlbXBsYXRlIFQgRXh0ZW5kcyBgRGVjYWZDb21wb25lbnQ8TW9kZWw+YCB0byBzY29wZSBhY2NlcHRhYmxlIGV2ZW50IG93bmVycy5cbiAgICogQHBhcmFtIGV2ZW50cyAtIERpY3Rpb25hcnkgb2YgZXZlbnQgbmFtZXMgbWFwcGVkIHRvIGZ1bmN0aW9uIGZhY3RvcmllcyBvciBjb21wb25lbnQgY29uc3RydWN0b3JzLlxuICAgKiBAcGFyYW0gaW5zdGFuY2UgLSBPcHRpb25hbCBjb21wb25lbnQgaW5zdGFuY2UgdG8gcmVjZWl2ZSB0aGUgZXZlbnRzOyBkZWZhdWx0cyB0byBgdGhpc2AuXG4gICAqL1xuICBwcm90ZWN0ZWQgcGFyc2VFdmVudHM8VCBleHRlbmRzIERlY2FmQ29tcG9uZW50PE1vZGVsPj4oXG4gICAgZXZlbnRzOiBVSUV2ZW50UHJvcGVydHksXG4gICAgaW5zdGFuY2U6IFRcbiAgKTogVUlFdmVudFByb3BlcnR5IHtcbiAgICBjb25zdCByZXN1bHQ6IFVJRXZlbnRQcm9wZXJ0eSA9IHt9O1xuICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50cykuZm9yRWFjaCgoW2tleSwgZm5dKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0ga2V5IGFzIHN0cmluZztcbiAgICAgIGNvbnN0IGV2dCA9IChmbiBhcyBVSUZ1bmN0aW9uTGlrZSkoKTtcbiAgICAgIGlmIChpc0NsYXNzQ29uc3RydWN0b3I8VD4oZXZ0KSkge1xuICAgICAgICBjb25zdCBmbiA9IG5ldyBldnQoKVtrZXkgYXMga2V5b2YgVF0gYXMgVUlFdmVudEhhbmRsZXI7XG4gICAgICAgIGlmIChmbikge1xuICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IGZuO1xuICAgICAgICAgIGluc3RhbmNlLmV2ZW50c1tuYW1lXSA9IGZuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRbbmFtZV0gPSBmbjtcbiAgICAgICAgaW5zdGFuY2UuZXZlbnRzW25hbWVdID0gZm47XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEZWNhZkNvbXBvbmVudCB9IGZyb20gXCIuL0RlY2FmQ29tcG9uZW50XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENsYXNzIHJlcHJlc2VudGluZyBhbiBldmVudCBoYW5kbGVyXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgZm9yIGhhbmRsaW5nIGV2ZW50cyBpbiB0aGUgVUkgZGVjb3JhdG9ycyBzeXN0ZW1cbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBmb3VuZGF0aW9uIGZvciBtYW5hZ2luZyBhbmQgcHJvY2Vzc2luZyBldmVudHMgdGhhdCBvY2N1clxuICogd2l0aGluIHRoZSBVSSBjb21wb25lbnRzIGdlbmVyYXRlZCBieSB0aGUgZGVjb3JhdG9ycy5cbiAqIEBjbGFzcyBFdmVudEhhbmRsZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9ycy91aVxuICovXG5leHBvcnQgY2xhc3MgRGVjYWZFdmVudEhhbmRsZXIgZXh0ZW5kcyBEZWNhZkNvbXBvbmVudDxNb2RlbD4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRGVjYWZFdmVudEhhbmRsZXJcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgRXZlbnRIYW5kbGVyIG9iamVjdFxuICAgKiBUaGlzIGNvbnN0cnVjdG9yIGN1cnJlbnRseSBkb2Vzbid0IHRha2UgYW55IHBhcmFtZXRlcnMsIGJ1dCBpdCBjYW4gYmVcbiAgICogZXh0ZW5kZWQgaW4gdGhlIGZ1dHVyZSB0byBhY2NlcHQgY29uZmlndXJhdGlvbiBvcHRpb25zIGlmIG5lZWRlZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhbiBldmVudCB3aXRoIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAqIExvZ3MgdGhlIGV2ZW50IGhhbmRsaW5nIHByb2Nlc3MsIGluY2x1ZGluZyB0aGUgY29tcG9uZW50IG5hbWUgYW5kIHRoZSBhcmd1bWVudHMgcGFzc2VkLlxuICAgKlxuICAgKiBAcGFyYW0gYXJncyAtIFRoZSBhcmd1bWVudHMgZm9yIHRoZSBldmVudCBoYW5kbGVyLlxuICAgKiBAcmV0dXJucyB2b2lkXG4gICAqL1xuICBoYW5kbGUoLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy5oYW5kbGUpXG4gICAgICAuaW5mbyhgY29tcG9uZW50ICR7dGhpcy5jb21wb25lbnROYW1lfSBoYW5kbGluZyAke0pTT04uc3RyaW5naWZ5KGFyZ3MpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYW4gY2xpY2sgZXZlbnQgd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgKiBMb2dzIHRoZSBldmVudCBoYW5kbGluZyBwcm9jZXNzLCBpbmNsdWRpbmcgdGhlIGNvbXBvbmVudCBuYW1lIGFuZCB0aGUgYXJndW1lbnRzIHBhc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIGZvciB0aGUgZXZlbnQgaGFuZGxlci5cbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgaGFuZGxlQ2xpY2soLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy5oYW5kbGVDbGljaylcbiAgICAgIC5pbmZvKFxuICAgICAgICBgY29tcG9uZW50ICR7dGhpcy5jb21wb25lbnROYW1lfSBoYW5kbGluZyBjbGljayAke0pTT04uc3RyaW5naWZ5KGFyZ3MpfWBcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhbiBjbGljayBldmVudCB3aXRoIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAqIExvZ3MgdGhlIGV2ZW50IGhhbmRsaW5nIHByb2Nlc3MsIGluY2x1ZGluZyB0aGUgY29tcG9uZW50IG5hbWUgYW5kIHRoZSBhcmd1bWVudHMgcGFzc2VkLlxuICAgKlxuICAgKiBAcGFyYW0gYXJncyAtIFRoZSBhcmd1bWVudHMgZm9yIHRoZSBldmVudCBoYW5kbGVyLlxuICAgKiBAcmV0dXJucyB2b2lkXG4gICAqL1xuICBoYW5kbGVBY3Rpb24oLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy5oYW5kbGVBY3Rpb24pXG4gICAgICAuaW5mbyhcbiAgICAgICAgYGNvbXBvbmVudCAke3RoaXMuY29tcG9uZW50TmFtZX0gaGFuZGxpbmcgYWN0aW9uICR7SlNPTi5zdHJpbmdpZnkoYXJncyl9YFxuICAgICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTG9nZ2VkQ2xhc3MgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuZXhwb3J0IGNsYXNzIERlY2FmVHJhbnNsYXRlU2VydmljZSBleHRlbmRzIExvZ2dlZENsYXNzIHtcbiAgdHJhbnNsYXRlKGtleTogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYW55IHtcbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLnRyYW5zbGF0ZSlcbiAgICAgIC5pbmZvKFxuICAgICAgICBgTXVzdCB0cmFuc2xhdGUgJHtrZXl9IHdpdGggcGFyYW1zICR7SlNPTi5zdHJpbmdpZnkocGFyYW1zIHx8IHt9KX1gXG4gICAgICApO1xuICB9XG5cbiAgaW5zdGFudChrZXk6IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Pik6IGFueSB7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy5pbnN0YW50KVxuICAgICAgLmluZm8oXG4gICAgICAgIGBNdXN0IHRyYW5zbGF0ZSAke2tleX0gd2l0aCBwYXJhbXMgJHtKU09OLnN0cmluZ2lmeShwYXJhbXMgfHwge30pfWBcbiAgICAgICk7XG4gIH1cbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIE1vZHVsZSB0aGF0IGV4dGVuZHMgdGhlIE1vZGVsIHByb3RvdHlwZSB3aXRoIHJlbmRlcmluZyBjYXBhYmlsaXRpZXNcbiAqIEBzdW1tYXJ5IEFkZHMgdGhlIHJlbmRlciBtZXRob2QgdG8gYWxsIE1vZGVsIGluc3RhbmNlcyBmcm9tIGRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBSZW5kZXJhYmxlIGludGVyZmFjZSBmb3IgdGhlIE1vZGVsIGNsYXNzIGJ5IGFkZGluZyBhIHJlbmRlciBtZXRob2RcbiAqIHRvIGl0cyBwcm90b3R5cGUuIFRoaXMgYWxsb3dzIGFueSBNb2RlbCBpbnN0YW5jZSB0byBiZSByZW5kZXJlZCB1c2luZyB0aGUgUmVuZGVyaW5nRW5naW5lLlxuICogQG1vZHVsZSBtb2RlbC9vdmVycmlkZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9ycy9tb2RlbFxuICovXG5cbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVuZGVyaW5nRW5naW5lIH0gZnJvbSBcIi4uL3VpL1JlbmRlcmluZ1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIERlY29yYXRpb25LZXlzLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHtcbiAgQ3J1ZE9wZXJhdGlvbktleXMsXG4gIGdldFVJQXR0cmlidXRlS2V5LFxuICBSZW5kZXJpbmdFcnJvcixcbiAgVUlFbGVtZW50TWV0YWRhdGEsXG4gIFVJS2V5cyxcbiAgVUlNb2RlbE1ldGFkYXRhLFxufSBmcm9tIFwiLi4vdWkvaW5kZXhcIjtcbmltcG9ydCBcIi4vbW9kZWxcIjtcbmltcG9ydCB7IE5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVuZGVycyB0aGUgbW9kZWwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIHJlbmRlcmluZyBlbmdpbmVcbiAqIEBzdW1tYXJ5IERlbGVnYXRlcyByZW5kZXJpbmcgdG8gdGhlIFJlbmRlcmluZ0VuZ2luZSBiYXNlZCBvbiBtb2RlbCBtZXRhZGF0YVxuICogVGhpcyBtZXRob2QgaW1wbGVtZW50cyB0aGUgcmVuZGVyIG1ldGhvZCBmcm9tIHRoZSBSZW5kZXJhYmxlIGludGVyZmFjZSBmb3IgYWxsIE1vZGVsIGluc3RhbmNlcy5cbiAqIEl0IHVzZXMgdGhlIFJlbmRlcmluZ0VuZ2luZSB0byBkZXRlcm1pbmUgaG93IHRvIHJlbmRlciB0aGUgbW9kZWwgYmFzZWQgb24gaXRzIG1ldGFkYXRhLlxuICpcbiAqIEB0ZW1wbGF0ZSBNIFR5cGUgb2YgdGhlIG1vZGVsIGJlaW5nIHJlbmRlcmVkXG4gKiBAcGFyYW0ge2FueVtdfSBhcmdzIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHJlbmRlcmluZyBlbmdpbmVcbiAqIEByZXR1cm4ge2FueX0gVGhlIHJlbmRlcmVkIG91dHB1dCBpbiB0aGUgZm9ybWF0IGRldGVybWluZWQgYnkgdGhlIHJlbmRlcmluZyBlbmdpbmVcbiAqL1xuTW9kZWwucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KHRoaXM6IE0sIC4uLmFyZ3M6IGFueVtdKSB7XG4gIHJldHVybiBSZW5kZXJpbmdFbmdpbmUucmVuZGVyKHRoaXMsIC4uLmFyZ3MpO1xufTtcblxuKE1vZGVsIGFzIGFueSkucmVuZGVyZWRCeSA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8TT5cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBNZXRhZGF0YS5nZXQobW9kZWwsIE1ldGFkYXRhLmtleShVSUtleXMuUkVGTEVDVCwgVUlLZXlzLlJFTkRFUkVEX0JZKSk7XG59LmJpbmQoTW9kZWwpO1xuXG4oTW9kZWwgYXMgYW55KS51aVByb3BlcnRpZXNPZiA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8TT5cbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWV0YSA9IE1ldGFkYXRhLmdldChcbiAgICBtb2RlbCxcbiAgICBNZXRhZGF0YS5rZXkoVUlLZXlzLlJFRkxFQ1QsIERlY29yYXRpb25LZXlzLlBST1BFUlRJRVMpXG4gICk7XG4gIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGEpO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkudWlEZWNvcmF0aW9uT2YgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICBwcm9wOiBzdHJpbmcsXG4gIGtleT86IHN0cmluZ1xuKTogYW55IHtcbiAgY29uc3QgbWV0YSA9IE1ldGFkYXRhLmdldChcbiAgICBtb2RlbCxcbiAgICBNZXRhZGF0YS5rZXkoVUlLZXlzLlJFRkxFQ1QsIERlY29yYXRpb25LZXlzLlBST1BFUlRJRVMsIHByb3ApXG4gICk7XG4gIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKCFrZXkpIHJldHVybiBtZXRhO1xuICByZXR1cm4gbWV0YVtrZXldO1xufTtcblxuKE1vZGVsIGFzIGFueSkudWlNb2RlbE9mID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPlxuKTogVUlNb2RlbE1ldGFkYXRhIHtcbiAgcmV0dXJuIE1ldGFkYXRhLmdldChtb2RlbCwgTWV0YWRhdGEua2V5KFVJS2V5cy5SRUZMRUNULCBVSUtleXMuVUlNT0RFTCkpO1xufTtcblxuKE1vZGVsIGFzIGFueSkudWlFbGVtZW50T2YgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICBwcm9wOiBzdHJpbmdcbik6IFVJRWxlbWVudE1ldGFkYXRhIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIE1ldGFkYXRhLmdldChtb2RlbCwgZ2V0VUlBdHRyaWJ1dGVLZXkocHJvcCwgVUlLZXlzLkVMRU1FTlQpKTtcbn07XG5cbihNb2RlbCBhcyBhbnkpLnVpTGlzdE1vZGVsT2YgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPE0+XG4pOiBVSU1vZGVsTWV0YWRhdGEge1xuICByZXR1cm4gTWV0YWRhdGEuZ2V0KG1vZGVsLCBNZXRhZGF0YS5rZXkoVUlLZXlzLlJFRkxFQ1QsIFVJS2V5cy5VSUxJU1RNT0RFTCkpO1xufTtcblxuKE1vZGVsIGFzIGFueSkudWlIYW5kbGVyc0ZvciA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8TT5cbik6IFVJTW9kZWxNZXRhZGF0YSB7XG4gIHJldHVybiBNZXRhZGF0YS5nZXQobW9kZWwsIE1ldGFkYXRhLmtleShVSUtleXMuUkVGTEVDVCwgVUlLZXlzLkhBTkRMRVJTKSk7XG59O1xuXG4oTW9kZWwgYXMgYW55KS51aUxheW91dE9mID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPlxuKTogVUlNb2RlbE1ldGFkYXRhIHtcbiAgcmV0dXJuIE1ldGFkYXRhLmdldChtb2RlbCwgTWV0YWRhdGEua2V5KFVJS2V5cy5SRUZMRUNULCBVSUtleXMuVUlMQVlPVVQpKTtcbn07XG5cbihNb2RlbCBhcyBhbnkpLnVpSXNIaWRkZW4gPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICBwcm9wOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gISFNZXRhZGF0YS5nZXQobW9kZWwsIGdldFVJQXR0cmlidXRlS2V5KHByb3AsIFVJS2V5cy5ISURERU4pKTtcbn07XG5cbihNb2RlbCBhcyBhbnkpLnVpSXNIaWRkZW5PbiA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gIHByb3A6IHN0cmluZyxcbiAgb3A/OiBDcnVkT3BlcmF0aW9uS2V5c1xuKTogQ3J1ZE9wZXJhdGlvbktleXNbXSB8IGJvb2xlYW4ge1xuICBjb25zdCBtZXRhID0gTWV0YWRhdGEuZ2V0KG1vZGVsLCBnZXRVSUF0dHJpYnV0ZUtleShwcm9wLCBVSUtleXMuSElEREVOKSk7XG4gIGlmICghbWV0YSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIW9wKSByZXR1cm4gbWV0YSBhcyBDcnVkT3BlcmF0aW9uS2V5c1tdO1xuICByZXR1cm4gKG1ldGEgYXMgQ3J1ZE9wZXJhdGlvbktleXNbXSkuaW5jbHVkZXMob3ApO1xufTtcblxuKE1vZGVsIGFzIGFueSkudWlUeXBlT2YgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICBwcm9wOiBzdHJpbmdcbik6IFVJTW9kZWxNZXRhZGF0YSB7XG4gIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwsXG4gICAgTWV0YWRhdGEua2V5KFVJS2V5cy5SRUZMRUNULCBEZWNvcmF0aW9uS2V5cy5QUk9QRVJUSUVTLCBwcm9wKVxuICApO1xuICBpZiAoIW1ldGEpXG4gICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICBgTm8gbWV0YWRhdGEgZm91bmQgZm9yIHByb3BlcnR5ICcke3Byb3B9JyBvbiBtb2RlbCAnJHttb2RlbC5uYW1lfSdgXG4gICAgKTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG1ldGEpLmZpbHRlcigoaykgPT5cbiAgICBbVUlLZXlzLlBST1AsIFVJS2V5cy5FTEVNRU5ULCBVSUtleXMuQ0hJTERdLmluY2x1ZGVzKGspXG4gICk7XG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMClcbiAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgIGBObyBVSSB0eXBlIG1ldGFkYXRhIGZvdW5kIGZvciBwcm9wZXJ0eSAnJHtwcm9wfScgb24gbW9kZWwgJyR7bW9kZWwubmFtZX0nYFxuICAgICk7XG4gIGlmIChrZXlzLmxlbmd0aCA+IDEpXG4gICAgdGhyb3cgbmV3IFJlbmRlcmluZ0Vycm9yKFxuICAgICAgYE9ubHkgb25lIHR5cGUgb2YgZGVjb3JhdGlvbiBpcyBhbGxvd2VkLiBQbGVhc2UgY2hvb3NlIGJldHdlZW4gQHVpcHJvcCwgQHVpY2hpbGQgb3IgQHVpZWxlbWVudGBcbiAgICApO1xuICByZXR1cm4gbWV0YVtrZXlzWzBdXTtcbn07XG4vL1xuLy8gKE1ldGFkYXRhIGFzIGFueSkudWlFbGVtZW50cyA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuLy8gICBtb2RlbDogQ29uc3RydWN0b3I8TT5cbi8vICk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbi8vICAgY29uc3QgcHJvcHMgPSBNZXRhZGF0YS51aVByb3BlcnRpZXNPZihtb2RlbCk7XG4vLyAgIGlmICghcHJvcHMpIHJldHVybiB1bmRlZmluZWQ7XG4vLyAgIHJldHVybiBwcm9wc1xuLy8gICAgIC5tYXAoKHByb3ApID0+IE1ldGFkYXRhLmdldChtb2RlbCwgZ2V0VUlBdHRyaWJ1dGVLZXkocHJvcCwgVUlLZXlzLkVMRU1FTlQpKSlcbi8vICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuLy8gfS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkudWlMaXN0SXRlbXMgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogTWV0YWRhdGEsXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPlxuKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBtZXRhID0gTWV0YWRhdGEuZ2V0KFxuICAgIG1vZGVsLFxuICAgIE1ldGFkYXRhLmtleShVSUtleXMuUkVGTEVDVCwgRGVjb3JhdGlvbktleXMuUFJPUEVSVElFUylcbiAgKTtcbiAgaWYgKCFtZXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gT2JqZWN0LmtleXMobWV0YSk7XG59LmJpbmQoTW9kZWwpO1xuIiwiaW1wb3J0IHsgVUlLZXlzIH0gZnJvbSBcIi4uL3VpL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgVUlIYW5kbGVyTWV0YWRhdGEsXG4gIFVJTGlzdE1vZGVsTWV0YWRhdGEsXG4gIFVJTW9kZWxNZXRhZGF0YSxcbiAgVUlMYXlvdXRNZXRhZGF0YSxcbiAgSVBhZ2VkQ29tcG9uZW50UHJvcGVydGllcyxcbn0gZnJvbSBcIi4uL3VpL3R5cGVzXCI7XG5pbXBvcnQgeyBVSU1lZGlhQnJlYWtQb2ludHMgfSBmcm9tIFwiLi4vdWkvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBhcHBseSwgTWV0YWRhdGEsIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IHRhZ3MgYSBjbGFzcyBhcyBhIFVJIG1vZGVsXG4gKiBAc3VtbWFyeSBBZGRzIHJlbmRlcmluZyBjYXBhYmlsaXRpZXMgdG8gYSBtb2RlbCBjbGFzcyBieSBwcm92aWRpbmcgYSByZW5kZXIgbWV0aG9kXG4gKiBUaGlzIGRlY29yYXRvciBhcHBsaWVzIG1ldGFkYXRhIHRvIHRoZSBjbGFzcyB0aGF0IGVuYWJsZXMgaXQgdG8gYmUgcmVuZGVyZWQgYnkgdGhlIFVJIHJlbmRlcmluZyBlbmdpbmUuXG4gKiBUaGUgbW9kZWwgd2lsbCBiZSByZW5kZXJlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdGFnIGFuZCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXSBUaGUgSFRNTCB0YWcgdG8gdXNlIHdoZW4gcmVuZGVyaW5nIHRoaXMgbW9kZWwgKGRlZmF1bHRzIHRvIGNsYXNzIG5hbWUpXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtwcm9wc10gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIHJlbmRlcmVkIGVsZW1lbnRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGNsYXNzIGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aW1vZGVsXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBCYXNpYyB1c2FnZSB3aXRoIGRlZmF1bHQgdGFnIChjbGFzcyBuYW1lKVxuICogQHVpbW9kZWwoKVxuICogY2xhc3MgVXNlclByb2ZpbGUgZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBuYW1lOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgZW1haWw6IHN0cmluZztcbiAqIH1cbiAqXG4gKiAvLyBVc2FnZSB3aXRoIGN1c3RvbSB0YWcgYW5kIHByb3BlcnRpZXNcbiAqIEB1aW1vZGVsKCdkaXYnLCB7IGNsYXNzOiAndXNlci1jYXJkJyB9KVxuICogY2xhc3MgVXNlckNhcmQgZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB1c2VybmFtZTogc3RyaW5nO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgU3lzdGVtXG4gKiAgIHBhcnRpY2lwYW50IHVpbW9kZWxcbiAqICAgcGFydGljaXBhbnQgY29uc3RydWN0b3JcbiAqICAgcGFydGljaXBhbnQgaW5zdGFuY2VcbiAqICAgU3lzdGVtLT4+dWltb2RlbDpkbyhjb25zdHJ1Y3RvcilcbiAqICAgdWltb2RlbC0+PmNvbnN0cnVjdG9yOiBFeGVjdXRlcyB0aGUgY29uc3RydWN0b3JcbiAqICAgY29uc3RydWN0b3ItPj51aW1vZGVsOiByZXR1cm5zIGluc3RhbmNlXG4gKiAgIHVpbW9kZWwtPj5pbnN0YW5jZTogYWRkcyB0aGUgcmVuZGVyIG1ldGhvZFxuICogICB1aW1vZGVsLT4+U3lzdGVtOiByZXR1cm5zIFVJTW9kZWwgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpbW9kZWwodGFnPzogc3RyaW5nLCBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICByZXR1cm4gKG9yaWdpbmFsOiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgY29uc3QgbWV0YTogVUlNb2RlbE1ldGFkYXRhID0ge1xuICAgICAgdGFnOiB0YWcgfHwgb3JpZ2luYWwubmFtZSxcbiAgICAgIHByb3BzOiBwcm9wcyxcbiAgICB9O1xuICAgIHJldHVybiBtZXRhZGF0YShcbiAgICAgIE1ldGFkYXRhLmtleShVSUtleXMuUkVGTEVDVCwgVUlLZXlzLlVJTU9ERUwpLFxuICAgICAgbWV0YVxuICAgICkob3JpZ2luYWwpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBzcGVjaWZpZXMgd2hpY2ggcmVuZGVyaW5nIGVuZ2luZSB0byB1c2UgZm9yIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IEFzc29jaWF0ZXMgYSBtb2RlbCB3aXRoIGEgc3BlY2lmaWMgcmVuZGVyaW5nIGVuZ2luZSBpbXBsZW1lbnRhdGlvblxuICogVGhpcyBkZWNvcmF0b3IgYWxsb3dzIHlvdSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCByZW5kZXJpbmcgZW5naW5lIGZvciBhIHNwZWNpZmljIG1vZGVsIGNsYXNzLFxuICogZW5hYmxpbmcgZGlmZmVyZW50IHJlbmRlcmluZyBzdHJhdGVnaWVzIGZvciBkaWZmZXJlbnQgbW9kZWxzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmdpbmUgVGhlIG5hbWUgb2YgdGhlIHJlbmRlcmluZyBlbmdpbmUgdG8gdXNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBjbGFzcyBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gcmVuZGVyZWRCeVxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU3BlY2lmeSBhIGN1c3RvbSByZW5kZXJpbmcgZW5naW5lIGZvciBhIG1vZGVsXG4gKiBAdWltb2RlbCgpXG4gKiBAcmVuZGVyZWRCeSgncmVhY3QnKVxuICogY2xhc3MgUmVhY3RDb21wb25lbnQgZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB0aXRsZTogc3RyaW5nO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgU3lzdGVtXG4gKiAgIHBhcnRpY2lwYW50IHJlbmRlcmVkQnlcbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIFN5c3RlbS0+PnJlbmRlcmVkQnk6IGFwcGx5IHRvIE1vZGVsXG4gKiAgIHJlbmRlcmVkQnktPj5Nb2RlbDogYWRkcyBlbmdpbmUgbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IHVzZXMgc3BlY2lmaWVkIGVuZ2luZVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5TeXN0ZW06IHJlbmRlcnMgd2l0aCBjdXN0b20gZW5naW5lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJlZEJ5KGVuZ2luZTogc3RyaW5nKSB7XG4gIHJldHVybiBhcHBseShcbiAgICBtZXRhZGF0YShNZXRhZGF0YS5rZXkoVUlLZXlzLlJFRkxFQ1QsIFVJS2V5cy5SRU5ERVJFRF9CWSksIGVuZ2luZSlcbiAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgdGFncyBhIG1vZGVsIGFzIGEgbGlzdCBpdGVtIGZvciBVSSByZW5kZXJpbmdcbiAqIEBzdW1tYXJ5IFNwZWNpZmllcyBob3cgYSBtb2RlbCBzaG91bGQgYmUgcmVuZGVyZWQgd2hlbiBkaXNwbGF5ZWQgaW4gYSBsaXN0IGNvbnRleHRcbiAqIFRoaXMgZGVjb3JhdG9yIGFwcGxpZXMgbWV0YWRhdGEgdG8gdGhlIGNsYXNzIHRoYXQgZW5hYmxlcyBpdCB0byBiZSByZW5kZXJlZCBhcyBhIGxpc3QgaXRlbVxuICogYnkgdGhlIFVJIHJlbmRlcmluZyBlbmdpbmUuIFRoZSBtb2RlbCB3aWxsIGJlIHJlbmRlcmVkIHdpdGggdGhlIHNwZWNpZmllZCB0YWcgYW5kIHByb3BlcnRpZXNcbiAqIHdoZW4gaXQgYXBwZWFycyBpbiBhIGxpc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIFRoZSBIVE1MIHRhZyB0byB1c2Ugd2hlbiByZW5kZXJpbmcgdGhpcyBtb2RlbCBhcyBhIGxpc3QgaXRlbSAoZGVmYXVsdHMgdG8gY2xhc3MgbmFtZSlcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3Byb3BzXSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgcmVuZGVyZWQgbGlzdCBpdGVtIGVsZW1lbnRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGNsYXNzIGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aWxpc3Rtb2RlbFxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQmFzaWMgdXNhZ2Ugd2l0aCBkZWZhdWx0IHRhZyAoY2xhc3MgbmFtZSlcbiAqIEB1aW1vZGVsKClcbiAqIEB1aWxpc3Rtb2RlbCgpXG4gKiBjbGFzcyBUb2RvSXRlbSBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHRpdGxlOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgY29tcGxldGVkOiBib29sZWFuO1xuICogfVxuICpcbiAqIC8vIFVzYWdlIHdpdGggY3VzdG9tIHRhZyBhbmQgcHJvcGVydGllc1xuICogQHVpbW9kZWwoKVxuICogQHVpbGlzdG1vZGVsKCdsaScsIHsgY2xhc3M6ICdsaXN0LWdyb3VwLWl0ZW0nIH0pXG4gKiBjbGFzcyBMaXN0SXRlbSBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHRleHQ6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFN5c3RlbVxuICogICBwYXJ0aWNpcGFudCB1aWxpc3Rtb2RlbFxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgU3lzdGVtLT4+dWlsaXN0bW9kZWw6IGFwcGx5IHRvIE1vZGVsXG4gKiAgIHVpbGlzdG1vZGVsLT4+TW9kZWw6IGFkZHMgbGlzdCBpdGVtIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiB1c2VzIGxpc3QgaXRlbSBtZXRhZGF0YSB3aGVuIGluIGxpc3QgY29udGV4dFxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5TeXN0ZW06IHJlbmRlcnMgd2l0aCBsaXN0IGl0ZW0gc3R5bGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdWlsaXN0bW9kZWwobmFtZT86IHN0cmluZywgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcmV0dXJuIChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IG1ldGE6IFVJTGlzdE1vZGVsTWV0YWRhdGEgPSB7XG4gICAgICBpdGVtOiB7XG4gICAgICAgIHRhZzogbmFtZSB8fCBvcmlnaW5hbC5uYW1lLFxuICAgICAgICBwcm9wczogcHJvcHMsXG4gICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIG1ldGFkYXRhKFxuICAgICAgTWV0YWRhdGEua2V5KFVJS2V5cy5SRUZMRUNULCBVSUtleXMuVUlMSVNUTU9ERUwpLFxuICAgICAgbWV0YVxuICAgICkob3JpZ2luYWwpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBhZGRzIGV2ZW50IGhhbmRsZXJzIHRvIGEgVUkgbW9kZWxcbiAqIEBzdW1tYXJ5IFNwZWNpZmllcyBldmVudCBoYW5kbGVycyB0aGF0IHNob3VsZCBiZSBhdHRhY2hlZCB0byB0aGUgcmVuZGVyZWQgbW9kZWxcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gZGVmaW5lIGV2ZW50IGhhbmRsZXJzIHRoYXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5XG4gKiBhdHRhY2hlZCB0byB0aGUgcmVuZGVyZWQgVUkgZWxlbWVudC4gVGhlIGhhbmRsZXJzIGFyZSBwYXNzZWQgYXMgcHJvcGVydGllc1xuICogdG8gdGhlIHJlbmRlcmluZyBlbmdpbmUuXG4gKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHNdIE9iamVjdCBjb250YWluaW5nIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zIGFuZCBvdGhlciBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBjbGFzcyBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWloYW5kbGVyc1xuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIGV2ZW50IGhhbmRsZXJzIHRvIGEgbW9kZWxcbiAqIEB1aW1vZGVsKCdidXR0b24nKVxuICogQHVpaGFuZGxlcnMoe1xuICogICBvbkNsaWNrOiAoZXZlbnQpID0+IGNvbnNvbGUubG9nKCdCdXR0b24gY2xpY2tlZCcpLFxuICogICBvbk1vdXNlT3ZlcjogKGV2ZW50KSA9PiBjb25zb2xlLmxvZygnTW91c2Ugb3ZlciBidXR0b24nKSxcbiAqICAgZGlzYWJsZWQ6IGZhbHNlXG4gKiB9KVxuICogY2xhc3MgQ2xpY2thYmxlQnV0dG9uIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgbGFiZWw6IHN0cmluZztcbiAqIH1cbiAqXG4gKiAvLyBBZGQgZm9ybSBzdWJtaXNzaW9uIGhhbmRsZXJzXG4gKiBAdWltb2RlbCgnZm9ybScpXG4gKiBAdWloYW5kbGVycyh7XG4gKiAgIG9uU3VibWl0OiAoZXZlbnQpID0+IHtcbiAqICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICogICAgIGNvbnNvbGUubG9nKCdGb3JtIHN1Ym1pdHRlZCcpO1xuICogICB9LFxuICogICBvblJlc2V0OiAoZXZlbnQpID0+IGNvbnNvbGUubG9nKCdGb3JtIHJlc2V0JylcbiAqIH0pXG4gKiBjbGFzcyBDb250YWN0Rm9ybSBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGVtYWlsOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBTeXN0ZW1cbiAqICAgcGFydGljaXBhbnQgdWloYW5kbGVyc1xuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgVUlcbiAqICAgU3lzdGVtLT4+dWloYW5kbGVyczogYXBwbHkgdG8gTW9kZWxcbiAqICAgdWloYW5kbGVycy0+Pk1vZGVsOiBhZGRzIGhhbmRsZXIgbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IHJlcXVlc3RzIHJlbmRlcmluZyB3aXRoIGhhbmRsZXJzXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlVJOiByZW5kZXJzIGVsZW1lbnQgd2l0aCBldmVudCBoYW5kbGVycyBhdHRhY2hlZFxuICogICBVSS0+Pk1vZGVsOiB0cmlnZ2VycyBoYW5kbGVycyBvbiBldmVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpaGFuZGxlcnMocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gIHJldHVybiAob3JpZ2luYWw6IGFueSkgPT4ge1xuICAgIGNvbnN0IG1ldGE6IFVJSGFuZGxlck1ldGFkYXRhID0ge1xuICAgICAgaGFuZGxlcnM6IHByb3BzLFxuICAgIH07XG4gICAgcmV0dXJuIG1ldGFkYXRhKFxuICAgICAgTWV0YWRhdGEua2V5KFVJS2V5cy5SRUZMRUNULCBVSUtleXMuSEFORExFUlMpLFxuICAgICAgbWV0YVxuICAgICkob3JpZ2luYWwpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBjcmVhdGVzIGEgbGF5b3V0IGNvbnRhaW5lciB3aXRoIGdyaWQgc3BlY2lmaWNhdGlvbnNcbiAqIEBzdW1tYXJ5IENvbWJpbmVzIFVJIG1vZGVsIGZ1bmN0aW9uYWxpdHkgd2l0aCBsYXlvdXQgZ3JpZCBjb25maWd1cmF0aW9uXG4gKiBUaGlzIGRlY29yYXRvciBjcmVhdGVzIGEgVUkgbW9kZWwgdGhhdCBhY3RzIGFzIGEgbGF5b3V0IGNvbnRhaW5lciB3aXRoIHNwZWNpZmllZFxuICogY29sdW1uIGFuZCByb3cgY29uZmlndXJhdGlvbnMuIEl0J3MgYSBjb252ZW5pZW5jZSBkZWNvcmF0b3IgdGhhdCBjb21iaW5lcy5cbiAqIEB1aW1vZGVsIHdpdGggbGF5b3V0LXNwZWNpZmljIHByb3BlcnRpZXMgZm9yIHJlc3BvbnNpdmUgZ3JpZCBsYXlvdXRzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIEhUTUwgdGFnIHRvIHVzZSBmb3IgdGhlIGxheW91dCBjb250YWluZXJcbiAqIEBwYXJhbSB7bnVtYmVyfGJvb2xlYW59IFtjb2xzTW9kZT0xXSBOdW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgZ3JpZCBsYXlvdXQgb3IgYSBib29sZWFuIGZvciBmbGV4IG1vZGVcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ1tdfSBbcm93cz0xXSBOdW1iZXIgb2Ygcm93cyBvciBhcnJheSBvZiByb3cgZGVmaW5pdGlvbnNcbiAqIEBwYXJhbSB7VUlNZWRpYUJyZWFrUG9pbnRzfSBbYnJlYWtwb2ludD0nbSddIE1lZGlhIGJyZWFrcG9pbnQgZm9yIHJlc3BvbnNpdmUgYmVoYXZpb3JcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGNsYXNzIGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aWxheW91dFxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgc2ltcGxlIDItY29sdW1uIGxheW91dFxuICogQHVpbGF5b3V0KCdkaXYnLCAyLCAzKVxuICogY2xhc3MgVHdvQ29sdW1uTGF5b3V0IGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0cHJvcCgxLCAxKVxuICogICBoZWFkZXI6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsYXlvdXRwcm9wKDEsIDIpXG4gKiAgIGxlZnRDb250ZW50OiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0cHJvcCgyLCAyKVxuICogICByaWdodENvbnRlbnQ6IHN0cmluZztcbiAqIH1cbiAqXG4gKiAvLyBDcmVhdGUgYSByZXNwb25zaXZlIGxheW91dCB3aXRoIGN1c3RvbSBicmVha3BvaW50XG4gKiBAdWlsYXlvdXQoJ3NlY3Rpb24nLCB0cnVlLCAyLCAnbCcpXG4gKiBjbGFzcyBSZXNwb25zaXZlTGF5b3V0IGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0cHJvcCgxLCAxKVxuICogICB0aXRsZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxheW91dHByb3AoMiwgMSlcbiAqICAgc3VidGl0bGU6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFN5c3RlbVxuICogICBwYXJ0aWNpcGFudCB1aWxheW91dFxuICogICBwYXJ0aWNpcGFudCB1aW1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBTeXN0ZW0tPj51aWxheW91dDogYXBwbHkgdG8gTW9kZWxcbiAqICAgdWlsYXlvdXQtPj51aW1vZGVsOiBjYWxsIHdpdGggbGF5b3V0IHByb3BzXG4gKiAgIHVpbW9kZWwtPj5Nb2RlbDogYWRkcyBtb2RlbCBtZXRhZGF0YSB3aXRoIGxheW91dCBjb25maWdcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IHJlcXVlc3RzIHJlbmRlcmluZyBhcyBsYXlvdXQgY29udGFpbmVyXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlN5c3RlbTogcmVuZGVycyBncmlkIGxheW91dCB3aXRoIHNwZWNpZmllZCBkaW1lbnNpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aWxheW91dChcbiAgdGFnOiBzdHJpbmcsXG4gIGNvbHNNb2RlOiBudW1iZXIgfCBib29sZWFuID0gMSxcbiAgcm93czogbnVtYmVyIHwgc3RyaW5nW10gPSAxLFxuICBwcm9wczogYW55ID0ge31cbikge1xuICBjb25zdCBjb25maWcgPSBPYmplY3QuYXNzaWduKHtcbiAgICAuLi4odHlwZW9mIGNvbHNNb2RlID09PSBcImJvb2xlYW5cIlxuICAgICAgPyB7XG4gICAgICAgICAgZmxleE1vZGU6IGNvbHNNb2RlLFxuICAgICAgICAgIGNvbHM6IDEsXG4gICAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICAgIGZsZXhNb2RlOiBmYWxzZSxcbiAgICAgICAgICBjb2xzOiBjb2xzTW9kZSxcbiAgICAgICAgfSksXG4gICAgcm93cyxcbiAgICAuLi5PYmplY3QuYXNzaWduKHsgYnJlYWtwb2ludDogVUlNZWRpYUJyZWFrUG9pbnRzLkxBUkdFIH0sIHByb3BzKSxcbiAgfSBhcyBVSUxheW91dE1ldGFkYXRhKTtcbiAgcmV0dXJuIChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIG1ldGFkYXRhKE1ldGFkYXRhLmtleShVSUtleXMuUkVGTEVDVCwgVUlLZXlzLlVJTEFZT1VUKSwgY29uZmlnKShvcmlnaW5hbCk7XG4gICAgcmV0dXJuIHVpbW9kZWwodGFnLCBjb25maWcpKG9yaWdpbmFsLCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IGNyZWF0ZXMgYSBtdWx0aS1zdGVwIGZvcm0gbW9kZWwgd2l0aCBwYWdlIG5hdmlnYXRpb25cbiAqIEBzdW1tYXJ5IENvbWJpbmVzIFVJIG1vZGVsIGZ1bmN0aW9uYWxpdHkgd2l0aCBzdGVwcGVkL3dpemFyZCBmb3JtIGNvbmZpZ3VyYXRpb25cbiAqIFRoaXMgZGVjb3JhdG9yIGNyZWF0ZXMgYSBVSSBtb2RlbCB0aGF0IGFjdHMgYXMgYSBtdWx0aS1zdGVwIGNvbnRhaW5lciB3aXRoIHBhZ2UgbmF2aWdhdGlvblxuICogY2FwYWJpbGl0aWVzLiBJdCBpcyBkZXNpZ25lZCBmb3Igd2l6YXJkLXN0eWxlIGZvcm1zIG9yIG11bHRpLXBhZ2Ugd29ya2Zsb3dzIHdoZXJlIHVzZXJzXG4gKiBwcm9ncmVzcyB0aHJvdWdoIHNlcXVlbnRpYWwgc3RlcHMuIFRoZSBkZWNvcmF0b3IgY29tYmluZXMgQHVpbW9kZWwgd2l0aCBwYWdlLXNwZWNpZmljXG4gKiBwcm9wZXJ0aWVzIGFuZCBvcHRpb25hbCBwYWdpbmF0aW9uIGNvbnRyb2xzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgLSBUaGUgSFRNTCB0YWcgdG8gdXNlIGZvciB0aGUgc3RlcHBlZCBmb3JtIGNvbnRhaW5lclxuICogQHBhcmFtIHtudW1iZXIgfCBJUGFnZWRDb21wb25lbnRQcm9wZXJ0aWVzW119IFtwYWdlcz0xXSAtIE51bWJlciBvZiBwYWdlcyBvciBhbiBhcnJheSBvZiBwYWdlIGRlZmluaXRpb25zIHdpdGggbWV0YWRhdGFcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhZ2luYXRlZD1mYWxzZV0gLSBXaGV0aGVyIHRvIHNob3cgcGFnaW5hdGlvbiBjb250cm9scyAoZS5nLiwgcHJldi9uZXh0IGJ1dHRvbnMpXG4gKiBAcGFyYW0ge2FueX0gW3Byb3BzPXt9XSAtIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSBjb250YWluZXIgZWxlbWVudFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgY2xhc3MgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpc3RlcHBlZG1vZGVsXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBzaW1wbGUgMy1zdGVwIHdpemFyZCBmb3JtXG4gKiBAdWlzdGVwcGVkbW9kZWwoJ2RpdicsIDMsIHRydWUpXG4gKiBjbGFzcyBSZWdpc3RyYXRpb25XaXphcmQgZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIC8vIFBhZ2UgMTogUGVyc29uYWwgSW5mb1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcGFnZXByb3AoMSlcbiAqICAgZmlyc3ROYW1lOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcGFnZXByb3AoMSlcbiAqICAgbGFzdE5hbWU6IHN0cmluZztcbiAqXG4gKiAgIC8vIFBhZ2UgMjogQ29udGFjdCBJbmZvXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwYWdlcHJvcCgyKVxuICogICBlbWFpbDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXBhZ2Vwcm9wKDIpXG4gKiAgIHBob25lOiBzdHJpbmc7XG4gKlxuICogICAvLyBQYWdlIDM6IENvbmZpcm1hdGlvblxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcGFnZXByb3AoMylcbiAqICAgYWNjZXB0VGVybXM6IGJvb2xlYW47XG4gKiB9XG4gKlxuICogLy8gQ3JlYXRlIGEgd2l6YXJkIHdpdGggY3VzdG9tIHBhZ2UgZGVmaW5pdGlvbnNcbiAqIEB1aXN0ZXBwZWRtb2RlbCgnc2VjdGlvbicsIFtcbiAqICAgeyB0aXRsZTogJ1BlcnNvbmFsJywgaWNvbjogJ3VzZXInIH0sXG4gKiAgIHsgdGl0bGU6ICdDb250YWN0JywgaWNvbjogJ2VtYWlsJyB9LFxuICogICB7IHRpdGxlOiAnUmV2aWV3JywgaWNvbjogJ2NoZWNrJyB9XG4gKiBdLCB0cnVlLCB7IGNsYXNzOiAnd2l6YXJkLWNvbnRhaW5lcicgfSlcbiAqIGNsYXNzIE9uYm9hcmRpbmdXaXphcmQgZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwYWdlcHJvcCgxKVxuICogICB1c2VybmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXBhZ2Vwcm9wKDIpXG4gKiAgIGVtYWlsOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcGFnZXByb3AoMylcbiAqICAgcHJlZmVyZW5jZXM6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFN5c3RlbVxuICogICBwYXJ0aWNpcGFudCB1aXN0ZXBwZWRtb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aW1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBQYWdpbmF0aW9uQ29udHJvbGxlclxuICogICBTeXN0ZW0tPj51aXN0ZXBwZWRtb2RlbDogYXBwbHkgdG8gTW9kZWxcbiAqICAgdWlzdGVwcGVkbW9kZWwtPj51aW1vZGVsOiBjYWxsIHdpdGggcGFnZSBjb25maWdcbiAqICAgdWltb2RlbC0+Pk1vZGVsOiBhZGRzIG1vZGVsIG1ldGFkYXRhIHdpdGggcGFnZXMgYW5kIHBhZ2luYXRpb25cbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IHJlcXVlc3RzIHJlbmRlcmluZyBhcyBzdGVwcGVkIGZvcm1cbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+UGFnaW5hdGlvbkNvbnRyb2xsZXI6IGluaXRpYWxpemUgcGFnZSBuYXZpZ2F0aW9uXG4gKiAgIFBhZ2luYXRpb25Db250cm9sbGVyLT4+U3lzdGVtOiByZW5kZXJzIGN1cnJlbnQgcGFnZSB3aXRoIG5hdmlnYXRpb24gY29udHJvbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpc3RlcHBlZG1vZGVsKFxuICB0YWc6IHN0cmluZyxcbiAgcGFnZXM6IG51bWJlciB8IElQYWdlZENvbXBvbmVudFByb3BlcnRpZXNbXSA9IDEsXG4gIHBhZ2luYXRlZDogYm9vbGVhbiA9IGZhbHNlLFxuICBwcm9wczogYW55ID0ge31cbikge1xuICBsZXQgcGFnZVRpdGxlczogSVBhZ2VkQ29tcG9uZW50UHJvcGVydGllc1tdID0gW107XG4gIGlmICh0eXBlb2YgcGFnZXMgPT09IFwib2JqZWN0XCIpIHtcbiAgICBwYWdlVGl0bGVzID0gcGFnZXMgYXMgSVBhZ2VkQ29tcG9uZW50UHJvcGVydGllc1tdO1xuICAgIHBhZ2VzID0gcGFnZVRpdGxlcy5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIHVpbW9kZWwodGFnLCB7XG4gICAgcGFnZXMsXG4gICAgcGFnaW5hdGVkLFxuICAgIHBhZ2VUaXRsZXMsXG4gICAgcHJvcHMsXG4gIH0pO1xufVxuIiwiaW1wb3J0IFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBNb2RlbEJ1aWxkZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICB1aWhhbmRsZXJzLFxuICB1aWxheW91dCxcbiAgdWlsaXN0bW9kZWwsXG4gIHVpbW9kZWwsXG4gIHVpc3RlcHBlZG1vZGVsLFxuICByZW5kZXJlZEJ5LFxufSBmcm9tIFwiLi4vbW9kZWwvZGVjb3JhdG9yc1wiO1xuXG5kZWNsYXJlIG1vZHVsZSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiIHtcbiAgaW50ZXJmYWNlIE1vZGVsQnVpbGRlcjxNPiB7XG4gICAgZGVjb3JhdGVDbGFzcyhkZWNvcmF0b3I6IENsYXNzRGVjb3JhdG9yKTogTW9kZWxCdWlsZGVyPE0+O1xuICB9XG59XG5cbmRlY2xhcmUgbW9kdWxlIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCIge1xuICBleHBvcnQgaW50ZXJmYWNlIE1vZGVsQnVpbGRlcjxNPiB7XG4gICAgdWltb2RlbCh0YWc/OiBzdHJpbmcsIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55Pik6IE1vZGVsQnVpbGRlcjxNPjtcbiAgICByZW5kZXJlZEJ5KGVuZ2luZTogc3RyaW5nKTogTW9kZWxCdWlsZGVyPE0+O1xuICAgIHVpbGlzdG1vZGVsKG5hbWU/OiBzdHJpbmcsIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55Pik6IE1vZGVsQnVpbGRlcjxNPjtcbiAgICB1aWhhbmRsZXJzKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55Pik6IE1vZGVsQnVpbGRlcjxNPjtcbiAgICB1aWxheW91dChcbiAgICAgIHRhZzogc3RyaW5nLFxuICAgICAgY29sc01vZGU/OiBudW1iZXIgfCBib29sZWFuLFxuICAgICAgcm93cz86IG51bWJlciB8IHN0cmluZ1tdLFxuICAgICAgcHJvcHM/OiBhbnlcbiAgICApOiBNb2RlbEJ1aWxkZXI8TT47XG4gICAgdWlzdGVwcGVkbW9kZWwoXG4gICAgICB0YWc6IHN0cmluZyxcbiAgICAgIHBhZ2VzPzogbnVtYmVyIHwgYW55W10sXG4gICAgICBwYWdpbmF0ZWQ/OiBib29sZWFuLFxuICAgICAgcHJvcHM/OiBhbnlcbiAgICApOiBNb2RlbEJ1aWxkZXI8TT47XG4gIH1cbn1cblxuY29uc3QgcHJvdG90eXBlID0gTW9kZWxCdWlsZGVyLnByb3RvdHlwZSBhcyBNb2RlbEJ1aWxkZXI8YW55PiAmIHtcbiAgdWltb2RlbDogKHRhZz86IHN0cmluZywgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBNb2RlbEJ1aWxkZXI8YW55PjtcbiAgcmVuZGVyZWRCeTogKGVuZ2luZTogc3RyaW5nKSA9PiBNb2RlbEJ1aWxkZXI8YW55PjtcbiAgdWlsaXN0bW9kZWw6IChuYW1lPzogc3RyaW5nLCBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IE1vZGVsQnVpbGRlcjxhbnk+O1xuICB1aWhhbmRsZXJzOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBNb2RlbEJ1aWxkZXI8YW55PjtcbiAgdWlsYXlvdXQ6IChcbiAgICB0YWc6IHN0cmluZyxcbiAgICBjb2xzTW9kZT86IG51bWJlciB8IGJvb2xlYW4sXG4gICAgcm93cz86IG51bWJlciB8IHN0cmluZ1tdLFxuICAgIHByb3BzPzogYW55XG4gICkgPT4gTW9kZWxCdWlsZGVyPGFueT47XG4gIHVpc3RlcHBlZG1vZGVsOiAoXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgcGFnZXM/OiBudW1iZXIgfCBhbnlbXSxcbiAgICBwYWdpbmF0ZWQ/OiBib29sZWFuLFxuICAgIHByb3BzPzogYW55XG4gICkgPT4gTW9kZWxCdWlsZGVyPGFueT47XG59O1xuXG5pZiAoIXByb3RvdHlwZS5kZWNvcmF0ZUNsYXNzKSB7XG4gIHByb3RvdHlwZS5kZWNvcmF0ZUNsYXNzID0gZnVuY3Rpb24gKGRlY29yYXRvcjogQ2xhc3NEZWNvcmF0b3IpIHtcbiAgICBpZiAoISh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycykge1xuICAgICAgKHRoaXMgYXMgYW55KS5fY2xhc3NEZWNvcmF0b3JzID0gW107XG4gICAgfVxuICAgICh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycy5wdXNoKGRlY29yYXRvcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbnByb3RvdHlwZS51aW1vZGVsID0gZnVuY3Rpb24gKHRhZz86IHN0cmluZywgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gIHJldHVybiB0aGlzLmRlY29yYXRlQ2xhc3ModWltb2RlbCh0YWcsIHByb3BzKSk7XG59O1xuXG5wcm90b3R5cGUucmVuZGVyZWRCeSA9IGZ1bmN0aW9uIChlbmdpbmU6IHN0cmluZykge1xuICByZXR1cm4gdGhpcy5kZWNvcmF0ZUNsYXNzKHJlbmRlcmVkQnkoZW5naW5lKSk7XG59O1xuXG5wcm90b3R5cGUudWlsaXN0bW9kZWwgPSBmdW5jdGlvbiAobmFtZT86IHN0cmluZywgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gIHJldHVybiB0aGlzLmRlY29yYXRlQ2xhc3ModWlsaXN0bW9kZWwobmFtZSwgcHJvcHMpKTtcbn07XG5cbnByb3RvdHlwZS51aWhhbmRsZXJzID0gZnVuY3Rpb24gKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICByZXR1cm4gdGhpcy5kZWNvcmF0ZUNsYXNzKHVpaGFuZGxlcnMocHJvcHMpKTtcbn07XG5cbnByb3RvdHlwZS51aWxheW91dCA9IGZ1bmN0aW9uIChcbiAgdGFnOiBzdHJpbmcsXG4gIGNvbHNNb2RlPzogbnVtYmVyIHwgYm9vbGVhbixcbiAgcm93cz86IG51bWJlciB8IHN0cmluZ1tdLFxuICBwcm9wcz86IGFueVxuKSB7XG4gIHJldHVybiB0aGlzLmRlY29yYXRlQ2xhc3ModWlsYXlvdXQodGFnLCBjb2xzTW9kZSwgcm93cywgcHJvcHMpKTtcbn07XG5cbnByb3RvdHlwZS51aXN0ZXBwZWRtb2RlbCA9IGZ1bmN0aW9uIChcbiAgdGFnOiBzdHJpbmcsXG4gIHBhZ2VzPzogbnVtYmVyIHwgYW55W10sXG4gIHBhZ2luYXRlZD86IGJvb2xlYW4sXG4gIHByb3BzPzogYW55XG4pIHtcbiAgcmV0dXJuIHRoaXMuZGVjb3JhdGVDbGFzcyh1aXN0ZXBwZWRtb2RlbCh0YWcsIHBhZ2VzLCBwYWdpbmF0ZWQsIHByb3BzKSk7XG59O1xuIiwiLyoqXG4gKiBAbW9kdWxlIHVpLWRlY29yYXRvcnMvZGFzaGJvYXJkL2NvbnN0YW50c1xuICogQHN1bW1hcnkgTWV0YWRhdGEga2V5cyBmb3IgdGhlIGRhc2hib2FyZC1zZWxlY3RhYmxlLWNvbXBvbmVudCBkZWNvcmF0b3IuXG4gKiBAZGVzY3JpcHRpb24gTmFtZXNwYWNlZCBrZXlzIHVzZWQgdG8gc3RvcmUgcGFsZXR0ZSBtZXRhZGF0YSBvbiBhXG4gKiBgQGRhc2hjb21wb25lbnRgLWRlY29yYXRlZCBjbGFzcy4gTWlycm9ycyB0aGUgYGdyYXBoYCBzdWJtb2R1bGUnc1xuICogYEdyYXBoS2V5c2AgY29udmVudGlvbiBzbyB0aGUgZGFzaGJvYXJkIG1ldGFkYXRhIGZhbWlseSBpcyBpc29sYXRlZCBmcm9tXG4gKiB0aGUgVUkgbW9kZWwgbWV0YWRhdGEga2V5cy5cbiAqL1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXRhZGF0YSBrZXkgY29uc3RhbnRzIGZvciBkYXNoYm9hcmQgY29tcG9uZW50cy5cbiAqIEBzdW1tYXJ5IENvbGxlY3Rpb24gb2Ygc3RyaW5nIGtleXMgdXNlZCBhcyBtZXRhZGF0YSBuYW1lc3BhY2VzIGZvclxuICogZGFzaGJvYXJkLXNlbGVjdGFibGUgY29tcG9uZW50cy4gVGhlIGBDT01QT05FTlRgIGtleSBjYXJyaWVzIHRoZSBwYWxldHRlXG4gKiBtZXRhZGF0YSBvYmplY3QgYXR0YWNoZWQgYnkgYEBkYXNoY29tcG9uZW50KClgLlxuICogQGVudW0gRGFzaEtleXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9ycy9kYXNoYm9hcmQvY29uc3RhbnRzXG4gKi9cbmV4cG9ydCBlbnVtIERhc2hLZXlzIHtcbiAgLyoqIE5hbWVzcGFjZSByb290IGZvciBhbGwgZGFzaGJvYXJkIG1ldGFkYXRhLiAqL1xuICBST09UID0gXCJkYXNoYm9hcmRcIixcbiAgLyoqIEtleSB1bmRlciB3aGljaCBgQGRhc2hjb21wb25lbnQoKWAgcGFsZXR0ZSBtZXRhZGF0YSBpcyBzdG9yZWQuICovXG4gIENPTVBPTkVOVCA9IGAke0Rhc2hLZXlzLlJPT1R9LmNvbXBvbmVudGAsXG59XG4iLCIvKipcbiAqIEBtb2R1bGUgdWktZGVjb3JhdG9ycy9kYXNoYm9hcmQvcmVnaXN0cnlcbiAqIEBzdW1tYXJ5IERhc2hib2FyZC1zZWxlY3RhYmxlIGNvbXBvbmVudCByZWdpc3RyeS5cbiAqIEBkZXNjcmlwdGlvbiBNb2R1bGUtbGV2ZWwgcmVnaXN0cnkgdGhhdCB0cmFja3MgZXZlcnkgYEBkYXNoY29tcG9uZW50YC1cbiAqIGRlY29yYXRlZCBjb25zdHJ1Y3Rvci4gVGhlIGBAZGFzaGNvbXBvbmVudGAgZGVjb3JhdG9yIGNhbGxzXG4gKiB7QGxpbmsgcmVnaXN0ZXJEYXNoQ29tcG9uZW50fSBhcyBhIHNpZGUtZWZmZWN0OyBjb25zdW1lcnMgZGlzY292ZXIgYWxsXG4gKiBkZWNvcmF0ZWQgY2xhc3NlcyB2aWEge0BsaW5rIGRhc2hDb21wb25lbnRzfS5cbiAqXG4gKiBUaGlzIGZvbGxvd3MgdGhlIHNhbWUgcGF0dGVybiBhcyB0aGUgYGdyYXBoYCBzdWJtb2R1bGUncyBub2RlIHJlZ2lzdHJ5IGFuZFxuICogdGhlIGBJbmplY3RhYmxlc1JlZ2lzdHJ5YCBpbiBgaW5qZWN0YWJsZS1kZWNvcmF0b3JzYCDigJQgYSBwcml2YXRlIGBTZXRgXG4gKiByYXRoZXIgdGhhbiB0aGUgYE1ldGFkYXRhYCBpbnRlcm5hbCBoZWxwZXJzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuLyoqXG4gKiBJbnRlcm5hbCByZWdpc3RyeSBvZiBhbGwgYEBkYXNoY29tcG9uZW50YC1kZWNvcmF0ZWQgY29uc3RydWN0b3JzLlxuICovXG5jb25zdCBEQVNIX0NPTVBPTkVOVF9SRUdJU1RSWSA9IG5ldyBTZXQ8Q29uc3RydWN0b3I+KCk7XG5cbi8qKlxuICogQXBwZW5kcyBhIGNvbnN0cnVjdG9yIHRvIHRoZSBkYXNoYm9hcmQgY29tcG9uZW50IHJlZ2lzdHJ5LiBDYWxsZWQgYnkgdGhlXG4gKiBgQGRhc2hjb21wb25lbnRgIGRlY29yYXRvci4gSWRlbXBvdGVudCDigJQgcmUtZGVjb3JhdGluZyB0aGUgc2FtZSBjbGFzcyBkb2VzXG4gKiBub3QgZHVwbGljYXRlIHRoZSBlbnRyeS5cbiAqIEBwYXJhbSBjdG9yIFRoZSBgQGRhc2hjb21wb25lbnRgLWRlY29yYXRlZCBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGFzaENvbXBvbmVudChjdG9yOiBDb25zdHJ1Y3Rvcik6IHZvaWQge1xuICBEQVNIX0NPTVBPTkVOVF9SRUdJU1RSWS5hZGQoY3Rvcik7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbGwgYEBkYXNoY29tcG9uZW50YC1kZWNvcmF0ZWQgY29uc3RydWN0b3JzLlxuICogQHJldHVybnMgQSBmcmVzaCBhcnJheSBvZiBjb25zdHJ1Y3RvcnMgKG11dGFibGU7IGRvZXMgbm90IGV4cG9zZSB0aGUgaW50ZXJuYWwgc2V0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhc2hDb21wb25lbnRzKCk6IENvbnN0cnVjdG9yW10ge1xuICByZXR1cm4gWy4uLkRBU0hfQ09NUE9ORU5UX1JFR0lTVFJZXTtcbn1cblxuLyoqXG4gKiBDbGVhcnMgdGhlIGRhc2hib2FyZCBjb21wb25lbnQgcmVnaXN0cnkuIEludGVuZGVkIGZvciB0ZXN0cyBvbmx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXREYXNoQ29tcG9uZW50UmVnaXN0cnkoKTogdm9pZCB7XG4gIERBU0hfQ09NUE9ORU5UX1JFR0lTVFJZLmNsZWFyKCk7XG59XG4iLCIvKipcbiAqIEBtb2R1bGUgdWktZGVjb3JhdG9ycy9kYXNoYm9hcmQvZGVjb3JhdG9yc1xuICogQHN1bW1hcnkgVGhlIGBAZGFzaGNvbXBvbmVudCgpYCBjbGFzcyBkZWNvcmF0b3IuXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIG1vZHVsZSB0aGF0IG1hcmtzIGRlY2FmIG1vZGVsIGNsYXNzZXMgYXNcbiAqIGRhc2hib2FyZC1zZWxlY3RhYmxlIHBhbGV0dGUgZW50cmllcy4gQXR0YWNoZXMgdGhlIHtAbGluayBEYXNoQ29tcG9uZW50TWV0YWRhdGF9XG4gKiBwYXlsb2FkIHVuZGVyIHtAbGluayBEYXNoS2V5cy5DT01QT05FTlR9IGFuZCByZWdpc3RlcnMgdGhlIGNsYXNzIGluIHRoZVxuICogZGFzaGJvYXJkIHJlZ2lzdHJ5IGFzIGEgc2lkZS1lZmZlY3QuXG4gKi9cblxuaW1wb3J0IHtcbiAgYXBwbHksXG4gIERlY29yYXRpb24sXG4gIG1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IHVpbW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgRGFzaEtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHsgRGFzaENvbXBvbmVudE1ldGFkYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IHJlZ2lzdGVyRGFzaENvbXBvbmVudCB9IGZyb20gXCIuL3JlZ2lzdHJ5XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENsYXNzIGRlY29yYXRvciB0aGF0IG1hcmtzIGEgY2xhc3MgYXMgZGFzaGJvYXJkLXNlbGVjdGFibGUuXG4gKiBAc3VtbWFyeSBBdHRhY2hlcyBwYWxldHRlIG1ldGFkYXRhICh0cmFuc2xhdGlvbiBsYWJlbCBrZXksIGRlZmF1bHQgZ3JpZFxuICogc2l6ZSwgY29uZmlndXJhdGlvbiBtb2RlbCByZWZlcmVuY2UpIGFuZCByZWdpc3RlcnMgdGhlIGNvbnN0cnVjdG9yIGluIHRoZVxuICogZGFzaGJvYXJkIGNvbXBvbmVudCByZWdpc3RyeSwgbWlycm9yaW5nIHRoZSBncmFwaCBgQG5vZGUoKWAgZGVjb3JhdG9yLlxuICpcbiAqIFVzYWdlOlxuICogYGBgdHNcbiAqIEBkYXNoY29tcG9uZW50KFwibXkud2lkZ2V0XCIsIHtcbiAqICAgbGFiZWw6IFwibXkud2lkZ2V0LmxhYmVsXCIsXG4gKiAgIGRlZmF1bHRTaXplOiB7IGNvbHM6IDIsIHJvd3M6IDEgfSxcbiAqICAgbW9kZWw6IE15V2lkZ2V0Q29uZmlnTW9kZWwsXG4gKiB9KVxuICogQG1vZGVsKClcbiAqIGV4cG9ydCBjbGFzcyBNeVdpZGdldCBleHRlbmRzIE1vZGVsIHsgLi4uIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXSBUaGUgY29tcG9uZW50IHRhZyAoZGVmYXVsdHMgdG8gdGhlIGNsYXNzIG5hbWUpLlxuICogQHBhcmFtIHtEYXNoQ29tcG9uZW50TWV0YWRhdGF9IFtkYXNoXSBQYWxldHRlIG1ldGFkYXRhLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHNdIEFkLWhvYyBwcm9wcyBmb3IgdGhlIGNvbXBvbmVudC5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGNsYXNzIGRlY29yYXRvciBmdW5jdGlvbi5cbiAqIEBmdW5jdGlvbiBkYXNoY29tcG9uZW50XG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGFzaGNvbXBvbmVudChcbiAgdGFnPzogc3RyaW5nLFxuICBkYXNoPzogRGFzaENvbXBvbmVudE1ldGFkYXRhLFxuICBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT5cbikge1xuICBmdW5jdGlvbiBkYXNoY29tcG9uZW50KFxuICAgIHRhZz86IHN0cmluZyxcbiAgICBkYXNoPzogRGFzaENvbXBvbmVudE1ldGFkYXRhLFxuICAgIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PlxuICApIHtcbiAgICBjb25zdCBtZXRhOiBEYXNoQ29tcG9uZW50TWV0YWRhdGEgPSB7XG4gICAgICB0YWc6IGRhc2g/LnRhZyB8fCB0YWcsXG4gICAgICAuLi5kYXNoLFxuICAgICAgZGVmYXVsdFNpemU6IGRhc2g/LmRlZmF1bHRTaXplID8/IHsgY29sczogMSwgcm93czogMSB9LFxuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyRGFzaENvbXBvbmVudCh0YXJnZXQ6IG9iamVjdCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXBwbHkoXG4gICAgICAgIHVpbW9kZWwodGFnLCBwcm9wcyksXG4gICAgICAgIG1ldGFkYXRhKERhc2hLZXlzLkNPTVBPTkVOVCwgbWV0YSlcbiAgICAgICkodGFyZ2V0KTtcbiAgICAgIHJlZ2lzdGVyRGFzaENvbXBvbmVudCh0YXJnZXQgYXMgQ29uc3RydWN0b3IpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKERhc2hLZXlzLkNPTVBPTkVOVClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogZGFzaGNvbXBvbmVudCxcbiAgICAgIGFyZ3M6IFt0YWcsIGRhc2gsIHByb3BzXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuIiwiLyoqXG4gKiBAbW9kdWxlIHVpLWRlY29yYXRvcnMvZGFzaGJvYXJkL3JlYWRlclxuICogQHN1bW1hcnkgTWV0YWRhdGEgcmVhZGVycyBmb3IgYEBkYXNoY29tcG9uZW50KClgLWRlY29yYXRlZCBjbGFzc2VzLlxuICogQGRlc2NyaXB0aW9uIFJlYWQtc2lkZSBoZWxwZXJzIHRoYXQgcmVzb2x2ZSB0aGUgcGFsZXR0ZSBtZXRhZGF0YSBhbmQgdGhlXG4gKiBub3JtYWxpemVkIHtAbGluayBEYXNoQ29tcG9uZW50RGVmaW5pdGlvbn0gYXR0YWNoZWQgYnkgYEBkYXNoY29tcG9uZW50KClgLlxuICogQWNjZXB0IGVpdGhlciBhIGNvbnN0cnVjdG9yIG9yIGFuIGluc3RhbmNlLCBhbmQgYXBwbHkgZGVmYXVsdHMgc28gY29uc3VtZXJzXG4gKiBuZXZlciByZXNvbHZlIHVuZGVmaW5lZCBmb290cHJpbnQgdmFsdWVzLlxuICovXG5cbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRGFzaEtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHtcbiAgRGFzaENvbXBvbmVudERlZmluaXRpb24sXG4gIERhc2hDb21wb25lbnRNZXRhZGF0YSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgY29uc3RydWN0b3Itb3ItaW5zdGFuY2UgaW5wdXQgdG8gYSBjb25zdHJ1Y3Rvci5cbiAqIEZhbGxzIGJhY2sgdG8gdGhlIGluc3RhbmNlJ3Mgb3duIGNvbnN0cnVjdG9yIGFuZCBmaW5hbGx5IHRvIHRoZSByYXcgdmFsdWVcbiAqIHdoZW4ge0BsaW5rIE1ldGFkYXRhLmNvbnN0cn0gY2Fubm90IHJlc29sdmUgYSB1c2FibGUgY29uc3RydWN0b3IuXG4gKiBAcGFyYW0gbW9kZWwgVGhlIGRlY29yYXRlZCBjbGFzcyBvciBhbiBpbnN0YW5jZSBvZiBpdC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU1vZGVsPE0+KG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiB8IE0pOiBDb25zdHJ1Y3RvcjxNPiB7XG4gIGNvbnN0IHJlc29sdmVkID0gTWV0YWRhdGEuY29uc3RyKG1vZGVsIGFzIENvbnN0cnVjdG9yPE0+KTtcbiAgaWYgKHR5cGVvZiByZXNvbHZlZCA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gcmVzb2x2ZWQgYXMgQ29uc3RydWN0b3I8TT47XG4gIGNvbnN0IGZhbGxiYWNrID0gKG1vZGVsIGFzIHsgY29uc3RydWN0b3I/OiBDb25zdHJ1Y3RvcjxNPiB9KS5jb25zdHJ1Y3RvcjtcbiAgaWYgKHR5cGVvZiBmYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZmFsbGJhY2sgYXMgQ29uc3RydWN0b3I8TT47XG4gIHJldHVybiBtb2RlbCBhcyBDb25zdHJ1Y3RvcjxNPjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgcGFsZXR0ZSBtZXRhZGF0YSBhdHRhY2hlZCBieSBgQGRhc2hjb21wb25lbnQoKWAuXG4gKiBAc3VtbWFyeSBSZXNvbHZlcyB0aGUgbWV0YWRhdGEgb2JqZWN0IHN0b3JlZCBvbiB0aGUgY2xhc3MsIGFjY2VwdGluZyBlaXRoZXJcbiAqIHRoZSBjb25zdHJ1Y3RvciBvciBhbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3IgfCBvYmplY3R9IG1vZGVsIFRoZSBkZWNvcmF0ZWQgY2xhc3Mgb3IgYW4gaW5zdGFuY2Ugb2YgaXQuXG4gKiBAcmV0dXJucyBUaGUgcGFsZXR0ZSBtZXRhZGF0YSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB1bi1kZWNvcmF0ZWQuXG4gKiBAZnVuY3Rpb24gZGFzaENvbXBvbmVudE1ldGFkYXRhT2ZcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9ycy9kYXNoYm9hcmQvcmVhZGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXNoQ29tcG9uZW50TWV0YWRhdGFPZjxNPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPE0+IHwgTVxuKTogRGFzaENvbXBvbmVudE1ldGFkYXRhIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlTW9kZWwobW9kZWwpO1xuICByZXR1cm4gTWV0YWRhdGEuZ2V0KHJlc29sdmVkLCBEYXNoS2V5cy5DT01QT05FTlQpIGFzXG4gICAgfCBEYXNoQ29tcG9uZW50TWV0YWRhdGFcbiAgICB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVzb2x2ZXMgYSBub3JtYWxpemVkIGRlZmluaXRpb24gZm9yIGEgZGFzaGJvYXJkIGNvbXBvbmVudC5cbiAqIEBzdW1tYXJ5IEFwcGxpZXMgZGVmYXVsdHMgKHRhZyBmcm9tIGNsYXNzIG5hbWUsIHNpemUgYHtjb2xzOjEsIHJvd3M6MX1gKVxuICogc28gY29uc3VtZXJzIG5ldmVyIHJlc29sdmUgdW5kZWZpbmVkIGZvb3RwcmludCB2YWx1ZXMuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yIHwgb2JqZWN0fSBtb2RlbCBUaGUgZGVjb3JhdGVkIGNsYXNzIG9yIGFuIGluc3RhbmNlIG9mIGl0LlxuICogQHJldHVybnMgQSBub3JtYWxpemVkIHtAbGluayBEYXNoQ29tcG9uZW50RGVmaW5pdGlvbn0uXG4gKiBAZnVuY3Rpb24gZGFzaENvbXBvbmVudERlZmluaXRpb25PZlxuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzL2Rhc2hib2FyZC9yZWFkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhc2hDb21wb25lbnREZWZpbml0aW9uT2Y8TT4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiB8IE1cbik6IERhc2hDb21wb25lbnREZWZpbml0aW9uIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlTW9kZWwobW9kZWwpO1xuICBjb25zdCBtZXRhID0gZGFzaENvbXBvbmVudE1ldGFkYXRhT2YocmVzb2x2ZWQpIHx8IHt9O1xuICBjb25zdCB0YWcgPSBtZXRhLnRhZyB8fCByZXNvbHZlZC5uYW1lO1xuICByZXR1cm4ge1xuICAgIG5hbWU6IHJlc29sdmVkLm5hbWUsXG4gICAgdGFnLFxuICAgIGxhYmVsOiBtZXRhLmxhYmVsLFxuICAgIGRlZmF1bHRTaXplOiBtZXRhLmRlZmF1bHRTaXplID8/IHsgY29sczogMSwgcm93czogMSB9LFxuICAgIG1vZGVsOiBtZXRhLm1vZGVsLFxuICAgIHByb3BzOiBtZXRhLnByb3BzLFxuICAgIG1ldGFkYXRhOiBtZXRhLm1ldGFkYXRhLFxuICB9O1xufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gVUkgZGVjb3JhdG9ycyBtb2R1bGUgZm9yIFR5cGVTY3JpcHQgYXBwbGljYXRpb25zXG4gKiBAc3VtbWFyeSBBIGNvbGxlY3Rpb24gb2YgZGVjb3JhdG9ycyBhbmQgdXRpbGl0aWVzIGZvciBidWlsZGluZyBVSSBjb21wb25lbnRzIGluIFR5cGVTY3JpcHQgYXBwbGljYXRpb25zLlxuICogVGhpcyBtb2R1bGUgZXhwb3J0cyBmdW5jdGlvbmFsaXR5IGZyb20gYm90aCB0aGUgbW9kZWwgYW5kIFVJIHN1Ym1vZHVsZXMsIHByb3ZpZGluZyBkZWNvcmF0b3JzIGZvclxuICogcmVuZGVyaW5nLCBjb21wb25lbnQgZGVmaW5pdGlvbiwgYW5kIFVJIHN0YXRlIG1hbmFnZW1lbnQuXG4gKiBAbW9kdWxlIHVpLWRlY29yYXRvcnNcbiAqL1xuXG5pbXBvcnQgXCIuL292ZXJyaWRlc1wiO1xuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL292ZXJyaWRlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3VpXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXNoYm9hcmRcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VycmVudCBwYWNrYWdlIHZlcnNpb24gc3RyaW5nXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uIGZvciByZWZlcmVuY2VcbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgY29tbWl0IGhhc2ggb2YgdGhlIG1vZHVsZSBidWlsZC5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY3VycmVudCBnaXQgY29tbWl0IGhhc2ggZm9yIHRoZSBwYWNrYWdlLiBUaGUgYnVpbGQgcmVwbGFjZXNcbiAqIHRoZSBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgY29tbWl0IGhhc2ggYXQgcHVibGlzaCB0aW1lLlxuICogQGNvbnN0IENPTU1JVFxuICovXG5leHBvcnQgY29uc3QgQ09NTUlUID0gXCIjI0NPTU1JVCMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGZ1bGwgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIG1vZHVsZS5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgc2VtdmVyIHZlcnNpb24gYW5kIGNvbW1pdCBoYXNoIGZvciB0aGUgcGFja2FnZS5cbiAqIFRoZSBidWlsZCByZXBsYWNlcyB0aGUgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGA8dmVyc2lvbj4tPGNvbW1pdD5gIHZhbHVlIGF0IHB1Ymxpc2ggdGltZS5cbiAqIEBjb25zdCBGVUxMX1ZFUlNJT05cbiAqL1xuZXhwb3J0IGNvbnN0IEZVTExfVkVSU0lPTiA9IFwiIyNGVUxMX1ZFUlNJT04jI1wiO1xuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0UjI1wiO1xuXG5NZXRhZGF0YS5yZWdpc3RlckxpYnJhcnkoUEFDS0FHRV9OQU1FLCBWRVJTSU9OKTtcbiJdLCJuYW1lcyI6WyJVSU1lZGlhQnJlYWtQb2ludHMiLCJVSUtleXMiLCJSRUZMRUNUIiwiVUlNT0RFTCIsIlJFTkRFUkVEX0JZIiwiRUxFTUVOVCIsIlBST1AiLCJDSElMRCIsIk5BTUUiLCJOQU1FX1BSRUZJWCIsIlZBTElEQVRJT05fTUVTU0FHRSIsIlVJTElTVE1PREVMIiwiVUlMSVNUUFJPUCIsIlVJTEFZT1VUIiwiVUlMQVlPVVRQUk9QIiwiSEFORExFUlMiLCJUWVBFIiwiU1VCX1RZUEUiLCJISURERU4iLCJISURFX0ZPUiIsIlNIT1dfRk9SIiwiUkVOREVSX0lGIiwiRk9STUFUIiwiT1JERVIiLCJQQUdFIiwiRVZFTlRTIiwiRklSU1QiLCJMQVNUIiwiUkVBRF9PTkxZIiwiU0VRVUVOQ0UiLCJSRVFVSVJFRCIsIlZhbGlkYXRpb25LZXlzIiwiTUlOIiwiTUlOX0xFTkdUSCIsIk1BWCIsIk1BWF9MRU5HVEgiLCJQQVRURVJOIiwiVVJMIiwiU1RFUCIsIkRBVEUiLCJFTUFJTCIsIlBBU1NXT1JEIiwiRVFVQUxTIiwiRElGRiIsIkxFU1NfVEhBTiIsIkxFU1NfVEhBTl9PUl9FUVVBTCIsIkdSRUFURVJfVEhBTiIsIkdSRUFURVJfVEhBTl9PUl9FUVVBTCIsIlZhbGlkYXRhYmxlQnlUeXBlIiwiRW1haWxWYWxpZGF0b3IiLCJVUkxWYWxpZGF0b3IiLCJEYXRlVmFsaWRhdG9yIiwiUGFzc3dvcmRWYWxpZGF0b3IiLCJWYWxpZGF0YWJsZUJ5QXR0cmlidXRlIiwiUmVxdWlyZWRWYWxpZGF0b3IiLCJNaW5WYWxpZGF0b3IiLCJNYXhWYWxpZGF0b3IiLCJTdGVwVmFsaWRhdG9yIiwiTWluTGVuZ3RoVmFsaWRhdG9yIiwiTWF4TGVuZ3RoVmFsaWRhdG9yIiwiUGF0dGVyblZhbGlkYXRvciIsIkVxdWFsc1ZhbGlkYXRvciIsIkRpZmZWYWxpZGF0b3IiLCJMZXNzVGhhblZhbGlkYXRvciIsIkxlc3NUaGFuT3JFcXVhbFZhbGlkYXRvciIsIkdyZWF0ZXJUaGFuVmFsaWRhdG9yIiwiR3JlYXRlclRoYW5PckVxdWFsVmFsaWRhdG9yIiwiSFRNTDVEYXRlRm9ybWF0IiwiSFRNTDVJbnB1dFR5cGVzIiwiQlVUVE9OIiwiQ0hFQ0tCT1giLCJDT0xPUiIsIkRBVEVUSU1FX0xPQ0FMIiwiRklMRSIsIklNQUdFIiwiTU9OVEgiLCJOVU1CRVIiLCJSQURJTyIsIlJBTkdFIiwiUkVTRVQiLCJTRUFSQ0giLCJTVUJNSVQiLCJURUwiLCJURVhUIiwiVEVYVEFSRUEiLCJTRUxFQ1QiLCJUSU1FIiwiV0VFSyIsIkhUTUw1Q2hlY2tUeXBlcyIsIkNvbXBvbmVudEV2ZW50TmFtZXMiLCJSZW5kZXIiLCJCYWNrQnV0dG9uQ2xpY2tFdmVudCIsIlJlZnJlc2giLCJDbGljayIsIkNoYW5nZSIsIlN1Ym1pdCIsIlZhbGlkYXRpb25FcnJvciIsIlRoZW1lQ2hhbmdlIiwiRm9ybUdyb3VwTG9hZGVkIiwiVHJhbnNhY3Rpb25Ib29rcyIsIkJlZm9yZVJlYWQiLCJBZnRlclJlYWQiLCJCZWZvcmVDcmVhdGUiLCJBZnRlckNyZWF0ZSIsIkJlZm9yZVVwZGF0ZSIsIkFmdGVyVXBkYXRlIiwiQmVmb3JlRGVsZXRlIiwiQWZ0ZXJEZWxldGUiLCJFbGVtZW50U2l6ZXMiLCJ4c21hbGwiLCJzbWFsbCIsIm1lZGl1bSIsImRlZmF1bHQiLCJsYXJnZSIsInhMYXJnZSIsImF1dG8iLCJleHBhbmQiLCJibG9jayIsImhhbGYiLCJmdWxsIiwiRWxlbWVudFBvc2l0aW9ucyIsImxlZnQiLCJjZW50ZXIiLCJyaWdodCIsInRvcCIsImJvdHRvbSIsIkxheW91dEdyaWRHYXBzIiwiY29sbGFwc2UiLCJub25lIiwiQWN0aW9uUm9sZXMiLCJjYW5jZWwiLCJjb25maXJtIiwic3VibWl0IiwiY2xlYXIiLCJiYWNrIiwiT3BlcmF0aW9uS2V5cyIsIkNSRUFURSIsIlJFQUQiLCJVUERBVEUiLCJERUxFVEUiLCJXaW5kb3dDb2xvclNjaGVtZXMiLCJsaWdodCIsImRhcmsiLCJ1bmRlZmluZWQiLCJSZW5kZXJpbmdFcnJvciIsIkludGVybmFsRXJyb3IiLCJjb25zdHJ1Y3RvciIsIm1zZyIsInN1cGVyIiwibmFtZSIsImlzQ2xhc3NDb25zdHJ1Y3RvciIsImZuIiwidGVzdCIsIlN0cmluZyIsImdldFVJQXR0cmlidXRlS2V5IiwicHJvcCIsImtleSIsIk1ldGFkYXRhIiwiRGVjb3JhdGlvbktleXMiLCJQUk9QRVJUSUVTIiwiZm9ybWF0QnlUeXBlIiwidHlwZSIsInZhbHVlIiwiYXJncyIsImZvcm1hdCIsInNoaWZ0IiwiZm9ybWF0RGF0ZSIsIkRhdGUiLCJwYXJzZVZhbHVlQnlUeXBlIiwiZmllbGRQcm9wcyIsInJlc3VsdCIsIkFycmF5IiwicGFyc2VkIiwiaXNBcnJheSIsIm1hcCIsInYiLCJSZXNlcnZlZE1vZGVscyIsIlNUUklORyIsInRvTG93ZXJDYXNlIiwiam9pbiIsInBhcnNlVG9OdW1iZXIiLCJ0cmltIiwibGVuZ3RoIiwicGFyc2VEYXRlIiwiT0JKRUNUIiwiSlNPTiIsInN0cmluZ2lmeSIsIkJPT0xFQU4iLCJlc2NhcGVIdG1sIiwiaXNOYU4iLCJOdW1iZXIiLCJ0YWdzVG9SZXBsYWNlIiwicmVwbGFjZSIsInRhZyIsInJldmVydEh0bWwiLCJnZW5lcmF0ZVVJTW9kZWxJRCIsIm1vZGVsIiwiaWQiLCJub3ciLCJwayIsIk1vZGVsIiwiZSIsIlJlbmRlcmluZ0VuZ2luZSIsInRoaXMiLCJjYWNoZSIsImZsYXZvdXIiLCJpbml0aWFsaXplZCIsInJlZ2lzdGVyIiwiY29uc29sZSIsImxvZyIsInRyYW5zbGF0ZSIsInRvVmlldyIsIkJJR0lOVCIsImdldENsYXNzRGVjb3JhdG9yc01ldGFkYXRhIiwidWlNb2RlbE9mIiwidWlMaXN0TW9kZWxPZiIsInVpSGFuZGxlcnNGb3IiLCJ1aUxheW91dE9mIiwiZmlsdGVyIiwiQm9vbGVhbiIsInNvcnRDaGlsZHJlbkJ5T3JkZXIiLCJjaGlsZHJlbiIsInNvcnQiLCJhIiwiYiIsImFPcmRlciIsInByb3BzIiwib3JkZXIiLCJiT3JkZXIiLCJ3ZWlnaHQiLCJQcmltaXRpdmVzIiwiaW5kZXhPZiIsImFXZWlnaHQiLCJiV2VpZ2h0IiwiaXNDdXN0b21WYWxpZGF0b3IiLCJPYmplY3QiLCJ2YWx1ZXMiLCJpbmNsdWRlcyIsImlzVmFsaWRhdGFibGVCeVR5cGUiLCJrZXlzIiwiaXNWYWxpZGF0YWJsZUJ5QXR0cmlidXRlIiwidG9BdHRyaWJ1dGVWYWx1ZSIsIkVycm9yIiwidG9GaWVsZERlZmluaXRpb24iLCJnbG9iYWxQcm9wcyIsImdlbmVyYXRlSWQiLCJpbmhlcml0UHJvcHMiLCJnbG9iYWxQcm9wc1dpdGhvdXRJbmhlcml0cyIsImNsYXNzRGVjb3JhdG9ycyIsImNsYXNzRGVjb3JhdG9yIiwiYXNzaWduIiwiaXRlbSIsImhhbmRsZXJzIiwidWlEZWNvcmF0b3JzIiwidWlQcm9wZXJ0aWVzT2YiLCJjaGlsZFByb3BzIiwibWFwcGVyIiwiZ2V0UGF0aCIsInBhcmVudCIsInZhbGlkYXRpb25EZWNvcmF0b3JzIiwiZ2V0IiwiZGVjcyIsInVpRGVjb3JhdGlvbk9mIiwidWlUeXBlT2YiLCJOb3RGb3VuZEVycm9yIiwiaGFzSGlkZU9uRGVjb3JhdG9yIiwidWlJc0hpZGRlbiIsImhhc1VpRWxlbWVudERlY29yYXRvciIsInVpRWxlbWVudE9mIiwic29ydGVkIiwiZW50cmllcyIsImsiLCJmb3JFYWNoIiwiZGVjIiwibW9kZWxOYW1lIiwiaXNQcm9wZXJ0eU1vZGVsIiwiaXNNb2RlbCIsImJ1aWxkIiwiQ2xhenoiLCJzdWJtb2RlbCIsImNvbnN0cnVjdGFibGUiLCJjbGF6ek5hbWUiLCJjaGlsZHJlbkdsb2JhbFByb3BzIiwiY2hpbGRPZiIsImNoaWxkRGVmaW5pdGlvbiIsInB1c2giLCJkZWNQcm9wcyIsInJlbmRlciIsInVpUHJvcHMiLCJ2aXNpYmlsaXR5UHJvcHMiLCJoaWRlRm9yIiwic2hvd0ZvciIsInBhdGgiLCJ2YWxpZGF0aW9uRGVjcyIsIm1lc3NhZ2UiLCJiYXNpY1R5cGUiLCJjaGlsZCIsImZpbmQiLCJjIiwiZW5kc1dpdGgiLCJyb3ciLCJjb2wiLCJjdXJyZW50TmFtZXNwYWNlcyIsIlNldCIsIm5hbWVzcGFjZXMiLCJuYW1lc3BhY2UiLCJvcGVyYXRpb24iLCJoaWRkZW5PbiIsImhpZGRlbiIsInNvbWUiLCJyZW5kZXJlcklkIiwiZW5naW5lIiwiY3VycmVudCIsImdldE9yQm9vdCIsIm9iaiIsImluaXRpYWxpemUiLCJmcm9tT2JqZWN0IiwicmVuZGVyZWRCeSIsImhpZGVPbiIsIm9wZXJhdGlvbnMiLCJvYmplY3QiLCJwcm9wZXJ0eUtleSIsInByb3BNZXRhZGF0YSIsInJlbmRlcklmIiwidWlvcmRlciIsInVpZWxlbWVudCIsInNlcmlhbGl6ZSIsIm9yaWdpbmFsIiwibWV0YWRhdGEiLCJ1aXByb3AiLCJwcm9wTmFtZSIsInRhcmdldCIsInVpY2hpbGQiLCJjbGF6eiIsImN1c3RvbVR5cGVzIiwibXVsdGlwbGUiLCJ1aWxpc3Rwcm9wIiwidWlsYXlvdXRwcm9wIiwidWlwYWdlcHJvcCIsInBhZ2UiLCJ1aW9uIiwiZXZlbnQiLCJoYW5kbGVyIiwidWlvbmNsaWNrIiwidWlvbnJlbmRlciIsInVpdGFibGVjb2wiLCJzZXF1ZW5jZSIsInZhbHVlUGFyc2VyRm4iLCJVSVZhbGlkYXRvciIsIlZhbGlkYXRvciIsImdldE1lc3NhZ2UiLCJ0cmFuc2xhdGVTZXJ2aWNlIiwiRGVjYWZDb21wb25lbnQiLCJMb2dnZWRDbGFzcyIsImVuYWJsZURhcmtNb2RlIiwiaXNEYXJrTW9kZSIsInJvdXRlIiwiYm9yZGVycyIsImV2ZW50cyIsInJlcG9zaXRvcnkiLCJfcmVwb3NpdG9yeSIsImZvciIsImluZm8iLCJjb21wb25lbnROYW1lIiwicmVmcmVzaCIsInByZXZpZXciLCJkZWJ1ZyIsInBhcnNlSGFuZGxlcnMiLCJpbnN0YW5jZSIsImhhbmRsZSIsInBhcnNlRXZlbnRzIiwiZXZ0IiwiRGVjYWZFdmVudEhhbmRsZXIiLCJoYW5kbGVDbGljayIsImhhbmRsZUFjdGlvbiIsIkRlY2FmVHJhbnNsYXRlU2VydmljZSIsInBhcmFtcyIsImluc3RhbnQiLCJwcm90b3R5cGUiLCJiaW5kIiwibWV0YSIsInVpSXNIaWRkZW5PbiIsIm9wIiwidWlMaXN0SXRlbXMiLCJ1aW1vZGVsIiwiYXBwbHkiLCJ1aWxpc3Rtb2RlbCIsInVpaGFuZGxlcnMiLCJ1aWxheW91dCIsImNvbHNNb2RlIiwicm93cyIsImNvbmZpZyIsImZsZXhNb2RlIiwiY29scyIsImJyZWFrcG9pbnQiLCJMQVJHRSIsInVpc3RlcHBlZG1vZGVsIiwicGFnZXMiLCJwYWdpbmF0ZWQiLCJwYWdlVGl0bGVzIiwiTW9kZWxCdWlsZGVyIiwiZGVjb3JhdGVDbGFzcyIsImRlY29yYXRvciIsIl9jbGFzc0RlY29yYXRvcnMiLCJEYXNoS2V5cyIsIkRBU0hfQ09NUE9ORU5UX1JFR0lTVFJZIiwicmVnaXN0ZXJEYXNoQ29tcG9uZW50IiwiY3RvciIsImFkZCIsImRhc2hDb21wb25lbnRzIiwicmVzZXREYXNoQ29tcG9uZW50UmVnaXN0cnkiLCJkYXNoY29tcG9uZW50IiwiZGFzaCIsImRlZmF1bHRTaXplIiwiaW5uZXJEYXNoQ29tcG9uZW50IiwiQ09NUE9ORU5UIiwiRGVjb3JhdGlvbiIsImRlZmluZSIsInJlc29sdmVNb2RlbCIsInJlc29sdmVkIiwiY29uc3RyIiwiZmFsbGJhY2siLCJkYXNoQ29tcG9uZW50TWV0YWRhdGFPZiIsImRhc2hDb21wb25lbnREZWZpbml0aW9uT2YiLCJsYWJlbCIsIlZFUlNJT04iLCJDT01NSVQiLCJGVUxMX1ZFUlNJT04iLCJQQUNLQUdFX05BTUUiLCJyZWdpc3RlckxpYnJhcnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0lBaUNZQTs7Q0FBWixTQUFZQTtJQUNWQSxtQkFBQSxXQUFBO0lBQ0FBLG1CQUFBLFlBQUE7SUFDQUEsbUJBQUEsV0FBQTtJQUNBQSxtQkFBQSxZQUFBO0FBQ0QsRUFMRCxDQUFZQSx1QkFBQUEscUJBQWtCLENBQUE7O0FBb0R2QixNQUFNQyxTQUFTO0lBQ3BCQyxTQUFTO0lBQ1RDLFNBQVM7SUFDVEMsYUFBYTtJQUNiQyxTQUFTO0lBQ1RDLE1BQU07SUFDTkMsT0FBTztJQUNQQyxNQUFNO0lBQ05DLGFBQWE7SUFDYkMsb0JBQW9CO0lBRXBCQyxhQUFhO0lBQ2JDLFlBQVk7SUFDWkMsVUFBVTtJQUNWQyxjQUFjO0lBQ2RDLFVBQVU7SUFFVkMsTUFBTTtJQUNOQyxVQUFVO0lBRVZDLFFBQVE7SUFDUkMsVUFBVTtJQUNWQyxVQUFVO0lBQ1ZDLFdBQVc7SUFDWEMsUUFBUTtJQUNSQyxPQUFPO0lBQ1BDLE1BQU07SUFDTkMsUUFBUTtJQUVSQyxPQUFPO0lBQ1BDLE1BQU07SUFFTkMsV0FBVztJQUNYQyxVQUFVO0lBQ1ZDLFVBQVVDLGVBQWVEO0lBQ3pCRSxLQUFLRCxlQUFlQztJQUNwQkMsWUFBWUYsZUFBZUU7SUFDM0JDLEtBQUtILGVBQWVHO0lBQ3BCQyxZQUFZSixlQUFlSTtJQUMzQkMsU0FBU0wsZUFBZUs7SUFDeEJDLEtBQUtOLGVBQWVNO0lBQ3BCQyxNQUFNUCxlQUFlTztJQUNyQkMsTUFBTVIsZUFBZVE7SUFDckJDLE9BQU9ULGVBQWVTO0lBQ3RCQyxVQUFVVixlQUFlVTtJQUN6QkMsUUFBUVgsZUFBZVc7SUFDdkJDLE1BQU1aLGVBQWVZO0lBQ3JCQyxXQUFXYixlQUFlYTtJQUMxQkMsb0JBQW9CZCxlQUFlYztJQUNuQ0MsY0FBY2YsZUFBZWU7SUFDN0JD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
|
|
1
|
+
import{ValidationKeys as e,PasswordValidator as t,DateValidator as r,URLValidator as n,EmailValidator as o,GreaterThanOrEqualValidator as s,GreaterThanValidator as i,LessThanOrEqualValidator as a,LessThanValidator as c,DiffValidator as u,EqualsValidator as l,PatternValidator as E,MaxLengthValidator as p,MinLengthValidator as f,StepValidator as d,MaxValidator as h,MinValidator as O,RequiredValidator as m,formatDate as T,Model as R,ReservedModels as A,parseDate as g,Primitives as L,Validator as y,ModelBuilder as N}from"@decaf-ts/decorator-validation";import{OperationKeys as D,InternalError as I,NotFoundError as S}from"@decaf-ts/db-decorators";import{Metadata as C,DecorationKeys as b,propMetadata as M,metadata as w,apply as P,Decoration as k}from"@decaf-ts/decoration";import{LoggedClass as U}from"@decaf-ts/logging";var _;(e=>{e.SMALL="small",e.MEDIUM="medium",e.LARGE="large",e.XLARGE="xlarge"})(_||(_={}));const H={REFLECT:"ui",UIMODEL:"uimodel",RENDERED_BY:"rendered-by",ELEMENT:"uielement",PROP:"uiprop",CHILD:"uichild",NAME:"name",NAME_PREFIX:"input-",VALIDATION_MESSAGE:"validationMessage",UILISTMODEL:"uilistmodel",UILISTPROP:"uilistprop",UILAYOUT:"uilayout",UILAYOUTPROP:"uilayoutprop",HANDLERS:"handlers",TYPE:"type",SUB_TYPE:"subType",HIDDEN:"hidden",HIDE_FOR:"hide-for",SHOW_FOR:"show-for",RENDER_IF:"render-if",FORMAT:"format",ORDER:"order",PAGE:"page",EVENTS:"events",FIRST:"first",LAST:"last",READ_ONLY:"readonly",SEQUENCE:"sequence",REQUIRED:e.REQUIRED,MIN:e.MIN,MIN_LENGTH:e.MIN_LENGTH,MAX:e.MAX,MAX_LENGTH:e.MAX_LENGTH,PATTERN:e.PATTERN,URL:e.URL,STEP:e.STEP,DATE:e.DATE,EMAIL:e.EMAIL,PASSWORD:e.PASSWORD,EQUALS:e.EQUALS,DIFF:e.DIFF,LESS_THAN:e.LESS_THAN,LESS_THAN_OR_EQUAL:e.LESS_THAN_OR_EQUAL,GREATER_THAN:e.GREATER_THAN,GREATER_THAN_OR_EQUAL:e.GREATER_THAN_OR_EQUAL},F={[H.EMAIL]:o,[H.URL]:n,[H.DATE]:r,[H.PASSWORD]:t},B={[H.REQUIRED]:m,[H.MIN]:O,[H.MAX]:h,[H.STEP]:d,[H.MIN_LENGTH]:f,[H.MAX_LENGTH]:p,[H.PATTERN]:E,[H.EQUALS]:l,[H.DIFF]:u,[H.LESS_THAN]:c,[H.LESS_THAN_OR_EQUAL]:a,[H.GREATER_THAN]:i,[H.GREATER_THAN_OR_EQUAL]:s},v="yyyy-MM-dd",j={BUTTON:"button",CHECKBOX:"checkbox",COLOR:"color",DATE:H.DATE,DATETIME_LOCAL:"datetime-local",EMAIL:H.EMAIL,FILE:"file",HIDDEN:"hidden",IMAGE:"image",MONTH:"month",NUMBER:"number",PASSWORD:H.PASSWORD,RADIO:"radio",RANGE:"range",RESET:"reset",SEARCH:"search",SUBMIT:"submit",TEL:"tel",TEXT:"text",TEXTAREA:"textarea",SELECT:"select",TIME:"time",URL:H.URL,WEEK:"week"},$=[j.CHECKBOX,j.RADIO],G={Render:"render",BackButtonClickEvent:"backButtonNavigationEndEvent",Refresh:"RefreshEvent",Click:"ClickEvent",Change:"ChangeEvent",Submit:"SubmitEvent",ValidationError:"validationErrorEvent",ThemeChange:"themeChangeEvent",FormGroupLoaded:"formGroupLoadedEvent"},x={BeforeRead:"beforeRead",AfterRead:"afterRead",BeforeCreate:"beforeCreate",AfterCreate:"afterCreate",BeforeUpdate:"beforeUpdate",AfterUpdate:"afterUpdate",BeforeDelete:"beforeDelete",AfterDelete:"afterDelete"},Y={xsmall:"xsmall",small:"small",medium:"medium",default:"default",large:"large",xLarge:"xlarge","2xLarge":"2xlarge",auto:"auto",expand:"expand",block:"block",half:"half",full:"full"},V={left:"left",center:"center",right:"right",top:"top",bottom:"bottom"},X={small:"small",medium:"medium",large:"large",collapse:"collapse",none:""},Q={cancel:"cancel",confirm:"confirm",submit:"submit",clear:"clear",back:"back",[D.CREATE]:D.CREATE,[D.READ]:D.READ,[D.UPDATE]:D.UPDATE,[D.DELETE]:D.DELETE},W={light:"light",dark:"dark",undefined:"undefined"};class z extends I{constructor(e){super(e,z.name)}}const J=e=>"function"==typeof e&&/^class\s/.test(e+"");function K(e,t){return C.key(H.REFLECT,b.PROPERTIES,e,t)}function q(e,t,...r){if(e===H.DATE){if(!t)return"";const e=r.shift()||v;return T(new Date(t),e)}return t}function Z(e,t,r){let n;switch(e){case Array.name:n=(Array.isArray(t)?t.map(e=>Z(A.STRING.name.toLowerCase(),e,r)):[t]).join(",");break;case j.NUMBER:n=ee(t);break;case j.DATE:{const e=r.format;t&&(""+t).trim().length&&(n=typeof t===A.NUMBER.name.toLowerCase()?new Date(t):t?e?g(e,t):new Date(t):void 0);break}default:n=typeof t===A.OBJECT.name.toLowerCase()?Array.isArray(t)?t.join(","):JSON.stringify(t):typeof t===A.BOOLEAN.name.toLowerCase()?t:typeof t===A.STRING.name.toLowerCase()?te(t):n}if(void 0===n)throw new I(`Failed to parse value of type ${e} from ${typeof t} - ${t}`);return n}function ee(e){if("number"==typeof e&&!isNaN(e))return e;const t=Number(e);return isNaN(t)?void 0:t}function te(e){if(!e)return e;const t={"&":"&","<":"<",">":">"};return(""+e).replace(/[&<>]/g,e=>t[e]||e)}function re(e){const t={"&":"&","<":"<",">":">"};return(""+e).replace(/<|>|&/g,e=>t[e]||e)}function ne(e){let t=Date.now();try{R.pk(e.constructor)&&(t=e[R.pk(e.constructor)])}catch(e){}return`${e.constructor.name}-${t}`}class oe{static{this.cache={}}constructor(e){this.flavour=e,this.initialized=!1,oe.register(this)}translate(e,t=!0){if(t)switch(e){case A.STRING.name.toLowerCase():return j.TEXT;case A.NUMBER.name.toLowerCase():case A.BIGINT.name.toLowerCase():return j.NUMBER;case A.BOOLEAN.name.toLowerCase():return j.CHECKBOX;case A.DATE.name.toLowerCase():return j.DATE}else switch(e){case j.SELECT:case j.TEXT:case j.EMAIL:case j.COLOR:case j.PASSWORD:case j.TEL:case j.URL:case j.SEARCH:case j.HIDDEN:case j.TEXTAREA:case j.RADIO:return A.STRING.name.toLowerCase();case j.NUMBER:return A.NUMBER.name.toLowerCase();case j.CHECKBOX:return A.BOOLEAN.name.toLowerCase();case j.DATE:case j.DATETIME_LOCAL:case j.TIME:return A.DATE.name.toLowerCase()}return e}getClassDecoratorsMetadata(e){return[R.uiModelOf(e.constructor),R.uiListModelOf(e.constructor),R.uiHandlersFor(e.constructor),R.uiLayoutOf(e.constructor)].filter(Boolean)}sortChildrenByOrder(e=[]){return e.sort((t,r)=>{const n=t.props?.order??0,o=r.props?.order??0,s=t=>t===H.FIRST?0:typeof t===L.NUMBER?1:t===H.LAST?e.length+e.indexOf(r):1,i=s(n),a=s(o);return i!==a?i-a:1===i&&typeof n===L.NUMBER&&typeof o===L.NUMBER?n-o:0})}isCustomValidator(t){return!Object.values(e).includes(t)&&!Object.values(H).includes(t)}isValidatableByType(e){return Object.keys(F).includes(e)}isValidatableByAttribute(e){return Object.keys(B).includes(e)}toAttributeValue(e,t){if(!Object.keys(B).includes(e))throw Error(`Invalid attribute key "${e}". Expected one of: ${Object.keys(B).join(", ")}.`);return e===H.REQUIRED||t[e]}toFieldDefinition(t,r={},n=!0){const{inheritProps:o,...s}=r;r=s;const i=this.getClassDecoratorsMetadata(t);if(!i.length)throw new z(`No ui definitions set for model ${t.constructor.name}. Did you use @uimodel?`);const a=Object.assign({},...i,o||{}),{tag:c,props:u,item:l,handlers:E}=a,p=R.uiPropertiesOf(t.constructor);let f,d=l?.props||{},h={};const O=(e,t)=>e?[e,t].join("."):t;if(p){const n=C.get(t.constructor,e.REFLECT)||{};for(const e of p){const o=R.uiDecorationOf(t.constructor,e);let s;try{s=R.uiTypeOf(t.constructor,e)}catch(e){if(!(e instanceof S))throw e}if(R.uiIsHidden(t.constructor,e)&&!R.uiElementOf(t.constructor,e))throw new z(`@uielement no found in "${e}". It is required to use hiddenOn decorator.`);Object.entries(o).map(([e,t])=>({key:e,props:t})).sort(e=>[H.ELEMENT,H.CHILD].includes(e.key)?-1:1).forEach(o=>{if(!o)throw new z("No decorator found");switch(o.key){case H.PROP:d[e]=o.props;break;case H.CHILD:{const n=o.props?.props?.name||e;try{if(!R.isModel(R.build({},n))&&!R.isPropertyModel(t,n))throw new z(`Child "${n}" must be a model.`)}catch(e){throw new z(`Child "${n}" must be a model.`)}let s;const i=t[e];if("object"!=typeof i||null===i||Array.isArray(i)){const e=o.props.props?.name;s=new(R.get(e))}f=f||[];const a=Object.assign({},r||{},{model:s},{inheritProps:o.props,childOf:O(r?.childOf,e)}),c=this.toFieldDefinition(i||s,a,!1),{inheritProps:u}=a;u&&(c.props=Object.assign({},c.props,u.props||{})),f.push(c);break}case H.UILISTPROP:{h=h||{};const t=o.props;t.name&&(h[t.name]="object"==typeof t?.props&&H.SEQUENCE in t.props?t.props:e);const n=Object.assign({},a.props?.item||{},l?.props||{},t?.props||{},r);d={tag:l?.tag||n.render||"",props:Object.assign({},d?.props,{mapper:h},n)};break}case H.EVENTS:case H.HIDDEN:case H.HIDE_FOR:case H.SHOW_FOR:case H.PAGE:case H.ORDER:case H.UILAYOUTPROP:case H.ELEMENT:{f=f||[];const s=o.props,i=o.key===H.HIDE_FOR?{hideFor:o.props}:o.key===H.SHOW_FOR?{showFor:o.props}:{},a=Object.assign({},d?.props,s.props||{},i,s?.props?.name?{path:O(r?.childOf,s.props.name),childOf:void 0}:{},r,{name:s.props?.name||e});if(o.key===H.ELEMENT){const r={tag:s.tag||d?.tag||c||"",props:a},o=n[e];if(o)for(const e of Object.entries(o).map(([e,t])=>({key:e,props:t})))this.isValidatableByAttribute(e.key)?r.props[this.translate(e.key)]=this.toAttributeValue(e.key,e.props):this.isValidatableByType(e.key)?(e.key===j.DATE&&(r.props[H.FORMAT]=e.props.format||v),r.props[H.TYPE]=e.key):this.isCustomValidator(e.key)&&(a[H.SUB_TYPE]=e.key,e.props?.message&&(a[H.VALIDATION_MESSAGE]=e.props.message));if(!r.props[H.TYPE]){const n=C.type(t.constructor,e).name;r.props[H.TYPE]=this.translate(n.toLowerCase(),!0)}r.props.value=q(r.props[H.TYPE],t[e],r.props[H.FORMAT]),f.push(r)}else{const t=f.find(t=>t.props?.name===e||[H.UILAYOUTPROP,H.PAGE,H.EVENTS].includes(o.key)&&(t.props?.childOf===e||t.props?.childOf?.endsWith("."+e)));if(t)if(o.key===H.HIDE_FOR||o.key===H.SHOW_FOR)t.props=Object.assign({},t.props,i);else if(o.key!==H.UILAYOUTPROP)t.props=Object.assign({},t.props,{[o.key]:s});else{const{row:e,col:r,props:n}=o.props;t.props=Object.assign({},n||{},t.props,e,r)}}break}default:throw new z("Invalid key: "+o.key)}})}}r=Object.assign({},u,r,{handlers:E||{}});const m=new Set([...Array.isArray(r?.namespaces)?r.namespaces:[],..."string"==typeof r?.namespace?[r.namespace]:[]].filter(Boolean)),T=r?.operation;f=this.sortChildrenByOrder(f).filter(e=>{const t=e?.props?.hidden||[];if(t.length>0&&t.includes(T))return!1;const r=e?.props?.hideFor||[],n=e?.props?.showFor||[];return!(r.length>0&&[...m].some(e=>r.includes(e))||n.length>0&&![...m].some(e=>n.includes(e)))});const A={tag:c,item:d,props:r,children:f?.length?f:void 0};return n&&(A.rendererId=ne(t)),A}static register(e){if(e.flavour in this.cache)throw new I(`Rendering engine under ${e.flavour} already exists`);this.cache[e.flavour]=e,this.current=e}static getOrBoot(e){if(e instanceof oe)return e;const t=new e;return t.initialize(),t}static get(e){if(!e)return this.getOrBoot(this.current);if(!(e in this.cache))throw new I(`Rendering engine under ${e} does not exist`);return this.getOrBoot(this.cache[e])}static render(e,...t){if(!R.get(e.constructor.name)&&!R.fromObject(e))throw new I("No model registered found");const r=R.renderedBy(e.constructor);return oe.get(r).render(e,...t)}}function se(...e){return(t,r)=>M(K(r,H.HIDDEN),e)(t,r)}function ie(...e){return(t,r)=>M(K(r,H.HIDE_FOR),e)(t,r)}function ae(...e){return(t,r)=>M(K(r,H.SHOW_FOR),e)(t,r)}function ce(...e){return ae(...e)}function ue(e=H.FIRST){return(t,r)=>M(K(r,H.ORDER),e)(t,r)}function le(){return se(D.CREATE,D.READ,D.UPDATE,D.DELETE)}function Ee(e,t,r=!1){return(n,o)=>{"object"==typeof e&&(t=e,e="");const s={tag:e,serialize:r,props:Object.assign({},t||{},{name:o})};return M(K(o,H.ELEMENT),s)(n,o)}}function pe(e=void 0,t=!1){return(r,n)=>{const o={name:e||n,stringify:t};M(K(n,H.PROP),o)(r,n)}}function fe(e,t,r={},n=!1,o=!1){return(s,i)=>{const a={tag:t,serialize:o,props:Object.assign({},r||{},{name:e||i},n?{customTypes:[Array.name],multiple:!0}:{multiple:r?.multiple||!1})};M(K(i,H.CHILD),a)(s,i)}}function de(e=void 0,t){return(r,n)=>{const o={name:e||n,props:t||{}};M(K(n,H.UILISTPROP),o)(r,n)}}function he(e=1,t=1){return(r,n)=>{const o={name:n,props:Object.assign({},{row:t,col:e})};M(K(n,H.UILAYOUTPROP),o)(r,n)}}function Oe(e=1){return(t,r)=>M(K(r,H.PAGE),e)(t,r)}function me(e,t){return(r,n)=>{M(K(n,H.EVENTS),{..."object"==typeof e?e:{[e]:t}})(r,n)}}function Te(e){return me("handleClick",e)}function Re(e){return me("render",e)}function Ae(e=H.LAST,t){return(r,n)=>{const o={name:n,props:{sequence:e,...t?{valueParserFn:t}:{}}};M(K(n,H.UILISTPROP),o)(r,n)}}class ge extends y{getMessage(e,...t){return ge.translateService?ge.translateService.translate(e,...t):super.getMessage(e,...t)}}class Le extends U{constructor(){super(),this.enableDarkMode=!0,this.isDarkMode=!1,this.item={tag:""},this.props={},this.route="",this.borders=!1,this.OperationKeys=D,this.initialized=!1,this.events={},this.handlers={}}get repository(){return this._repository}set repository(e){this._repository=e}async render(...e){this.log.for(this.render).info(`render for ${this.componentName} with ${JSON.stringify(e)}`)}async refresh(...e){this.log.for(this.refresh).info("Refresh called with args: "+e)}async initialize(...e){this.initialized=!0}async translate(...e){this.log.for(this.translate).info(`translate for ${this.componentName} with ${JSON.stringify(e)}`)}async preview(...e){this.log.for(this.preview).debug("Preview called with args: "+e)}async submit(...e){this.log.for(this.submit).info(`submit for ${this.componentName} with ${JSON.stringify(e)}`)}parseHandlers(e,t){const r={};return Object.entries(e).forEach(([e,n])=>{if(J(n)){const o=new n,s=e in o?o[e]:o.handle;r[e]=s,t.handlers[e]=s}else r[e]=n,t.handlers[e]=n}),r}parseEvents(e,t){const r={};return Object.entries(e).forEach(([e,n])=>{const o=e,s=n();if(J(s)){const n=(new s)[e];n&&(r[o]=n,t.events[o]=n)}else r[o]=n,t.events[o]=n}),r}}class ye extends Le{constructor(){super()}handle(...e){this.log.for(this.handle).info(`component ${this.componentName} handling ${JSON.stringify(e)}`)}handleClick(...e){this.log.for(this.handleClick).info(`component ${this.componentName} handling click ${JSON.stringify(e)}`)}handleAction(...e){this.log.for(this.handleAction).info(`component ${this.componentName} handling action ${JSON.stringify(e)}`)}}class Ne extends U{translate(e,t){this.log.for(this.translate).info(`Must translate ${e} with params ${JSON.stringify(t||{})}`)}instant(e,t){this.log.for(this.instant).info(`Must translate ${e} with params ${JSON.stringify(t||{})}`)}}function De(e,t){return(r,n)=>{const o={tag:e||r.name,props:t};return w(C.key(H.REFLECT,H.UIMODEL),o)(r)}}function Ie(e){return P(w(C.key(H.REFLECT,H.RENDERED_BY),e))}function Se(e,t){return(r,n)=>{const o={item:{tag:e||r.name,props:t}};return w(C.key(H.REFLECT,H.UILISTMODEL),o)(r)}}function Ce(e){return t=>{const r={handlers:e};return w(C.key(H.REFLECT,H.HANDLERS),r)(t)}}function be(e,t=1,r=1,n={}){const o=Object.assign({..."boolean"==typeof t?{flexMode:t,cols:1}:{flexMode:!1,cols:t},rows:r,...Object.assign({breakpoint:_.LARGE},n)});return(t,r)=>(w(C.key(H.REFLECT,H.UILAYOUT),o)(t),De(e,o)(t,r))}function Me(e,t=1,r=!1,n={}){let o=[];return"object"==typeof t&&(o=t,t=o.length),De(e,{pages:t,paginated:r,pageTitles:o,props:n})}R.prototype.render=function(...e){return oe.render(this,...e)},R.renderedBy=(e=>C.get(e,C.key(H.REFLECT,H.RENDERED_BY))).bind(R),R.uiPropertiesOf=(e=>{const t=C.get(e,C.key(H.REFLECT,b.PROPERTIES));if(t)return Object.keys(t)}).bind(R),R.uiDecorationOf=(e,t,r)=>{const n=C.get(e,C.key(H.REFLECT,b.PROPERTIES,t));if(n)return r?n[r]:n},R.uiModelOf=e=>C.get(e,C.key(H.REFLECT,H.UIMODEL)),R.uiElementOf=(e,t)=>C.get(e,K(t,H.ELEMENT)),R.uiListModelOf=e=>C.get(e,C.key(H.REFLECT,H.UILISTMODEL)),R.uiHandlersFor=e=>C.get(e,C.key(H.REFLECT,H.HANDLERS)),R.uiLayoutOf=e=>C.get(e,C.key(H.REFLECT,H.UILAYOUT)),R.uiIsHidden=(e,t)=>!!C.get(e,K(t,H.HIDDEN)),R.uiIsHiddenOn=(e,t,r)=>{const n=C.get(e,K(t,H.HIDDEN));return!!n&&(r?n.includes(r):n)},R.uiTypeOf=(e,t)=>{const r=C.get(e,C.key(H.REFLECT,b.PROPERTIES,t));if(!r)throw new S(`No metadata found for property '${t}' on model '${e.name}'`);const n=Object.keys(r).filter(e=>[H.PROP,H.ELEMENT,H.CHILD].includes(e));if(0===n.length)throw new S(`No UI type metadata found for property '${t}' on model '${e.name}'`);if(n.length>1)throw new z("Only one type of decoration is allowed. Please choose between @uiprop, @uichild or @uielement");return r[n[0]]},R.uiListItems=(e=>{const t=C.get(e,C.key(H.REFLECT,b.PROPERTIES));if(t)return Object.keys(t)}).bind(R);const we=N.prototype;var Pe;we.decorateClass||(we.decorateClass=function(e){return this._classDecorators||(this._classDecorators=[]),this._classDecorators.push(e),this}),we.uimodel=function(e,t){return this.decorateClass(De(e,t))},we.renderedBy=function(e){return this.decorateClass(Ie(e))},we.uilistmodel=function(e,t){return this.decorateClass(Se(e,t))},we.uihandlers=function(e){return this.decorateClass(Ce(e))},we.uilayout=function(e,t,r,n){return this.decorateClass(be(e,t,r,n))},we.uisteppedmodel=function(e,t,r,n){return this.decorateClass(Me(e,t,r,n))},(e=>{e.ROOT="dashboard",e.COMPONENT="dashboard.component"})(Pe||(Pe={}));const ke=new Set;function Ue(e){ke.add(e)}function _e(){return[...ke]}function He(){ke.clear()}function Fe(e,t,r){return k.for(Pe.COMPONENT).define({decorator:(e,t,r)=>{const n={tag:t?.tag||e,...t,defaultSize:t?.defaultSize??{cols:1,rows:1}};return t=>{const o=P(De(e,r),w(Pe.COMPONENT,n))(t);return Ue(t),o}},args:[e,t,r]}).apply()}function Be(e){const t=C.constr(e);if("function"==typeof t)return t;const r=e.constructor;return"function"==typeof r?r:e}function ve(e){const t=Be(e);return C.get(t,Pe.COMPONENT)}function je(e){const t=Be(e),r=ve(t)||{},n=r.tag||t.name;return{name:t.name,tag:n,label:r.label,defaultSize:r.defaultSize??{cols:1,rows:1},model:r.model,props:r.props,metadata:r.metadata}}const $e="##VERSION##",Ge="##COMMIT##",xe="##FULL_VERSION##",Ye="##PACKAGE##";C.registerLibrary(Ye,$e);export{Q as ActionRoles,Ge as COMMIT,G as ComponentEventNames,Pe as DashKeys,Le as DecafComponent,ye as DecafEventHandler,Ne as DecafTranslateService,V as ElementPositions,Y as ElementSizes,xe as FULL_VERSION,$ as HTML5CheckTypes,v as HTML5DateFormat,j as HTML5InputTypes,X as LayoutGridGaps,Ye as PACKAGE_NAME,oe as RenderingEngine,z as RenderingError,x as TransactionHooks,H as UIKeys,_ as UIMediaBreakPoints,ge as UIValidator,$e as VERSION,B as ValidatableByAttribute,F as ValidatableByType,W as WindowColorSchemes,je as dashComponentDefinitionOf,ve as dashComponentMetadataOf,_e as dashComponents,Fe as dashcomponent,te as escapeHtml,q as formatByType,ne as generateUIModelID,K as getUIAttributeKey,le as hidden,ie as hideFor,se as hideOn,J as isClassConstructor,ee as parseToNumber,Z as parseValueByType,Ue as registerDashComponent,ce as renderIf,Ie as renderedBy,He as resetDashComponentRegistry,re as revertHtml,ae as showFor,fe as uichild,Ee as uielement,Ce as uihandlers,be as uilayout,he as uilayoutprop,Se as uilistmodel,de as uilistprop,De as uimodel,me as uion,Te as uionclick,Re as uionrender,ue as uiorder,Oe as uipageprop,pe as uiprop,Me as uisteppedmodel,Ae as uitablecol};
|
|
2
|
+
//# sourceMappingURL=ui-decorators.js.map
|