@spiffcommerce/core 26.0.0 → 26.1.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../src/types.ts","../src/util/exception.ts","../src/services/persistence.ts","../src/Configuration.ts","../src/util/crossplatform.ts","../src/services/server.ts","../src/customCanvas.ts","../src/util/image.ts","../src/services/asset.ts","../src/services/promiseCache.ts","../src/services/option.ts","../src/query.ts","../src/WorkflowManager/scenes/index.ts","../src/util/PromiseQueue/index.ts","../src/util/option.ts","../src/util/frame.ts","../src/util/color.ts","../src/util/illustration.ts","../src/util/guid.ts","../src/Elements/SVGLayout.tsx","../src/util/math.ts","../src/Elements/Image.tsx","../src/Elements/Group.tsx","../src/Elements/Frame.tsx","../src/util/font.ts","../src/text/algorithm/traditional.ts","../src/text/shared.ts","../src/Elements/Textbox.tsx","../src/Elements/Illustration.tsx","../src/CommandContext.tsx","../src/Elements/factory.ts","../src/LayoutsState.ts","../src/command.ts","../src/services/steps/frame/Service.ts","../src/services/SilentStepHandler/index.ts","../src/services/shortener.ts","../src/util/Poller.ts","../src/services/steps/digitalContent.ts","../src/services/steps/frame/index.ts","../src/services/steps/illustration.ts","../src/services/steps/material.ts","../src/services/steps/model.ts","../src/services/steps/module.ts","../src/services/steps/picture.ts","../src/services/steps/question.ts","../src/services/steps/shape.ts","../src/services/toast.ts","../src/text/algorithm/autosize.ts","../src/services/steps/text/index.ts","../src/module/ModuleProduct.ts","../src/module/products/Favourites/font.ts","../src/module/products/Favourites/background.ts","../src/module/svg/elements.ts","../src/module/svg/modify.ts","../src/module/svg/Warp.ts","../src/module/products/Favourites/index.ts","../src/module/products/Maltesers/font.ts","../src/module/products/Maltesers/index.ts","../src/module/products/Vegemite/font.ts","../src/module/products/Vegemite/index.ts","../src/module/resolver.ts","../src/GlobalPropertyStateManager/query.ts","../src/Bundle/query.ts","../src/WorkflowManager/index.ts","../src/stepHandles/resource/variant.ts","../src/stepHandles/index.ts","../src/stepHandles/steps/illustration.ts","../src/stepHandles/steps/material.ts","../src/stepHandles/steps/model.ts","../src/stepHandles/steps/picture.ts","../src/stepHandles/steps/question.ts","../src/stepHandles/steps/shape.ts","../src/stepHandles/steps/text.ts","../src/stepHandles/steps/information.ts","../src/stepHandles/steps/digitalContent.ts","../src/stepHandles/steps/module.ts","../src/stepHandles/factory.ts","../src/services/design.ts","../src/WorkflowExperience/index.ts","../src/generation/index.ts","../src/WorkflowManager/LayoutPreviewService/index.ts","../src/GlobalPropertyConfiguration/index.ts","../src/GlobalPropertyStateManager/index.ts","../src/Bundle/stateManager.ts","../src/productCollection.ts","../src/Bundle/index.ts","../src/flowService.ts","../src/integration.ts","../src/customer.ts","../src/client.ts","../src/WorkflowManager/mock.ts","../src/stepHandles/steps/frame.ts","../src/customerPortal/queries.ts","../src/customerPortal/functions.ts"],"sourcesContent":["import { FunctionComponent, ReactNode } from \"preact/compat\";\nimport { WorkflowManager } from \"./WorkflowManager\";\nimport type { RenderableContextService } from \"@spiffcommerce/preview\";\nimport type { ThemeInstallConfigurationGraphQl } from \"@spiffcommerce/theme-bridge\";\nimport { CanvasCommand } from \"./command\";\n\nexport enum AssetType {\n Data = \"Data\",\n Font = \"Font\",\n Frame = \"Frame\",\n Illustration = \"Illustration\",\n Image = \"Image\",\n Model = \"Model\",\n Material = \"Material\",\n Color = \"Color\",\n QuestionnaireCollateral = \"QuestionnaireCollateral\",\n RequestCollateral = \"RequestCollateral\",\n SignupCollateral = \"SignupCollateral\",\n Video = \"Video\",\n ColorProfile = \"ColorProfile\",\n Environment = \"Environment\",\n}\n\nexport interface Asset {\n /**\n * The path of the asset within the bucket.\n */\n key?: string;\n\n /**\n * The name of this asset, the file name by default, otherwise a name set by the user.\n */\n name?: string;\n\n /**\n * The time that this asset was uploaded.\n */\n createdAt?: string;\n\n /**\n * The ID of this asset's license.\n */\n licenseId?: string;\n\n /**\n * The content type registered with the bucket.\n */\n mimeType?: string;\n\n /**\n * The ID of the person that uploaded this asset.\n */\n ownerId?: string;\n\n /**\n * The price to use this asset.\n */\n price?: number;\n\n /**\n * The asset type being dealt with.\n */\n type?: AssetType;\n\n /**\n * True when this asset is publicly available to anyone.\n */\n public?: boolean;\n\n /**\n * All versions for this asset, including the \"latest\" one which is the default and represented\n * by the key of the asset itself.\n */\n objectVersions?: AssetObjectVersion[];\n\n /**\n * A list of tags for organisational purposes.\n */\n tags?: AssetTag[];\n\n hubLink?: string;\n\n fileLink?: string;\n\n newVersionLink?: string;\n\n invalidateLink?: string;\n\n versions?: AssetVersion[];\n\n metadata?: AssetMetadata[];\n}\n\n/**\n * A tag for organisation of assets\n */\nexport interface AssetTag {\n /**\n * A unique ID.\n */\n id: string;\n /**\n * The human friendly display name of the tag.\n */\n name: string;\n /**\n * The key of the asset the tag is associated to.\n */\n assetKey: string;\n /**\n * The partner that owns that asset & tag.\n */\n partnerId: string;\n}\n\ninterface AssetMetadata {\n key: string;\n value: string;\n}\n\ninterface AssetVersion {\n name: string;\n\n link: string;\n}\n\n/**\n * An object version is a snapshow of an asset at a given point in time. Each time\n * the user updates the file associated to an asset a new object version is created.\n * Users can then see a timeline of all object versions and switch between them.\n */\nexport interface AssetObjectVersion {\n /**\n * The size of the file in bytes.\n */\n size: number;\n /**\n * A timestamp for when this version was created.\n */\n timestamp: string;\n /**\n * The id of the version, this is required in cases where we want to perform\n * specific operations on a version such as making it the latest one or deleting it.\n */\n versionId: string;\n /**\n * The url that this asset should be called on when we want to get it,\n * instead of the base key. This key is\n */\n versionedKey: string;\n}\n\nexport interface Step<T extends AnyStepData = AnyStepData> {\n conditions?: Condition[];\n data: T;\n globalPropertyAspectConfigurations?: GlobalPropertyAspectConfiguration[];\n helpText?: string;\n mandatory?: boolean;\n silent?: boolean;\n option?: OptionResource;\n optionId?: string;\n stepName: string;\n stepTitle: string;\n tags?: string[];\n type: StepType;\n}\n\nexport interface GlobalPropertyAspectConfiguration {\n aspectName?: string;\n globalPropertyConfigurationId?: string;\n}\n\nexport interface GlobalPropertyConfiguration {\n id: string;\n aspects: GlobalPropertyConfigurationAspect[];\n}\n\nexport interface GlobalPropertyConfigurationAspect {\n name: string;\n type: AspectType;\n title: string;\n description: string;\n entityId?: string;\n conditions?: GlobalPropertyConfigurationAspectCondition[];\n}\n\nexport interface GlobalPropertyConfigurationAspectCondition {\n targetAspectName?: string;\n action: AspectConditionAction;\n requiredVariantSelections: string[];\n}\n\nexport enum AspectConditionAction {\n Show = \"Show\",\n}\n\nexport enum AspectType {\n FileUpload = \"FileUpload\",\n Option = \"Option\",\n ColorOption = \"ColorOption\",\n Text = \"Text\",\n}\n\nexport enum StepType {\n Information = \"Information\",\n Bulk = \"Bulk\",\n DigitalContent = \"DigitalContent\",\n Finish = \"Finish\",\n Frame = \"Frame\",\n Illustration = \"Illustration\",\n Introduction = \"Introduction\",\n Material = \"Material\",\n Model = \"Model\",\n Module = \"Module\",\n Picture = \"Picture\",\n /**\n * @deprecated Use Frame instead.\n */\n Photo = \"Photo\",\n ProductOverlay = \"ProductOverlay\",\n Question = \"Question\",\n Shape = \"Shape\",\n SilentIllustration = \"SilentIllustration\",\n Text = \"Text\",\n}\n\nexport interface StepAspect {\n stepName: string;\n stepType: StepType;\n aspectType: StepAspectType;\n}\n\nexport enum StepAspectType {\n Color = \"Color\",\n Colors = \"Colors\",\n Selection = \"Selection\",\n Selections = \"Selections\",\n Text = \"Text\",\n Upload = \"Upload\",\n}\n\nexport interface Region {\n top: number;\n left: number;\n width: number;\n height: number;\n layer?: number;\n layerIndex?: number;\n rotation: number;\n panelId: string;\n immutable?: boolean;\n adjustmentBoundary?: { x: number; y: number; height: number; width: number };\n}\n\nexport interface Condition {\n requiredVariantSelections: string[];\n action: string;\n targetStepName: string;\n}\n\ninterface StepAsset {\n key: string;\n previewKey?: string;\n}\n\nexport interface OptionResource {\n id?: string;\n localId?: string;\n name: string;\n type?: string;\n variants?: VariantResource[];\n defaultVariant?: VariantResource;\n workflowId?: string;\n public?: boolean;\n displayType?: string;\n colorProfile?: Asset;\n integrationOptions?: IntegrationOptionResource[];\n}\n\nexport interface VariantResource {\n id?: string;\n name: string;\n enabled: boolean;\n priceModifier: number;\n\n asset?: Asset;\n material?: MaterialResource;\n thumbnail?: Asset;\n\n color?: string;\n localId?: string;\n default?: boolean;\n namedColor?: string;\n\n option?: OptionResource;\n}\n\nexport interface IntegrationOptionResource {\n id?: string;\n localId?: string;\n integrationId: string;\n externalProductId?: string;\n}\n\n/**\n * Represents a material resource that can be additively applied to\n * a material targeted in the scene.\n */\nexport type MaterialResource = {\n /**\n * A unique identified for this material.\n */\n id: string;\n /**\n * The name of this material\n */\n name: string;\n /**\n * Defines the base color of a surface before any other calculations are made.\n */\n albedoMapKey?: string;\n /**\n * Defines the transparency of a surface.\n */\n alphaMapKey?: string;\n /**\n * Defines shadowing on a surface.\n */\n ambientMapKey?: string;\n /**\n * Defines the amount of light being emitted from a surface.\n */\n emissionMapKey?: string;\n /**\n * Identical to roughness.\n */\n metallicMapKey?: string;\n /**\n * Defines the direction light will bounce in when it hits a point on a surface.\n */\n normalMapKey?: string;\n /**\n * Used to define how smooth a surface is.\n */\n roughnessMapKey?: string;\n /**\n * Used to define refraction of light on a surface.\n */\n refractionMapKey?: string;\n /**\n * The intensity of refraction, when refraction is enabled via a texture.\n */\n refractionIntensity?: number;\n /**\n * Use to define reflection of light on a surface.\n */\n reflectionMapKey?: string;\n /**\n * The intensity of reflection, when reflection is enabled via a texture.\n */\n reflectionIntensity?: number;\n /**\n * The rotation of the reflection map (around the up axis, in degrees), when reflection is enabled via a texture.\n */\n reflectionRotation?: number;\n /**\n * When enabled the material will be displayed with a clearcoat affect for simulating coated plastic surfaces.\n */\n clearCoat: MaterialEffectMode;\n /**\n * Index of refraction when clear coat is enabled.\n */\n clearCoatIOR?: number;\n /**\n * The date that this material resource was created\n */\n createdAt: string;\n /**\n * The date that this material resource was last updated.\n */\n updatedAt: string;\n};\n\n/**\n * Used to specify the behavior of a material effect such as clearcoat, sheen and translucency.\n */\nexport enum MaterialEffectMode {\n /**\n * When a material variant effect specifies 'None' the effect doesn't change in any way. This is the default behavior.\n */\n None = \"None\",\n /**\n * When a material variant effect specifies 'RemoveWhenSelected' the effect is removed.\n */\n RemoveWhenSelected = \"RemoveWhenSelected\",\n /**\n * When a material variant effect specifies 'ApplyWhenSelected' the effect is enabled.\n */\n ApplyWhenSelected = \"ApplyWhenSelected\",\n}\n\nexport type AnyStepData =\n | InformationStepData\n | BulkStepData\n | DigitalContentStepData\n | FinalizeStepData\n | FrameStepData\n | IllustrationStepData\n | MaterialStepData\n | ModelStepData\n | ModuleStepData\n | PictureStepData\n | QuestionStepData\n | ShapeStepData\n | SilentStepData\n | TextStepData;\n\nexport interface Animatable {\n lookAtAnimation?: CameraAnimation;\n modelAnimation?: ModelAnimation;\n}\n\nexport interface BulkStepData extends Animatable {\n aspects: StepAspect[];\n}\n\nexport interface InformationStepData extends Animatable, Placeable {\n content: string;\n}\n\nexport interface DigitalContentStepData extends Animatable, Placeable {\n baseUrl: string;\n varyUpload?: boolean;\n}\n\nexport interface FrameStepData extends Animatable, Placeable, Colorable {\n hideSelectionInCart?: boolean;\n hideImageInCart?: boolean;\n colorPickerEnabled?: boolean;\n displaySelectionOnFinishStep?: boolean;\n displayImageOnFinishStep?: boolean;\n disablePlaceholder?: boolean;\n initialZoomLevel?: number;\n markSelectionAsCustomField?: boolean;\n markImageAsCustomField?: boolean;\n maxColors?: number;\n focalBlur?: boolean;\n focalBlurRadius?: number;\n focalBlurStrength?: number;\n forceImageCover?: boolean;\n overlayImageKey?: string;\n placeholderImageKey?: string;\n placeholderImageUrl?: string;\n varySelection?: boolean;\n varyUpload?: boolean;\n whitelistedExtensions: string[];\n}\n\nexport interface IllustrationStepData extends Animatable, Placeable, Colorable {\n hideSelectionInCart?: boolean;\n hideColorsInCart?: boolean;\n displaySelectionOnFinishStep?: boolean;\n displayColorsOnFinishStep?: boolean;\n markSelectionAsCustomField?: boolean;\n markColorsAsCustomField?: boolean;\n assetKeys?: string[];\n assets?: StepAsset[];\n defaultAssetKey?: string;\n colorPickerEnabled?: boolean;\n varySelection?: boolean;\n varyColors?: boolean;\n}\n\nexport interface MaterialStepData extends Animatable {\n hideSelectionInCart?: boolean;\n displaySelectionOnFinishStep?: boolean;\n markSelectionAsCustomField?: boolean;\n targetMaterials: string[];\n varySelection?: boolean;\n}\n\nexport interface ModelStepData extends Animatable {\n replaceProductModel?: boolean;\n hideSelectionInCart?: boolean;\n displaySelectionOnFinishStep?: boolean;\n markSelectionAsCustomField?: boolean;\n varySelection?: boolean;\n}\n\nexport interface ModuleStepData extends Animatable, Placeable {\n hideTextInCart?: boolean;\n displayTextOnFinishStep?: boolean;\n markTextAsCustomField?: boolean;\n module: string;\n maxLength: number;\n varyText?: string;\n}\n\nexport interface PictureStepData extends Animatable, Placeable {\n hideSelectionInCart?: boolean;\n displaySelectionOnFinishStep?: boolean;\n markSelectionAsCustomField?: boolean;\n varySelection?: boolean;\n}\n\nexport interface QuestionStepData extends Animatable {\n hideSelectionsInCart?: boolean;\n displaySelectionsOnFinishStep?: boolean;\n markSelectionsAsCustomField?: boolean;\n varySelections?: boolean;\n}\n\nexport interface ShapeStepData extends Animatable, Placeable {\n hideSelectionInCart?: boolean;\n displaySelectionOnFinishStep?: boolean;\n markSelectionAsCustomField?: boolean;\n defaultColour?: string;\n excludeFromPrint?: boolean;\n varySelection?: boolean;\n}\n\nexport interface TextStepData extends Animatable, Placeable, Colorable {\n hideSelectionInCart?: boolean;\n hideFillImageInCart?: boolean;\n hideColorInCart?: boolean;\n hideTextInCart?: boolean;\n displaySelectionOnFinishStep?: boolean;\n displayFillImageOnFinishStep?: boolean;\n displayColorOnFinishStep?: boolean;\n displayTextOnFinishStep?: boolean;\n markSelectionAsCustomField?: boolean;\n markFillImageAsCustomField?: boolean;\n markColorAsCustomField?: boolean;\n markTextAsCustomField?: boolean;\n allowNewlines?: boolean;\n defaultText: string;\n deleteDefaultOnFocus?: boolean;\n replaceableText?: string;\n font: string;\n colorPickerEnabled?: boolean;\n maxLength: number;\n maxSize?: number;\n minSize?: number;\n size: number;\n textAlign: string;\n colour: string;\n uppercase?: boolean;\n vertical?: boolean;\n verticalAlign: string;\n curved?: boolean;\n paths?: string[];\n userCanReplaceText?: boolean;\n varySelection?: boolean;\n varyText?: boolean;\n varyColor?: boolean;\n imageFillOption?: OptionResource;\n imageFillScale?: number;\n}\n\nexport interface SilentStepData extends Animatable, Placeable {\n asset?: Asset;\n excludeFromPrint?: boolean;\n}\n\ntype FinalizeStepData = Animatable;\n\n/**\n * A colorable step is a step that can have an optional color option assigned to help drive color palette choices.\n */\nexport interface Colorable {\n colorOption?: OptionResource;\n}\n\n/**\n * A placeable step is a step that can be placed on a canvas in a set of specific positions.\n */\nexport interface Placeable {\n regions: Region[];\n}\n\nexport interface StepService<T extends AnyStepData> {\n /**\n * Initialize the given step, or reload from serialized data if present.\n */\n init(stepData: Step<T>, workflowManager: WorkflowManager, reducerState?: LayoutsState): Promise<any>;\n}\n\nexport interface LayoutsState {\n layouts: { [id: string]: LayoutState };\n serializableWorkflow: SerializableWorkflow;\n}\n\n/**\n * A workflow step in the process of being serialized or deserialized.\n */\nexport interface SerializableStep {\n stepName: string;\n storage?: StepStorage;\n selectedVariants?: SerializableVariant[];\n}\n\nexport interface SerializableWorkflow {\n steps: SerializableStep[];\n}\n\nexport interface SerializableVariant {\n id: string;\n priceModifier: number;\n}\n\n// Non-variant information required to rehydrate a workflow step.\nexport interface StepStorage {\n bulkIsConnected?: boolean;\n color?: string;\n colorProfileAssetKey?: string;\n colors?: { [key: string]: IllustrationColorObject };\n colour?: string;\n currentFrameSources?: string[];\n customiseAllText?: boolean;\n defaultCleared?: boolean;\n fillImage?: TextFillImage;\n frameOffsetsList?: FrameOffsets[];\n framePatternData?: {\n originalAssetKey?: string;\n backgroundRemovedAssetKey?: string;\n useOriginalAsset?: boolean;\n };\n framePatternSrc?: string;\n inputText?: string;\n overrideGlobalConfiguration?: boolean;\n overrideGlobalConfigurations?: { [key: string]: boolean };\n text?: string;\n videoShortUrl?: string;\n videoUrl?: string;\n}\n\nexport interface IllustrationColorObject {\n browserValue: string;\n spotColor?: { profileName: string; namedColor: string };\n pmsValue?: string;\n}\n\nexport interface FrameOffsets {\n y: number;\n x: number;\n zoom: number;\n}\n\nexport interface LayoutState {\n /**\n * The elements currently on this layout.\n */\n elements: LayoutElement[];\n /**\n * A file describing the properties of this layout.\n */\n layout: ILayout;\n /**\n * A unique ID regenerated each time this layout is changed.\n */\n modificationID: string;\n}\n\n/**\n * Represents an element on the SVG canvas. This may comprise of multiple SVG elements when\n * output such as path elements, defs, etc. All concrete elements must implement this interface.\n */\nexport interface LayoutElement extends Layerable {\n /**\n * The unique identifier for this element.\n */\n id: string;\n /**\n * If the element was made from a workflow step, this is its step name.\n */\n stepName?: string;\n /**\n * If the element was made from a workflow step, this is its region.\n */\n stepRegion?: Region;\n /**\n * The type of this element\n */\n type: LayoutElementType;\n /**\n * Horizontal offset from top left origin point.\n */\n x: number;\n /**\n * Vertical offset from top left origin point.\n */\n y: number;\n /**\n * The height in pixels of the element.\n */\n width: number;\n /**\n * The height in pixels of the element.\n */\n height: number;\n /**\n * The rotation in degrees.\n */\n rotation: number;\n\n /**\n * The element is considered immutable and shouldn't be modifiable by the user.\n */\n immutable?: boolean;\n /**\n * When true this element should be rendered on top of all other elements always.\n */\n productOverlay?: boolean;\n /**\n * When true, this element will be removed from SVGString output when\n * the removeExcludedElements flag is set to true.\n */\n excludeFromExport?: boolean;\n /**\n * Value to use as the mask attribute if the element does not correspond to a step.\n */\n mask?: string;\n /**\n * Injected by the LayoutsProvider if required. Shouldn't be\n * used by the user. This is a simple way to pass global rendering configuration\n * to individual elements without having to set up a react context.\n */\n _renderingConfiguration?: RenderingConfiguration;\n}\n\n/**\n * Represents a layerable entity. Layerable entities can be sorted within our system for rendering purposes.\n */\nexport interface Layerable {\n /**\n * The layer that this element exists on. Elements on a higher layer can never\n * be below an element on a lower layer. 0 by default.\n */\n layer?: number;\n /**\n * The index of this element on the current layer, if no layer is present it is assumed to be 0.\n * For the index 0 is lower, > 0 is higher\n */\n layerIndex?: number;\n}\n\nexport interface TextFillImage {\n src: string;\n width: number;\n height: number;\n scale: number;\n}\n\n/**\n * The reason we need to turn a layout into an SVG.\n */\nexport enum LayoutRenderingPurpose {\n ThreeD = \"ThreeD\",\n FreeDesign = \"FreeDesign\",\n Print = \"Print\",\n}\n\n/**\n * Specifies configuration for rendering a Papyrus canvas as an SVG string.\n */\nexport interface RenderingConfiguration {\n /**\n * Sets the viewbox to a custom value when subregions are desired.\n */\n region?: PreviewRegion;\n /**\n * Excludes marked elements from the SVG output when true.\n */\n removeExcludedElements?: boolean;\n\n purpose: LayoutRenderingPurpose;\n\n /**\n * When true any cached data will be ignored and assets will be rendered in full\n * with the properties they are provided.\n */\n omitCachedFields?: boolean;\n /**\n * When true, spot colors will be output, when provided, into any\n * fill or stroke style in an illustration.\n */\n spotColors?: boolean;\n\n colorProfiles?: ColorProfileProps[];\n\n /**\n * Allow for debug rendering on elements.\n */\n debug?: boolean;\n}\n\nexport interface ColorProfileProps {\n name: string;\n key: string;\n}\n\nexport interface PreviewRegion {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/**\n * The possible types for an element.\n */\nexport enum LayoutElementType {\n Frame = \"frame\",\n Group = \"group\",\n Image = \"image\",\n Pattern = \"pattern\",\n Illustration = \"illustration\",\n Textbox = \"textbox\",\n}\n\n/**\n * Represents a layout contained within a specific user created design.\n */\nexport interface ILayout {\n /**\n * The internal identifier for this layout.\n */\n id: string;\n\n /**\n * A link to the json resource describing this layout\n */\n layoutPath?: string;\n\n /**\n * The index this layout appears at in its design\n */\n index: number;\n\n /**\n * An id for the panel associated to this layout.\n */\n panelId: string;\n\n /**\n * The date this layout was created.\n */\n createdAt: Date;\n\n /**\n * The date this layout was last updated.\n */\n updatedAt: Date;\n\n /**\n * The height of the layout. This matches the background element on the canvas as a convenience.\n */\n height: number;\n\n /**\n * The width of the layout. This matches the background element on the canvas as a convenience.\n */\n width: number;\n /**\n * When true this layout should contain no background fill.\n */\n transparentBackground?: boolean;\n\n previewRegion?: {\n height: number;\n width: number;\n top: number;\n left: number;\n };\n\n useEditableArea?: boolean;\n editableArea?: {\n x: number;\n y: number;\n height: number;\n width: number;\n };\n\n name: string;\n}\n\nexport interface FileInfo {\n /**\n * The name of the file.\n */\n name: string;\n\n /**\n * A blob object representing the\n * data of the file.\n */\n blob: Blob;\n}\n\n/**\n * A command along with a function to run afterwards.\n */\nexport interface CommandWithFollowup {\n command?: CanvasCommand;\n followup?: () => Promise<void>;\n}\n\nexport interface DesignResource {\n metadata?: { [key: string]: string };\n sku?: string;\n}\n\nexport interface DesignDetails {\n name: string;\n layouts: { index: number; panelId: string }[];\n workflowId: string;\n transactionId: string;\n previewImage?: string;\n useThreeDimPreview: boolean;\n metadata?: { key: string; value: string }[];\n selectedVariants?: { key: string; ids: string[] }[];\n}\n\n/**\n * The variant selections of a completed step.\n */\nexport interface SelectedVariants {\n [stepName: string]: {\n id: string;\n name: string;\n priceModifier: number;\n }[];\n}\n\n// The metadata and variant selections of a completed workflow.\nexport interface ExportedData {\n [name: string]: {\n value: string;\n priceModifier: number;\n };\n}\n\nexport interface DesignCreationMessage {\n additionalExternalProductId?: string;\n additionalExternalVariantId?: string;\n baseCost?: number;\n designExternalVariants?: DesignExternalVariant[];\n designProductId?: string;\n designProductVariantId?: string;\n event: string;\n exportedData: ExportedData;\n externalCartProductId?: string;\n externalCartProductVariantId?: string;\n lineItemImageUrl: string;\n metadata?: { [stepName: string]: string };\n optionsCost: number;\n processExecutionId?: string;\n quantity?: number;\n selectedVariants?: SelectedVariants;\n sku?: string;\n transactionId: string;\n transactionOwnerId?: string;\n weight?: number;\n workflowViewerLink: string;\n workflowViewerReadOnlyLink: string;\n}\n\nexport interface BundleDesignCreationMessage {\n bundleId: string;\n items: DesignCreationMessage[];\n bundleOwnerId?: string;\n}\n\nexport interface DesignWorkflowMetadata {\n [key: string]: string;\n}\n\n/**\n * Represents a transaction.\n */\nexport interface Transaction {\n /**\n * A unique identifier for this transaction. Useful for reloading and\n * modifying state of the transaction.\n */\n id: string;\n\n /**\n * User-supplied name for the associated design.\n */\n designName?: string;\n\n /**\n * The workflow associated with this transaction.\n */\n workflowId?: string;\n\n /**\n * Temporary ID that grants write permission to the transaction.\n */\n transactionOwnerId?: string;\n\n /**\n * The current state of the design.\n */\n workflowState?: string;\n\n /**\n * URL to a partner-specific logo intended to display during the workflow experience.\n */\n customLogoLink?: string;\n\n /**\n * URL to a logo intended to display at the periphery of the workflow experience.\n */\n workflowFooterLogoLink?: string;\n\n /**\n * URL to the corresponding integration in the REST API.\n */\n restApiIntegrationLink?: string;\n\n /**\n * URL to redirect to when a workflow is finished.\n */\n callbackUrl?: string;\n\n /**\n * Product that this transaction belongs to.\n */\n product?: Product;\n\n /**\n * The integration product related to this lineitem.\n */\n integrationProduct?: IntegrationProductResource;\n\n /**\n * Whether this transaction has previously been ordered.\n */\n isOrdered?: boolean;\n\n /**\n * @deprecated use isOrdered to check whether transaction has been ordered instead.\n */\n lineItem?: LineItem;\n\n /**\n * The external product variant ID representing the design product related\n * to this transaction, null unless the createDesignProduct flag was set\n * and the design was finalized using createDesign operation.\n */\n /**@deprecated use externalCartProductVariantId or designExternalVariants[x].externalProductVariantId instead of this moving forward */\n externalDesignProductVariantId?: string;\n\n /**\n * The external product id representing the design product related\n * to this transaction, null unless the createDesignProduct flag was set\n * and the design was finalized using createDesign operation.\n */\n /**@deprecated use externalCartProductId or designExternalVariants[x].externalProductId instead of this moving forward. */\n externalDesignProductId?: string;\n\n /**\n * The external product id representing the product related to the transaction.\n * This value can hold any type of transaction such as design and standard products.\n */\n externalCartProductId?: string;\n\n /**\n * The external product variant id representing the product related to the transaction.\n * This value can hold any type of transaction such as design and standard products.\n */\n externalCartProductVariantId?: string;\n\n priceModifierTotal?: number;\n\n /**\n * URL to open the transaction in the workflow viewer.\n */\n workflowViewerLink?: string;\n\n workflowViewerReadOnlyLink?: string;\n\n previewImageLink?: string;\n\n lastSyncedAt?: string;\n\n /**\n * The users who have access to this transaction.\n */\n stakeholders?: Stakeholder[];\n\n /** The stakeholder of the currently logged in user, if applicable. */\n currentStakeholder?: Stakeholder;\n\n /**\n * The amount of this transaction that was, or will be, ordered\n */\n quantity?: number;\n\n createdAt?: string;\n\n printFileUrl1?: string;\n printFileUrl2?: string;\n printFileUrl3?: string;\n printFileUrl4?: string;\n printFileUrl5?: string;\n printFileName1?: string;\n printFileName2?: string;\n printFileName3?: string;\n printFileName4?: string;\n printFileName5?: string;\n\n /**\n * An array of objects containing information on additional products to add to the cart.\n * Typically only available when being passed to {@link DesignCreationMessage}\n */\n designExternalVariants?: DesignExternalVariant[];\n\n /**\n * A list of actions that have been associated to this transaction. To be used by the client to interact further post design.\n */\n transactionShareActions?: ShareAction[];\n\n /** Whether any share actions for this Transaction require the user to be authenticated as a stakeholder */\n hasAuthenticatedActions?: boolean;\n\n marketplaceThemeInstallConfiguration?: ThemeInstallConfigurationGraphQl;\n\n completed?: boolean;\n}\n\nexport interface ShareAction {\n id: string;\n type: ShareActionType;\n title?: string;\n precedence?: number;\n stakeholderType?: string;\n url?: string;\n}\n\nexport enum ShareActionType {\n Hyperlink = \"Hyperlink\",\n Edit = \"Edit\",\n Approve = \"Approve\",\n}\n\n/**\n * An object containing ids for an external product/variant that should be added to the cart alongside the base product/variant.\n */\nexport interface DesignExternalVariant {\n id?: string;\n externalProductId?: string;\n externalProductVariantId?: string;\n skuCode?: string;\n}\n\n/**\n * An integration product represents the connection of a product in SpiffCommerce with\n * a product on a third party platform.\n */\nexport interface IntegrationProductResource {\n /**\n * The ID of the IntegrationProduct entity. Used internally by SpiffCommerce.\n */\n id: string;\n /**\n * The ID of the product on the third party platform. For example a Shopify product ID.\n */\n externalProductId?: string;\n /**\n * The integration that this product is associated with. For example a Shopify integration.\n */\n integration?: Integration;\n\n /**\n * The ID of an additional product (on the third party platform) that should be added to the cart.\n */\n additionalExternalProductId?: string;\n\n /**\n * A supplementary ID for the additional product. Shopify uses the variant ids to add products to the cart.\n */\n additionalExternalVariantId?: string;\n\n /**\n * When the additionalExternalProductId is set, this is the IntegrationProduct that is associated with it.\n * If no Spiff product has been associated with the additionalExternalProductId, this will be null.\n */\n additionalIntegrationProduct?: IntegrationProductResource;\n\n /**\n * The product that this integration product is associated with.\n */\n product?: Product;\n}\n\nexport interface Integration {\n id: string;\n enabled: boolean;\n externalIntegrationId?: string;\n type?: IntegrationType;\n isCurrent?: boolean;\n theme: Theme;\n logo: string;\n partner: Partner;\n marketplaceThemeInstallConfiguration?: ThemeInstallConfigurationGraphQl;\n}\n\nexport interface Theme {\n configuration?: string;\n fontAsset?: Asset;\n id?: string;\n name?: string;\n primaryColor?: string;\n secondaryColor?: string;\n textColor?: string;\n themeLayout?: {\n id?: string;\n name?: string;\n };\n}\n\nexport enum IntegrationType {\n Hub = \"Hub\",\n Shopify = \"Shopify\",\n}\n\n/**\n * Fields found in a variant within a line item resource.\n */\nexport interface LineItemVariant {\n currencyCode: string;\n optionName: string;\n priceModifier: number;\n stepName: string;\n variantName: string;\n}\n\nexport interface LineItem {\n id: string;\n transactionId?: string;\n previewImageUrl?: string;\n product: Product;\n quantity: number;\n metadata?: LineItemMetadata[];\n variants: LineItemVariant[];\n}\n\nexport interface LineItemMetadata {\n stepName: string;\n metadata: string;\n}\n\nexport interface ProductWorkflow {\n friendlyName: string;\n id: string;\n index?: number;\n present?: boolean;\n imageUrl: string;\n workflowName: string;\n}\n\nexport interface Partner {\n id?: string;\n name?: string;\n currencyCode?: string;\n customerDetailsPromptMarkdown?: string;\n activeAddons?: AddonHandle[];\n}\n\nexport enum AddonHandle {\n BackgroundRemover = \"BackgroundRemover\",\n ConversionAccelerator = \"Conversion Accelerator\",\n ProcessBuilder = \"ProcessBuilder\",\n}\n\nexport interface Product {\n /**\n * ID of the partner owner.\n */\n partnerId?: string;\n partner?: Partner;\n\n /**\n * Whether a line item for this product is delivered as soon as the order is received.\n */\n autoprint: boolean;\n\n /**\n * Whether this product can be quickprinted.\n */\n canQuickprint?: boolean;\n\n /**\n * The internal identifier for this product.\n */\n id: string;\n\n /**\n * The human friendly name of the product.\n */\n name: string;\n\n /**\n * A description of the Product, written in Markdown.\n */\n description?: string;\n\n /**\n * A URL to the image asset associated with this product.\n */\n imageUrl?: string;\n\n /**\n * A resource url for a 3D model used to represent this product\n * in the 3d editor. If not available we assume the product doesn't support 3D.\n */\n modelUrl?: string;\n\n /**\n * A URL for the image used as an overlay on any workflows\n * that incorporate a product overlay step.\n */\n overlayImageUrl?: string;\n\n /**\n * Words which can't be used in a workflow for this product.\n */\n profanities?: {\n id: string;\n createdAt: string;\n userId: string;\n word: string;\n }[];\n\n /**\n * The max characters that can be typed for quickprint.\n */\n quickprintMaxLength?: number;\n\n /**\n * The name of the module to use for quickprint.\n */\n quickprintModuleName?: string;\n\n /**\n * If true, the product should be displayed in the client as if it is available.\n * Should be displayed as if it is unavailable otherwise.\n */\n enabled: boolean;\n\n /**\n * Workflows which have been assigned to this product.\n */\n workflows?: ProductWorkflow[];\n\n /**\n * The base price of this product in sub units. Essentially the cost of the\n * product without any customisations applied.\n */\n basePrice?: number;\n\n /**\n * The weight of this product.\n */\n weight?: number;\n\n /**\n * When specified, represents a pre-rendered image of this product to be\n * displayed to customers while the 3D preview is loading.\n */\n preloadImageUrl?: string;\n\n /**\n * When set the store owner has configured this product to prompt for\n * customer details. In hosted experience, we'll offer to collect this information from the customer. In\n * bespoke UIs created using the Core SDK you will need to check this flag and request the data accordingly.\n * See attachCustomerDetails on the WorkflowExperience for how to supply us with the details you collect.\n */\n promptForCustomerDetails?: boolean;\n\n /**\n * Configuration for conversion. Optional.\n */\n conversionConfiguration?: ConversionConfiguration;\n\n integrationProducts?: IntegrationProductResource[];\n\n productTags?: ProductTag[];\n\n productImages?: ProductImage[];\n\n /**\n * The SKU of the product in the merchant's store.\n */\n sku?: string;\n\n /**\n * The Spiff SKU code for the product.\n */\n skuCode?: string;\n\n /**\n * Price breaks for this product when dealing with quantity.\n */\n priceBreaks?: ProductPriceBreak[];\n}\n\nexport interface ProductImage {\n id: string;\n precedence?: number;\n asset: Asset;\n}\n\n/**\n * A price break represents a minimum quantity of a product and the price that will be charged for that quantity.\n * This can be seen as an override for the base price of the product.\n */\nexport interface ProductPriceBreak {\n /**\n * The id of this price break.\n */\n id: string;\n /**\n * The minimum quantity of this price break. A positive integer.\n */\n minQty: number;\n /**\n * A percentage to apply to the overall price. A value between 0-1 where 1 retains 100% of the original price and 0 completely discounts it to free.\n */\n percentage: number;\n}\n\nexport interface ProductTag {\n id: string;\n name: string;\n}\n\nexport interface ColorOption {\n id?: string;\n fill?: string;\n stroke?: string;\n variant?: VariantResource;\n colorProfileAssetKey?: string;\n pmsValue?: string;\n}\n\nexport interface RegionElement {\n id: string;\n region?: Region;\n}\n\nexport interface FrameMetadata {\n image: string;\n}\n\nexport interface IllustrationMetadata {\n colors: string[];\n}\n\nexport interface ModuleMetadata {\n text: string;\n}\n\nexport interface TextMetadata {\n color?: string;\n text: string;\n fillImage?: string;\n}\n\nexport interface SelectionStorage {\n selectedVariants?: VariantResource[];\n}\n\nexport interface FrameStepStorage extends SelectionStorage {\n framePatternAsset?: Asset;\n currentFrameSources?: string[];\n framePatternData?: {\n originalAssetKey?: string;\n backgroundRemovedAssetKey?: string;\n useOriginalAsset?: boolean;\n };\n}\n\nexport interface TextStepStorage extends SelectionStorage {\n color?: string;\n defaultCleared?: boolean;\n inputText?: string;\n text?: string;\n customiseAllText?: boolean;\n}\n\nexport type StepSelections = {\n [key: string]: SelectionStorage;\n};\n\nexport interface FrameData {\n /**\n * The path data for a frame SVG\n */\n path: string;\n\n /**\n * The viewbox width\n */\n width: number;\n\n /**\n * The viewbox height.\n */\n height: number;\n}\n\nexport interface FrameThresholdSettings {\n // Whether to enable a black and white threshold.\n useThreshold: boolean;\n // If using threshold, whether to invert black and white.\n invertThreshold: boolean;\n // An integer from 0 to 256.\n threshold: number;\n // A number from 0 to 1.\n thresholdSaturation: number;\n}\n\n/**\n * Details relating to a model for use in the preview.\n */\nexport type ModelDetails = {\n readonly model?: string;\n readonly contextService: RenderableContextService;\n};\n\n/**\n * A renderable context represents the relationship of a texture in the 3D preview\n * with an external canvas. This context allows external clients to render to a texture\n * in the 3D preview with a simple interface.\n */\nexport type RenderableContext = {\n /**\n * A unique identifier for this renderable context.\n */\n getID(): string;\n\n /**\n * A name for this renderable.\n */\n getName(): string;\n\n /**\n * Sets the render context associated to this renderable.\n * @param ctx The context to use for rendering.\n */\n setStaticContext(ctx: CanvasRenderingContext2D): void;\n\n /**\n * Get the render context associated to this renderable.\n */\n getStaticContext(): CanvasRenderingContext2D | undefined;\n\n /**\n * Sets whether or not this renderable is dirty and will need re-rendering.\n * @param value The new value\n */\n setStaticContextDirty(value: boolean): void;\n\n /**\n * When this context has been set as dirty, returns true.\n */\n getStaticContextDirty(): boolean;\n\n /**\n * A timestamp for the last successful render of the context.\n */\n getLastCompletedStaticRender(): number | undefined;\n};\n\n/**\n * Represents a handle to a material in the 3D scene. The underlying complexity of materials is abstracted\n * away so the client doesn't need to know anything more than the ID they're given and the name.\n */\nexport type MaterialHandle = {\n /**\n * The identifier for the material.\n */\n readonly id: string;\n /**\n * The human readable name for the material.\n */\n readonly name: string;\n};\n\n/**\n * Settings related to the 3D preview.\n */\nexport type PreviewOptions = {\n /**\n * The color expected to be seen in the background of the product. Expects a hexadecimal value.\n */\n readonly backgroundColor?: string;\n /**\n * Image to be used as a background when running with transparency, the image\n * will be scaled and centered to fill the preview based on aspect ratio.\n */\n readonly backgroundImage?: string;\n /**\n * The closest zoom the camera can achieve to the product.\n */\n readonly maxZoomOverride?: number;\n /**\n * The furthest zoom the camera can achieve to the product.\n */\n readonly minZoomOverride?: number;\n /**\n * The environment file used to calculate product lighting.\n */\n readonly environmentFile?: string;\n /**\n * The intensity of the environment lighting.\n */\n readonly environmentIntensity?: number;\n /**\n * The rotation (around the y axis) of the environment lighting, in degrees.\n */\n readonly environmentRotationY?: number;\n\n /**\n * The lowest point, vertically, that the camera can rotate to.\n * https://doc.babylonjs.com/divingDeeper/cameras/camera_introduction\n */\n readonly lowerBetaLimitDeg?: number;\n\n /**\n * The highest point, vertically, that the camera can rotate to.\n * https://doc.babylonjs.com/divingDeeper/cameras/camera_introduction\n */\n readonly upperBetaLimitDeg?: number;\n\n /**\n * The leftmost point, horizontally, that the camera can rotate to.\n * https://doc.babylonjs.com/divingDeeper/cameras/camera_introduction\n */\n readonly lowerAlphaLimitDeg?: number;\n\n /**\n * The rightmost point, horizontally, that the camera can rotate to.\n * https://doc.babylonjs.com/divingDeeper/cameras/camera_introduction\n */\n readonly upperAlphaLimitDeg?: number;\n\n /**\n * When set the product while rotate slowly\n */\n readonly autoRotation?: boolean;\n /**\n * Time in milliseconds before the product starts rotating after a user input has taken control.\n */\n readonly idleTimeBeforeRotation?: number;\n /**\n * When set the 3D preview won't attempt to orient the product automatically to its front view at load.\n */\n readonly disableAutomaticOrientation?: boolean;\n /**\n * When true the action bar won't be displayed to the user.\n */\n readonly disableActionBar?: boolean;\n /**\n * When set, mousing over the model in this preview will highlight the associated mesh/material.\n * When layout contexts are provided, only the materials with matching names will highlight.\n */\n readonly highlightOnMaterialHover?: boolean;\n /**\n * Sets the color of highlights when enabled. Expects hexadecimal value.\n */\n readonly highlightColor?: string;\n /**\n * When true, the user will not be able to pan the camera.\n */\n readonly noPan?: boolean;\n};\n\n/**\n * Defines the different behaviors supported by the camera system\n * for control when viewing a product.\n */\nexport enum ProductCameraRig {\n Orbit,\n Pan,\n}\n\n/**\n * Identical to CameraAnimation typing, however the\n * target is always available and hence is not optional.\n */\nexport type CameraPose = {\n readonly lonDeg: number;\n readonly radius: number;\n readonly latDeg: number;\n readonly target: {\n readonly x: number;\n readonly y: number;\n readonly z: number;\n };\n};\n\nexport type LoadProgressEventData = {\n /**\n * The total load value of the scene, this is an average of all\n * 'in progress' loading events. when all events are fully loaded this value will be 100.\n */\n readonly loadValue: number;\n /**\n * This value is true when the base model and scene have been initialized.\n */\n readonly sceneInitialized: boolean;\n};\n\nexport interface Design {\n id?: string;\n sku?: string;\n transaction?: Transaction;\n processExecution?: {\n id?: string;\n };\n}\n\n/**\n * Defines the locations at which a conversion attempt can take place.\n */\nexport enum ConversionLocation {\n /**\n * The client should expose a flow for allowing the user to optionally input details at any point.\n */\n Manual = \"Manual\",\n /**\n * The client should show the conversion flow at the beginning of a workflow.\n */\n OnStart = \"OnStart\",\n /**\n * The client should allow the user to input details just before quitting the experience.\n */\n OnQuit = \"OnQuit\",\n /**\n * The client should ask the user for details prior to adding to cart.\n */\n OnEnd = \"OnEnd\",\n}\n\n/**\n * The data configured to be requested.\n */\nexport enum ConversionDataType {\n Email = \"Email\",\n FirstName = \"FirstName\",\n LastName = \"LastName\",\n Phone = \"Phone\",\n}\n\nexport interface ConversionData {\n type: ConversionDataType;\n mandatory: boolean;\n}\n\n/**\n * The configuration for conversion, exposed on products currently.\n */\nexport interface ConversionConfiguration {\n id: string;\n name?: string;\n locations: ConversionLocation[];\n requestedData: ConversionDataType[];\n requestedDataItems: ConversionData[];\n mandatory?: boolean;\n}\n\n/**\n * Someone who has used a workflow experience and entered their contact details.\n */\nexport interface Customer {\n id?: string;\n emailAddress: string;\n firstName?: string;\n lastName?: string;\n phoneNumber?: string;\n loginToken?: string;\n partner?: Partner;\n stakeholders?: Stakeholder[];\n bundleStakeholders?: BundleStakeholder[];\n hasBundleTemplates?: boolean;\n}\n\nexport interface CustomerDetailsInput {\n emailAddress: string;\n firstName?: string;\n lastName?: string;\n phoneNumber?: string;\n}\n\nexport enum StakeholderType {\n Owner = \"Owner\",\n Approver = \"Approver\",\n Editor = \"Editor\",\n Viewer = \"Viewer\",\n}\n\nexport interface Stakeholder {\n id: string;\n type?: StakeholderType;\n authorizationDate?: string;\n authorizationNote?: string;\n authorizationStatus?: string;\n transaction?: Transaction;\n customer?: Customer;\n}\n\n/**\n * A wrapper for a list of bundles returned from the server.\n */\nexport interface BundlesFeed {\n /** The items. The size of this array will typically be limited by the request. */\n items: Bundle[];\n /** The total number of items available on the server that matched the initial request. */\n total: number;\n}\n\nexport enum BundleTemplateStatus {\n Draft = \"Draft\",\n Active = \"Active\",\n}\n\nexport interface Bundle {\n id?: string;\n bundleOwnerId?: string;\n completed?: boolean;\n currentBundleStakeholder?: BundleStakeholder;\n bundleStakeholders?: BundleStakeholder[];\n bundleStateData?: string;\n metadata?: { key: string; value: string }[];\n name?: string;\n partner?: Partner;\n productCollection?: ProductCollectionResource;\n transactions?: Transaction[];\n template?: boolean;\n templateStatus?: BundleTemplateStatus;\n bundleShareActions?: ShareAction[];\n workflowViewerLink: string;\n workflowViewerAmendLink: string;\n workflowViewerReadOnlyLink: string;\n}\n\nexport interface BundleStakeholder {\n id: string;\n bundle?: Bundle;\n customer?: Customer;\n type?: StakeholderType;\n authorizationDate?: string;\n authorizationNote?: string;\n authorizationStatus?: string;\n}\n\nexport interface BundleStakeholderInput {\n type: StakeholderType;\n customerDetails: CustomerDetailsInput;\n}\n\nexport type ProductCollectionResource = {\n id: string;\n globalPropertyConfiguration?: GlobalPropertyConfiguration;\n productCollectionProducts?: ProductCollectionProductResource[];\n name: string;\n description?: string;\n image?: Asset;\n transformCollection?: TransformCollection;\n};\n\nexport type ProductCollectionProductResource = {\n id: string;\n productCollection?: ProductCollectionResource;\n productCollectionId?: string;\n product: Product;\n productId: string;\n workflowId?: string;\n};\n\nexport type GlobalPropertyState = {\n id: string;\n aspects: GlobalPropertyStateAspect[];\n};\n\nexport type GlobalPropertyStateAspect = {\n name: string;\n value: string;\n type?: AspectType;\n storage?: GlobalPropertyStateAspectStorage;\n};\n\nexport type GlobalPropertyStateAspectStorage =\n | GlobalPropertyStateFileUploadStorage\n | GlobalPropertyStateColorOptionStorage;\n\nexport type GlobalPropertyStateFileUploadStorage = {\n originalAssetKey?: string;\n backgroundRemovedAssetKey?: string;\n useOriginalAsset?: boolean;\n};\n\nexport type GlobalPropertyStateColorOptionStorage = {\n customColor?: string;\n};\n\nexport interface BundleStateData {\n transactions: BundleStateTransaction[];\n}\n\nexport interface BundleStateTransaction {\n transactionId: string;\n /** @deprecated */ transform?: BundleStateTransform;\n activeTransform?: string;\n transforms?: { [key: string]: BundleStateTransform };\n}\n\nexport interface BundleStateTransform {\n position: Vector3;\n rotation: Vector3;\n scale: Vector3;\n}\n\nexport interface Vector3 {\n x: number;\n y: number;\n z: number;\n}\n\nexport interface TransformCollection {\n id: string;\n name: string;\n transforms: TransformCollectionTransform[];\n}\n\nexport interface TransformCollectionTransform {\n id: string;\n name: string;\n position: Vector3;\n rotation: Vector3;\n scale: Vector3;\n}\n\n// Allows a type to be extended with other arbitrary fields, while still requiring the base fields.\nexport type Extendable<T> = T & { [key: string]: any };\n\nexport interface Metafield {\n id: string;\n createdAt: string;\n updatedAt: string;\n entityId: string;\n value: string;\n metafieldConfiguration: MetafieldConfiguration;\n}\n\nexport interface MetafieldConfiguration {\n id: string;\n createdAt: string;\n updatedAt: string;\n entityType: string;\n metafieldType: string;\n name: string;\n}\n\nexport enum TextAlgorithm {\n /**\n * An algorithm that finds the best size for text based\n * on a range minSize <-> maxSize\n * NOTE: Default, this is how we've calculated historically.\n */\n Autosize = \"Autosize\",\n /**\n * An algorithm that follows behavior of other popular\n * text editing applications.\n */\n Traditional = \"Traditional\",\n}\n\nexport interface FrameElement extends LayoutElement {\n // The source path for the frame. Equivalent to the d attribute of an SVG path element.\n path: string;\n\n /**\n * Assigns the 'data-frame-width' attribute to the frame element. The rasterizer we use has issues with images inside\n * patterns. This is a workaround to ensure that the pattern is correctly sized.\n */\n dataWidth?: number;\n /**\n * Assigns the 'data-frame-height' attribute to the frame element. The rasterizer we use has issues with images inside\n * patterns. This is a workaround to ensure that the pattern is correctly sized.\n */\n dataHeight?: number;\n\n // Disables the placeholder image for this frame. Instead the frame will\n // be blank before any image is UploadRounded.\n disablePlaceholder?: boolean;\n\n // FIXME: Scale was removed from all other elements however persists on frames\n // to ensure backwards compat with existing functionality. We should remove this when we can.\n scaleX: number;\n scaleY: number;\n\n // The opacity of the frame\n opacity?: number;\n // The pattern for this frame. Roughly translates to a pattern tag in SVG.\n pattern?: Pattern;\n // Properties used to control focal blur in frames.\n focalBlur?: boolean;\n focalBlurStrength?: number;\n focalBlurRadius?: number;\n forceImageCover?: boolean;\n\n // Whether to enable a black and white threshold.\n useThreshold?: boolean;\n // If using threshold, whether to invert black and white.\n invertThreshold?: boolean;\n // An integer from 0 to 256.\n threshold?: number;\n // A number from 0 to 1.\n thresholdSaturation?: number;\n}\n\n/**\n * A pattern object stores data relevant for displaying an image within a frame, including\n * the source for the image itself and also dimensions and offsets.\n */\ninterface Pattern extends Omit<LayoutElement, \"type\"> {\n /**\n * The image to use when a file is generated, this should be an original high resolution source file.\n */\n src: string;\n\n /**\n * Scaling X of image within frame.\n */\n scaleX: number;\n\n /**\n * Scaling Y of image within frame.\n */\n scaleY: number;\n\n /**\n * The SVG document that the src represents. This must be the actual content string of the document, rather than a URL.\n */\n svg?: string;\n\n /**\n * A map of ID to color code, used to store color selections in the SVG. Only applicable when `svg` is provided.\n */\n colors?: { [key: string]: ColorDefinition };\n}\n\nexport interface GroupElement extends LayoutElement {\n /**\n * A clip path applied to the group\n */\n clipPath?: string;\n /**\n * Elements renderable inside this group.\n */\n children: LayoutElement[];\n}\n\nexport interface IllustrationElement extends LayoutElement {\n /**\n * When provided a src will be used to rehyrdrate the svg field. On serialization\n * the svg field will be dropped and only src will remain.\n */\n src?: string;\n /**\n * The string representation of the SVG element. A valid SVG document.\n */\n svg?: string;\n /**\n * A cached image representation of this SVG, to be used for faster\n * rendering in performance critical code.\n */\n cachedObjectURL?: string;\n /**\n * A map of ID to color code, used to store color selections in the SVG.\n */\n colors: { [key: string]: ColorDefinition };\n}\n\n/**\n * Represents a raster image on the Papyrus canvas.\n */\nexport interface ImageElement extends LayoutElement {\n /**\n * A src for the image. This will be used in place of the data URL in server environments and should\n * be original image quality.\n */\n src: string;\n /**\n * https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio\n */\n preserveAspectRatio?: string;\n}\n\nexport interface TextboxElement extends LayoutElement {\n /**\n * Horizontal alignment of text. eg. left, center, right.\n */\n align?: string;\n /**\n * An image to use as the fill instead of a color.\n */\n textFillImage?: TextFillImage;\n /**\n * Fill color of this text. Any value that can be parsed by css fill should work here.\n */\n fill: string;\n /**\n * The font size.\n */\n fontSize: number;\n /**\n * Information about the font family used to render this text.\n */\n fontData: FontData | undefined;\n /**\n * Text computed for this textbox.\n */\n text?: string;\n /**\n * Per element user input. Not used by the layout engine. Instead\n * used to store user input for textbox to preserve newlines.\n */\n input?: string;\n /**\n * Should the text layout top to bottom.\n */\n vertical?: boolean;\n /**\n * The height between text lines.\n */\n lineHeight?: number;\n /**\n * The alignment of text vertically, top center or bottom.\n */\n verticalAlign: string;\n /**\n * When true the text will be rendered using the provided curve.\n */\n curved?: boolean;\n /**\n * The curve to use when curved = true. Ignored otherwise.\n */\n paths?: string[]; // TODO: remove array and change to path from paths.\n /**\n * The algorithm to use when laying out text.\n */\n algorithm?: TextAlgorithm;\n\n fillSpotColorDefinition?: SpotColorDefinition;\n}\n\nexport interface FontData {\n assetUrl: string;\n name: string;\n}\n\n/**\n * A container for data related to a specific spotcolor. toString\n * can be used to output a string expected by Filegen inside a stroke or fill.\n */\nexport interface SpotColorDefinition {\n /**\n * The name of the profile being used.\n */\n profileName: string;\n\n /**\n * The named color expected by the profile.\n */\n namedColor: string;\n}\n\n/**\n * Contains configuration for font sizing.\n *\n * When min/maxSize values are set we interpret the textbox as being\n * in \"Variable Mode\" which essentially\n * auto sizes the text based on a given region.\n *\n * When only size is set, we interpret the textbox as being in \"Fixed Mode\" where\n * text is computed at a fixed font size.\n */\nexport interface SizeRange {\n /**\n * Variable Mode: A maximum size\n */\n maxSize?: number;\n\n /**\n * Variable Mode: Minimum Size\n */\n minSize?: number;\n\n /**\n * Fixed Mode: A Fixed font size to be used at all times.\n */\n size: number;\n}\n\nexport interface CanvasRegion {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\nexport interface ColorDefinition {\n /**\n * Represents the color value in hex or any other\n * browser supported format. This will be used when rendering the canvas\n * in an environment that doesn't support spot color.\n */\n browserValue: string;\n\n /**\n * A spot color definition. This is optional and will\n * be applied to the SVG returned by toString when configured allowing\n * filegen to output spot colors.\n */\n spotColor?: SpotColorDefinition;\n\n /**\n * Represents the color value in the PMS colorspace.\n */\n pmsValue?: string;\n}\n\n/**\n * A container for data related to a specific spotcolor. toString\n * can be used to output a string expected by Filegen inside a stroke or fill.\n */\nexport interface SpotColorDefinition {\n /**\n * The name of the profile being used.\n */\n profileName: string;\n\n /**\n * The named color expected by the profile.\n */\n namedColor: string;\n}\n\nexport interface TextFillSpotColor {\n profileName: string;\n namedColor: string;\n}\n\nexport interface PatternImageData {\n /**\n * The original src of the image.\n */\n src: string;\n\n /**\n * The natural width of the image.\n */\n width: number;\n\n /**\n * The natural height of the image.\n */\n height: number;\n\n /**\n * Cached result of the calculation width/height.\n */\n aspect: number;\n\n /**\n * The SVG document that the src represents. This must be the actual content string of the document, rather than a URL.\n */\n svg?: string;\n\n /**\n * A map of ID to color code, used to store color selections in the SVG. Only applicable when `svg` is provided.\n */\n colors?: { [key: string]: ColorDefinition };\n}\n\n/**\n * Defines the direction of scaling, can be used\n * to determine the anchor point of a scale calculation.\n */\nexport enum ScaleAxis {\n North,\n Northeast,\n East,\n Southeast,\n South,\n Southwest,\n West,\n Northwest,\n}\n\n/**\n * A point in a 2D coordinate space.\n */\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport interface Workflow {\n defaultPreviewPanelIndex?: number;\n deletedAt?: Date;\n id: string;\n previewAssetKey?: string;\n previewImageUrl?: string;\n name: string;\n introduction: string;\n panels: WorkflowPanel[];\n showModelOnFinishStep: boolean;\n showPricing?: boolean;\n baseCurrency?: string;\n showPlusInVariantPrices?: boolean;\n allowProofDownload: boolean;\n steps: Step<AnyStepData>[];\n stepGroups: StepGroup[];\n theme?: {\n primaryColour: string;\n textColour: string;\n };\n globalPreviewConfig?: PreviewConfiguration;\n finalizeStepConfig?: FinalizeStepConfig;\n partnerId?: string;\n toggleBulkSourceView?: boolean;\n overrideTheme?: Theme;\n globalPropertyConfiguration?: GlobalPropertyConfiguration;\n}\n\nexport interface WorkflowPanel {\n height: number;\n width: number;\n name: string;\n index: number;\n transparentBackground?: boolean;\n previewRegion?: PreviewRegion;\n useEditableArea?: boolean;\n editableArea?: {\n x: number;\n y: number;\n height: number;\n width: number;\n };\n}\n\nexport interface StepGroup {\n id?: string;\n name: string;\n stepNames: string[];\n}\n\n\nexport interface FinalizeStepConfig {\n termsMarkdown?: string;\n modelAnimation?: ModelAnimation;\n lookAtAnimation?: CameraAnimation;\n previewRegion?: { left: number; top: number; width: number; height: number };\n}\n\nexport interface PreviewRegion {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\nexport interface ModelAnimation {\n /**\n * A value it seconds along the animation timeline to begin at.\n */\n from?: number;\n /**\n * A value in seconds along the animation timeline to end at.\n */\n to?: number;\n /**\n * When true the animation will loop. The only behaviour currently is to reset\n * back to from but we could have it bounce back and forth and/or follow a curve.\n */\n loop?: boolean;\n /**\n * The name of the animation to play.\n */\n name?: string;\n}\n\n/**\n * A CameraAnimation specifies a discrete state that the camera should\n * animate to. This state represents the final position of the camera after animations have run.\n */\nexport interface CameraAnimation {\n /**\n * The longitutude in degrees the camera should animate to.\n */\n lonDeg: number;\n /**\n * The lattitude in degrees the camera should animnate to.\n */\n latDeg: number;\n /**\n * An optional target for the camera to focus on in the scene.\n */\n target?: { x: number; y: number; z: number };\n /**\n * A value in scene units specifying camera distance from the target.\n */\n radius?: number;\n}\n\n/**\n * Settings related to the 3D preview for use at either a global level or at per step level. The global\n * values can be a default if per step values aren't specified.\n */\nexport interface PreviewConfiguration {\n /**\n * @deprecated Removed in favor of backgroundColor as a simple hexadecimal color value.\n */\n clearColor?: [number, number, number];\n /**\n * The color expected to be seen in the background of the product\n */\n backgroundColor?: string;\n /**\n * The closest zoom the camera can achieve to the product.\n */\n maxZoomOverride?: number;\n /**\n * The furthest zoom the camera can achieve to the product.\n */\n minZoomOverride?: number;\n /**\n * The environment file used to calculate product lighting.\n */\n environmentFile?: string;\n\n /**\n * The lowest point, vertically, that the camera can rotate to.\n * https://doc.babylonjs.com/divingDeeper/cameras/camera_introduction\n */\n lowerBetaLimitDeg?: number;\n\n /**\n * The highest point, vertically, that the camera can rotate to.\n * https://doc.babylonjs.com/divingDeeper/cameras/camera_introduction\n */\n upperBetaLimitDeg?: number;\n\n /**\n * The leftmost point, horizontally, that the camera can rotate to.\n * https://doc.babylonjs.com/divingDeeper/cameras/camera_introduction\n */\n lowerAlphaLimitDeg?: number;\n\n /**\n * The rightmost point, horizontally, that the camera can rotate to.\n * https://doc.babylonjs.com/divingDeeper/cameras/camera_introduction\n */\n upperAlphaLimitDeg?: number;\n\n /**\n * When set the product while rotate slowly\n */\n autoRotation?: boolean;\n /**\n * Time in milliseconds before the product starts rotating after a user input has taken control.\n */\n idleTimeBeforeRotation?: number;\n /**\n * When set the 3D preview won't attempt to orient the product automatically to its front view at load.\n */\n disableAutomaticOrientation?: boolean;\n /**\n * When true the action bar won't be displayed to the user.\n */\n disableActionBar?: boolean;\n\n /**\n * When true the AR button will be displayed to the user.\n */\n enableAR?: boolean;\n}\n\nexport enum UnitOfMeasurement {\n Pixel = \"px\",\n Millimeter = \"mm\",\n Centimeter = \"cm\",\n}\n\nexport type PapyrusComponent<T = any> = FunctionComponent<T>;\n\nexport type PapyrusNode = ReactNode;\n","import { AnyStepData, Asset, Region, Step, VariantResource } from \"../types\";\n\n/**\n * A generic base class for custom errors that assigns the name\n * of the error class automatically. All custom errors should extend this.\n */\nabstract class CustomError extends Error {\n constructor(message) {\n super(message);\n this.name = this.constructor.name;\n }\n}\n\n/**\n * A custom class for categorising errors related to workflow configuration.\n */\nabstract class ConfigurationError extends CustomError {\n constructor(message) {\n super(`ConfigurationError - ${message}`);\n }\n}\n\n/**\n * Thrown when an option was expected but not found in the workflow configuration or\n * the server returned a 404 for an option we expected.\n */\nclass OptionNotFoundError extends ConfigurationError {\n readonly optionId: string;\n constructor(step: Step<AnyStepData>) {\n super(`Option not Configured: ${step.stepTitle}`);\n this.optionId = step?.optionId || \"N/A\";\n }\n}\n\n/**\n * Thrown when a layout is not found for a given region entity. This\n * can occur when panels are deleted from a workflow but steps are still relying\n * on the layout being present.\n */\nclass LayoutNotFoundError extends ConfigurationError {\n readonly panelId: string;\n constructor(region: Region) {\n super(`Panel not Found: ${region.panelId}`);\n this.panelId = region?.panelId || \"N/A\";\n }\n}\n\n/**\n * Thrown when an asset is not found on a specific variant. This can occur when\n * the asset wasn't configured in hub and the variant is loaded in a workflow.\n */\nclass AssetNotFoundError extends ConfigurationError {\n readonly variant: VariantResource;\n constructor(variant: VariantResource) {\n super(`Asset not found for variant: ${variant.name}`);\n this.variant = variant;\n }\n}\n\n/**\n * Thrown when a resource is not found linked to a specific asset. This\n * can occur when generation of a resource fails or hasn't completed. Or may be\n * a sign of a misconfiguration.\n */\nclass ResourceNotFoundError extends ConfigurationError {\n readonly asset: Asset;\n constructor(asset: Asset) {\n super(`Resource not found for asset: ${asset.name}`);\n this.asset = asset;\n }\n}\n\n/**\n * Thrown when configuration is missing when it was expected. More generic\n * to cover remaining cases outside of the more specific ones such as options, variants & assets.\n */\nclass MisconfigurationError extends ConfigurationError {\n readonly step: Step<AnyStepData>;\n constructor(step: Step<AnyStepData>, message: string) {\n super(`Workflow Misconfiguration: ${step.stepName} - ${message}`);\n this.step = step;\n }\n}\n\n/**\n * A custom class for categorising errors related to implementation of core.\n */\nabstract class ImplementationError extends CustomError {\n constructor(message) {\n super(`ImplementationError - ${message}`);\n }\n}\n\n/**\n * Thrown when we hit a case that we didn't expect to happen\n */\nclass UnhandledBehaviorError extends ImplementationError {\n constructor(message: string) {\n super(`Unhandled Behavior Encountered: ${message}`);\n }\n}\n\n/**\n * Thrown when we fail to parse something that we expected to be valid\n */\nclass ParseError extends ImplementationError {\n constructor(message: string) {\n super(`Parsing Error: ${message}`);\n }\n}\n\n/**\n * Thrown when we use the client in a way that is not supported by the platform.\n */\nclass ClientError extends ImplementationError {\n constructor(message: string) {\n super(`Client Error: ${message}`);\n }\n}\n\n/**\n * Thrown when we fail to generate a resource on the client. Generally this is\n * due to poor handling of device or browser specific requirements like memory limits.\n */\nclass ResourceGenerationError extends ImplementationError {\n constructor(message: string) {\n super(`Resource Generation Failed: ${message}`);\n }\n}\n\n// Config errors\nexport { OptionNotFoundError, LayoutNotFoundError, AssetNotFoundError, ResourceNotFoundError, MisconfigurationError };\n\n// Implementation errors\nexport { UnhandledBehaviorError, ClientError, ResourceGenerationError, ParseError };\n","interface StorageService {\n /**\n * Get a value.\n * @param key The key to lookup the value with.\n */\n get(key: string): string | undefined;\n /**\n * Set a value.\n * @param key The key to set.\n * @param val The new value.\n */\n set(key: string, val: string): void;\n /**\n * Remove a value.\n * @param key The key to remove, does nothing if the key doesn't exist.\n */\n remove(key: string): void;\n /**\n * Get a map from persistence.\n * @param key The key to search by.\n */\n getMap<K = any, V = any>(key: string): Map<K, V> | undefined;\n /**\n * St a map into persistence.\n * @param key The key to set the map at.\n * @param val The map to set.\n */\n setMap<K = any, V = any>(key: string, val: Map<K, V>): void;\n}\n\n/**\n * Storage built upon browser localStorage capability.\n */\nclass LocalStorageService implements StorageService {\n get(key: string): string | undefined {\n return localStorage.getItem(key) || undefined;\n }\n set(key: string, val: string): void {\n localStorage.setItem(key, val);\n }\n remove(key: string): void {\n localStorage.removeItem(key);\n }\n getMap(key: string): Map<any, any> | undefined {\n const serialisedMap = this.get(key);\n if (!serialisedMap) {\n return;\n }\n return new Map(JSON.parse(serialisedMap));\n }\n setMap(key: string, val: Map<any, any>): void {\n const mapSerialised = JSON.stringify([...val.entries()]);\n this.set(key, mapSerialised);\n }\n}\n\n/**\n * An in-memory fallback storage when we encounter environments that don't support localStorage.\n */\nclass InMemoryStorageService implements StorageService {\n private storage: Map<string, string> = new Map();\n get(key: string): string | undefined {\n return this.storage.get(key) || undefined;\n }\n set(key: string, val: string): void {\n this.storage.set(key, val);\n }\n remove(key: string): void {\n this.storage.delete(key);\n }\n getMap(key: string): Map<any, any> | undefined {\n const serialisedMap = this.get(key);\n if (!serialisedMap) {\n return;\n }\n return new Map(JSON.parse(serialisedMap));\n }\n setMap(key: string, val: Map<any, any>): void {\n const mapSerialised = JSON.stringify([...val.entries()]);\n this.set(key, mapSerialised);\n }\n}\n\nconst buildPersistentStorage = (): StorageService => {\n try {\n if (localStorage) {\n return new LocalStorageService();\n }\n return new InMemoryStorageService();\n } catch {\n console.warn(\"Local storage was unavilable due to browser security settings. Using in-memory storage instead.\");\n return new InMemoryStorageService();\n }\n};\n\nexport const persistenceService = buildPersistentStorage();\n","class Configuration {\n private readonly defaultServerUrl = \"https://api.au.spiffcommerce.com\";\n private readonly defaultServicesApiUrl = \"https://services.au.spiffcommerce.com\";\n private readonly defaultHubUrl = \"https://hub.au.spiffcommerce.com\";\n\n private serverUrl: string;\n private servicesApiUrl: string;\n private hubUrl: string;\n\n private serverUrlCallbacks: (() => void)[];\n\n constructor() {\n this.serverUrl = this.defaultServerUrl;\n this.servicesApiUrl = this.defaultServicesApiUrl;\n this.hubUrl = this.defaultHubUrl;\n this.serverUrlCallbacks = [];\n }\n\n getServerUrl() {\n return this.serverUrl;\n }\n\n getServicesApiUrl() {\n return this.servicesApiUrl;\n }\n\n getHubUrl() {\n return this.hubUrl;\n }\n\n setServerUrl(serverUrl: string) {\n this.serverUrl = serverUrl;\n this.serverUrlCallbacks.forEach((callback) => callback());\n }\n\n setServicesApiUrl(servicesApiUrl: string) {\n this.servicesApiUrl = servicesApiUrl;\n }\n\n setHubUrl(hubUrl: string) {\n this.hubUrl = hubUrl;\n }\n\n addServerUrlCallback(callback: () => void) {\n this.serverUrlCallbacks.push(callback);\n }\n}\n\nexport const spiffCoreConfiguration = new Configuration();\n","import { Font } from \"opentype.js\";\nimport { renderToStaticMarkup } from \"preact-render-to-string\";\nimport { PapyrusNode } from \"../types\";\n\nlet domImpl: any = undefined;\nlet fetchImpl: ((input: RequestInfo | URL, init?: RequestInit) => Promise<Response>) | undefined = undefined;\n\n/**\n * We use this to register a window in environments where one wouldn't be available.\n */\nexport function registerWindowImplementation(impl: any) {\n domImpl = impl;\n}\n\nexport function registerFetchImplementation(impl: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>) {\n fetchImpl = impl;\n}\n\nfunction constructWindow(): any {\n if (!domImpl) {\n throw new Error(\"DOM constructor is not registered. Please register it before calling this function.\");\n }\n return new domImpl();\n}\n\nexport function fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n if (!fetchImpl) {\n if (typeof window !== \"undefined\" && window.fetch) {\n return window.fetch(input, init);\n }\n if (typeof global !== \"undefined\" && global.fetch) {\n return global.fetch(input, init);\n }\n throw new Error(\"Fetch implementation is not registered. Please register it before calling this function.\");\n }\n return fetchImpl(input, init);\n}\n\nconst arrayBufferMimeTypeCache: Map<string, string> = new Map();\nconst arrayBufferFileCache: Map<string, Promise<ArrayBuffer>> = new Map();\nconst textFileCache: Map<string, Promise<string>> = new Map();\n\nconst getFromArrayBufferCache = async (url: string): Promise<ArrayBuffer> => {\n const cachedPromise = arrayBufferFileCache.get(url);\n if (cachedPromise) return cachedPromise;\n const getData = async () => {\n const resp = await fetch(url);\n arrayBufferMimeTypeCache.set(url, resp.headers?.get(\"content-type\") || \"\");\n return await resp.arrayBuffer();\n };\n const ab = getData();\n arrayBufferFileCache.set(url, ab);\n return ab;\n};\n\nconst getFromTextCache = async (url: string): Promise<string> => {\n const cachedPromise = textFileCache.get(url);\n if (cachedPromise) return cachedPromise;\n const getData = async () => {\n const resp = await fetch(url);\n return await resp.text();\n };\n const ab = getData();\n textFileCache.set(url, ab);\n return ab;\n};\n\n// Whether each capability in the list is present.\n// The Web API has all sorts of stuff that aren't present on the server.\nconst hasCapabilities = (capabilities: string[]): boolean => {\n return capabilities.every((cap) => cap !== \"undefined\");\n};\n\nexport const createElement = (tag: string): HTMLElement => {\n if (hasCapabilities([typeof document])) {\n return document.createElement(tag);\n }\n const doc = constructWindow().window.document;\n return doc.createElement(tag);\n};\n\nexport const createElementNS = (namespace: string, tag: string) => {\n if (hasCapabilities([typeof document])) {\n return document.createElementNS(namespace, tag);\n }\n const doc = constructWindow().window.document;\n const elem = doc.createElement(tag);\n elem.setAttribute(\"xmlns\", namespace);\n return elem;\n};\n\nexport const domParser = () => {\n if (hasCapabilities([typeof DOMParser])) {\n return new DOMParser();\n }\n const dom = constructWindow();\n return new dom.window.DOMParser();\n};\n\nexport const fetchAsArrayBuffer = (externalUrl: string, allowCache?: boolean): Promise<ArrayBuffer> => {\n return new Promise((resolve, reject) => {\n if (!allowCache) {\n fetch(externalUrl)\n .then((response) => {\n response.arrayBuffer().then(resolve).catch(reject);\n })\n .catch((err) => {\n reject(err);\n });\n } else {\n getFromArrayBufferCache(externalUrl).then(resolve).catch(reject);\n }\n });\n};\n\nexport const fetchAsString = (externalUrl: string, allowCache?: boolean): Promise<string> => {\n return new Promise((resolve, reject) => {\n if (!allowCache) {\n fetch(externalUrl)\n .then((response) => {\n response.text().then(resolve).catch(reject);\n })\n .catch(reject);\n } else {\n getFromTextCache(externalUrl).then(resolve).catch(reject);\n }\n });\n};\n\nexport const renderPapyrusComponentAsString = (component: PapyrusNode) => {\n return renderToStaticMarkup(component as any);\n};\n\n/**\n * Cache for fontfaces to prevent multiple loads of the same font.\n * This is required since the browser will still attempt to load it again every time, even if it would hit the cache.\n * Spawning off many requests for items that would hit cache still takes time, and can actually get blocked by the browser.\n */\nconst fontFaceCache: Map<string, Promise<FontFace>> = new Map();\n\n/**\n * Loads a given font as a font face set in the browser. This function has\n * no effect in a server environment, in the browser it gives the browser access to a font face for\n * use in font rendering.\n * If the font has already been loaded, this function will return the existing promise.\n * @param font An opentype font object.\n * @param externalUrl An external URL that can be used to access the original font file.\n * @returns A promise resolved when the font has been loaded. Rejected if an error occured.\n */\nexport const loadFontFaceSet = async (font: Font, externalUrl: string): Promise<FontFace | undefined> => {\n if (hasCapabilities([typeof FontFace])) {\n if (fontFaceCache.has(externalUrl)) {\n return fontFaceCache.get(externalUrl);\n }\n const familyName = font.names.fullName[\"en\"];\n const fontFace = new FontFace(familyName, `url(${externalUrl})`);\n (document.fonts as any).add(fontFace);\n const promise = fontFace.load();\n fontFaceCache.set(externalUrl, promise);\n return promise;\n }\n return undefined;\n};\n\nexport const xmlSerializer = (): XMLSerializer => {\n if (hasCapabilities([typeof XMLSerializer])) {\n return new XMLSerializer();\n }\n const dom = constructWindow();\n return new dom.window.XMLSerializer() as XMLSerializer;\n};\n\nexport const toBase64 = (input: string): string => {\n return btoa(input);\n};\n\n// The file-type library guesses an array buffer's mime type using magic numbers.\n// It therefore only works on binary formats, not text formats like SVG.\n// SVG is currently the only text case that this function must handle.\n// If that ever changes then this function will have to become smarter.\nexport const getMimeTypeOfArrayBuffer = (arrayBuffer: ArrayBuffer): string => {\n function getMimeTypeFromArrayBuffer() {\n const uint8arr = new Uint8Array(arrayBuffer);\n const len = 4;\n if (uint8arr.length >= len) {\n const signatureArr = new Array(len);\n for (let i = 0; i < len; i++) signatureArr[i] = new Uint8Array(arrayBuffer)[i].toString(16);\n const signature = signatureArr.join(\"\").toUpperCase();\n\n switch (signature) {\n case \"89504E47\":\n return \"image/png\";\n case \"47494638\":\n return \"image/gif\";\n case \"25504446\":\n return \"application/pdf\";\n case \"504B0304\":\n return \"application/zip\";\n }\n\n // Some magic numbers are shorter.\n const sig = signature.slice(0, 4);\n switch (sig) {\n case \"FFD8\":\n return \"image/jpeg\";\n }\n }\n return null;\n }\n const mimeTypeData = getMimeTypeFromArrayBuffer();\n if (!mimeTypeData) {\n return \"image/svg+xml\";\n }\n return mimeTypeData;\n};\n\nexport const dataUrlFromExternalUrl = async (url: string): Promise<string> => {\n const blob = await getFromArrayBufferCache(url);\n const type = arrayBufferMimeTypeCache.get(url) || getMimeTypeOfArrayBuffer(blob);\n return await webBlobToDataUrl(new Blob([blob], { type }));\n};\n\nconst uint8ArrayToString = (array: Uint8Array): string => {\n let binary = \"\";\n const len = array.byteLength;\n for (let i = 0; i < len; i++) {\n binary += String.fromCharCode(array[i]);\n }\n return binary;\n};\n\nexport const arrayBufferToDataUrl = async (arrayBuffer: ArrayBuffer): Promise<string> => {\n const mimeType = getMimeTypeOfArrayBuffer(arrayBuffer);\n\n const uint8Array = new Uint8Array(arrayBuffer);\n const binaryString = uint8ArrayToString(uint8Array);\n const b64 = btoa(binaryString);\n\n return `data:${mimeType};base64,${b64}`;\n};\n\nexport const svgToDataUrl = (svgString: string): string => {\n return `data:image/svg+xml;base64,${btoa(svgString)}`;\n};\n\nexport const dataUrlToArrayBuffer = (dataUrl: string): ArrayBuffer => {\n // strip newlines\n const uri = dataUrl.replace(/\\r?\\n/g, \"\");\n\n // split the URI up into the \"metadata\" and the \"data\" portions\n const firstComma = uri.indexOf(\",\");\n if (firstComma === -1 || firstComma <= 4) {\n throw new TypeError(\"malformed data: URI\");\n }\n\n // remove the \"data:\" scheme and parse the metadata\n const meta = uri.substring(5, firstComma).split(\";\");\n\n let base64 = false;\n for (let i = 1; i < meta.length; i++) {\n if (meta[i] === \"base64\") {\n base64 = true;\n }\n }\n // get the encoded data portion and decode URI-encoded chars\n const data = decodeURI(uri.substring(firstComma + 1));\n\n // convert the data to an array buffer.\n if (base64) {\n const buf = new Uint8Array(\n atob(data)\n .split(\"\")\n .map((c) => c.charCodeAt(0)),\n );\n return buf.buffer;\n } else {\n const buf = new Uint8Array(data.split(\"\").map((c) => c.charCodeAt(0)));\n return buf.buffer;\n }\n};\n\nconst webBlobToDataUrl = (blob: Blob): Promise<string> => {\n return new Promise((resolve, reject) => {\n const a = new FileReader();\n a.onload = function (e: any) {\n const target = e.target;\n if (!target || !target.result) {\n reject();\n } else {\n resolve(target.result.toString());\n }\n };\n a.readAsDataURL(blob);\n });\n};\n","import { ApolloClient, createHttpLink, from, InMemoryCache } from \"@apollo/client/core\";\nimport { setContext } from \"@apollo/client/link/context\";\nimport { onError } from \"@apollo/client/link/error\";\nimport { spiffCoreConfiguration } from \"../Configuration\";\nimport { fetch } from \"../util/crossplatform\";\nimport { removeTypenameFromVariables } from \"@apollo/client/link/remove-typename\";\n\n/**\n * The different types of authentication for server calls.\n */\ninterface AuthenticationObject {\n activeIntegration?: string;\n applicationKey?: string;\n bearer?: string;\n customerToken?: string;\n partnerId?: string;\n}\n\nlet localCustomerToken: string | undefined = undefined;\nexport const setLocalCustomerToken = (customerToken: string) => {\n localCustomerToken = customerToken;\n};\n\nlet applicationKey: string | undefined = undefined;\nexport const setApplicationKey = (key: string) => {\n applicationKey = key;\n};\n\nexport const getApplicationKey = () => {\n return applicationKey;\n};\n\nlet bearerAuthenticationToken: string | undefined = undefined;\nexport const setBearerAuthenticationToken = (token: string) => {\n bearerAuthenticationToken = token;\n};\n\n/**\n * Request authentication from the parent window.\n * @returns A promise resolving to an authentication object containing\n * the required credentials.\n */\nconst getHubAuthentication = (): Promise<AuthenticationObject> => {\n return new Promise((resolve) => {\n const hubUrl = spiffCoreConfiguration.getHubUrl();\n const onAuthenticationReceived = (event: MessageEvent<AuthenticationObject>) => {\n if (event.origin !== hubUrl) return;\n window.removeEventListener(\"message\", onAuthenticationReceived);\n resolve(event.data);\n };\n if (window.parent !== window) {\n window.addEventListener(\"message\", onAuthenticationReceived, false);\n window.parent.postMessage(\"ready\", hubUrl);\n }\n });\n};\n\n/**\n * Retrieve stored authentication values for server calls.\n */\nconst getServerAuth = async (): Promise<AuthenticationObject> => {\n const localAuthObj = {\n applicationKey: applicationKey,\n customerToken: localCustomerToken,\n bearer: bearerAuthenticationToken,\n };\n\n // When in an internal iframe, get authentication from the parent window.\n if (\n typeof window !== \"undefined\" &&\n (window.location.href.includes(\"/workflows/product/\") || window.location.href.includes(\"hub=true\"))\n ) {\n return { ...(await getHubAuthentication()), ...localAuthObj };\n } else {\n return localAuthObj;\n }\n};\n\nclass GraphQlManager {\n private shadowGraphqlClient: ApolloClient<any>;\n\n constructor() {\n this.shadowGraphqlClient = this.constructShadowGraphqlClient();\n spiffCoreConfiguration.addServerUrlCallback(() => {\n this.shadowGraphqlClient = this.constructShadowGraphqlClient();\n });\n }\n\n getShadowGraphqlClient() {\n return this.shadowGraphqlClient;\n }\n\n private constructShadowGraphqlClient() {\n const httpLink = createHttpLink({\n uri: `${spiffCoreConfiguration.getServerUrl()}/graphql`,\n fetch: fetch,\n });\n const authLink = setContext(async (_request, operationContext) => {\n const { headers } = operationContext;\n const newHeaders = headers || {};\n const auth = await getServerAuth();\n\n // Request context values take precedence over stored values.\n // These are passed on the query and mutate functions.\n const bearer = operationContext.bearer ?? auth.bearer;\n const partnerId = operationContext.partnerId ?? auth.partnerId;\n const activeIntegration = operationContext.activeIntegration ?? auth.activeIntegration;\n const transactionOwnerId = operationContext.transactionOwnerId;\n const customerToken = operationContext.customerToken ?? auth.customerToken;\n const applicationKey = operationContext.applicationKey ?? auth.applicationKey;\n const bundleOwnerId = operationContext.bundleOwnerId;\n\n /**\n * Sentry is an optional dependancy. If it's available, we check if there's an\n * active trace & attach any sentry related headers to the request.\n */\n try {\n if (window && window[\"__SENTRY__\"]) {\n const hub = window[\"__SENTRY__\"].hub;\n if (hub) {\n const traceHeaders = hub.traceHeaders();\n Object.entries(traceHeaders).forEach(([key, value]) => {\n newHeaders[key] = value;\n });\n }\n }\n } catch (e) {\n // Sentry is not available\n }\n\n if (bearer) {\n newHeaders[\"Authorization\"] = `Bearer ${bearer}`;\n }\n if (partnerId) {\n newHeaders[\"partnerId\"] = partnerId;\n }\n if (activeIntegration) {\n newHeaders[\"activeIntegration\"] = activeIntegration;\n }\n if (transactionOwnerId) {\n newHeaders[\"transactionOwnerId\"] = transactionOwnerId;\n }\n if (customerToken) {\n newHeaders[\"customerToken\"] = customerToken;\n }\n if (applicationKey) {\n newHeaders[\"X-Application-Key\"] = applicationKey;\n }\n if (bundleOwnerId) {\n newHeaders[\"bundleOwnerId\"] = bundleOwnerId;\n }\n\n return {\n headers: newHeaders,\n };\n });\n\n const errorLink = onError(({ operation, graphQLErrors, networkError }) => {\n const errors = graphQLErrors || [];\n if (networkError) console.log(\"GraphQL Network error\");\n errors.forEach(() => console.log(\"GraphQL Error: \" + operation.operationName));\n });\n\n const removeTypenameLink = removeTypenameFromVariables();\n\n return new ApolloClient({\n link: from([removeTypenameLink, errorLink, authLink, httpLink]),\n cache: new InMemoryCache(),\n name: \"Core\",\n });\n }\n}\n\nconst graphQlManager = new GraphQlManager();\nexport { graphQlManager };\n","interface CustomImage {\n height: number;\n naturalHeight: number;\n naturalWidth: number;\n src: string | ArrayBuffer;\n width: number;\n}\n\ninterface CustomContext {\n drawImage(image: CustomCanvas | CustomImage, dx: number, dy: number): void;\n drawImage(image: CustomCanvas | CustomImage, dx: number, dy: number, dw: number, dh: number): void;\n drawImage(\n image: CustomCanvas | CustomImage,\n sx: number,\n sy: number,\n sw: number,\n sh: number,\n dx: number,\n dy: number,\n dw: number,\n dh: number,\n ): void;\n rotate(angle: number): void;\n scale(x: number, y: number): void;\n translate(x: number, y: number): void;\n}\n\ninterface CustomCanvas {\n height: number;\n getContext(type: string): CustomContext | null;\n toDataURL(): string;\n toDataURL(type?: string, quality?: number): string;\n width: number;\n}\n\nlet createCanvasInternal: ((width?: number, height?: number, type?: \"pdf\" | \"svg\") => CustomCanvas) | undefined;\nlet loadImageInternal: ((src: string | ArrayBuffer, allowCrossOrigin?: boolean) => Promise<CustomImage>) | undefined;\n\nconst createCanvas = (width?: number, height?: number, type?: \"pdf\" | \"svg\"): CustomCanvas => {\n if (createCanvasInternal !== undefined) {\n return createCanvasInternal(width, height, type);\n }\n try {\n const module = documentCanvasModule(true);\n setCanvasModule(module!);\n return module!.createCanvas(width, height, type);\n } catch (e) {\n throw new Error(\"Canvas module not set\");\n }\n};\nconst loadImage = (src: string | ArrayBuffer, allowCrossOrigin?: boolean): Promise<CustomImage> => {\n if (loadImageInternal !== undefined) {\n return loadImageInternal(src, allowCrossOrigin);\n }\n try {\n const module = documentCanvasModule(true);\n setCanvasModule(module!);\n return module!.loadImage(src, allowCrossOrigin);\n } catch (e) {\n throw new Error(\"Canvas module not set\");\n }\n};\n\ninterface CustomCanvasModule {\n createCanvas: typeof createCanvas;\n loadImage: typeof loadImage;\n}\n\nfunction setCanvasModule(module?: CustomCanvasModule) {\n createCanvasInternal = module?.createCanvas;\n loadImageInternal = module?.loadImage;\n}\n\nfunction documentCanvasModule(throwOnError: boolean): CustomCanvasModule | undefined {\n try {\n const ctx = document.createElement(\"canvas\").getContext(\"2d\");\n if (ctx) {\n return {\n createCanvas: (width?: number, height?: number, _type?: \"pdf\" | \"svg\") => {\n const canvas: HTMLCanvasElement = document.createElement(\"canvas\");\n if (width !== undefined && width !== null) {\n canvas.width = width;\n }\n if (height !== undefined && height !== null) {\n canvas.height = height;\n }\n return canvas as any;\n },\n loadImage: (src: string | ArrayBuffer, allowCrossOrigin?: boolean) => {\n return new Promise((resolve, reject) => {\n const image = document.createElement(\"img\");\n if (allowCrossOrigin !== false) {\n image.crossOrigin = \"Anonymous\";\n }\n image.onload = () => {\n resolve(image);\n };\n image.onerror = reject;\n image.src = src as string;\n });\n },\n };\n }\n } catch (e) {\n if (throwOnError) {\n throw e;\n }\n }\n return undefined;\n}\n\nlet domParser: typeof DOMParser | undefined;\nfunction getDomParser(): typeof DOMParser {\n if (domParser === undefined) {\n domParser = DOMParser;\n }\n return domParser;\n}\nfunction setDomParser(parser: typeof DOMParser) {\n domParser = parser;\n}\n\nexport { createCanvas, documentCanvasModule, getDomParser, loadImage, setCanvasModule, setDomParser };\nexport type { CustomCanvas, CustomContext, CustomImage, CustomCanvasModule };\n","import { createCanvas, loadImage, CustomCanvas as Canvas, CustomImage as Image } from \"../customCanvas\";\nimport { arrayBufferToDataUrl, getMimeTypeOfArrayBuffer } from \"./crossplatform\";\n\n// Explicily import ES Module\nimport exifr from \"exifr/dist/mini.esm.mjs\"; // to use ES Modules\n\n/**\n * Logic for scaling and orienting images.\n * Much of this file is taken literally or spiritually from\n * the Blueimp image load library.\n */\n\nlet supportsAutoOrientation: boolean | null = null;\n\n/*\nGet EXIF orientation value.\nExif orientation values to correctly display the letter F:\n\n 1 2\n ██████ ██████\n ██ ██\n ████ ████\n ██ ██\n ██ ██\n\n 3 4\n ██ ██\n ██ ██\n ████ ████\n ██ ██\n ██████ ██████\n\n 5 6\n██████████ ██\n██ ██ ██ ██\n██ ██████████\n\n 7 8\n ██ ██████████\n ██ ██ ██ ██\n██████████ ██\n\n*/\n\nexport const getExifOrientation = (arrayBuffer: ArrayBuffer): Promise<number> => {\n return new Promise((resolve) => {\n const mimeType = getMimeTypeOfArrayBuffer(arrayBuffer);\n if (mimeType !== \"image/jpeg\") {\n return resolve(1);\n }\n exifr\n .orientation(arrayBuffer)\n .then((orientation: number | undefined) => {\n if (!orientation) return resolve(1); // No EXIF data.\n return resolve(orientation);\n })\n .catch(() => {\n return resolve(1);\n });\n });\n};\n\n// Whether the execution environment lacks automatic image orientation.\n// Checks whether the test URL with EXIF orientation gets oriented correctly.\nconst requiresCanvasOrientation = async (): Promise<boolean> => {\n if (supportsAutoOrientation !== null) {\n return !supportsAutoOrientation;\n }\n // black+white 3x2 JPEG, with the following meta information set:\n // - EXIF Orientation: 6 (Rotated 90° CCW)\n // Image data layout (B=black, F=white):\n // BFF\n // BBB\n const testImageUrl =\n \"data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAA\" +\n \"AAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA\" +\n \"QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE\" +\n \"BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAIAAwMBEQACEQEDEQH/x\" +\n \"ABRAAEAAAAAAAAAAAAAAAAAAAAKEAEBAQADAQEAAAAAAAAAAAAGBQQDCAkCBwEBAAAAAAA\" +\n \"AAAAAAAAAAAAAABEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AG8T9NfSMEVMhQ\" +\n \"voP3fFiRZ+MTHDifa/95OFSZU5OzRzxkyejv8ciEfhSceSXGjS8eSdLnZc2HDm4M3BxcXw\" +\n \"H/9k=\";\n const img = await loadImage(testImageUrl);\n supportsAutoOrientation = img.width === 2 && img.height === 3;\n return !supportsAutoOrientation;\n};\n\n// Width and height to use for the canvas.\nexport const canvasDims = (img: Image): [number, number] => {\n const maxDimension = 8192;\n const aspectRatio = img.naturalWidth / img.naturalHeight;\n if (img.naturalHeight <= maxDimension && img.naturalWidth <= maxDimension) {\n return [img.naturalWidth, img.naturalHeight];\n }\n if (img.naturalHeight > img.naturalWidth) {\n return [aspectRatio * maxDimension, maxDimension];\n }\n return [maxDimension, maxDimension / aspectRatio];\n};\n\nconst getScaledAndOrientedCanvas = async (arrayBuffer: ArrayBuffer): Promise<Canvas> => {\n const dataUrl = await arrayBufferToDataUrl(arrayBuffer);\n const img = await loadImage(dataUrl);\n const [canvasWidth, canvasHeight] = canvasDims(img);\n const needToOrient = await requiresCanvasOrientation();\n if (!needToOrient) {\n const canvas = createCanvas(canvasWidth, canvasHeight);\n canvas.getContext(\"2d\")?.drawImage(img, 0, 0, canvasWidth, canvasHeight);\n return canvas;\n }\n const orientation = await getExifOrientation(arrayBuffer);\n const [orientedWidth, orientedHeight] = orientation > 4 ? [canvasHeight, canvasWidth] : [canvasWidth, canvasHeight];\n const canvas = createCanvas(orientedWidth, orientedHeight);\n const ctx = canvas.getContext(\"2d\")!;\n\n // Orient the canvas.\n switch (orientation) {\n case 2:\n ctx.translate(orientedWidth, 0);\n ctx.scale(-1, 1);\n break;\n case 3:\n ctx.translate(orientedWidth, orientedHeight);\n ctx.rotate(Math.PI);\n break;\n case 4:\n ctx.translate(0, orientedHeight);\n ctx.scale(1, -1);\n break;\n case 5:\n ctx.rotate(-0.5 * Math.PI);\n ctx.scale(-1, 1);\n break;\n case 6:\n ctx.rotate(-0.5 * Math.PI);\n ctx.translate(-orientedWidth, 0);\n break;\n case 7:\n ctx.rotate(-0.5 * Math.PI);\n ctx.translate(-orientedWidth, orientedHeight);\n ctx.scale(1, -1);\n break;\n case 8:\n ctx.rotate(0.5 * Math.PI);\n ctx.translate(0, -orientedHeight);\n break;\n default:\n break;\n }\n\n ctx.drawImage(img, 0, 0, orientedWidth, orientedHeight);\n return canvas;\n};\n\nexport const getAttributesFromArrayBuffer = async (arrayBuffer: ArrayBuffer) => {\n const canvas = await getScaledAndOrientedCanvas(arrayBuffer);\n const mimeTypeData = getMimeTypeOfArrayBuffer(arrayBuffer);\n if (mimeTypeData === \"image/jpeg\") {\n return {\n dataUrl: canvas.toDataURL(\"image/jpeg\", 1.0),\n height: canvas.height,\n width: canvas.width,\n };\n }\n return {\n dataUrl: canvas.toDataURL(),\n height: canvas.height,\n width: canvas.width,\n };\n};\n","import { gql } from \"@apollo/client/core\";\nimport { Asset, AssetType, FileInfo, MaterialResource } from \"../types\";\nimport { UnhandledBehaviorError } from \"../util/exception\";\nimport { persistenceService } from \"./persistence\";\nimport { graphQlManager } from \"./server\";\nimport { getAttributesFromArrayBuffer } from \"../util/image\";\n\ninterface AssetCreation {\n asset: Asset;\n uploadUrl: string;\n}\n\ninterface AssetCreationInfo {\n assetResponse: AssetCreation;\n mimeType: string;\n}\n\nconst assetMetadataFragment = gql`\n fragment AssetMetadataFields on Asset {\n metadata {\n key\n value\n }\n }\n`;\n\nexport const assetFragment = (includeMetadata: boolean) => {\n return gql`\n ${(includeMetadata && assetMetadataFragment) || \"\"}\n fragment AssetFields on Asset {\n name\n key\n type\n createdAt\n mimeType\n fileLink\n versions {\n name\n link\n }\n ${(includeMetadata && \"...AssetMetadataFields\") || \"\"}\n }\n `;\n};\n\nconst getAssetsQuery = gql`\n ${assetFragment(false)}\n query GetAssets($keys: [String]!) {\n assets(keys: $keys) {\n ...AssetFields\n }\n }\n`;\n\nexport const materialFragment = gql`\n fragment MaterialFields on Material {\n id\n name\n createdAt\n clearCoat\n clearCoatIor\n refractionIntensity\n reflectionIntensity\n reflectionRotation\n albedoMap {\n key\n fileLink\n }\n alphaMap {\n key\n fileLink\n }\n ambientMap {\n key\n fileLink\n }\n emissionMap {\n key\n fileLink\n }\n metallicMap {\n key\n fileLink\n }\n normalMap {\n key\n fileLink\n }\n refractionMap {\n key\n fileLink\n }\n reflectionMap {\n key\n fileLink\n }\n roughnessMap {\n key\n fileLink\n }\n }\n`;\n\nconst getMaterialsQuery = gql`\n ${materialFragment}\n query GetMaterials($ids: [String]) {\n materials(id: $ids) {\n ...MaterialFields\n }\n }\n`;\n\nconst createAssetMutation = gql`\n mutation CreateAsset($name: String!, $type: String!, $mimeType: String!, $anonymous: Boolean, $temporary: Boolean) {\n assetCreate(name: $name, type: $type, mimeType: $mimeType, anonymous: $anonymous, temporary: $temporary) {\n uploadUrl\n asset {\n name\n key\n type\n createdAt\n mimeType\n fileLink\n }\n }\n }\n`;\n\nconst removeBackgroundFromAssetMutation = gql`\n ${assetFragment(false)}\n mutation RemoveBackgroundFromAsset($key: String!) {\n assetRemoveBackground(key: $key) {\n ...AssetFields\n }\n }\n`;\n\nexport const getAssets = async (assetKeys: string[]): Promise<Asset[]> => {\n const response = await graphQlManager.getShadowGraphqlClient().query<{ assets: Asset[] }>({\n query: getAssetsQuery,\n errorPolicy: \"all\",\n variables: {\n keys: assetKeys,\n },\n });\n return response.data.assets;\n};\n\nconst getMaterials = async (ids: string[]): Promise<MaterialResource[]> => {\n const response = await graphQlManager.getShadowGraphqlClient().query<{ materials: MaterialResource[] }>({\n query: getMaterialsQuery,\n errorPolicy: \"all\",\n variables: {\n ids,\n },\n });\n return response.data.materials;\n};\n\nconst createAsset = async (\n name: string,\n type: string,\n mimeType: string,\n anonymous?: boolean,\n temporary?: boolean,\n): Promise<undefined | AssetCreation> => {\n const response = await graphQlManager.getShadowGraphqlClient().mutate<{ assetCreate: AssetCreation }>({\n mutation: createAssetMutation,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n name,\n type,\n mimeType,\n anonymous,\n temporary,\n },\n });\n return response.data?.assetCreate;\n};\n\n/**\n * An asset manager provides a way to create and\n * manage assets on the Spiff Commerce Platform.\n */\nexport interface AssetManager {\n /**\n * Uploads a file to the Spiff Commerce Platform.\n */\n uploadFile: (file: File, onProgress: (val: number) => void) => Promise<Asset>;\n\n /**\n * From an existing asset, generates a new asset that has the background replaced with transparency.\n * This process is idempotent, i.e. it will only run once for a given asset.\n * @param asset The existing asset to remove the background from.\n * @returns A promise that resolves with a new asset.\n */\n removeBackgroundFromAsset(asset: Asset): Promise<Asset>;\n}\n\nclass AssetService implements AssetManager {\n private cache = new Map<string, Promise<Asset>>();\n /**\n * Promise cache for BG removal processes. Values only present while process is active.\n * Use BGRMStorage and the regular asset promise cache to cache the actual objects.\n */\n private bgrmProcessCache = new Map<string, Promise<Asset>>();\n private materialCache = new Map<string, Promise<MaterialResource>>();\n\n /**\n * Allows for retrieving an asset, returns the option from a cache if possible.\n */\n async getLocalOrFromServer(assetKey: string): Promise<Asset> {\n if (this.cache.has(assetKey)) {\n const asset = this.cache.get(assetKey);\n if (!asset) throw new UnhandledBehaviorError(\"Failed to get asset from cache!\");\n return asset;\n }\n const assetResolver = async () => {\n const asset = (await getAssets([assetKey]))[0];\n return asset;\n };\n const resolver = assetResolver();\n this.cache.set(assetKey, resolver);\n return resolver;\n }\n\n /**\n * Retrieves the asset from the server, bypassing cache (but still writing the result to cache)\n */\n async getFromServer(assetKey: string): Promise<Asset> {\n const assetResolver = async () => {\n const asset = (await getAssets([assetKey]))[0];\n return asset;\n };\n const resolver = assetResolver();\n this.cache.set(assetKey, resolver);\n return resolver;\n }\n\n keyFromURL(url: string): string | undefined {\n let key: string | undefined = undefined;\n try {\n key = new URL(url).pathname;\n } catch (e) {\n key = undefined;\n }\n if (key !== undefined && key.startsWith(\"/\")) {\n key = key.replace(\"/\", \"\");\n }\n return key?.split(\"?\")[0];\n }\n\n /**\n * Caches an asset if it doesn't already exist.\n */\n cacheAsset(asset: Asset) {\n if (!asset.key) throw new UnhandledBehaviorError(\"Asset has no key!\");\n if (this.cache.has(asset.key)) {\n return;\n }\n this.cache.set(asset.key, Promise.resolve(asset));\n }\n\n /**\n * Caches a material if it doesn't already exist.\n */\n cacheMaterial(material: MaterialResource) {\n if (!material.id) throw new UnhandledBehaviorError(\"Material has no id!\");\n if (this.materialCache.has(material.id)) {\n return;\n }\n this.materialCache.set(material.id, Promise.resolve(material));\n }\n\n /**\n * Allows for retrieving a material, returns the option from a cache if possible.\n * @param id The option ID to be retrieved.\n */\n async getMaterialLocalOrFromServer(id: string): Promise<MaterialResource> {\n if (this.materialCache.has(id)) {\n return this.materialCache.get(id)!;\n }\n const materialResolver = async () => {\n const material = (await getMaterials([id]))[0];\n return material;\n };\n const resolver = materialResolver();\n this.materialCache.set(id, resolver);\n return resolver;\n }\n\n /**\n * Upload a user asset to the server. Using callbacks to notify important events.\n * The asset will be stored via the persistence service for future access, if available.\n */\n async uploadAssetWithProgress(\n file: FileInfo,\n assetType: AssetType,\n onProgress: (val: number) => void,\n anonymous?: boolean,\n temporary?: boolean,\n ): Promise<Asset> {\n // We request the server to create a new asset entity.\n const creationResponse = await this.dispatchCreateAssetRequest(file, assetType, anonymous, temporary);\n if (!creationResponse) {\n throw new Error(\"Failed to create asset.\");\n }\n\n // Organise a request & set up header and associated authentication. We use the provided\n // presigned URL to upload the users asset data to the server. The asset isn't valid until this is done.\n await new Promise<Asset>((resolve, reject) => {\n const req = new XMLHttpRequest();\n req.open(\"PUT\", creationResponse.assetResponse.uploadUrl, true);\n req.setRequestHeader(\"Content-Type\", creationResponse.mimeType);\n req.setRequestHeader(\"Cache-Control\", \"public,max-age=31536000,immutable\");\n req.upload.onprogress = (event) => {\n if (event.lengthComputable) {\n onProgress((event.loaded * 100) / event.total);\n }\n };\n req.onload = () => {\n const responseData = creationResponse.assetResponse.asset;\n AssetStorage.add(creationResponse.assetResponse.asset);\n resolve(responseData);\n };\n req.onerror = reject;\n req.send(file.blob);\n });\n this.cacheAsset(creationResponse.assetResponse.asset);\n return creationResponse.assetResponse.asset;\n }\n\n async uploadAsset(file: FileInfo, assetType: AssetType, anonymous?: boolean, temporary?: boolean): Promise<Asset> {\n return this.uploadAssetWithProgress(file, assetType, () => {}, anonymous, temporary);\n }\n\n async uploadFile(file: File, onProgress: (val: number) => void): Promise<Asset> {\n const isRaster = !(\n file.type === \"image/svg+xml\" ||\n file.type === \"application/pdf\" ||\n file.type === \"application/postscript\"\n );\n const assetType = !isRaster ? AssetType.Illustration : AssetType.Image;\n if (!isRaster) {\n const fileInfo = {\n name: file.name,\n blob: new Blob([file], { type: file.type }),\n };\n return await this.uploadAssetWithProgress(fileInfo, assetType, onProgress, true);\n } else {\n const fileInfo = await this.loadImageAsFileInfo(file);\n return await this.uploadAssetWithProgress(fileInfo, assetType, onProgress, true);\n }\n }\n\n async removeBackgroundFromAsset(asset: Asset): Promise<Asset> {\n const originalKey = asset.key!;\n if (this.bgrmProcessCache.has(originalKey)) {\n return this.bgrmProcessCache.get(originalKey)!;\n }\n if (BGRMStorage.has(originalKey)) {\n const promise = this.getLocalOrFromServer(BGRMStorage.get(originalKey)!);\n this.bgrmProcessCache.set(originalKey, promise);\n return promise;\n }\n const processFunc = async (): Promise<Asset> => {\n const removeResponse = await graphQlManager\n .getShadowGraphqlClient()\n .mutate<{ assetRemoveBackground: Asset }>({\n mutation: removeBackgroundFromAssetMutation,\n fetchPolicy: \"no-cache\",\n errorPolicy: \"all\",\n variables: {\n key: originalKey,\n },\n });\n this.bgrmProcessCache.delete(originalKey);\n if (!removeResponse.data?.assetRemoveBackground?.key) {\n throw new Error(\"Failed to remove background from image\");\n }\n AssetStorage.add(removeResponse.data.assetRemoveBackground);\n BGRMStorage.add(originalKey, removeResponse.data.assetRemoveBackground.key!);\n this.cache.set(\n removeResponse.data.assetRemoveBackground.key!,\n Promise.resolve(removeResponse.data.assetRemoveBackground),\n );\n return removeResponse.data.assetRemoveBackground;\n };\n const promise = processFunc();\n this.bgrmProcessCache.set(originalKey, promise);\n return promise;\n }\n\n removePersistedAsset(assetKey: string) {\n AssetStorage.remove(assetKey);\n BGRMStorage.delete(assetKey);\n BGRMStorage.deleteForBgRemovedKey(assetKey);\n }\n\n getPersistedAssets(): PersistedAsset[] {\n return AssetStorage.list();\n }\n\n registerPersistedAssetListener(callback: () => void) {\n AssetStorage.addCallback(callback);\n }\n\n unRegisterPersistedAssetListener(callback: () => void) {\n AssetStorage.removeCallback(callback);\n }\n\n /**\n * Convert a File object for an image into a FileInfo.\n */\n loadImageAsFileInfo = async (file: File): Promise<FileInfo> => {\n const arrayBuffer = await file.arrayBuffer();\n const attributes = await getAttributesFromArrayBuffer(arrayBuffer);\n const dataUrlToBlob = (dataUrl: string, type: string) => {\n const binary = atob(dataUrl.split(\",\")[1]);\n const array: number[] = [];\n for (let i = 0; i < binary.length; i++) {\n array.push(binary.charCodeAt(i));\n }\n return new Blob([new Uint8Array(array)], { type });\n };\n return {\n name: file.name.substring(file.name.lastIndexOf(\"/\") + 1),\n blob: dataUrlToBlob(attributes.dataUrl, file.type),\n };\n };\n\n /**\n * Handles mimeType resolution & asset creation request\n * @param file A file info object containing data about the file and its name\n * @param assetType The type of asset we're expecting to upload\n */\n private async dispatchCreateAssetRequest(\n file: FileInfo,\n assetType: AssetType,\n anonymous?: boolean,\n temporary?: boolean,\n ): Promise<undefined | AssetCreationInfo> {\n // Send a request for asset creation to server\n // We get a presigned upload URL back\n const mimeType = file.blob.type ? file.blob.type : this.guessMIME(file.name);\n const assetResponse = await createAsset(file.name, assetType, mimeType, anonymous, temporary);\n if (!assetResponse) {\n return undefined;\n }\n\n return {\n assetResponse,\n mimeType,\n };\n }\n\n private guessMIME(ext: string): string {\n const extension = ext.split(\".\").pop();\n switch (extension) {\n case \"glb\":\n return \"model/gltf-binary\";\n case \"ttf\":\n return \"font/ttf\";\n case \"mkv\":\n return \"video/x-matroska\";\n default:\n throw new UnhandledBehaviorError(\"Unexpected mimetype: \" + extension);\n }\n }\n}\n\ninterface PersistedAsset {\n assetKey: string;\n src: string;\n}\n\nconst ASSET_PERSISTENCE_KEY = \"persistentAssets\";\n/**\n * Some bundled functionality for dealing with assets in persistence.\n */\nclass AssetStorage {\n private static callbacks: (() => void)[] = [];\n\n /**\n * Add a new asset to persistence\n * @param asset The asset to add.\n */\n static add(asset: Asset) {\n if (!asset.fileLink) {\n console.error(\"Failed to find cdn link on asset, cannot persist!\");\n return;\n }\n // Create a new map to store data\n const newPersistentAssetsMap = new Map<string, string>();\n newPersistentAssetsMap.set(asset.key || \"\", asset.fileLink);\n // Merge existing keys if available, into the new map.\n const oldPersistentAssets = persistenceService.getMap(ASSET_PERSISTENCE_KEY);\n if (oldPersistentAssets) {\n oldPersistentAssets.forEach((value, key) => {\n newPersistentAssetsMap.set(key, value);\n });\n }\n // Save the new map with all keys.\n persistenceService.setMap(ASSET_PERSISTENCE_KEY, newPersistentAssetsMap);\n AssetStorage.executeCallbacks();\n }\n /**\n * Remove an existing asset from persistence. Noop if the asset doesn't exist.\n * @param assetKey The key to remove.\n */\n static remove(assetKey: string) {\n const uploadedAssetsMap = persistenceService.getMap(ASSET_PERSISTENCE_KEY);\n if (!uploadedAssetsMap) return;\n const entryToRemove = Array.from(uploadedAssetsMap.entries()).find((m) => m[0] === assetKey);\n if (!entryToRemove) return;\n uploadedAssetsMap.delete(entryToRemove[0]);\n persistenceService.setMap(ASSET_PERSISTENCE_KEY, uploadedAssetsMap);\n AssetStorage.executeCallbacks();\n }\n /**\n * Get a list of all persisted assets.\n */\n static list(): PersistedAsset[] {\n const uploadedAssetsMap = persistenceService.getMap(ASSET_PERSISTENCE_KEY);\n if (!uploadedAssetsMap) return [];\n return Array.from(uploadedAssetsMap.entries()).map((m) => ({ assetKey: m[0], src: m[1] }));\n }\n /**\n * Adds a callback that will be called whenever assets are added/removed from persistence.\n */\n static addCallback(callback: () => void) {\n AssetStorage.callbacks.push(callback);\n }\n /**\n * Removes an existing callback.\n */\n static removeCallback(callback: () => void) {\n AssetStorage.callbacks = AssetStorage.callbacks.filter((cb) => cb !== callback);\n }\n\n private static executeCallbacks() {\n AssetStorage.callbacks.forEach((cb) => cb());\n }\n}\n\nconst BGRM_ASSET_PERSISTENCE_KEY = \"bgrmPersistentAssets\";\nclass BGRMStorage {\n static has(originalKey: string): boolean {\n return BGRMStorage.getMap().has(originalKey);\n }\n static get(originalKey: string): string | undefined {\n return BGRMStorage.getMap().get(originalKey);\n }\n static keys(): IterableIterator<string> {\n return BGRMStorage.getMap().keys();\n }\n static values(): IterableIterator<string> {\n return BGRMStorage.getMap().values();\n }\n static add(originalKey: string, bgRemovedKey: string) {\n const cache = BGRMStorage.getMap();\n cache.set(originalKey, bgRemovedKey);\n BGRMStorage.setMap(cache);\n }\n static delete(originalKey: string) {\n const cache = BGRMStorage.getMap();\n cache.delete(originalKey);\n BGRMStorage.setMap(cache);\n }\n static deleteForBgRemovedKey(bgRemovedKey: string) {\n const cache = BGRMStorage.getMap();\n const originalKey = Array.from(cache.keys()).find((key) => cache.get(key) === bgRemovedKey);\n if (originalKey) {\n cache.delete(originalKey);\n BGRMStorage.setMap(cache);\n }\n }\n\n private static getMap(): Map<string, string> {\n return persistenceService.getMap(BGRM_ASSET_PERSISTENCE_KEY) || new Map();\n }\n private static setMap(map: Map<string, string>) {\n persistenceService.setMap(BGRM_ASSET_PERSISTENCE_KEY, map);\n }\n}\n\nexport const assetService = new AssetService();\n","/**\n * A simple cache for promises. Helpful to avoid making multiple requests for the same data.\n */\nclass PromiseCache {\n private cache: Record<string, Promise<any>> = {};\n private disabled = false;\n\n /**\n * Gets a promise from the cache, or undefined if it doesn't exist.\n */\n public get(key: object): Promise<any> | undefined {\n if (this.disabled) return undefined;\n const keyString = JSON.stringify(key);\n return this.cache[keyString];\n }\n\n /**\n * Sets a promise in the cache and returns it.\n */\n public set(key: object, promise: Promise<any>): Promise<any> {\n if (this.disabled) return promise;\n const keyString = JSON.stringify(key);\n this.cache[keyString] = promise;\n return promise;\n }\n\n /**\n * Some environments don't want workflows to be cached. An example is a server\n * that doesn't launch a fresh instance per request. This method allows disabling\n * caching in a transparent way.\n */\n public disable(value: boolean): void {\n this.disabled = value;\n }\n}\n\nconst promiseCache = new PromiseCache();\nexport default promiseCache;\n","import { gql } from \"@apollo/client/core\";\nimport { assetFragment, assetService, materialFragment } from \"./asset\";\nimport promiseCache from \"./promiseCache\";\nimport { graphQlManager } from \"./server\";\nimport { OptionResource, VariantResource } from \"../types\";\n\nexport const optionFragment = gql`\n fragment OptionFields on Option {\n id\n name\n public\n currencyCode\n type\n workflowId\n displayType\n variants {\n id\n name\n enabled\n color\n namedColor\n priceModifier\n asset {\n ...AssetFields\n }\n thumbnail {\n ...AssetFields\n }\n material {\n ...MaterialFields\n }\n }\n defaultVariant {\n id\n name\n asset {\n ...AssetFields\n }\n }\n colorProfile {\n ...AssetFields\n }\n }\n`;\n\nconst getOptionsQuery = gql`\n ${assetFragment(false)}\n ${materialFragment}\n ${optionFragment}\n query GetOptions($ids: [String]!) {\n options(ids: $ids) {\n ...OptionFields\n }\n }\n`;\n\nconst getOptionsInternal = async (ids: string[]): Promise<OptionResource[]> => {\n const response = await graphQlManager.getShadowGraphqlClient().query<{ options: OptionResource[] }>({\n query: getOptionsQuery,\n errorPolicy: \"all\",\n variables: {\n ids,\n },\n });\n response.data.options.forEach((option) => {\n option.defaultVariant?.asset && assetService.cacheAsset(option.defaultVariant.asset);\n option.colorProfile && assetService.cacheAsset(option.colorProfile);\n option.variants?.forEach((variant) => {\n variant.asset && assetService.cacheAsset(variant.asset);\n variant.thumbnail && assetService.cacheAsset(variant.thumbnail);\n variant.material && assetService.cacheMaterial(variant.material);\n });\n });\n return response.data.options;\n};\n\nconst findOptionFromPromise = async (\n id: string,\n promise: Promise<OptionResource[]>,\n): Promise<OptionResource | undefined> => {\n const options = await promise;\n return options.find((option) => option.id === id);\n};\n\nconst getOptions = async (ids: string[]): Promise<OptionResource[]> => {\n const existingPromises = ids.map((id) => promiseCache.get({ id }));\n const uncachedIds = ids.filter((_id, index) => existingPromises[index] === undefined);\n if (uncachedIds.length === 0) {\n return Promise.all(existingPromises);\n }\n const getOptionsPromise = getOptionsInternal(uncachedIds);\n const uncachedPromises = uncachedIds.map((id) =>\n promiseCache.set({ id }, findOptionFromPromise(id, getOptionsPromise)),\n );\n const filteredPromises = existingPromises.filter((promise) => promise !== undefined);\n return await Promise.all(filteredPromises.concat(uncachedPromises));\n};\n\nclass OptionService {\n /**\n * Allows for retrieving an option, returns the option from a cache if possible.\n * @param id The option ID to be retrieved.\n */\n async getOption(id: string): Promise<undefined | OptionResource> {\n const optionResolver = async () => {\n const asset = (await getOptions([id]))[0];\n if (!asset) {\n return undefined;\n }\n return asset;\n };\n const resolver = optionResolver();\n return resolver;\n }\n\n async getAssetTileImageForVariant(variant: VariantResource): Promise<string> {\n // Image specifically set as thumbnail.\n const thumbnail = variant.thumbnail;\n if (thumbnail) {\n const thumbThumb = thumbnail.versions?.find((v) => v.name === \"thumbnail\");\n const thumbCdn = thumbnail.fileLink;\n return thumbThumb?.link || thumbCdn!;\n }\n\n // Fallback to standard asset instead.\n const asset = variant.asset;\n if (asset) {\n const assetThumb = asset.versions?.find((v) => v.name === \"thumbnail\");\n const assetCdn = asset.fileLink;\n return assetThumb?.link || assetCdn!;\n }\n\n if (variant.material) {\n return variant.material.id;\n }\n\n return \"\";\n }\n\n getDefaultVariant(option: OptionResource): VariantResource | undefined {\n const variants = option.variants;\n if (!variants) {\n return undefined;\n }\n if (variants.length === 1) {\n return variants[0];\n }\n if (option.defaultVariant === undefined) {\n return undefined;\n }\n return variants.find((variant) => variant.id === option.defaultVariant?.id);\n }\n\n /**\n * Returns the first variant marked as selected. This is used by most steps.\n */\n getSelectedVariant = (\n option: OptionResource | undefined,\n selectedVariantIds: string[],\n ): VariantResource | undefined => {\n if (!option || selectedVariantIds.length === 0) {\n return undefined;\n }\n return option.variants?.find((variant) => variant.id === selectedVariantIds[0]);\n };\n}\n\nconst optionService = new OptionService();\nexport { optionService };\n","import { gql } from \"@apollo/client/core\";\nimport { assetFragment, materialFragment } from \"./services/asset\";\nimport { optionFragment } from \"./services/option\";\n\nexport const activeIntegrationFragment = gql`\n fragment ActiveIntegrationFields on Integration {\n id\n logo\n theme {\n id\n configuration\n primaryColor\n secondaryColor\n textColor\n }\n partner {\n id\n name\n activeAddons\n }\n }\n`;\n\nexport const additionalProductFragment = gql`\n fragment AdditionalIntegrationProductFields on IntegrationProduct {\n id\n product {\n id\n basePrice\n enabled\n name\n description\n sku\n skuCode\n weight\n imageUrl\n modelUrl\n overlayImageUrl\n preloadImageUrl\n }\n }\n`;\n\nexport const createManyTransactionsMutation = gql`\n ${additionalProductFragment}\n mutation CreateTransactions(\n $inputs: [TransactionCreateInput]!\n $marketplaceThemeInstallId: String\n $marketplaceThemeInstallConfigurationId: String\n ) {\n transactionCreateMany(\n inputs: $inputs\n marketplaceThemeInstallId: $marketplaceThemeInstallId\n marketplaceThemeInstallConfigurationId: $marketplaceThemeInstallConfigurationId\n ) {\n id\n designName\n transactionOwnerId\n workflowId\n customLogoLink\n workflowFooterLogoLink\n restApiIntegrationLink\n workflowState\n workflowViewerLink\n workflowViewerReadOnlyLink\n product {\n id\n basePrice\n enabled\n name\n description\n partner {\n id\n name\n currencyCode\n customerDetailsPromptMarkdown\n }\n profanities {\n id\n word\n }\n sku\n skuCode\n weight\n workflows {\n id\n friendlyName\n isPresent\n workflowName\n imageUrl\n }\n imageUrl\n modelUrl\n overlayImageUrl\n preloadImageUrl\n promptForCustomerDetails\n conversionConfiguration {\n id\n name\n locations\n requestedData\n requestedDataItems {\n type\n mandatory\n }\n mandatory\n }\n productTags {\n id\n name\n }\n priceBreaks {\n id\n minQty\n percentage\n }\n }\n integrationProduct {\n id\n externalProductId\n externalVariantId\n additionalExternalProductId\n additionalExternalVariantId\n additionalIntegrationProduct {\n ...AdditionalIntegrationProductFields\n }\n }\n }\n }\n`;\n\nexport const stakeholderFragment = gql`\n fragment StakeholderFields on Stakeholder {\n id\n type\n authorizationDate\n authorizationNote\n authorizationStatus\n }\n`;\n\nexport const transactionShareActionFragment = gql`\n fragment TransactionShareActionFields on TransactionShareAction {\n id\n title\n type\n stakeholderType\n precedence\n url\n }\n`;\n\nexport const readTransactionsQuery = gql`\n ${additionalProductFragment}\n ${stakeholderFragment}\n ${transactionShareActionFragment}\n ${activeIntegrationFragment}\n query ReadTransactions($ids: [String]!) {\n transactions(ids: $ids) {\n customLogoLink\n designName\n externalDesignProductId\n externalDesignProductVariantId\n externalCartProductId\n externalCartProductVariantId\n id\n completed\n lastSyncedAt\n priceModifierTotal\n restApiIntegrationLink\n workflowFooterLogoLink\n workflowId\n workflowState\n workflowViewerLink\n workflowViewerReadOnlyLink\n previewImageLink\n isOrdered\n quantity\n printFileUrl1\n printFileUrl2\n printFileUrl3\n printFileUrl4\n printFileUrl5\n printFileName1\n printFileName2\n printFileName3\n printFileName4\n printFileName5\n stakeholders {\n ...StakeholderFields\n }\n currentStakeholder {\n ...StakeholderFields\n }\n hasAuthenticatedActions\n transactionShareActions {\n ...TransactionShareActionFields\n }\n product {\n id\n basePrice\n enabled\n name\n description\n partner {\n id\n name\n currencyCode\n customerDetailsPromptMarkdown\n }\n productImages {\n id\n precedence\n asset {\n key\n fileLink\n name\n type\n versions {\n name\n link\n }\n }\n }\n integrationProducts {\n id\n integration {\n id\n type\n }\n externalProductId\n externalVariantId\n additionalExternalProductId\n additionalExternalVariantId\n additionalIntegrationProduct {\n ...AdditionalIntegrationProductFields\n }\n }\n profanities {\n id\n word\n }\n sku\n skuCode\n weight\n workflows {\n id\n friendlyName\n isPresent\n workflowName\n imageUrl\n }\n imageUrl\n modelUrl\n overlayImageUrl\n preloadImageUrl\n promptForCustomerDetails\n conversionConfiguration {\n id\n name\n locations\n requestedData\n requestedDataItems {\n type\n mandatory\n }\n mandatory\n }\n productTags {\n id\n name\n }\n priceBreaks {\n id\n minQty\n percentage\n }\n }\n integrationProduct {\n id\n externalProductId\n externalVariantId\n additionalExternalProductId\n additionalExternalVariantId\n additionalIntegrationProduct {\n ...AdditionalIntegrationProductFields\n }\n integration {\n ...ActiveIntegrationFields\n }\n }\n }\n }\n`;\n\nexport const updateTransactionWorkflowStateQuery = gql`\n mutation UpdateTransactionWorkflowState($id: String!, $workflowState: String!) {\n transactionUpdate(id: $id, workflowState: $workflowState) {\n id\n }\n }\n`;\n\nexport const updateTransactionQuantityQuery = gql`\n mutation UpdateTransactionQuantity($id: String!, $quantity: Int) {\n transactionUpdate(id: $id, quantity: $quantity) {\n id\n }\n }\n`;\n\nexport const getTransactionQuery = gql`\n query ReadTransactionForDesignCreation($id: String!) {\n transactions(ids: [$id]) {\n id\n completed\n createdAt\n designName\n product {\n name\n sku\n basePrice\n promptForCustomerDetails\n partner {\n id\n name\n customerDetailsPromptMarkdown\n }\n conversionConfiguration {\n id\n name\n locations\n requestedData\n requestedDataItems {\n type\n mandatory\n }\n mandatory\n }\n productTags {\n id\n name\n }\n priceBreaks {\n id\n minQty\n percentage\n }\n }\n bundle {\n id\n metadata {\n key\n value\n }\n bundleStakeholders {\n type\n customer {\n emailAddress\n }\n }\n }\n externalCartProductId\n externalCartProductVariantId\n externalDesignProductId\n externalDesignProductVariantId\n lastSyncedAt\n previewImageLink\n priceModifierTotal\n quantity\n workflowId\n workflowState\n workflowViewerLink\n workflowViewerReadOnlyLink\n }\n }\n`;\n\nexport const getTransactionShareActionsQuery = gql`\n ${transactionShareActionFragment}\n query ReadTransactionForShareActions($id: String!) {\n transactions(ids: [$id]) {\n id\n hasAuthenticatedActions\n transactionShareActions {\n ...TransactionShareActionFields\n }\n }\n }\n`;\n\nexport const readWorkflowStates = gql`\n query ReadWorkflowStates($ids: [String]!) {\n transactions(ids: $ids) {\n id\n workflowState\n }\n }\n`;\n\nconst IntegrationProductFragment = gql`\n ${additionalProductFragment}\n fragment IntegrationProductFields on IntegrationProduct {\n id\n externalProductId\n externalVariantId\n additionalExternalProductId\n additionalExternalVariantId\n additionalIntegrationProduct {\n ...AdditionalIntegrationProductFields\n }\n integration {\n id\n enabled\n externalIntegrationId\n type\n }\n product {\n id\n basePrice\n enabled\n imageUrl\n modelUrl\n name\n description\n overlayImageUrl\n preloadImageUrl\n sku\n skuCode\n workflows {\n id\n index\n friendlyName\n isPresent\n workflowName\n imageUrl\n }\n productTags {\n id\n name\n }\n productImages {\n id\n precedence\n asset {\n key\n fileLink\n name\n type\n versions {\n name\n link\n }\n }\n }\n priceBreaks {\n id\n minQty\n percentage\n }\n }\n }\n`;\n\nexport const getIntegrationProductsQuery = gql`\n ${IntegrationProductFragment}\n query GetIntegrationProducts($ids: [String!]!) {\n integrationProducts(ids: $ids) {\n ...IntegrationProductFields\n }\n }\n`;\n\nexport const getIntegrationProductFromExternalIdsQuery = gql`\n ${IntegrationProductFragment}\n query GetIntegrationProductFromExternalIds($externalIntegrationId: String!, $externalProductId: String!) {\n integrationProductFromExternalIds(\n externalIntegrationId: $externalIntegrationId\n externalProductId: $externalProductId\n ) {\n ...IntegrationProductFields\n }\n }\n`;\n\nexport const getTransactionStakeholdersQuery = gql`\n ${stakeholderFragment}\n query ReadTransactionForStakeholders($id: String!) {\n transactions(ids: [$id]) {\n stakeholders {\n ...StakeholderFields\n }\n currentStakeholder {\n ...StakeholderFields\n }\n }\n }\n`;\n\nexport const finalizeUpdateTransactionMutation = gql`\n mutation FinalizeUpdateTransaction($transactionId: String!) {\n transactionFinalizeUpdate(transactionId: $transactionId)\n }\n`;\n\nexport const regionFragment = gql`\n fragment RegionFields on Region {\n width\n top\n left\n height\n layer\n layerIndex\n rotation\n panelId\n immutable\n adjustmentBoundary {\n width\n x\n y\n height\n }\n }\n`;\n\nexport const lookAtAnimationFragment = gql`\n fragment LookAtAnimationFields on LookAtAnimation {\n latDeg\n lonDeg\n radius\n target {\n x\n y\n z\n }\n }\n`;\n\nexport const renderingPipelineConfigurationFragment = gql`\n fragment RenderingPipelineConfigurationFields on RenderingPipelineConfiguration {\n antiAliasing {\n samples\n fxaaEnabled\n }\n bloom {\n enabled\n kernel\n scale\n threshold\n weight\n }\n chromaticAberration {\n enabled\n aberrationAmount\n direction {\n x\n y\n }\n radialIntensity\n }\n colorCurves {\n enabled\n globalDensity\n globalExposure\n globalHue\n globalSaturation\n highlightsDensity\n highlightsExposure\n highlightsHue\n highlightsSaturation\n midtonesDensity\n midtonesExposure\n midtonesHue\n midtonesSaturation\n shadowsDensity\n shadowsExposure\n shadowsHue\n shadowsSaturation\n }\n depthOfField {\n enabled\n blurLevel\n focusDistance\n focalLength\n fStop\n lensSize\n }\n grain {\n enabled\n animated\n intensity\n }\n misc {\n contrast\n exposure\n toneMappingEnabled\n toneMappingType\n }\n sharpen {\n enabled\n colorAmount\n edgeAmount\n }\n vignette {\n enabled\n blendMode\n cameraFov\n center {\n x\n y\n }\n colorRgba {\n r\n g\n b\n a\n }\n colorHex\n stretch\n weight\n }\n }\n`;\n\nexport const modelAnimationFragment = gql`\n fragment ModelAnimationFields on ModelAnimation {\n from\n to\n loop\n name\n }\n`;\n\nexport const getWorkflowsQuery = (includeAssetMetadata: boolean) => {\n return gql`\n ${assetFragment(includeAssetMetadata)}\n ${materialFragment}\n ${optionFragment}\n ${regionFragment}\n ${lookAtAnimationFragment}\n ${renderingPipelineConfigurationFragment}\n ${modelAnimationFragment}\n query GetWorkflows($ids: [String!]!) {\n workflows(ids: $ids) {\n partner {\n termsMarkdown\n }\n allowProofDownload\n defaultPreviewPanelIndex\n finalizeStepConfig {\n termsMarkdown\n lookAtAnimation {\n ...LookAtAnimationFields\n }\n modelAnimation {\n ...ModelAnimationFields\n }\n }\n globalPreviewConfig {\n autoRotation\n backgroundColor\n backgroundImage\n clearColor\n disableActionBar\n disableAutomaticOrientation\n emissiveGlowIntensity\n enableAR\n environmentFile\n environmentIntensity\n environmentRotationY\n idleTimeBeforeRotation\n lowerAlphaLimitDeg\n lowerBetaLimitDeg\n maxZoomOverride\n minZoomOverride\n noPan\n upperAlphaLimitDeg\n upperBetaLimitDeg\n renderingPipelineConfiguration {\n ...RenderingPipelineConfigurationFields\n }\n }\n id\n introduction\n name\n overrideTheme {\n id\n configuration\n name\n primaryColor\n secondaryColor\n textColor\n themeLayout {\n id\n name\n }\n fontAsset {\n ...AssetFields\n }\n }\n panels {\n editableArea {\n height\n width\n x\n y\n }\n height\n width\n index\n name\n useEditableArea\n transparentBackground\n previewRegion {\n ...RegionFields\n }\n }\n previewAsset {\n ...AssetFields\n }\n showModelOnFinishStep\n showPlusInVariantPrices\n showPricing\n skuCode\n stepGroups {\n name\n stepNames\n }\n steps {\n stepName\n type\n tags\n globalPropertyAspectConfigurations {\n aspectName\n globalPropertyConfigurationId\n }\n option {\n ...OptionFields\n }\n stepTitle\n helpText\n mandatory\n silent\n conditions {\n requiredVariantSelections\n targetStepName\n action\n }\n data {\n __typename\n ... on InformationStepData {\n content\n lookAtAnimation {\n ...LookAtAnimationFields\n }\n modelAnimation {\n ...ModelAnimationFields\n }\n }\n ... on DigitalContentStepData {\n advancedEditorAnimation {\n x\n y\n zoom\n layoutName\n }\n baseUrl\n lookAtAnimation {\n ...LookAtAnimationFields\n }\n modelAnimation {\n ...ModelAnimationFields\n }\n regions {\n ...RegionFields\n }\n }\n ... on FrameStepData {\n advancedEditorAnimation {\n x\n y\n zoom\n layoutName\n }\n colorOption {\n ...OptionFields\n }\n colorPickerEnabled\n initialZoomLevel\n disablePlaceholder\n displayImageOnFinishStep\n displaySelectionOnFinishStep\n forceImageCover\n hideImageInCart\n hideSelectionInCart\n lookAtAnimation {\n ...LookAtAnimationFields\n }\n maxColors\n modelAnimation {\n ...ModelAnimationFields\n }\n overlayImageKey\n overlayImageUrl\n placeholderImageKey\n placeholderImageUrl\n regions {\n ...RegionFields\n }\n whitelistedExtensions\n }\n ... on IllustrationStepData {\n advancedEditorAnimation {\n x\n y\n zoom\n layoutName\n }\n colorOption {\n ...OptionFields\n }\n colorPickerEnabled\n displayColorsOnFinishStep\n displaySelectionOnFinishStep\n hideColorsInCart\n hideSelectionInCart\n lookAtAnimation {\n ...LookAtAnimationFields\n }\n modelAnimation {\n ...ModelAnimationFields\n }\n regions {\n ...RegionFields\n }\n }\n ... on MaterialStepData {\n advancedEditorAnimation {\n x\n y\n zoom\n layoutName\n }\n displaySelectionOnFinishStep\n hideSelectionInCart\n lookAtAnimation {\n ...LookAtAnimationFields\n }\n modelAnimation {\n ...ModelAnimationFields\n }\n targetMaterials\n }\n ... on ModelStepData {\n advancedEditorAnimation {\n x\n y\n zoom\n layoutName\n }\n displaySelectionOnFinishStep\n hideSelectionInCart\n lookAtAnimation {\n ...LookAtAnimationFields\n }\n modelAnimation {\n ...ModelAnimationFields\n }\n replaceProductModel\n }\n ... on ModuleStepData {\n advancedEditorAnimation {\n x\n y\n zoom\n layoutName\n }\n displayTextOnFinishStep\n hideTextInCart\n lookAtAnimation {\n ...LookAtAnimationFields\n }\n maxLength\n modelAnimation {\n ...ModelAnimationFields\n }\n module\n regions {\n ...RegionFields\n }\n }\n ... on PictureStepData {\n advancedEditorAnimation {\n x\n y\n zoom\n layoutName\n }\n displaySelectionOnFinishStep\n hideSelectionInCart\n lookAtAnimation {\n ...LookAtAnimationFields\n }\n modelAnimation {\n ...ModelAnimationFields\n }\n regions {\n ...RegionFields\n }\n }\n ... on ProductOverlayStepData {\n regions {\n ...RegionFields\n }\n overlayType\n }\n ... on QuestionStepData {\n advancedEditorAnimation {\n x\n y\n zoom\n layoutName\n }\n allowMultipleSelections\n displaySelectionsOnFinishStep\n displayType\n hideSelectionsInCart\n lookAtAnimation {\n ...LookAtAnimationFields\n }\n modelAnimation {\n ...ModelAnimationFields\n }\n }\n ... on ShapeStepData {\n advancedEditorAnimation {\n x\n y\n zoom\n layoutName\n }\n displaySelectionOnFinishStep\n excludeFromPrint\n hideSelectionInCart\n lookAtAnimation {\n ...LookAtAnimationFields\n }\n modelAnimation {\n ...ModelAnimationFields\n }\n regions {\n ...RegionFields\n }\n }\n ... on SilentIllustrationStepData {\n advancedEditorAnimation {\n x\n y\n zoom\n layoutName\n }\n asset {\n ...AssetFields\n }\n excludeFromPrint\n lookAtAnimation {\n ...LookAtAnimationFields\n }\n modelAnimation {\n ...ModelAnimationFields\n }\n regions {\n ...RegionFields\n }\n }\n ... on TextStepData {\n advancedEditorAnimation {\n x\n y\n zoom\n layoutName\n }\n allowNewlines\n colorOption {\n ...OptionFields\n }\n colorPickerEnabled\n curved\n defaultText\n deleteDefaultOnFocus\n displayColorOnFinishStep\n displayImageFillOnFinishStep\n displaySelectionOnFinishStep\n displayTextOnFinishStep\n hideColorInCart\n hideImageFillInCart\n hideSelectionInCart\n hideTextInCart\n imageFillOption {\n ...OptionFields\n }\n imageFillScale\n lookAtAnimation {\n ...LookAtAnimationFields\n }\n maxLength\n maxSize\n minSize\n modelAnimation {\n ...ModelAnimationFields\n }\n paths\n regions {\n ...RegionFields\n }\n replaceableText\n size\n textAlign\n uppercase\n userCanReplaceText\n vertical\n verticalAlign\n }\n }\n }\n }\n }\n `;\n};\n\nexport const getTransactionWithPartnerQuery = gql`\n query GetTransactionForPartner($id: String!) {\n transactions(ids: [$id]) {\n id\n completed\n bundle {\n id\n }\n customLogoLink\n isOrdered\n product {\n id\n partner {\n id\n }\n }\n }\n }\n`;\n\nexport const getWorkflowWithThemeQuery = gql`\n ${assetFragment(false)}\n query GetWorkflowForTheme($id: String!) {\n workflow(id: $id) {\n id\n overrideTheme {\n id\n configuration\n name\n primaryColor\n secondaryColor\n textColor\n themeLayout {\n id\n name\n }\n fontAsset {\n ...AssetFields\n }\n }\n }\n }\n`;\n\nconst marketplaceThemeInstallConfigurationFragment = gql`\n fragment MarketplaceThemeInstallConfigurationFields on MarketplaceThemeInstallConfiguration {\n id\n themeInstallId\n fields {\n type\n key\n value\n asset {\n key\n name\n fileLink\n type\n }\n listValues\n objectValues\n schema\n root\n }\n themeVersion {\n id\n version\n status\n createdAt\n updatedAt\n launchData {\n targetFiles {\n filename\n type\n mimeType\n fileLink\n preload\n }\n }\n configurationSchema {\n customSchemas {\n name\n type\n title\n fields\n extends\n schemas\n }\n fields {\n key\n type\n title\n required\n defaultValue\n options {\n key\n value\n }\n assetType\n multiLine\n items\n fields\n schema\n root\n }\n }\n }\n }\n`;\n\nexport const getMarketplaceThemeInstallConfigurationQuery = gql`\n ${marketplaceThemeInstallConfigurationFragment}\n query GetMarketplaceThemeInstallConfiguration($themeConfigurationId: String!, $themeInstallId: String!) {\n marketplaceThemeInstallConfiguration(id: $themeConfigurationId, themeInstallId: $themeInstallId, raw: false) {\n ...MarketplaceThemeInstallConfigurationFields\n }\n }\n`;\n\nexport const currentIntegrationQuery = gql`\n ${activeIntegrationFragment}\n ${marketplaceThemeInstallConfigurationFragment}\n query GetCurrentIntegration {\n currentIntegration {\n id\n type\n marketplaceThemeInstallConfiguration(raw: false) {\n ...MarketplaceThemeInstallConfigurationFields\n }\n ...ActiveIntegrationFields\n }\n }\n`;\n\nexport const getTransactionForMarketplaceThemeQuery = gql`\n ${marketplaceThemeInstallConfigurationFragment}\n query ReadTransactionForMarketplaceTheme($id: String!) {\n transactions(ids: [$id]) {\n marketplaceThemeInstallConfiguration(raw: false) {\n ...MarketplaceThemeInstallConfigurationFields\n }\n }\n }\n`;\n\nexport const getBundleForMarketplaceThemeQuery = gql`\n ${marketplaceThemeInstallConfigurationFragment}\n query ReadBundleForMarketplaceTheme($id: String!) {\n bundles(ids: [$id]) {\n marketplaceThemeInstallConfiguration(raw: false) {\n ...MarketplaceThemeInstallConfigurationFields\n }\n }\n }\n`;\n","import { AnyStepData, Step, StepGroup, StepSelections, StepType, Workflow } from \"../../types\";\n\n/**\n * A renderable scene is a scene that can be displayed to the user. This is based on the workflow state.\n */\nexport interface RenderableScene {\n /**\n * The id of the scene.\n */\n id: string;\n /**\n * The title of the scene.\n */\n title: string;\n /**\n * The id of each step inside the scene that can be rendered. This is based on the workflow state.\n */\n renderableSteps: string[];\n /**\n * The WorkflowScene representation of this object. Provided for backwards compatibility.\n * @deprecated\n */\n workflowScene: WorkflowScene;\n}\n\n/**\n * Information parsed froma workflow structure that is relevant\n * to a given scene.\n */\nexport interface WorkflowScene {\n /**\n * A unique identifier for the scene.\n */\n name: string;\n /**\n * A human-readable title for the scene.\n */\n title: string;\n /**\n * Steps which can display to the user.\n * But may be conditionally hidden based on workflow logic\n */\n renderableSteps: Step<AnyStepData>[];\n /**\n * Steps which don't display to the user.\n * Their behavior is always silent & executed in the background.\n * @deprecated Silent steps are no longer handled seperately from normal steps.\n */\n silentSteps: Step<AnyStepData>[];\n}\n\n/**\n * @deprecated All steps can now be silent. It will take a long time to transition away from this approach though. Including potentially more dev work.\n */\nexport const silentStepTypes = [StepType.SilentIllustration, StepType.ProductOverlay];\n\n/**\n * Gets all scenes in the workflow structured in a way that makes it easier for us to track current state.\n * FIXME: renderableSteps in the response from this function have a different meaning to renderableSteps in getRenderableRelevantScenes and others.\n * FIXME: silentSteps will be removed in the future. They will be treating like other steps & not a special case moving forwards.\n * @param workflow The workflow to get scenes for.\n * @returns A list of scenes containing\n */\nconst getAllScenes = async (workflow: Workflow): Promise<WorkflowScene[]> => {\n const scenes: WorkflowScene[] = [];\n\n // If the workflow needs an intro, add it.\n if (workflow.introduction) {\n scenes.push({\n name: \"Introduction\",\n title: workflow.name,\n renderableSteps: [\n {\n type: StepType.Introduction,\n stepName: \"Introduction\",\n stepTitle: workflow.name,\n helpText: workflow.introduction,\n data: {},\n conditions: [],\n },\n ],\n silentSteps: [],\n });\n }\n\n // For each step in the workflow,\n // check if it belongs to a group.\n // If not then stick it in its own scene.\n // If it does then look for a scene with the group's name.\n // Stick it in that scene if you find it, otherwise make a new scene.\n for (const step of workflow.steps) {\n const group = findGroupForStep(step.stepName, workflow.stepGroups);\n\n // FIXME: I don't believe the system actually allows you to have groupless steps anymore...\n if (!group) {\n scenes.push({\n name: step.stepName,\n title: step.stepTitle,\n renderableSteps: silentStepTypes.includes(step.type) ? [] : [step],\n silentSteps: silentStepTypes.includes(step.type) ? [step] : [],\n });\n } else {\n const existingScene = scenes.find((scene) => scene.name === group.name);\n if (existingScene) {\n if (silentStepTypes.includes(step.type)) {\n existingScene.silentSteps.push(step);\n } else {\n existingScene.renderableSteps.push(step);\n }\n } else {\n scenes.push({\n name: group.name,\n title: group.name,\n renderableSteps: silentStepTypes.includes(step.type) ? [] : [step],\n silentSteps: silentStepTypes.includes(step.type) ? [step] : [],\n });\n }\n }\n }\n\n // Add the finish step.\n const finishSceneTitle = \"workflow.steps.finish.confirmDesign\";\n scenes.push({\n name: \"Finish\",\n title: finishSceneTitle,\n renderableSteps: [\n {\n type: StepType.Finish,\n stepName: \"Finish\",\n stepTitle: finishSceneTitle,\n helpText: \"\",\n data: {\n modelAnimation: workflow.finalizeStepConfig\n ? workflow.finalizeStepConfig.modelAnimation\n : undefined,\n lookAtAnimation: workflow.finalizeStepConfig\n ? workflow.finalizeStepConfig.lookAtAnimation\n : undefined,\n },\n conditions: [],\n },\n ],\n silentSteps: [],\n });\n\n return scenes;\n};\n\n/**\n * Find the scene relating to a step\n * @param stepName The step ID.\n * @param stepGroups The list of scenes.\n * @returns Scene if found or undefined.\n */\nconst findGroupForStep = (stepName: string, stepGroups: StepGroup[]): StepGroup | undefined => {\n return stepGroups.find((group) => group.stepNames.includes(stepName));\n};\n\n/**\n * Determines whether a step is conditionally active.\n * @param step A step to check.\n * @param stepSelections The current customer selections.\n * @returns Returns true when the step is conditionally active. False otherwise.\n */\nconst stepConditionsAreSatisfied = (step: Step<AnyStepData>, stepSelections: StepSelections): boolean => {\n // Currently all conditions must be met (AND), we should allow for OR of conditions as well.\n return (step.conditions || []).every((condition) => {\n const originatingStepData = stepSelections[condition.targetStepName];\n if (originatingStepData && originatingStepData.selectedVariants) {\n const selectedVariants = originatingStepData.selectedVariants;\n return condition.requiredVariantSelections.some(\n (reqVariant) => selectedVariants.find((selVariant) => selVariant.id === reqVariant) !== undefined,\n );\n }\n return false;\n });\n};\n\n/**\n * Filters out steps that are not conditionally active.\n * @param scene The scene to filter.\n * @param stepSelections The current customer selections.\n * @returns A scene with only conditionally active steps. If all steps have been filtered out we return null.\n */\nconst filterSceneByConditions = (scene: WorkflowScene, stepSelections: StepSelections): WorkflowScene | null => {\n const filteredScene: WorkflowScene = {\n name: scene.name,\n title: scene.title,\n renderableSteps: scene.renderableSteps.filter((step) => stepConditionsAreSatisfied(step, stepSelections)),\n silentSteps: scene.silentSteps.filter((step) => stepConditionsAreSatisfied(step, stepSelections)),\n };\n if (filteredScene.silentSteps.length === 0 && filteredScene.renderableSteps.length === 0) {\n return null;\n }\n return filteredScene;\n};\n\n/**\n * Used to understand what scenes contain active steps.\n * @param allScenes All scenes in the workflow.\n * @param stepSelections The current customer selections.\n * @returns A list of scenes that contain at least one conditionally active step.\n */\nconst getActiveScenes = (allScenes: WorkflowScene[], stepSelections: StepSelections): WorkflowScene[] => {\n return allScenes\n .map((scene) => filterSceneByConditions(scene, stepSelections))\n .filter((scene) => scene !== null) as WorkflowScene[];\n};\n\n/**\n * This function is only used to drive what steps are visible for the user.\n * NOTE: Do not use this function to apply internal workflow logic like loading/unloading steps. As a renderable step may still need to be loaded/unloaded.\n * @param allScenes All scenes in the workflow.\n * @param stepSelections The current customer selections.\n * @param singleVariantsRenderable When true the function will return steps that have a single variant.\n * @returns A list of scenes & steps inside them that are renderable to the customer.\n */\nconst getRenderableRelevantScenes = async (\n allScenes: WorkflowScene[],\n stepSelections: StepSelections,\n singleVariantsRenderable: boolean = false,\n): Promise<WorkflowScene[]> => {\n const activeScenes = getActiveScenes(allScenes, stepSelections);\n\n // Evaluate each step\n const stepsWithRenderableConfiguration: string[] = [];\n for (const scene of activeScenes) {\n for (const step of scene.renderableSteps) {\n const variants = (step.option?.variants || []).length;\n if (step.silent) continue;\n /**\n * Silent steps are now possible on any step in the system.\n * Let's move towards removing this code.\n * FIXME: Once ops are happy we have marked required steps silent. Remove.\n */\n if (\n step.type === StepType.Model ||\n step.type === StepType.Material ||\n step.type === StepType.Picture ||\n step.type === StepType.Shape\n ) {\n if (variants > 1 || singleVariantsRenderable) stepsWithRenderableConfiguration.push(step.stepName);\n } else {\n stepsWithRenderableConfiguration.push(step.stepName);\n }\n }\n }\n // Filter out scenes that don't have any renderable steps.\n const renderableScenes = activeScenes.filter((scene) => {\n const filteredScene = scene.renderableSteps.filter((step: Step<AnyStepData>) =>\n stepsWithRenderableConfiguration.includes(step.stepName),\n );\n return filteredScene.length > 0;\n });\n\n // Filter out unrenderable steps from the scenes.\n for (const renderableScene of renderableScenes) {\n renderableScene.renderableSteps = renderableScene.renderableSteps.filter((step: Step<AnyStepData>) =>\n stepsWithRenderableConfiguration.includes(step.stepName),\n );\n }\n\n return renderableScenes;\n};\n\nexport { getAllScenes, getActiveScenes, getRenderableRelevantScenes, stepConditionsAreSatisfied };\n","/**\n * A queue promise is a container for a promise that can be\n * executed at a later time.\n */\nexport abstract class QueueablePromise {\n readonly timestamp = Date.now();\n abstract execute(): Promise<any>;\n}\n\n/**\n * A promise queue contains any number of QueuePromise objects. These objects are stored within a PromiseQueue and executed\n * as quickly as possible in order. This is ideal in situations where a specific operation should be\n * applied in an ordered way while still making.\n */\nexport class PromiseQueue<T extends QueueablePromise> {\n private queue: T[] = [];\n private activePromise?: Promise<void> = undefined;\n private queueMaxSize: number | undefined = undefined;\n private isEnabled: boolean;\n\n /**\n * Constructs a new promise queue.\n * @param queueMaxSize An optional maximum size, when the max size is hit.\n * The older promises will be discarded.\n * @param enabled When false, the queue will not process any jobs. Assign `enabled` to true to start processing.\n */\n constructor(queueMaxSize?: number, enabled = true) {\n this.queueMaxSize = queueMaxSize;\n this.isEnabled = enabled;\n }\n\n /**\n * Enqueue a new promise.\n * @param promise A new promise to add to the queue.\n */\n enqueue(promise: T) {\n this.queue.push(promise);\n\n // If configured to do so, let's ensure the queue cannot grow too large by removing\n // older unprocessed work. This is great in situations where we know promises are\n // enqueued often and only the latest promises need to be executed.\n if (this.queueMaxSize !== undefined && this.queue.length > this.queueMaxSize) {\n const queueLength = this.queue.length - 1;\n for (let i = 0; i < queueLength; ++i) {\n this.queue.shift();\n }\n }\n\n if (!this.isEnabled) {\n return;\n }\n\n // If there's an active processing promise, it'll be picked up alongside the existing work.\n if (this.activePromise) {\n return;\n }\n // Otherwise we create a promise to handle this.\n this.activePromise = this.dequeue();\n }\n\n get enabled() {\n return this.isEnabled;\n }\n\n /**\n * Enable or disable the queue. When disabled, the queue will not process any jobs.\n * Disabling processing will not cancel any active promises.\n */\n set enabled(value: boolean) {\n if (!this.isEnabled && value && !this.activePromise && this.getRemainingQueueSize() > 0) {\n this.activePromise = this.dequeue();\n }\n this.isEnabled = value;\n }\n\n /**\n * @returns Returns true when work is being actively processed by this queue.\n */\n hasActivePromise() {\n return !!this.activePromise;\n }\n\n /**\n * @returns The number of unexecuted jobs remaining in the queue. Not including the active job.\n */\n getRemainingQueueSize() {\n return this.queue.length;\n }\n\n /**\n * Finalize the queue, any jobs that come in while this is in progress will result\n * in the promise being extended.\n */\n async finalize() {\n if (this.activePromise) return this.activePromise;\n return Promise.resolve();\n }\n\n /**\n * Once called will recursively resolve the jobs in the\n * queue until no more are available.\n */\n private async dequeue() {\n const item = this.queue.shift();\n // Is the queue empty.\n if (!item) {\n this.activePromise = undefined;\n return;\n }\n // Execute & process remaining messages.\n try {\n await item.execute();\n } catch (err) {\n console.log(err);\n } finally {\n await this.dequeue();\n }\n }\n}\n","import { OptionResource, VariantResource } from \"../types\";\n\nexport const getDefaultVariant = (option: OptionResource): VariantResource | undefined => {\n const variants = option.variants;\n if (!variants) {\n return;\n }\n if (variants.length === 1) {\n return variants[0];\n }\n if (option.defaultVariant === undefined) {\n return;\n }\n return variants.find((variant) => variant.id === option.defaultVariant);\n};\n","import { domParser, fetchAsArrayBuffer, fetchAsString, getMimeTypeOfArrayBuffer } from \"./crossplatform\";\nimport { FrameOffsets, OptionResource, Region, VariantResource } from \"../types\";\nimport { getAttributesFromArrayBuffer } from \"./image\";\nimport { FrameData, PatternImageData } from \"../types\";\nimport { getDefaultVariant } from \"../util/option\";\nimport { dataUriToBuffer } from \"data-uri-to-buffer\";\n\n/**\n * A map of src to pattern image data.\n */\nexport const patternImageDataCache = new Map<string, PatternImageData>();\n\n/**\n * A map of frame path to frame data relevant to that path.\n */\nexport const frameDataCache = new Map<string, FrameData>();\n/**\n * A cache of frame data generating promises.\n */\nconst frameDataPromiseCache = new Map<string, Promise<FrameData>>();\n\nexport const generateFrameSVG = async (region?: Region, src?: string): Promise<string> => {\n if (!src) {\n if (!region) throw new Error(\"No region or src supplied. Cannot construct frame!\");\n return generateDefaultRectangleFrameSvg(region);\n }\n return fetchAsString(src);\n};\n\n/**\n * TODO: This function isn't required anymore as the Group element will render a rect internally when no clipPath is given.\n * @param region A region to generate a rect from\n * @returns An SVG string representing a rectangle frame\n */\nexport const generateDefaultRectangleFrameSvg = (region: Region): string => {\n const width = region.width;\n const height = region.height;\n return `<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 ${width} ${height}'>\n <path id=\"target-path\" d='M0 0 h ${width} v ${height} h ${-width} Z' />\n </svg>\n `;\n};\n\nexport const getVariant = (\n designInputStepData: any, // FrameDesignInputStepData from generation types\n option?: OptionResource,\n): undefined | VariantResource => {\n if (!option) {\n return undefined;\n }\n const variant =\n option.variants?.find((variant) => variant.id === designInputStepData.frameVariantId) ||\n getDefaultVariant(option);\n if (!variant) {\n throw new Error(`No variant with ID: ${designInputStepData.frameVariantId}`);\n }\n if (!variant.asset) {\n throw new Error(`No asset for variant with ID: ${designInputStepData.frameVariantId}`);\n }\n return variant;\n};\n\nexport const getFrameData = async (frameSvg: string): Promise<FrameData> => {\n if (frameDataPromiseCache.has(frameSvg)) {\n return frameDataPromiseCache.get(frameSvg)!;\n }\n const getFrameDataPromise = async () => {\n if (frameDataCache.has(frameSvg)) {\n return frameDataCache.get(frameSvg)!;\n }\n await new Promise((resolve) => setTimeout(resolve, 0));\n const parser = domParser();\n const frameDocument = parser.parseFromString(frameSvg, \"image/svg+xml\");\n const svg: Element | undefined = frameDocument.querySelector(\"svg\");\n if (!svg) {\n throw new Error(\"Malformed frame SVG: <svg> tag not found\");\n }\n const viewBox = svg.getAttribute(\"viewBox\");\n if (!viewBox) {\n throw new Error(\"SVG missing viewBox.\");\n }\n const viewBoxElems = viewBox.split(\" \");\n const viewBoxHeight = parseFloat(viewBoxElems[3]) || 1;\n const viewBoxWidth = parseFloat(viewBoxElems[2]) || 1;\n\n const elementById = frameDocument.getElementById(\"target-path\");\n const elementByClass = frameDocument.getElementsByClassName(\"st0\").item(0);\n\n // Newer frames specify a target id that we search for.\n if (elementById) {\n const path = elementById.getAttribute(\"d\");\n if (!path) {\n throw new Error(\"Malformed frame SVG: 'd' attribute not found on target element\");\n }\n const data = {\n path,\n width: viewBoxWidth,\n height: viewBoxHeight,\n };\n frameDataCache.set(path, data);\n return data;\n }\n\n // Common case in older frames, we have this code for backwards compat\n if (elementByClass) {\n const path = elementByClass.getAttribute(\"d\");\n if (!path) {\n throw new Error(\"Malformed frame SVG: 'd' attribute not found on target element\");\n }\n const data = {\n path,\n width: viewBoxWidth,\n height: viewBoxHeight,\n };\n frameDataCache.set(path, data);\n return data;\n }\n\n throw new Error(\"Malformed frame SVG\");\n };\n const frameDataPromise = getFrameDataPromise();\n frameDataPromiseCache.set(frameSvg, frameDataPromise);\n return frameDataPromise;\n};\n\nexport const calculateOffsets = (\n imageData: PatternImageData,\n frameData: FrameData,\n /** @deprecated These values were used by the old imposition system. */\n nondefaults?: { scale?: number; left?: number; top?: number },\n forceImageCover?: boolean,\n): FrameOffsets => {\n // Calculate the aspect ratios of the frame and the image\n const frameAspectRatio = frameData.width / frameData.height;\n const imageAspectRatio = imageData.width / imageData.height;\n\n let scaleFactor;\n if (forceImageCover) {\n // Ensure image covers the entire frame\n if (imageAspectRatio > frameAspectRatio) {\n // Image is wider, scale based on frame height\n scaleFactor = frameData.height / imageData.height;\n } else {\n // Image is taller, scale based on frame width\n scaleFactor = frameData.width / imageData.width;\n }\n } else {\n if (imageAspectRatio > frameAspectRatio) {\n // Image is wider, scale based on frame width\n scaleFactor = frameData.width / imageData.width;\n } else {\n // Image is taller, scale based on frame height\n scaleFactor = frameData.height / imageData.height;\n }\n }\n\n if (nondefaults?.scale !== undefined) {\n scaleFactor *= nondefaults?.scale;\n }\n\n // Compute center and left/top offsets\n const frameCenterHorizontal = frameData.width / 2;\n const frameCenterVertical = frameData.height / 2;\n const defaultLeft = frameCenterHorizontal - (imageData.width / 2) * scaleFactor;\n const left = nondefaults?.left || defaultLeft;\n const defaultTop = frameCenterVertical - (imageData.height / 2) * scaleFactor;\n const top = nondefaults?.top || defaultTop;\n return {\n x: left,\n y: top,\n zoom: scaleFactor,\n };\n};\n\nexport const getPatternImageData = async (src: string): Promise<PatternImageData> => {\n // Check the cache first.\n if (patternImageDataCache.has(src)) {\n return patternImageDataCache.get(src)!;\n }\n\n if (src.startsWith(\"data:image/svg+xml\")) {\n const parsed = dataUriToBuffer(src);\n const svg = new TextDecoder().decode(parsed.buffer);\n const attributes = svgStringDimensions(svg);\n const data = {\n src: src,\n width: attributes.width,\n height: attributes.height,\n aspect: attributes.width / attributes.height,\n };\n patternImageDataCache.set(src, data);\n return data;\n }\n\n // Otherwise load dimensions based on file type. SVG uses viewbox,\n // raster is based on natural dimensions\n const extension = src.split(\".\").pop()?.toLowerCase() ?? \"\";\n if (extension === \"svg\") {\n const svgData = await GetSVGDimensions(src);\n const width = svgData.width;\n const height = svgData.height;\n const data = {\n src: src,\n width,\n height,\n aspect: width / height,\n };\n patternImageDataCache.set(src, data);\n return data;\n } else {\n const arrayBuffer = await fetchAsArrayBuffer(src, true);\n const mimeType = getMimeTypeOfArrayBuffer(arrayBuffer);\n const isJpgExtension = extension === \"jpg\" || extension === \"jpeg\";\n if (!mimeType.endsWith(extension) && mimeType === \"image/jpeg\" && !isJpgExtension) {\n throw Error(`File ${src} has wrong extension for mime type ${mimeType}`);\n }\n const attributes = await getAttributesFromArrayBuffer(arrayBuffer);\n const data = {\n src: src,\n width: attributes.width,\n height: attributes.height,\n aspect: attributes.width / attributes.height,\n };\n patternImageDataCache.set(src, data);\n return data;\n }\n};\n\n/**\n * Returns dimensions of a given svg string in viewbox and rendered form and a dataURL allowing for\n * the SVG to be rendered cross origin on a canvas.\n * @param src The source for the SVG\n */\nexport const GetSVGDimensions = async (\n src: string,\n): Promise<{\n width: number;\n height: number;\n}> => {\n const svgText = await fetchAsString(src);\n return svgStringDimensions(svgText);\n};\n\n/**\n * Handle the different ways that lengths may be specified in an SVG.\n */\nconst lengthToPixels = (length: string): number => {\n if (length.endsWith(\"mm\")) {\n return Number(length.replace(\"mm\", \"\")) * 3.7795275591; // mm to px at 96dpi.\n }\n if (length.endsWith(\"px\")) {\n return Number(length.replace(\"px\", \"\"));\n }\n return Number(length); // Bare pixel amount.\n};\n\n/**\n * Return the dimensions of an SVG string.\n */\nexport const svgStringDimensions = (svgText: string): { width: number; height: number } => {\n const parser = domParser();\n const svgDOM = parser.parseFromString(svgText, \"image/svg+xml\");\n const svgElement = svgDOM.querySelector(\"svg\");\n if (!svgElement) {\n throw new Error(\"No svg tag found, this svg must be malformed!\");\n }\n const viewBox = svgElement.getAttribute(\"viewBox\");\n const width = svgElement.getAttribute(\"width\");\n const height = svgElement.getAttribute(\"height\");\n\n // Prioritize explicit height and width.\n const viewBoxValues =\n height && width\n ? [0, 0, lengthToPixels(width), lengthToPixels(height)]\n : viewBox?.split(\" \").map((str: string) => Number(str));\n if (!viewBoxValues) {\n throw new Error(\"No viewbox or width/height values detected on SVG file!\");\n }\n return {\n width: viewBoxValues[2],\n height: viewBoxValues[3],\n };\n};\n","import Fuse, { FuseResult } from \"fuse.js\";\nimport { ColorDefinition, SpotColorDefinition } from \"../types\";\n\n// TODO: Should we move these lists onto a spreadsheet in the cloud and then process them when required?\nconst pmsValues = [\n \"Yellow C\",\n \"Yellow 012 C\",\n \"Orange 021 C\",\n \"Warm Red C\",\n \"Red 032 C\",\n \"Rubine Red C\",\n \"Rhodamine Red C\",\n \"Purple C\",\n \"Violet C\",\n \"Blue 072 C\",\n \"Reflex Blue C\",\n \"Process Blue C\",\n \"Green C\",\n \"Black C\",\n \"Yellow 0131 C\",\n \"Red 0331 C\",\n \"Magenta 0521 C\",\n \"Violet 0631 C\",\n \"Blue 0821 C\",\n \"Green 0921 C\",\n \"Black 0961 C\",\n \"801 C\",\n \"802 C\",\n \"803 C\",\n \"804 C\",\n \"805 C\",\n \"806 C\",\n \"807 C\",\n \"871 C\",\n \"872 C\",\n \"873 C\",\n \"874 C\",\n \"875 C\",\n \"876 C\",\n \"877 C\",\n \"Medium Yellow C\",\n \"Bright Orange C\",\n \"Bright Red C\",\n \"Strong Red C\",\n \"Pink C\",\n \"Medium Purple C\",\n \"Dark Blue C\",\n \"Medium Blue C\",\n \"Bright Green C\",\n \"Neutral Black C\",\n \"100 C\",\n \"101 C\",\n \"102 C\",\n \"103 C\",\n \"104 C\",\n \"105 C\",\n \"7401 C\",\n \"7402 C\",\n \"7403 C\",\n \"7404 C\",\n \"7405 C\",\n \"7406 C\",\n \"7407 C\",\n \"106 C\",\n \"107 C\",\n \"108 C\",\n \"109 C\",\n \"110 C\",\n \"111 C\",\n \"112 C\",\n \"113 C\",\n \"114 C\",\n \"115 C\",\n \"116 C\",\n \"117 C\",\n \"118 C\",\n \"119 C\",\n \"127 C\",\n \"128 C\",\n \"129 C\",\n \"130 C\",\n \"131 C\",\n \"132 C\",\n \"133 C\",\n \"1205 C\",\n \"1215 C\",\n \"1225 C\",\n \"1235 C\",\n \"1245 C\",\n \"1255 C\",\n \"1265 C\",\n \"120 C\",\n \"121 C\",\n \"122 C\",\n \"123 C\",\n \"124 C\",\n \"125 C\",\n \"126 C\",\n \"7548 C\",\n \"7549 C\",\n \"7550 C\",\n \"7551 C\",\n \"7552 C\",\n \"7553 C\",\n \"7554 C\",\n \"7555 C\",\n \"7556 C\",\n \"7557 C\",\n \"7558 C\",\n \"7559 C\",\n \"7560 C\",\n \"7561 C\",\n \"134 C\",\n \"135 C\",\n \"136 C\",\n \"137 C\",\n \"138 C\",\n \"139 C\",\n \"140 C\",\n \"1345 C\",\n \"1355 C\",\n \"1365 C\",\n \"1375 C\",\n \"1385 C\",\n \"1395 C\",\n \"1405 C\",\n \"141 C\",\n \"142 C\",\n \"143 C\",\n \"144 C\",\n \"145 C\",\n \"146 C\",\n \"147 C\",\n \"7408 C\",\n \"7409 C\",\n \"7410 C\",\n \"7411 C\",\n \"7412 C\",\n \"7413 C\",\n \"7414 C\",\n \"7562 C\",\n \"7563 C\",\n \"7564 C\",\n \"7565 C\",\n \"7566 C\",\n \"7567 C\",\n \"7568 C\",\n \"7569 C\",\n \"7570 C\",\n \"7571 C\",\n \"7572 C\",\n \"7573 C\",\n \"7574 C\",\n \"7575 C\",\n \"712 C\",\n \"713 C\",\n \"714 C\",\n \"715 C\",\n \"716 C\",\n \"717 C\",\n \"718 C\",\n \"148 C\",\n \"149 C\",\n \"150 C\",\n \"151 C\",\n \"152 C\",\n \"153 C\",\n \"154 C\",\n \"155 C\",\n \"156 C\",\n \"157 C\",\n \"158 C\",\n \"159 C\",\n \"160 C\",\n \"161 C\",\n \"1485 C\",\n \"1495 C\",\n \"1505 C\",\n \"1525 C\",\n \"1535 C\",\n \"1545 C\",\n \"1555 C\",\n \"1565 C\",\n \"1575 C\",\n \"1585 C\",\n \"1595 C\",\n \"1605 C\",\n \"1615 C\",\n \"162 C\",\n \"163 C\",\n \"164 C\",\n \"165 C\",\n \"166 C\",\n \"167 C\",\n \"168 C\",\n \"7576 C\",\n \"7577 C\",\n \"7578 C\",\n \"7579 C\",\n \"7580 C\",\n \"7581 C\",\n \"7582 C\",\n \"1625 C\",\n \"1635 C\",\n \"1645 C\",\n \"1655 C\",\n \"1665 C\",\n \"1675 C\",\n \"1685 C\",\n \"169 C\",\n \"170 C\",\n \"171 C\",\n \"172 C\",\n \"173 C\",\n \"174 C\",\n \"175 C\",\n \"7583 C\",\n \"7584 C\",\n \"7585 C\",\n \"7586 C\",\n \"7587 C\",\n \"7588 C\",\n \"7589 C\",\n \"7590 C\",\n \"7591 C\",\n \"7592 C\",\n \"7593 C\",\n \"7594 C\",\n \"7595 C\",\n \"7596 C\",\n \"7597 C\",\n \"7598 C\",\n \"7599 C\",\n \"7600 C\",\n \"7601 C\",\n \"7602 C\",\n \"7603 C\",\n \"7604 C\",\n \"7605 C\",\n \"7606 C\",\n \"7607 C\",\n \"7608 C\",\n \"7609 C\",\n \"7610 C\",\n \"7611 C\",\n \"7612 C\",\n \"7613 C\",\n \"7614 C\",\n \"7615 C\",\n \"7616 C\",\n \"7617 C\",\n \"7520 C\",\n \"7521 C\",\n \"7522 C\",\n \"7523 C\",\n \"7524 C\",\n \"7525 C\",\n \"7526 C\",\n \"489 C\",\n \"488 C\",\n \"487 C\",\n \"486 C\",\n \"485 C\",\n \"484 C\",\n \"483 C\",\n \"176 C\",\n \"177 C\",\n \"178 C\",\n \"179 C\",\n \"180 C\",\n \"181 C\",\n \"1765 C\",\n \"1775 C\",\n \"1785 C\",\n \"1788 C\",\n \"1795 C\",\n \"1805 C\",\n \"1815 C\",\n \"1767 C\",\n \"1777 C\",\n \"1787 C\",\n \"1797 C\",\n \"1807 C\",\n \"1817 C\",\n \"7618 C\",\n \"7619 C\",\n \"7620 C\",\n \"7621 C\",\n \"7622 C\",\n \"7623 C\",\n \"7624 C\",\n \"7625 C\",\n \"7626 C\",\n \"7627 C\",\n \"7628 C\",\n \"7629 C\",\n \"7630 C\",\n \"7631 C\",\n \"7415 C\",\n \"7416 C\",\n \"7417 C\",\n \"7418 C\",\n \"7419 C\",\n \"7420 C\",\n \"7421 C\",\n \"182 C\",\n \"183 C\",\n \"184 C\",\n \"185 C\",\n \"186 C\",\n \"187 C\",\n \"188 C\",\n \"196 C\",\n \"197 C\",\n \"198 C\",\n \"199 C\",\n \"200 C\",\n \"201 C\",\n \"202 C\",\n \"189 C\",\n \"190 C\",\n \"191 C\",\n \"192 C\",\n \"193 C\",\n \"194 C\",\n \"195 C\",\n \"1895 C\",\n \"1905 C\",\n \"1915 C\",\n \"1925 C\",\n \"1935 C\",\n \"1945 C\",\n \"1955 C\",\n \"705 C\",\n \"706 C\",\n \"707 C\",\n \"708 C\",\n \"709 C\",\n \"710 C\",\n \"711 C\",\n \"698 C\",\n \"699 C\",\n \"700 C\",\n \"701 C\",\n \"702 C\",\n \"703 C\",\n \"704 C\",\n \"203 C\",\n \"204 C\",\n \"205 C\",\n \"206 C\",\n \"207 C\",\n \"208 C\",\n \"209 C\",\n \"210 C\",\n \"211 C\",\n \"212 C\",\n \"213 C\",\n \"214 C\",\n \"215 C\",\n \"216 C\",\n \"7422 C\",\n \"7423 C\",\n \"7424 C\",\n \"7425 C\",\n \"7426 C\",\n \"7427 C\",\n \"7428 C\",\n \"7632 C\",\n \"7633 C\",\n \"7634 C\",\n \"7635 C\",\n \"7636 C\",\n \"7637 C\",\n \"7638 C\",\n \"217 C\",\n \"218 C\",\n \"219 C\",\n \"220 C\",\n \"221 C\",\n \"222 C\",\n \"7639 C\",\n \"7640 C\",\n \"7641 C\",\n \"7642 C\",\n \"7643 C\",\n \"7644 C\",\n \"7645 C\",\n \"223 C\",\n \"224 C\",\n \"225 C\",\n \"226 C\",\n \"227 C\",\n \"228 C\",\n \"229 C\",\n \"230 C\",\n \"231 C\",\n \"232 C\",\n \"233 C\",\n \"234 C\",\n \"235 C\",\n \"670 C\",\n \"671 C\",\n \"672 C\",\n \"673 C\",\n \"674 C\",\n \"675 C\",\n \"676 C\",\n \"677 C\",\n \"678 C\",\n \"679 C\",\n \"680 C\",\n \"681 C\",\n \"682 C\",\n \"683 C\",\n \"684 C\",\n \"685 C\",\n \"686 C\",\n \"687 C\",\n \"688 C\",\n \"689 C\",\n \"690 C\",\n \"510 C\",\n \"509 C\",\n \"508 C\",\n \"507 C\",\n \"506 C\",\n \"505 C\",\n \"504 C\",\n \"7429 C\",\n \"7430 C\",\n \"7431 C\",\n \"7432 C\",\n \"7433 C\",\n \"7434 C\",\n \"7435 C\",\n \"691 C\",\n \"692 C\",\n \"693 C\",\n \"694 C\",\n \"695 C\",\n \"696 C\",\n \"697 C\",\n \"496 C\",\n \"495 C\",\n \"494 C\",\n \"493 C\",\n \"492 C\",\n \"491 C\",\n \"490 C\",\n \"503 C\",\n \"502 C\",\n \"501 C\",\n \"500 C\",\n \"499 C\",\n \"498 C\",\n \"497 C\",\n \"5035 C\",\n \"5025 C\",\n \"5015 C\",\n \"5005 C\",\n \"4995 C\",\n \"4985 C\",\n \"4975 C\",\n \"236 C\",\n \"237 C\",\n \"238 C\",\n \"239 C\",\n \"240 C\",\n \"241 C\",\n \"242 C\",\n \"2365 C\",\n \"2375 C\",\n \"2385 C\",\n \"2395 C\",\n \"2405 C\",\n \"2415 C\",\n \"2425 C\",\n \"243 C\",\n \"244 C\",\n \"245 C\",\n \"246 C\",\n \"247 C\",\n \"248 C\",\n \"249 C\",\n \"7646 C\",\n \"7647 C\",\n \"7648 C\",\n \"7649 C\",\n \"7650 C\",\n \"7651 C\",\n \"7652 C\",\n \"250 C\",\n \"251 C\",\n \"252 C\",\n \"253 C\",\n \"254 C\",\n \"255 C\",\n \"517 C\",\n \"516 C\",\n \"515 C\",\n \"514 C\",\n \"513 C\",\n \"512 C\",\n \"511 C\",\n \"7436 C\",\n \"7437 C\",\n \"7438 C\",\n \"7439 C\",\n \"7440 C\",\n \"7441 C\",\n \"7442 C\",\n \"2562 C\",\n \"2572 C\",\n \"2582 C\",\n \"2592 C\",\n \"2602 C\",\n \"2612 C\",\n \"2622 C\",\n \"7653 C\",\n \"7654 C\",\n \"7655 C\",\n \"7656 C\",\n \"7657 C\",\n \"7658 C\",\n \"7659 C\",\n \"524 C\",\n \"523 C\",\n \"522 C\",\n \"521 C\",\n \"520 C\",\n \"519 C\",\n \"518 C\",\n \"5245 C\",\n \"5235 C\",\n \"5225 C\",\n \"5215 C\",\n \"5205 C\",\n \"5195 C\",\n \"5185 C\",\n \"5175 C\",\n \"5165 C\",\n \"5155 C\",\n \"5145 C\",\n \"5135 C\",\n \"5125 C\",\n \"5115 C\",\n \"531 C\",\n \"530 C\",\n \"529 C\",\n \"528 C\",\n \"527 C\",\n \"526 C\",\n \"525 C\",\n \"256 C\",\n \"257 C\",\n \"258 C\",\n \"259 C\",\n \"260 C\",\n \"261 C\",\n \"262 C\",\n \"2563 C\",\n \"2573 C\",\n \"2583 C\",\n \"2593 C\",\n \"2603 C\",\n \"2613 C\",\n \"2623 C\",\n \"7660 C\",\n \"7661 C\",\n \"7662 C\",\n \"7663 C\",\n \"7664 C\",\n \"7665 C\",\n \"7666 C\",\n \"2567 C\",\n \"2577 C\",\n \"2587 C\",\n \"2597 C\",\n \"2607 C\",\n \"2617 C\",\n \"2627 C\",\n \"263 C\",\n \"264 C\",\n \"265 C\",\n \"266 C\",\n \"267 C\",\n \"268 C\",\n \"269 C\",\n \"2635 C\",\n \"2645 C\",\n \"2655 C\",\n \"2665 C\",\n \"2685 C\",\n \"2695 C\",\n \"270 C\",\n \"271 C\",\n \"272 C\",\n \"273 C\",\n \"274 C\",\n \"275 C\",\n \"276 C\",\n \"2705 C\",\n \"2715 C\",\n \"2725 C\",\n \"2735 C\",\n \"2745 C\",\n \"2755 C\",\n \"2765 C\",\n \"7667 C\",\n \"7668 C\",\n \"7669 C\",\n \"7670 C\",\n \"7671 C\",\n \"7672 C\",\n \"7673 C\",\n \"7443 C\",\n \"7444 C\",\n \"7445 C\",\n \"7446 C\",\n \"7447 C\",\n \"7448 C\",\n \"7449 C\",\n \"7674 C\",\n \"7675 C\",\n \"7676 C\",\n \"7677 C\",\n \"7678 C\",\n \"7679 C\",\n \"7680 C\",\n \"663 C\",\n \"664 C\",\n \"665 C\",\n \"666 C\",\n \"667 C\",\n \"668 C\",\n \"669 C\",\n \"5315 C\",\n \"5305 C\",\n \"5295 C\",\n \"5285 C\",\n \"5275 C\",\n \"5265 C\",\n \"5255 C\",\n \"538 C\",\n \"537 C\",\n \"536 C\",\n \"535 C\",\n \"534 C\",\n \"533 C\",\n \"532 C\",\n \"7541 C\",\n \"7542 C\",\n \"7543 C\",\n \"7544 C\",\n \"7545 C\",\n \"7546 C\",\n \"7547 C\",\n \"552 C\",\n \"551 C\",\n \"550 C\",\n \"549 C\",\n \"548 C\",\n \"547 C\",\n \"546 C\",\n \"5455 C\",\n \"5445 C\",\n \"5435 C\",\n \"5425 C\",\n \"5415 C\",\n \"5405 C\",\n \"5395 C\",\n \"642 C\",\n \"643 C\",\n \"644 C\",\n \"645 C\",\n \"646 C\",\n \"647 C\",\n \"648 C\",\n \"649 C\",\n \"650 C\",\n \"651 C\",\n \"652 C\",\n \"653 C\",\n \"654 C\",\n \"655 C\",\n \"656 C\",\n \"657 C\",\n \"658 C\",\n \"659 C\",\n \"660 C\",\n \"661 C\",\n \"662 C\",\n \"7450 C\",\n \"7451 C\",\n \"7452 C\",\n \"7453 C\",\n \"7454 C\",\n \"7455 C\",\n \"7456 C\",\n \"2706 C\",\n \"2716 C\",\n \"2726 C\",\n \"2736 C\",\n \"2746 C\",\n \"2756 C\",\n \"2766 C\",\n \"2708 C\",\n \"2718 C\",\n \"2728 C\",\n \"2738 C\",\n \"2748 C\",\n \"2758 C\",\n \"2768 C\",\n \"2707 C\",\n \"2717 C\",\n \"2727 C\",\n \"2747 C\",\n \"2757 C\",\n \"2767 C\",\n \"277 C\",\n \"278 C\",\n \"279 C\",\n \"280 C\",\n \"281 C\",\n \"282 C\",\n \"283 C\",\n \"284 C\",\n \"285 C\",\n \"286 C\",\n \"287 C\",\n \"288 C\",\n \"289 C\",\n \"7681 C\",\n \"7682 C\",\n \"7683 C\",\n \"7684 C\",\n \"7685 C\",\n \"7686 C\",\n \"7687 C\",\n \"545 C\",\n \"544 C\",\n \"543 C\",\n \"542 C\",\n \"541 C\",\n \"540 C\",\n \"539 C\",\n \"290 C\",\n \"291 C\",\n \"292 C\",\n \"293 C\",\n \"294 C\",\n \"295 C\",\n \"296 C\",\n \"2905 C\",\n \"2915 C\",\n \"2925 C\",\n \"2935 C\",\n \"2945 C\",\n \"2955 C\",\n \"2965 C\",\n \"297 C\",\n \"298 C\",\n \"299 C\",\n \"300 C\",\n \"301 C\",\n \"302 C\",\n \"303 C\",\n \"7688 C\",\n \"7689 C\",\n \"7690 C\",\n \"7691 C\",\n \"7692 C\",\n \"7693 C\",\n \"7694 C\",\n \"2975 C\",\n \"2985 C\",\n \"2995 C\",\n \"3005 C\",\n \"3015 C\",\n \"3025 C\",\n \"3035 C\",\n \"7695 C\",\n \"7696 C\",\n \"7697 C\",\n \"7698 C\",\n \"7699 C\",\n \"7700 C\",\n \"7701 C\",\n \"7457 C\",\n \"7458 C\",\n \"7459 C\",\n \"7460 C\",\n \"7461 C\",\n \"7462 C\",\n \"7463 C\",\n \"304 C\",\n \"305 C\",\n \"306 C\",\n \"307 C\",\n \"308 C\",\n \"309 C\",\n \"635 C\",\n \"636 C\",\n \"637 C\",\n \"638 C\",\n \"639 C\",\n \"640 C\",\n \"641 C\",\n \"7702 C\",\n \"7703 C\",\n \"7704 C\",\n \"7705 C\",\n \"7706 C\",\n \"7707 C\",\n \"7708 C\",\n \"628 C\",\n \"629 C\",\n \"630 C\",\n \"631 C\",\n \"632 C\",\n \"633 C\",\n \"634 C\",\n \"310 C\",\n \"311 C\",\n \"312 C\",\n \"313 C\",\n \"314 C\",\n \"315 C\",\n \"316 C\",\n \"3105 C\",\n \"3115 C\",\n \"3125 C\",\n \"3135 C\",\n \"3145 C\",\n \"3155 C\",\n \"3165 C\",\n \"7709 C\",\n \"7710 C\",\n \"7711 C\",\n \"7712 C\",\n \"7713 C\",\n \"7714 C\",\n \"7715 C\",\n \"317 C\",\n \"318 C\",\n \"319 C\",\n \"320 C\",\n \"321 C\",\n \"322 C\",\n \"323 C\",\n \"7464 C\",\n \"7465 C\",\n \"7466 C\",\n \"7467 C\",\n \"7468 C\",\n \"7469 C\",\n \"7470 C\",\n \"7471 C\",\n \"7472 C\",\n \"7473 C\",\n \"7474 C\",\n \"7475 C\",\n \"7476 C\",\n \"7477 C\",\n \"5523 C\",\n \"5513 C\",\n \"5503 C\",\n \"5493 C\",\n \"5483 C\",\n \"5473 C\",\n \"5463 C\",\n \"7716 C\",\n \"7717 C\",\n \"7718 C\",\n \"7719 C\",\n \"7720 C\",\n \"7721 C\",\n \"7722 C\",\n \"324 C\",\n \"325 C\",\n \"326 C\",\n \"327 C\",\n \"328 C\",\n \"329 C\",\n \"330 C\",\n \"3242 C\",\n \"3252 C\",\n \"3262 C\",\n \"3272 C\",\n \"3282 C\",\n \"3292 C\",\n \"3302 C\",\n \"3245 C\",\n \"3255 C\",\n \"3265 C\",\n \"3275 C\",\n \"3285 C\",\n \"3295 C\",\n \"3305 C\",\n \"3248 C\",\n \"3258 C\",\n \"3268 C\",\n \"3278 C\",\n \"3288 C\",\n \"3298 C\",\n \"3308 C\",\n \"566 C\",\n \"565 C\",\n \"564 C\",\n \"563 C\",\n \"562 C\",\n \"561 C\",\n \"560 C\",\n \"573 C\",\n \"572 C\",\n \"571 C\",\n \"570 C\",\n \"569 C\",\n \"568 C\",\n \"567 C\",\n \"559 C\",\n \"558 C\",\n \"557 C\",\n \"556 C\",\n \"555 C\",\n \"554 C\",\n \"553 C\",\n \"5595 C\",\n \"5585 C\",\n \"5575 C\",\n \"5565 C\",\n \"5555 C\",\n \"5545 C\",\n \"5535 C\",\n \"5665 C\",\n \"5655 C\",\n \"5645 C\",\n \"5635 C\",\n \"5625 C\",\n \"5615 C\",\n \"5605 C\",\n \"5527 C\",\n \"5517 C\",\n \"5507 C\",\n \"5497 C\",\n \"5487 C\",\n \"5477 C\",\n \"5467 C\",\n \"621 C\",\n \"622 C\",\n \"623 C\",\n \"624 C\",\n \"625 C\",\n \"626 C\",\n \"627 C\",\n \"331 C\",\n \"332 C\",\n \"333 C\",\n \"334 C\",\n \"335 C\",\n \"336 C\",\n \"337 C\",\n \"338 C\",\n \"339 C\",\n \"340 C\",\n \"341 C\",\n \"342 C\",\n \"343 C\",\n \"7723 C\",\n \"7724 C\",\n \"7725 C\",\n \"7726 C\",\n \"7727 C\",\n \"7728 C\",\n \"7729 C\",\n \"3375 C\",\n \"3385 C\",\n \"3395 C\",\n \"3405 C\",\n \"3415 C\",\n \"3425 C\",\n \"3435 C\",\n \"344 C\",\n \"345 C\",\n \"346 C\",\n \"347 C\",\n \"348 C\",\n \"349 C\",\n \"350 C\",\n \"351 C\",\n \"352 C\",\n \"353 C\",\n \"354 C\",\n \"355 C\",\n \"356 C\",\n \"357 C\",\n \"7478 C\",\n \"7479 C\",\n \"7480 C\",\n \"7481 C\",\n \"7482 C\",\n \"7483 C\",\n \"7484 C\",\n \"7730 C\",\n \"7731 C\",\n \"7732 C\",\n \"7733 C\",\n \"7734 C\",\n \"7735 C\",\n \"7736 C\",\n \"7737 C\",\n \"7738 C\",\n \"7739 C\",\n \"7740 C\",\n \"7741 C\",\n \"7742 C\",\n \"7743 C\",\n \"358 C\",\n \"359 C\",\n \"360 C\",\n \"361 C\",\n \"362 C\",\n \"363 C\",\n \"364 C\",\n \"7485 C\",\n \"7486 C\",\n \"7487 C\",\n \"7488 C\",\n \"7489 C\",\n \"7490 C\",\n \"7491 C\",\n \"365 C\",\n \"366 C\",\n \"367 C\",\n \"368 C\",\n \"369 C\",\n \"370 C\",\n \"371 C\",\n \"372 C\",\n \"373 C\",\n \"374 C\",\n \"375 C\",\n \"376 C\",\n \"377 C\",\n \"378 C\",\n \"580 C\",\n \"579 C\",\n \"578 C\",\n \"577 C\",\n \"576 C\",\n \"575 C\",\n \"574 C\",\n \"5807 C\",\n \"5797 C\",\n \"5787 C\",\n \"5777 C\",\n \"5767 C\",\n \"5757 C\",\n \"5747 C\",\n \"5875 C\",\n \"5865 C\",\n \"5855 C\",\n \"5845 C\",\n \"5835 C\",\n \"5825 C\",\n \"5815 C\",\n \"5803 C\",\n \"5793 C\",\n \"5783 C\",\n \"5773 C\",\n \"5763 C\",\n \"5753 C\",\n \"5743 C\",\n \"7492 C\",\n \"7493 C\",\n \"7494 C\",\n \"7495 C\",\n \"7496 C\",\n \"7497 C\",\n \"7498 C\",\n \"7744 C\",\n \"7745 C\",\n \"7746 C\",\n \"7747 C\",\n \"7748 C\",\n \"7749 C\",\n \"7750 C\",\n \"379 C\",\n \"380 C\",\n \"381 C\",\n \"382 C\",\n \"383 C\",\n \"384 C\",\n \"385 C\",\n \"386 C\",\n \"387 C\",\n \"388 C\",\n \"389 C\",\n \"390 C\",\n \"391 C\",\n \"392 C\",\n \"587 C\",\n \"586 C\",\n \"585 C\",\n \"584 C\",\n \"583 C\",\n \"582 C\",\n \"581 C\",\n \"393 C\",\n \"394 C\",\n \"395 C\",\n \"396 C\",\n \"397 C\",\n \"398 C\",\n \"399 C\",\n \"3935 C\",\n \"3945 C\",\n \"3955 C\",\n \"3965 C\",\n \"3975 C\",\n \"3985 C\",\n \"3995 C\",\n \"600 C\",\n \"601 C\",\n \"602 C\",\n \"603 C\",\n \"604 C\",\n \"605 C\",\n \"606 C\",\n \"607 C\",\n \"608 C\",\n \"609 C\",\n \"610 C\",\n \"611 C\",\n \"612 C\",\n \"613 C\",\n \"461 C\",\n \"460 C\",\n \"459 C\",\n \"458 C\",\n \"457 C\",\n \"456 C\",\n \"455 C\",\n \"614 C\",\n \"615 C\",\n \"616 C\",\n \"617 C\",\n \"618 C\",\n \"619 C\",\n \"620 C\",\n \"7751 C\",\n \"7752 C\",\n \"7753 C\",\n \"7754 C\",\n \"7755 C\",\n \"7756 C\",\n \"7757 C\",\n \"7758 C\",\n \"7759 C\",\n \"7760 C\",\n \"7761 C\",\n \"7762 C\",\n \"7763 C\",\n \"7764 C\",\n \"7765 C\",\n \"7766 C\",\n \"7767 C\",\n \"7768 C\",\n \"7769 C\",\n \"7770 C\",\n \"7771 C\",\n \"4545 C\",\n \"4535 C\",\n \"4525 C\",\n \"4515 C\",\n \"4505 C\",\n \"4495 C\",\n \"4485 C\",\n \"454 C\",\n \"453 C\",\n \"452 C\",\n \"451 C\",\n \"450 C\",\n \"449 C\",\n \"448 C\",\n \"7499 C\",\n \"7500 C\",\n \"7501 C\",\n \"7502 C\",\n \"7503 C\",\n \"7504 C\",\n \"7505 C\",\n \"468 C\",\n \"467 C\",\n \"466 C\",\n \"465 C\",\n \"464 C\",\n \"463 C\",\n \"462 C\",\n \"7506 C\",\n \"7507 C\",\n \"7508 C\",\n \"7509 C\",\n \"7510 C\",\n \"7511 C\",\n \"7512 C\",\n \"719 C\",\n \"720 C\",\n \"721 C\",\n \"722 C\",\n \"723 C\",\n \"724 C\",\n \"725 C\",\n \"475 C\",\n \"474 C\",\n \"473 C\",\n \"472 C\",\n \"471 C\",\n \"470 C\",\n \"469 C\",\n \"726 C\",\n \"727 C\",\n \"728 C\",\n \"729 C\",\n \"730 C\",\n \"731 C\",\n \"732 C\",\n \"4685 C\",\n \"4675 C\",\n \"4665 C\",\n \"4655 C\",\n \"4645 C\",\n \"4635 C\",\n \"4625 C\",\n \"7513 C\",\n \"7514 C\",\n \"7515 C\",\n \"7516 C\",\n \"7517 C\",\n \"7518 C\",\n \"7519 C\",\n \"4755 C\",\n \"4745 C\",\n \"4735 C\",\n \"4725 C\",\n \"4715 C\",\n \"4705 C\",\n \"4695 C\",\n \"482 C\",\n \"481 C\",\n \"480 C\",\n \"479 C\",\n \"478 C\",\n \"477 C\",\n \"476 C\",\n \"7527 C\",\n \"7528 C\",\n \"7529 C\",\n \"7530 C\",\n \"7531 C\",\n \"7532 C\",\n \"7533 C\",\n \"7534 C\",\n \"7535 C\",\n \"7536 C\",\n \"7537 C\",\n \"7538 C\",\n \"7539 C\",\n \"7540 C\",\n \"427 C\",\n \"428 C\",\n \"429 C\",\n \"430 C\",\n \"431 C\",\n \"432 C\",\n \"433 C\",\n \"420 C\",\n \"421 C\",\n \"422 C\",\n \"423 C\",\n \"424 C\",\n \"425 C\",\n \"426 C\",\n \"441 C\",\n \"442 C\",\n \"443 C\",\n \"444 C\",\n \"445 C\",\n \"446 C\",\n \"447 C\",\n \"413 C\",\n \"414 C\",\n \"415 C\",\n \"416 C\",\n \"417 C\",\n \"418 C\",\n \"419 C\",\n \"400 C\",\n \"401 C\",\n \"402 C\",\n \"403 C\",\n \"404 C\",\n \"405 C\",\n \"406 C\",\n \"407 C\",\n \"408 C\",\n \"409 C\",\n \"410 C\",\n \"411 C\",\n \"412 C\",\n \"434 C\",\n \"435 C\",\n \"436 C\",\n \"437 C\",\n \"438 C\",\n \"439 C\",\n \"440 C\",\n \"Warm Gray 1 C\",\n \"Warm Gray 2 C\",\n \"Warm Gray 3 C\",\n \"Warm Gray 4 C\",\n \"Warm Gray 5 C\",\n \"Warm Gray 6 C\",\n \"Warm Gray 7 C\",\n \"Warm Gray 8 C\",\n \"Warm Gray 9 C\",\n \"Warm Gray 10 C\",\n \"Warm Gray 11 C\",\n \"Cool Gray 1 C\",\n \"Cool Gray 2 C\",\n \"Cool Gray 3 C\",\n \"Cool Gray 4 C\",\n \"Cool Gray 5 C\",\n \"Cool Gray 6 C\",\n \"Cool Gray 7 C\",\n \"Cool Gray 8 C\",\n \"Cool Gray 9 C\",\n \"Cool Gray 10 C\",\n \"Cool Gray 11 C\",\n \"Black 2 C\",\n \"Black 3 C\",\n \"Black 4 C\",\n \"Black 5 C\",\n \"Black 6 C\",\n \"Black 7 C\",\n];\n\nconst hexValues = [\n \"FEDD00\",\n \"FFD700\",\n \"FE5000\",\n \"F9423A\",\n \"EF3340\",\n \"CE0058\",\n \"E10098\",\n \"BB29BB\",\n \"440099\",\n \"10069F\",\n \"001489\",\n \"0085CA\",\n \"00AB84\",\n \"2D2926\",\n \"F2F0A1\",\n \"FCAEBB\",\n \"F1B2DC\",\n \"BF9BDE\",\n \"74D1EA\",\n \"9DE7D7\",\n \"9E978E\",\n \"009ACE\",\n \"44D62C\",\n \"FFE900\",\n \"FFAA4D\",\n \"FF7276\",\n \"FF3EB5\",\n \"EA27C2\",\n \"84754E\",\n \"85714D\",\n \"866D4B\",\n \"8B6F4E\",\n \"87674F\",\n \"8B634B\",\n \"8A8D8F\",\n \"FFD900\",\n \"FF5E00\",\n \"F93822\",\n \"CE0056\",\n \"D62598\",\n \"4E008E\",\n \"00239C\",\n \"0084CA\",\n \"00B08B\",\n \"222223\",\n \"F6EB61\",\n \"F7EA48\",\n \"FCE300\",\n \"C5A900\",\n \"AF9800\",\n \"897A27\",\n \"F5E1A4\",\n \"ECD898\",\n \"EED484\",\n \"F4DA40\",\n \"F2CD00\",\n \"F1C400\",\n \"CBA052\",\n \"F9E547\",\n \"FBE122\",\n \"FEDB00\",\n \"FFD100\",\n \"DAAA00\",\n \"AA8A00\",\n \"9C8412\",\n \"FAE053\",\n \"FBDD40\",\n \"FDDA24\",\n \"FFCD00\",\n \"C99700\",\n \"AC8400\",\n \"897322\",\n \"F3DD6D\",\n \"F3D54E\",\n \"F3D03E\",\n \"F2A900\",\n \"CC8A00\",\n \"A07400\",\n \"6C571B\",\n \"F8E08E\",\n \"FBD872\",\n \"FFC845\",\n \"FFB81C\",\n \"C69214\",\n \"AD841F\",\n \"886B25\",\n \"FBDB65\",\n \"FDD757\",\n \"FED141\",\n \"FFC72C\",\n \"EAAA00\",\n \"B58500\",\n \"9A7611\",\n \"FFC600\",\n \"FFB500\",\n \"D19000\",\n \"B47E00\",\n \"73531D\",\n \"5A4522\",\n \"4B3D2A\",\n \"D29F13\",\n \"B78B20\",\n \"9F7D23\",\n \"967126\",\n \"8F6A2A\",\n \"7D622E\",\n \"6C5D34\",\n \"FDD26E\",\n \"FFC658\",\n \"FFBF3F\",\n \"FFA300\",\n \"DE7C00\",\n \"AF6D04\",\n \"74531C\",\n \"FDD086\",\n \"FFC56E\",\n \"FFB549\",\n \"FF9E1B\",\n \"D57800\",\n \"996017\",\n \"6E4C1E\",\n \"F2C75C\",\n \"F1BE48\",\n \"F1B434\",\n \"ED8B00\",\n \"CF7F00\",\n \"A76D11\",\n \"715C2A\",\n \"F6BE00\",\n \"F0B323\",\n \"FEAD77\",\n \"E6A65D\",\n \"D38235\",\n \"DC8633\",\n \"C16C18\",\n \"BD9B60\",\n \"D69A2D\",\n \"DB8A06\",\n \"CD7925\",\n \"AD6433\",\n \"89532F\",\n \"775135\",\n \"D78825\",\n \"D3832B\",\n \"C67D30\",\n \"B67233\",\n \"A7662B\",\n \"9E6A38\",\n \"835D32\",\n \"FCC89B\",\n \"FDBE87\",\n \"FDAA63\",\n \"F68D2E\",\n \"EA7600\",\n \"D45D00\",\n \"BE4D00\",\n \"FECB8B\",\n \"FFC27B\",\n \"FFB25B\",\n \"FF8200\",\n \"E57200\",\n \"BE6A14\",\n \"9B5A1A\",\n \"EFD19F\",\n \"EFBE7D\",\n \"ECA154\",\n \"E87722\",\n \"CB6015\",\n \"A1561C\",\n \"603D20\",\n \"FFAE62\",\n \"FF8F1C\",\n \"FF6900\",\n \"B94700\",\n \"94450B\",\n \"653819\",\n \"FFB990\",\n \"FFA06A\",\n \"FF7F32\",\n \"FF6A13\",\n \"D86018\",\n \"A65523\",\n \"8B4720\",\n \"FFBE9F\",\n \"FF9D6E\",\n \"FF7F41\",\n \"FF671F\",\n \"E35205\",\n \"BE531C\",\n \"73381D\",\n \"DB864E\",\n \"E07E3C\",\n \"DC6B2F\",\n \"DC582A\",\n \"C05131\",\n \"864A33\",\n \"674736\",\n \"FFA38B\",\n \"FF8D6D\",\n \"FF6A39\",\n \"FC4C02\",\n \"DC4405\",\n \"A9431E\",\n \"833921\",\n \"FFB3AB\",\n \"FF8674\",\n \"FF5C39\",\n \"FA4616\",\n \"CF4520\",\n \"963821\",\n \"6B3529\",\n \"C4622D\",\n \"BA5826\",\n \"AF5C37\",\n \"9E5330\",\n \"924C2E\",\n \"7B4D35\",\n \"5C4738\",\n \"D4B59E\",\n \"C07D59\",\n \"B15533\",\n \"9D432C\",\n \"7C3A2D\",\n \"6B3D2E\",\n \"5C3D31\",\n \"D14124\",\n \"BD472A\",\n \"B33D26\",\n \"8D3F2B\",\n \"83412C\",\n \"7B4931\",\n \"674230\",\n \"E4D5D3\",\n \"E1BBB4\",\n \"D6938A\",\n \"C26E60\",\n \"A4493D\",\n \"823B34\",\n \"683431\",\n \"DDBCB0\",\n \"CA9A8E\",\n \"BC8A7E\",\n \"A37F74\",\n \"866761\",\n \"6B4C4C\",\n \"583D3E\",\n \"EABEB0\",\n \"C09C83\",\n \"B46A55\",\n \"AB5C57\",\n \"A45248\",\n \"9A6A4F\",\n \"8A391B\",\n \"ECC3B2\",\n \"ECBAA8\",\n \"EAA794\",\n \"E8927C\",\n \"DA291C\",\n \"9A3324\",\n \"653024\",\n \"FFB1BB\",\n \"FF808B\",\n \"FF585D\",\n \"E03C31\",\n \"BE3A34\",\n \"81312F\",\n \"FFA3B5\",\n \"FF8DA1\",\n \"F8485E\",\n \"EE2737\",\n \"D22630\",\n \"AF272F\",\n \"7C2529\",\n \"FCAFC0\",\n \"FB637E\",\n \"F4364C\",\n \"CB333B\",\n \"A4343A\",\n \"643335\",\n \"C66E4E\",\n \"C04C36\",\n \"B7312C\",\n \"AB2328\",\n \"93272C\",\n \"8A2A2B\",\n \"802F2D\",\n \"E1523D\",\n \"C63527\",\n \"A72B2A\",\n \"9E2A2B\",\n \"6D3332\",\n \"633231\",\n \"572D2D\",\n \"E6BAA8\",\n \"E56A54\",\n \"E04E39\",\n \"CD545B\",\n \"B04A5A\",\n \"9B2242\",\n \"651D32\",\n \"FABBCB\",\n \"FC9BB3\",\n \"F65275\",\n \"E4002B\",\n \"C8102E\",\n \"A6192E\",\n \"76232F\",\n \"ECC7CD\",\n \"E89CAE\",\n \"DF4661\",\n \"D50032\",\n \"BA0C2F\",\n \"9D2235\",\n \"862633\",\n \"F8A3BC\",\n \"F67599\",\n \"EF426F\",\n \"E40046\",\n \"BF0D3E\",\n \"9B2743\",\n \"782F40\",\n \"F5B6CD\",\n \"F59BBB\",\n \"EF4A81\",\n \"E0004D\",\n \"C5003E\",\n \"A6093D\",\n \"8A1538\",\n \"F5DADF\",\n \"F7CED7\",\n \"F9B5C4\",\n \"F890A5\",\n \"EF6079\",\n \"E03E52\",\n \"CB2C30\",\n \"F2D4D7\",\n \"F4C3CC\",\n \"F2ACB9\",\n \"E68699\",\n \"D25B73\",\n \"B83A4B\",\n \"9E2A2F\",\n \"ECB3CB\",\n \"E782A9\",\n \"E0457B\",\n \"CE0037\",\n \"A50034\",\n \"861F41\",\n \"6F263D\",\n \"F99FC9\",\n \"F57EB6\",\n \"F04E98\",\n \"E31C79\",\n \"CE0F69\",\n \"AC145A\",\n \"7D2248\",\n \"F4CDD4\",\n \"E06287\",\n \"E24585\",\n \"B52555\",\n \"A4123F\",\n \"971B2F\",\n \"6A2C3E\",\n \"D6C9CA\",\n \"C4A4A7\",\n \"C16784\",\n \"C63663\",\n \"BC204B\",\n \"912F46\",\n \"7E2D40\",\n \"EABEDB\",\n \"E56DB1\",\n \"DA1884\",\n \"A50050\",\n \"910048\",\n \"6C1D45\",\n \"936D73\",\n \"934054\",\n \"8E2C48\",\n \"732E4A\",\n \"672E45\",\n \"582D40\",\n \"502B3A\",\n \"EF95CF\",\n \"EB6FBD\",\n \"DF1995\",\n \"D0006F\",\n \"AA0061\",\n \"890C58\",\n \"672146\",\n \"F4A6D7\",\n \"F277C6\",\n \"E93CAC\",\n \"C6007E\",\n \"A20067\",\n \"840B55\",\n \"EAD3E2\",\n \"E6BCD8\",\n \"DFA0C9\",\n \"D986BA\",\n \"C6579A\",\n \"AE2573\",\n \"960051\",\n \"E5CEDB\",\n \"E3C8D8\",\n \"DEBED2\",\n \"C996B6\",\n \"B06C96\",\n \"994878\",\n \"7C2855\",\n \"E4C6D4\",\n \"DCB6C9\",\n \"D0A1BA\",\n \"BE84A3\",\n \"A76389\",\n \"893B67\",\n \"612141\",\n \"EBBECB\",\n \"E8B3C3\",\n \"E4A9BB\",\n \"D592AA\",\n \"84344E\",\n \"6F2C3F\",\n \"572932\",\n \"E2BCCB\",\n \"DCA9BF\",\n \"C9809E\",\n \"B55C80\",\n \"A73A64\",\n \"9B3259\",\n \"872651\",\n \"E9CDD0\",\n \"E4BEC3\",\n \"D7A3AB\",\n \"C48490\",\n \"B46B7A\",\n \"984856\",\n \"893C47\",\n \"F2C6CF\",\n \"F1BDC8\",\n \"E9A2B2\",\n \"DC8699\",\n \"8F3237\",\n \"7F3035\",\n \"5D2A2C\",\n \"E9C4C7\",\n \"E5BAC1\",\n \"DAA5AD\",\n \"C6858F\",\n \"7A3E3A\",\n \"6A3735\",\n \"512F2E\",\n \"DFC2C3\",\n \"DBB7BB\",\n \"CCA1A6\",\n \"B07C83\",\n \"9C6169\",\n \"874B52\",\n \"3F2021\",\n \"F1A7DC\",\n \"EC86D0\",\n \"E45DBF\",\n \"DB3EB1\",\n \"C5299B\",\n \"AF1685\",\n \"80225F\",\n \"EFBAE1\",\n \"E277CD\",\n \"D539B5\",\n \"C800A1\",\n \"B0008E\",\n \"9E007E\",\n \"830065\",\n \"EAB8E4\",\n \"E59BDC\",\n \"DD7FD3\",\n \"C724B1\",\n \"BB16A3\",\n \"A51890\",\n \"80276C\",\n \"A56E87\",\n \"A83D72\",\n \"991E66\",\n \"8A1B61\",\n \"722257\",\n \"6A2A5B\",\n \"5E2751\",\n \"E7BAE4\",\n \"DD9CDF\",\n \"C964CF\",\n \"AD1AAC\",\n \"981D97\",\n \"72246C\",\n \"EBC6DF\",\n \"E6BEDD\",\n \"E2ACD7\",\n \"D48BC8\",\n \"93328E\",\n \"833177\",\n \"612C51\",\n \"EEDAEA\",\n \"CCAED0\",\n \"D59ED7\",\n \"B288B9\",\n \"A277A6\",\n \"9F5CC0\",\n \"963CBD\",\n \"D7A9E3\",\n \"C98BDB\",\n \"AC4FC6\",\n \"9B26B6\",\n \"87189D\",\n \"772583\",\n \"653165\",\n \"948794\",\n \"A2789C\",\n \"A15A95\",\n \"8E3A80\",\n \"6E2B62\",\n \"6A3460\",\n \"5D3754\",\n \"D5C2D8\",\n \"C9B1D0\",\n \"BA9CC5\",\n \"A57FB2\",\n \"642F6C\",\n \"59315F\",\n \"4B3048\",\n \"DBCDD3\",\n \"D0BEC7\",\n \"C6B0BC\",\n \"AF95A6\",\n \"86647A\",\n \"66435A\",\n \"4A3041\",\n \"D8C8D1\",\n \"D3C0CD\",\n \"BFA5B8\",\n \"9B7793\",\n \"7E5475\",\n \"693C5E\",\n \"512A44\",\n \"DFC8E7\",\n \"D7B9E4\",\n \"CAA2DD\",\n \"B580D1\",\n \"8031A7\",\n \"702F8A\",\n \"572C5F\",\n \"D6BFDD\",\n \"C6A1CF\",\n \"8C4799\",\n \"6D2077\",\n \"642667\",\n \"5D285F\",\n \"51284F\",\n \"CBA3D8\",\n \"B884CB\",\n \"A05EB5\",\n \"84329B\",\n \"702082\",\n \"671E75\",\n \"5F2167\",\n \"9991A4\",\n \"8D6E97\",\n \"7A4183\",\n \"6B3077\",\n \"653279\",\n \"5E366E\",\n \"5C4E63\",\n \"C1A0DA\",\n \"A77BCA\",\n \"8246AF\",\n \"5C068C\",\n \"500778\",\n \"470A68\",\n \"3C1053\",\n \"D7C6E6\",\n \"C1A7E2\",\n \"9063CD\",\n \"753BBD\",\n \"5F259F\",\n \"582C83\",\n \"512D6D\",\n \"C5B4E3\",\n \"AD96DC\",\n \"9678D3\",\n \"7D55C7\",\n \"330072\",\n \"2E1A47\",\n \"B4B5DF\",\n \"9595D2\",\n \"7474C1\",\n \"24135F\",\n \"211551\",\n \"201747\",\n \"221C35\",\n \"A7A4E0\",\n \"8B84D7\",\n \"685BC7\",\n \"2E008B\",\n \"280071\",\n \"250E62\",\n \"201547\",\n \"6E7CA0\",\n \"686E9F\",\n \"615E9B\",\n \"565294\",\n \"514689\",\n \"4C4184\",\n \"535486\",\n \"DDDAE8\",\n \"B6B8DC\",\n \"A7A2C3\",\n \"8986CA\",\n \"5D4777\",\n \"4B384C\",\n \"41273B\",\n \"878CB4\",\n \"7C7FAB\",\n \"7566A0\",\n \"6F5091\",\n \"68478D\",\n \"563D82\",\n \"523178\",\n \"E5E1E6\",\n \"E0DBE3\",\n \"C6BCD0\",\n \"A192B2\",\n \"7C6992\",\n \"614B79\",\n \"3F2A56\",\n \"D8D7DF\",\n \"C6C4D2\",\n \"B3B0C4\",\n \"8D89A5\",\n \"595478\",\n \"403A60\",\n \"1E1A34\",\n \"C5CFDA\",\n \"BBC7D6\",\n \"A2B2C8\",\n \"8E9FBC\",\n \"1B365D\",\n \"1F2A44\",\n \"1C1F2A\",\n \"D9E1E2\",\n \"A4BCC2\",\n \"98A4AE\",\n \"768692\",\n \"425563\",\n \"253746\",\n \"131E29\",\n \"B9D3DC\",\n \"A3C7D2\",\n \"8DB9CA\",\n \"6BA4B8\",\n \"003D4C\",\n \"00313C\",\n \"072B31\",\n \"BFCED6\",\n \"B7C9D3\",\n \"A6BBC8\",\n \"7A99AC\",\n \"5B7F95\",\n \"4F758B\",\n \"081F2C\",\n \"D1DDE6\",\n \"C6D6E3\",\n \"9BB8D3\",\n \"7DA1C4\",\n \"5E8AB4\",\n \"236192\",\n \"002E5D\",\n \"DBE2E9\",\n \"CED9E5\",\n \"A7BCD6\",\n \"7D9BC1\",\n \"326295\",\n \"003A70\",\n \"002554\",\n \"DDE5ED\",\n \"C8D8EB\",\n \"B1C9E8\",\n \"7BA4DB\",\n \"407EC9\",\n \"003594\",\n \"001A70\",\n \"BDC5DB\",\n \"89ABE3\",\n \"8094DD\",\n \"7BA6DE\",\n \"5F8FB4\",\n \"3A5DAE\",\n \"606EB2\",\n \"CBD3EB\",\n \"9FAEE5\",\n \"485CC7\",\n \"1E22AA\",\n \"171C8F\",\n \"151F6D\",\n \"141B4D\",\n \"B8CCEA\",\n \"5C88DA\",\n \"0047BB\",\n \"06038D\",\n \"001871\",\n \"001E62\",\n \"071D49\",\n \"C3D7EE\",\n \"A7C6ED\",\n \"307FE2\",\n \"001A72\",\n \"001E60\",\n \"13294B\",\n \"ABCAE9\",\n \"8BB8E8\",\n \"418FDE\",\n \"012169\",\n \"00205B\",\n \"041E42\",\n \"92C1E9\",\n \"6CACE4\",\n \"0072CE\",\n \"0033A0\",\n \"003087\",\n \"002D72\",\n \"0C2340\",\n \"94A9CB\",\n \"6787B7\",\n \"426DA9\",\n \"385E9D\",\n \"2C5697\",\n \"1D4F91\",\n \"1D428A\",\n \"C6DAE7\",\n \"BDD6E6\",\n \"A4C8E1\",\n \"7BAFD4\",\n \"003C71\",\n \"003057\",\n \"00263A\",\n \"B9D9EB\",\n \"9BCBEB\",\n \"69B3E7\",\n \"003DA5\",\n \"002F6C\",\n \"002855\",\n \"041C2C\",\n \"8DC8E8\",\n \"62B5E5\",\n \"009CDE\",\n \"0057B8\",\n \"004C97\",\n \"003865\",\n \"00263E\",\n \"71C5E8\",\n \"41B6E6\",\n \"00A3E0\",\n \"005EB8\",\n \"004B87\",\n \"003B5C\",\n \"002A3A\",\n \"4698CB\",\n \"298FC2\",\n \"0076A8\",\n \"006298\",\n \"005587\",\n \"004976\",\n \"01426A\",\n \"99D6EA\",\n \"5BC2E7\",\n \"00A9E0\",\n \"0077C8\",\n \"00629B\",\n \"004F71\",\n \"003E51\",\n \"7BA7BC\",\n \"6399AE\",\n \"4E87A0\",\n \"41748D\",\n \"34657F\",\n \"165C7D\",\n \"005776\",\n \"BBDDE6\",\n \"71B2C9\",\n \"4298B5\",\n \"0086BF\",\n \"007DBA\",\n \"00558C\",\n \"002B49\",\n \"9ADBE8\",\n \"59CBE8\",\n \"00B5E2\",\n \"006BA6\",\n \"00587C\",\n \"003B49\",\n \"A4DBE8\",\n \"8BD3E6\",\n \"4EC3E0\",\n \"00AFD7\",\n \"0095C8\",\n \"0082BA\",\n \"0067A0\",\n \"48A9C5\",\n \"009CBD\",\n \"0085AD\",\n \"007096\",\n \"006A8E\",\n \"00617F\",\n \"005670\",\n \"B8DDE1\",\n \"9BD3DD\",\n \"77C5D5\",\n \"3EB1C8\",\n \"0093B2\",\n \"007396\",\n \"005F83\",\n \"6AD1E3\",\n \"05C3DE\",\n \"00A9CE\",\n \"0092BC\",\n \"007FA3\",\n \"00677F\",\n \"004851\",\n \"68D2DF\",\n \"00C1D5\",\n \"00AEC7\",\n \"008EAA\",\n \"00778B\",\n \"006272\",\n \"004F59\",\n \"63B1BC\",\n \"00A7B5\",\n \"0097A9\",\n \"00859B\",\n \"007D8A\",\n \"007680\",\n \"006269\",\n \"B1E4E3\",\n \"88DBDF\",\n \"2DCCD3\",\n \"009CA6\",\n \"008C95\",\n \"007377\",\n \"005F61\",\n \"A0D1CA\",\n \"40C1AC\",\n \"00B0B9\",\n \"00A3AD\",\n \"007398\",\n \"005F86\",\n \"005A70\",\n \"7EDDD3\",\n \"5CB8B2\",\n \"279989\",\n \"007681\",\n \"487A7B\",\n \"0D5257\",\n \"244C5A\",\n \"B6CFD0\",\n \"ABC7CA\",\n \"94B7BB\",\n \"7FA9AE\",\n \"4F868E\",\n \"115E67\",\n \"07272D\",\n \"00968F\",\n \"00857D\",\n \"007672\",\n \"006D68\",\n \"00635B\",\n \"005E5D\",\n \"005151\",\n \"9CDBD9\",\n \"64CCC9\",\n \"00B2A9\",\n \"008675\",\n \"007367\",\n \"00685E\",\n \"00534C\",\n \"71DBD4\",\n \"2AD2C9\",\n \"00BFB3\",\n \"00A499\",\n \"008578\",\n \"00594F\",\n \"004C45\",\n \"7CE0D3\",\n \"2CD5C4\",\n \"00C7B1\",\n \"00B398\",\n \"009681\",\n \"007864\",\n \"004E42\",\n \"6DCDB8\",\n \"49C5B1\",\n \"00AB8E\",\n \"009B77\",\n \"008264\",\n \"006A52\",\n \"034638\",\n \"B9DCD2\",\n \"A1D6CA\",\n \"86C8BC\",\n \"6BBBAE\",\n \"006F62\",\n \"00594C\",\n \"1D3C34\",\n \"B5E3D8\",\n \"A5DFD3\",\n \"98DBCE\",\n \"6BCABA\",\n \"00816D\",\n \"006C5B\",\n \"173F35\",\n \"ADCAB8\",\n \"9ABEAA\",\n \"85B09A\",\n \"6FA287\",\n \"28724F\",\n \"205C40\",\n \"284734\",\n \"BFCEC2\",\n \"A7BDB1\",\n \"92ACA0\",\n \"7F9C90\",\n \"5C7F71\",\n \"43695B\",\n \"183028\",\n \"BAC5B9\",\n \"B0BDB0\",\n \"A3B2A4\",\n \"94A596\",\n \"708573\",\n \"5E7461\",\n \"22372B\",\n \"BCC9C5\",\n \"B1C0BC\",\n \"9DB0AC\",\n \"829995\",\n \"5D7975\",\n \"3E5D58\",\n \"18332F\",\n \"D1E0D7\",\n \"B7CDC2\",\n \"9AB9AD\",\n \"789F90\",\n \"507F70\",\n \"285C4D\",\n \"13322B\",\n \"A7E6D7\",\n \"8CE2D0\",\n \"3CDBC0\",\n \"009775\",\n \"007B5F\",\n \"00664F\",\n \"8FD6BD\",\n \"6ECEB2\",\n \"00B388\",\n \"00965E\",\n \"007A53\",\n \"006747\",\n \"115740\",\n \"50A684\",\n \"00966C\",\n \"008755\",\n \"007B4B\",\n \"006F44\",\n \"006845\",\n \"005844\",\n \"7AE1BF\",\n \"47D7AC\",\n \"00C389\",\n \"00AF66\",\n \"007749\",\n \"006341\",\n \"154734\",\n \"A0DAB3\",\n \"91D6AC\",\n \"71CC98\",\n \"009A44\",\n \"00843D\",\n \"046A38\",\n \"2C5234\",\n \"A2E4B8\",\n \"8FE2B0\",\n \"80E0A7\",\n \"00B140\",\n \"009639\",\n \"007A33\",\n \"215732\",\n \"9BE3BF\",\n \"26D07C\",\n \"00BF6F\",\n \"00B74F\",\n \"009F4D\",\n \"275D38\",\n \"00573F\",\n \"4B9560\",\n \"228848\",\n \"007A3E\",\n \"007041\",\n \"286140\",\n \"36573B\",\n \"395542\",\n \"6BA539\",\n \"48A23F\",\n \"319B42\",\n \"3A913F\",\n \"44883E\",\n \"4A773C\",\n \"44693D\",\n \"ADDC91\",\n \"A1D884\",\n \"6CC24A\",\n \"43B02A\",\n \"509E2F\",\n \"4C8C2B\",\n \"4A7729\",\n \"D0DEBB\",\n \"BCE194\",\n \"8EDD65\",\n \"78D64B\",\n \"74AA50\",\n \"719949\",\n \"79863C\",\n \"C2E189\",\n \"B7DD79\",\n \"A4D65E\",\n \"78BE20\",\n \"64A70B\",\n \"658D1B\",\n \"546223\",\n \"D4EB8E\",\n \"CDEA80\",\n \"C5E86C\",\n \"97D700\",\n \"84BD00\",\n \"7A9A01\",\n \"59621D\",\n \"C4D6A4\",\n \"BCD19B\",\n \"B7CE95\",\n \"A9C47F\",\n \"789D4A\",\n \"67823A\",\n \"4E5B31\",\n \"D0D1AB\",\n \"C6C89B\",\n \"BABD8B\",\n \"A2A569\",\n \"8A8D4A\",\n \"6D712E\",\n \"3D441E\",\n \"D2CE9E\",\n \"CBC793\",\n \"C0BB87\",\n \"AFA96E\",\n \"A09958\",\n \"89813D\",\n \"555025\",\n \"C3C6A8\",\n \"B3B995\",\n \"A3AA83\",\n \"899064\",\n \"737B4C\",\n \"5E6738\",\n \"3E4827\",\n \"BFCC80\",\n \"BBC592\",\n \"9CAF88\",\n \"8F993E\",\n \"76881D\",\n \"7A7256\",\n \"5B6236\",\n \"BABC16\",\n \"ABAD23\",\n \"999B30\",\n \"888D30\",\n \"7C8034\",\n \"727337\",\n \"656635\",\n \"E2E868\",\n \"DBE442\",\n \"CEDC00\",\n \"C4D600\",\n \"A8AD00\",\n \"949300\",\n \"787121\",\n \"E9EC6B\",\n \"E3E935\",\n \"E0E721\",\n \"D0DF00\",\n \"B5BD00\",\n \"9A9500\",\n \"827A04\",\n \"E3E48D\",\n \"E0E27C\",\n \"DBDE70\",\n \"D2D755\",\n \"B7BF10\",\n \"8E8C13\",\n \"625D20\",\n \"F0EC74\",\n \"EDE939\",\n \"ECE81A\",\n \"E1E000\",\n \"BFB800\",\n \"ADA400\",\n \"A09200\",\n \"F3EA5D\",\n \"F3E500\",\n \"EFDF00\",\n \"EEDC00\",\n \"BBA600\",\n \"9A8700\",\n \"685C20\",\n \"F1EB9C\",\n \"F0E991\",\n \"F0E87B\",\n \"EDE04B\",\n \"EADA24\",\n \"E1CD00\",\n \"CFB500\",\n \"EBE49A\",\n \"E9E186\",\n \"E6DE77\",\n \"E1D555\",\n \"D7C826\",\n \"C4B000\",\n \"B39B00\",\n \"E9DF97\",\n \"E4D77E\",\n \"DECD63\",\n \"D9C756\",\n \"B89D18\",\n \"A28E2A\",\n \"695B24\",\n \"DCD59A\",\n \"D6CF8D\",\n \"D0C883\",\n \"C0B561\",\n \"AC9F3C\",\n \"9F912A\",\n \"8A7B19\",\n \"CAB64B\",\n \"CFB023\",\n \"C1A01E\",\n \"A08629\",\n \"897630\",\n \"736635\",\n \"675E33\",\n \"D4C304\",\n \"C4B200\",\n \"91852C\",\n \"747136\",\n \"5D6439\",\n \"585C3B\",\n \"535435\",\n \"BBB323\",\n \"B4A91F\",\n \"AA9D2E\",\n \"8F7E35\",\n \"716135\",\n \"635939\",\n \"4E4934\",\n \"D5CB9F\",\n \"CFC493\",\n \"C5B783\",\n \"B3A369\",\n \"998542\",\n \"8C7732\",\n \"614F25\",\n \"CAC7A7\",\n \"BFBB98\",\n \"B0AA7E\",\n \"9B945F\",\n \"594A25\",\n \"524727\",\n \"4A412A\",\n \"F1E6B2\",\n \"DFD1A7\",\n \"D9C89E\",\n \"CEB888\",\n \"A89968\",\n \"94795D\",\n \"816040\",\n \"DDCBA4\",\n \"D3BC8D\",\n \"C6AA76\",\n \"B9975B\",\n \"8B5B29\",\n \"744F28\",\n \"5C462B\",\n \"EFDBB2\",\n \"FCD299\",\n \"E1B87F\",\n \"D6A461\",\n \"C6893F\",\n \"B77729\",\n \"A6631B\",\n \"EDC8A3\",\n \"E7B78A\",\n \"DDA46F\",\n \"C88242\",\n \"B36924\",\n \"934D11\",\n \"7D3F16\",\n \"F3CFB3\",\n \"F1C6A7\",\n \"F0BF9B\",\n \"E59E6D\",\n \"B86125\",\n \"A45A2A\",\n \"693F23\",\n \"E0C09F\",\n \"D9B48F\",\n \"CDA077\",\n \"B58150\",\n \"9E652E\",\n \"774212\",\n \"623412\",\n \"E0C6AD\",\n \"DCBFA6\",\n \"CDA788\",\n \"BF9474\",\n \"AD7C59\",\n \"946037\",\n \"4F2C1D\",\n \"E1B7A7\",\n \"D5A286\",\n \"C58B68\",\n \"99552B\",\n \"85431E\",\n \"6D4F47\",\n \"5E4B3C\",\n \"D7C4B7\",\n \"CDB5A7\",\n \"C0A392\",\n \"AE8A79\",\n \"956C58\",\n \"7C4D3A\",\n \"5B3427\",\n \"DBC8B6\",\n \"D3BBA8\",\n \"C6A992\",\n \"AA8066\",\n \"703F2A\",\n \"623B2A\",\n \"4E3629\",\n \"D6D2C4\",\n \"C5B9AC\",\n \"B7A99A\",\n \"A39382\",\n \"7A6855\",\n \"63513D\",\n \"473729\",\n \"D1CCBD\",\n \"B7B09C\",\n \"A69F88\",\n \"A7ACA2\",\n \"949A90\",\n \"8E9089\",\n \"4B4F54\",\n \"D0D3D4\",\n \"C1C6C8\",\n \"A2AAAD\",\n \"7C878E\",\n \"5B6770\",\n \"333F48\",\n \"1D252D\",\n \"C7C9C7\",\n \"B2B4B2\",\n \"9EA2A2\",\n \"898D8D\",\n \"707372\",\n \"54585A\",\n \"25282A\",\n \"BEC6C4\",\n \"A2ACAB\",\n \"919D9D\",\n \"717C7D\",\n \"505759\",\n \"3F4444\",\n \"373A36\",\n \"BABBB1\",\n \"A8A99E\",\n \"919388\",\n \"7E7F74\",\n \"65665C\",\n \"51534A\",\n \"212322\",\n \"C4BFB6\",\n \"AFA9A0\",\n \"9D968D\",\n \"8C857B\",\n \"776E64\",\n \"696158\",\n \"C4BCB7\",\n \"B2A8A2\",\n \"978C87\",\n \"857874\",\n \"746661\",\n \"5E514D\",\n \"382F2D\",\n \"D0C4C5\",\n \"C1B2B6\",\n \"AB989D\",\n \"7B6469\",\n \"584446\",\n \"453536\",\n \"382E2C\",\n \"D7D2CB\",\n \"CBC4BC\",\n \"BFB8AF\",\n \"B6ADA5\",\n \"ACA39A\",\n \"A59C94\",\n \"968C83\",\n \"8C8279\",\n \"83786F\",\n \"796E65\",\n \"6E6259\",\n \"D9D9D6\",\n \"D0D0CE\",\n \"C8C9C7\",\n \"BBBCBC\",\n \"B1B3B3\",\n \"A7A8AA\",\n \"97999B\",\n \"888B8D\",\n \"75787B\",\n \"63666A\",\n \"53565A\",\n \"332F21\",\n \"212721\",\n \"31261D\",\n \"3E2B2E\",\n \"101820\",\n \"3D3935\",\n];\n\nconst rgbValues = hexValues.map((h) => [\n parseInt(h.substring(0, 2), 16),\n parseInt(h.substring(2, 4), 16),\n parseInt(h.substring(4, 6), 16),\n]);\n\nfunction pmsToRgb(color: string) {\n const idx = pmsValues.indexOf(color);\n return idx >= 0 ? hexValues[idx] : \"\";\n}\n\nfunction rgbToPms(color: string) {\n const idx = hexValues.indexOf(color);\n return idx >= 0 ? pmsValues[idx] : \"\";\n}\n\n/**\n * Matches an input hex code (RRGGBB) to a number of PMS values. If an exact match is found, it will always be the first value in the resulting array.\n * @param hex A string containing the hexadecimal representation of a color, presented as RRGGBB (case sensitive).\n * @param maxDistance The maximum distance the input can be from a PMS color to be considered a match.\n * @returns An array of PMS color strings.\n */\nfunction matchHexToPms(hex: string, maxDistance = 64): { pms: string; hex: string }[] {\n const pmsColors: { pms: string; hex: string; distance: number }[] = [];\n const distances: number[] = [];\n const match = rgbToPms(hex);\n if (match) {\n pmsColors.push({\n pms: match,\n hex,\n distance: 0,\n });\n }\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n let r1: number, g1: number, b1: number;\n for (let idx = 0; idx < hexValues.length; idx++) {\n r1 = rgbValues[idx][0];\n g1 = rgbValues[idx][1];\n b1 = rgbValues[idx][2];\n const dist = Math.sqrt(Math.pow(r - r1, 2) + Math.pow(g - g1, 2) + Math.pow(b - b1, 2));\n distances.push(dist);\n }\n for (let idx = 0; idx < distances.length; idx++) {\n if (distances[idx] <= maxDistance && !pmsColors.some((it) => it.pms === pmsValues[idx])) {\n pmsColors.push({ pms: pmsValues[idx], hex: hexValues[idx], distance: distances[idx] });\n }\n }\n return pmsColors.sort((a, b) => a.distance - b.distance);\n}\n\n// TODO: add extra keywords\nconst pmsHexData = pmsValues.map((pms, idx) => ({ pms, hex: hexValues[idx] }));\nconst fuse = new Fuse(pmsHexData, { keys: [\"pms\"] });\ntype PmsSearchResult = FuseResult<{ pms: string; hex: string }>;\n/**\n * Searches for the input string across all of the known PMS values.\n * @param input The string to find.\n * @returns An array of objects that contain information on the matched PMS values.\n */\nfunction findPmsColors(input: string, limit?: number): PmsSearchResult[] {\n return fuse.search(input, !limit ? undefined : { limit });\n}\n\nlet colorContext: CanvasRenderingContext2D | null = null;\n/**\n * Converts an arbitrary browser color value into a hexadecimal string (RRGGBB).\n * If the provided color string is anything other than a hex code, it will use a canvas to determine the hex value.\n * @returns\n */\nfunction browserColorToHex(color: string): string {\n if (color.startsWith(\"#\")) {\n // Browser hex code\n return sanitizeHexCode(color);\n }\n if (!document) {\n throw new Error(\"browserColorToHex is only supported on browsers\");\n }\n if (!colorContext) {\n colorContext = document.createElement(\"canvas\").getContext(\"2d\");\n }\n if (!colorContext) {\n throw new Error(\"Failed to create canvas context required to convert colors\");\n }\n colorContext.fillStyle = color;\n // Setting fillStyle to the colorContext is expected to immediately convert it. Not tested ony anything except browsers, so marked as unsupported.\n const sanitized = sanitizeHexCode(colorContext.fillStyle);\n if (!sanitized) {\n console.error(`Unknown browser color ${color}`);\n }\n return sanitized;\n}\n\nfunction sanitizeHexCode(hexCode: string): string {\n const hex = hexCode.substring(1).toUpperCase();\n if (hex.length === 6) {\n return hex;\n }\n if (hex.length === 3) {\n // hex code ABC is the same as AABBCC\n return `${hex[0]}${hex[0]}${hex[1]}${hex[1]}${hex[2]}${hex[2]}`;\n }\n return \"\";\n}\n\nexport const colorDefinitionPrintValue = (colorDefinition: ColorDefinition): string => {\n const spot = spotColorDefinitionString(colorDefinition.spotColor);\n if (spot) {\n return `${colorDefinition.browserValue} ${spot}`;\n }\n return colorDefinition.browserValue;\n};\n\nexport const spotColorDefinitionString = (spotColorDefinition?: SpotColorDefinition): string => {\n if (!spotColorDefinition) {\n return \"\";\n }\n\n if (spotColorDefinition.profileName.includes(\"/\") && spotColorDefinition.profileName.includes(\".icc\")) {\n const profileNameStrWithoutSpaces = spotColorDefinition.profileName.replace(/\\s/g, \"-\");\n const amountToSlice = profileNameStrWithoutSpaces.lastIndexOf(\"/\");\n const profileNameFiltered = profileNameStrWithoutSpaces.slice(amountToSlice + 1); // Removes all characters before the last instance of /\n const finalFilteredName = profileNameFiltered.slice(0, -4); // Removes last 4 characters in the string which is the file extension (eg .icc)\n\n return `icc-named-color(${finalFilteredName}, ${spotColorDefinition.namedColor})`;\n }\n\n return `icc-named-color(${spotColorDefinition.profileName}, ${spotColorDefinition.namedColor})`;\n};\n\n/**\n * Converts a color value found in an SVG file into a color definition. This\n * logic will split out the browser value eg. \"#ffffff\" and the spot color value if available eg.\n * icc-named-color(cub, PANTONE_AAA_100_C)\n * @param value A color definition based on the data provided in the value.\n */\nexport const svgColorValueToDefinition = (value: string): ColorDefinition => {\n const parts = value.split(/[ ](?=[^)]*?(?:\\(|$))/);\n // When no parts exists we have an invalid value,\n // default to black in the same way browsers would.\n if (parts.length === 0) {\n return { browserValue: \"#000000\" };\n }\n // When only one part exists, we should have been given just a browser value.\n if (parts.length === 1) {\n return { browserValue: parts[0] };\n }\n // If multiple parts exist then we have a browser value and a spot color.\n const matchedFunctionArgs = parts[1].match(/\\(([^)]+)\\)/gm);\n if (!matchedFunctionArgs) {\n throw new Error(\"Unhandled state of color value in SVG\");\n }\n const params = matchedFunctionArgs[0].replace(/[() ]/g, \"\").split(\",\");\n return {\n browserValue: parts[0],\n spotColor: { profileName: params[0], namedColor: params[1] },\n };\n};\n\nexport { matchHexToPms, rgbToPms, pmsToRgb, browserColorToHex, findPmsColors };\nexport type { PmsSearchResult };\n","import { Declaration, parse, Rule } from \"css\";\nimport { colorDefinitionPrintValue, svgColorValueToDefinition } from \"./color\";\nimport { domParser, xmlSerializer } from \"./crossplatform\";\nimport { ColorDefinition } from \"../types\";\n\nconst fillableTagNames = [\n \"altGlyph\",\n \"circle\",\n \"ellipse\",\n \"path\",\n \"polygon\",\n \"polyline\",\n \"rect\",\n \"text\",\n \"textPath\",\n \"tref\",\n \"tspan\",\n];\n\n/** These fields in an inline style should be moved to an attribute */\nconst replaceableStyleNames = [\"fill\", \"stroke\"];\n\n/*\n * Apply a function to a DOM node and all its children.\n */\nconst traverse = (node: Element, f: (node: Element) => void) => {\n f(node);\n if (node.children.length > 0) {\n Array.from(node.children).forEach((child) => traverse(child, f));\n }\n};\n\n/**\n * Whether an SVG element matches a CSS selector.\n */\nconst matchingSelector = (node: Element, selector: string): boolean => {\n try {\n return node.matches(selector);\n } catch (e) {\n // Currently the only known type of failure is if a\n // class name contains a backtick.\n return node.classList.contains(selector.substring(1));\n }\n};\n\n/*\n * Prepare SVG to be embedded.\n */\nconst sanitizeSvgTree = (root: Element, preserveAspectRatio = false) => {\n // Set this so region height and width are respected.\n !preserveAspectRatio && root.setAttribute(\"preserveAspectRatio\", \"none\");\n\n // Discard script tags.\n // Convert style tags to per-element styles.\n const rules: Rule[] = [];\n traverse(root, (node) => {\n if (node.tagName === \"script\") {\n node.remove();\n return;\n }\n if (node.tagName === \"style\") {\n try {\n const tree = parse(node.innerHTML);\n tree.stylesheet?.rules.forEach((rule: Rule) => {\n rules.push(rule);\n });\n node.remove();\n } catch (e) {\n console.error(e);\n }\n return;\n }\n const nodeStyle = node.attributes.getNamedItem(\"style\")?.value?.trim();\n if (nodeStyle) {\n const styles: string[] = [];\n const styleStrings = nodeStyle.split(\";\");\n styleStrings.forEach((style) => {\n const trimmed = style.trim();\n if (trimmed) {\n const [field, value] = trimmed.split(\":\");\n const fieldDowncased = field.toLowerCase();\n const idx = replaceableStyleNames.indexOf(fieldDowncased);\n if (idx > -1) {\n node.setAttribute(fieldDowncased, value.trim());\n } else {\n styles.push(trimmed);\n }\n }\n });\n if (styles.length > 0) {\n node.setAttribute(\"style\", styles.join(\";\"));\n } else {\n node.removeAttribute(\"style\");\n }\n }\n });\n traverse(root, (node) => {\n rules.forEach((rule) => {\n rule.selectors?.forEach((selector) => {\n if (matchingSelector(node, selector)) {\n rule.declarations?.forEach((decl: Declaration) => {\n if (decl.property && decl.value) {\n node.setAttribute(decl.property, decl.value);\n }\n });\n }\n });\n });\n });\n};\n\nconst svgStringToElement = (svg: string): Element | null => {\n const parser = domParser();\n const parsedSvg = parser.parseFromString(svg, \"image/svg+xml\");\n return parsedSvg.firstElementChild;\n};\n\nconst setSvgDimensions = (svgRoot: Element, width: number, height: number) => {\n svgRoot.setAttribute(\"height\", `${height}px`);\n svgRoot.setAttribute(\"width\", `${width}px`);\n};\n\nconst setSvgColors = (svgRoot: Element, colors: { [key: string]: ColorDefinition }, includeSpotColors?: boolean) => {\n traverse(svgRoot, (node) => {\n // Handle fills set directly on elements.\n const fill = node.attributes.getNamedItem(\"fill\");\n if (fill && fill.value !== \"none\") {\n node.classList.forEach((className) => {\n if (className.startsWith(\"spiff-fill\")) {\n const color = colors[className.replace(\"spiff-fill-\", \"\")];\n if (color) {\n node.setAttribute(\n \"fill\",\n includeSpotColors ? colorDefinitionPrintValue(color) : color.browserValue,\n );\n } else {\n // legacy\n const color = colors[className];\n if (color) {\n node.setAttribute(\n \"fill\",\n includeSpotColors ? colorDefinitionPrintValue(color) : color.browserValue,\n );\n }\n }\n }\n });\n }\n const stroke = node.attributes.getNamedItem(\"stroke\");\n if (stroke && stroke.value !== \"none\") {\n node.classList.forEach((className) => {\n if (className.startsWith(\"spiff-stroke\")) {\n const color = colors[className.replace(\"spiff-stroke-\", \"\")];\n if (color) {\n node.setAttribute(\n \"stroke\",\n includeSpotColors ? colorDefinitionPrintValue(color) : color.browserValue,\n );\n } else {\n // legacy\n const color = colors[className];\n if (color) {\n node.setAttribute(\n \"fill\",\n includeSpotColors ? colorDefinitionPrintValue(color) : color.browserValue,\n );\n }\n }\n }\n });\n }\n });\n};\n\nconst svgElementToString = (svgRoot: Element): string => {\n const serialiser = xmlSerializer();\n return serialiser.serializeToString(svgRoot);\n};\n\nconst modifySVGWithElementProperties = (\n svg: string,\n width: number,\n height: number,\n colors: { [key: string]: ColorDefinition },\n includeSpotColors?: boolean,\n): string => {\n const svgRoot = svgStringToElement(svg);\n if (!svgRoot) {\n throw new Error(\"Failed to read SVG.\");\n }\n setSvgDimensions(svgRoot, width, height);\n setSvgColors(svgRoot, colors, includeSpotColors);\n return svgElementToString(svgRoot);\n};\n\nconst modifySVGColors = (\n svg: string,\n colors: { [key: string]: ColorDefinition },\n includeSpotColors?: boolean,\n): string => {\n const svgRoot = svgStringToElement(svg);\n if (!svgRoot) {\n throw new Error(\"Failed to read SVG.\");\n }\n setSvgColors(svgRoot, colors, includeSpotColors);\n return svgElementToString(svgRoot);\n};\n\nconst parseSvg = (svgBody: string): any => {\n // Get the raw SVG without a doctype.\n const svgRegex = /<svg.*<\\/svg>/s;\n const svgMatches = svgBody.match(svgRegex) || [];\n const svg = svgMatches?.length > 0 ? svgMatches[0] : \"\";\n\n // Parse the SVG into a tree.\n const parser = domParser();\n return parser.parseFromString(svg, \"image/svg+xml\");\n};\n\nconst generateSVGWithUnknownColors = async (\n svgBody: string,\n): Promise<{ svg: string; colors: { [key: string]: ColorDefinition } }> => {\n const parsedSvg = parseSvg(svgBody);\n const root = parsedSvg.firstElementChild;\n if (!root) {\n throw new Error(\"Failed to read SVG.\");\n }\n\n sanitizeSvgTree(root);\n\n // Annotate elements which have fills with a new class name.\n const colors: { [key: string]: ColorDefinition } = {};\n traverse(root, (node) => {\n if (fillableTagNames.includes(node.tagName) && !node.attributes.getNamedItem(\"fill\")) {\n node.setAttribute(\"fill\", \"black\");\n }\n const fill = node.attributes.getNamedItem(\"fill\");\n if (fill && fill.value !== \"none\" && !fill.value.startsWith(\"url(\")) {\n const fillValue = svgColorValueToDefinition(fill.value);\n const alphanumericFill = fillValue.browserValue.replace(/\\W/g, \"\");\n const className = `spiff-fill-${alphanumericFill}`;\n node.setAttribute(\"fill\", fillValue.browserValue);\n node.classList.add(className);\n colors[alphanumericFill] = fillValue;\n }\n const stroke = node.attributes.getNamedItem(\"stroke\");\n if (stroke && stroke.value !== \"none\" && !stroke.value.startsWith(\"url(\")) {\n const strokeValue = svgColorValueToDefinition(stroke.value);\n const alphanumericFill = strokeValue.browserValue.replace(/\\W/g, \"\");\n const className = `spiff-stroke-${alphanumericFill}`;\n node.classList.add(className);\n node.setAttribute(\"stroke\", strokeValue.browserValue);\n colors[alphanumericFill] = strokeValue;\n }\n });\n\n const serialiser = xmlSerializer();\n const rebuiltSvg = serialiser.serializeToString(root);\n\n return {\n colors,\n svg: rebuiltSvg,\n };\n};\n\nexport { sanitizeSvgTree, traverse, modifySVGWithElementProperties, modifySVGColors, generateSVGWithUnknownColors };\n","export const generate = (): string => {\n const s4 = () => {\n return Math.floor((1 + Math.random()) * 0x10000)\n .toString(16)\n .substring(1);\n };\n return s4() + s4() + \"-\" + s4() + \"-\" + s4() + \"-\" + s4() + \"-\" + s4() + s4() + s4();\n};\n","import { LayoutElement, LayoutRenderingPurpose, PapyrusComponent, RenderingConfiguration } from \"../types\";\nimport { generate } from \"../util/guid\";\nimport { sortElementsByLayersWithIndex, elementFactory } from \"../CommandContext\";\n\nexport interface SVGLayoutProps {\n configuration: RenderingConfiguration;\n preserveAspectRatio?: string;\n outlineArea?: {\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n scale?: number;\n hidden?: boolean; // When set the editable area will not be stroke. The mask will still take effect.\n };\n viewBox?: { x: number; y: number; width: number; height: number };\n width: number | string;\n height: number | string;\n position?: string;\n maxWidth?: string;\n maxHeight?: string;\n elements: LayoutElement[];\n backgroundColor?: string;\n outlineColor?: string;\n omitBoundClipping?: boolean;\n borderRadius?: number;\n}\n\nexport const SVGLayout: PapyrusComponent<SVGLayoutProps> = ({\n backgroundColor,\n outlineColor,\n borderRadius,\n configuration,\n elements,\n height,\n maxHeight,\n maxWidth,\n outlineArea,\n position,\n preserveAspectRatio,\n viewBox,\n width,\n}) => {\n const rx = borderRadius || 0;\n const strokeScale = 2 * (outlineArea?.scale || 1);\n const calculatedViewbox = viewBox || { x: 0, y: 0, width, height };\n const viewboxString = `${calculatedViewbox.x} ${calculatedViewbox.y} ${calculatedViewbox.width} ${calculatedViewbox.height}`;\n const maskId = generate();\n\n const defs = configuration.purpose === LayoutRenderingPurpose.FreeDesign && (\n <defs>\n <clipPath id=\"viewboxClip\">\n <rect width={calculatedViewbox.width} height={calculatedViewbox.height} rx={rx} />\n </clipPath>\n </defs>\n );\n\n const colorProfileElements = configuration.colorProfiles?.map((c, index) => {\n // Color profiles have no typescript definition. We tell the compiler to ignore their lack of existance.\n return (\n /* @ts-ignore */\n <color-profile key={index} name={c.name} xlinkHref={c.key}>\n {\" \"}\n {/* @ts-ignore */}\n </color-profile>\n );\n });\n\n // Mixin the rendering configuration if required\n const elementsWithConfiguration = elements.map((el) => {\n return {\n ...el,\n _renderingConfiguration: configuration,\n mask: outlineArea ? `url(#viewmask-${maskId})` : undefined,\n };\n });\n\n // Order the elements based on layer & index\n const sortedElements = sortElementsByLayersWithIndex(elementsWithConfiguration);\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n xmlSpace=\"preserve\"\n version=\"1.1\"\n preserveAspectRatio={preserveAspectRatio}\n width={width}\n height={height}\n style={{\n gridColumn: 1,\n gridRow: 1,\n maxWidth,\n maxHeight,\n position: position as any,\n }}\n viewBox={viewboxString}\n >\n {colorProfileElements}\n {defs}\n {!!backgroundColor && (\n <rect\n id=\"layout-background\"\n width={calculatedViewbox.width}\n height={calculatedViewbox.height}\n fill={backgroundColor}\n rx={rx}\n />\n )}\n <g\n id=\"element-group\"\n clipPath={configuration.purpose === LayoutRenderingPurpose.FreeDesign ? \"url(#viewboxClip)\" : undefined}\n >\n {sortedElements.map((el) => elementFactory(el)).filter((el) => !!el)}\n </g>\n {outlineArea && (\n <rect\n x={outlineArea.x}\n y={outlineArea.y}\n width={outlineArea.width}\n height={outlineArea.height}\n fill=\"none\"\n stroke={outlineArea.hidden ? \"none\" : outlineColor ? outlineColor : \"#aaaaaa\"}\n strokeWidth={strokeScale / 2}\n strokeDasharray={`${strokeScale * 2} ${strokeScale}`}\n />\n )}\n {outlineArea && (\n <mask id={`viewmask-${maskId}`}>\n <rect\n x={calculatedViewbox.x}\n y={calculatedViewbox.y}\n width={calculatedViewbox.width}\n height={calculatedViewbox.height}\n fill=\"black\"\n />\n <rect\n x={outlineArea.x}\n y={outlineArea.y}\n width={outlineArea.width}\n height={outlineArea.height}\n fill=\"white\"\n />\n </mask>\n )}\n </svg>\n );\n};\n","import { LayoutElement, Point, ScaleAxis } from \"../types\";\n\n/**\n * Returns an axis aligned bounding box for a given element.\n * @param element The element to calculate an AABB for.\n * @returns The AABB for the element.\n */\nconst getAxisAlignedBoundingBox = (x: number, y: number, width: number, height: number, rotation: number) => {\n const rotationRadians = degreesToRadians(rotation);\n\n const halfX = width / 2;\n const halfY = height / 2;\n\n const midX = x + halfX;\n const midY = y + halfY;\n\n const sin = Math.sin(rotationRadians);\n const cos = Math.cos(rotationRadians);\n\n const c1x = halfX;\n const c2x = halfX;\n const c1y = -halfY;\n const c2y = halfY;\n\n const transformedC1X = c1x * cos - c1y * sin;\n const transformedC2X = c2x * cos - c2y * sin;\n const transformC1Y = c1x * sin + c1y * cos;\n const transformedC2Y = c2x * sin + c2y * cos;\n\n const extentX = Math.max(Math.abs(transformedC1X), Math.abs(transformedC2X));\n const extentY = Math.max(Math.abs(transformC1Y), Math.abs(transformedC2Y));\n\n return {\n minX: midX - extentX,\n maxX: midX + extentX,\n minY: midY - extentY,\n maxY: midY + extentY,\n };\n};\n\n// Returns angle ABC, between lines AB and BC\nconst findAngle = (a: Point, b: Point, c: Point) => {\n const ab = Math.sqrt(Math.pow(b.x - a.x, 2) + Math.pow(b.y - a.y, 2));\n const bc = Math.sqrt(Math.pow(b.x - c.x, 2) + Math.pow(b.y - c.y, 2));\n const ac = Math.sqrt(Math.pow(c.x - a.x, 2) + Math.pow(c.y - a.y, 2));\n return Math.acos((bc * bc + ab * ab - ac * ac) / (2 * bc * ab)) * (180 / Math.PI);\n};\n\n/**\n * Degrees to radians.\n * @param degrees An angle in degrees.\n * @returns The equivelant angle in radians.\n */\nconst degreesToRadians = (degrees: number) => {\n return degrees * (Math.PI / 180);\n};\n\n/**\n * Radians to degrees.\n * @param radians An angle in radians.\n * @returns The equivelant angle in degrees.\n */\nconst radiansToDegrees = (radians: number) => {\n return radians * (180 / Math.PI);\n};\n\n/**\n * @param a The first value.\n * @param b The second value.\n * @returns Returns true if two values are within a distance to each other.\n */\nconst isCloseToValue = (a: number, b: number, allowableDistance: number) => {\n const diff = Math.abs(a - b);\n return diff < allowableDistance;\n};\n\nconst getTrueCoordinates = (point: Point, pointOfRotation: Point, rotation: number): Point => {\n const s = Math.sin(degreesToRadians(rotation));\n const c = Math.cos(degreesToRadians(rotation));\n return {\n x: (point.x - pointOfRotation.x) * c - (point.y - pointOfRotation.y) * s + pointOfRotation.x,\n y: (point.x - pointOfRotation.x) * s + (point.y - pointOfRotation.y) * c + pointOfRotation.y,\n };\n};\n\nconst getPointOfRotation = (nwPoint: Point, sePoint: Point): Point => {\n return {\n x: (nwPoint.x + sePoint.x) / 2,\n y: (nwPoint.y + sePoint.y) / 2,\n };\n};\n\nconst getNWPoint = (bounds: DOMRect, element: LayoutElement, scaleX: number, scaleY: number): Point => {\n return {\n x: bounds.x + element?.x * scaleX,\n y: bounds.y + element?.y * scaleY,\n };\n};\n\nconst getNEPoint = (bounds: DOMRect, element: LayoutElement, scaleX: number, scaleY: number): Point => {\n return {\n x: bounds.x + (element?.x + element?.width) * scaleX,\n y: bounds.y + element?.y * scaleY,\n };\n};\n\nconst getSWPoint = (bounds: DOMRect, element: LayoutElement, scaleX: number, scaleY: number): Point => {\n return {\n x: bounds.x + element?.x * scaleX,\n y: bounds.y + (element?.y + element?.height) * scaleY,\n };\n};\n\nconst getSEPoint = (bounds: DOMRect, element: LayoutElement, scaleX: number, scaleY: number): Point => {\n return {\n x: bounds.x + (element?.x + element?.width) * scaleX,\n y: bounds.y + (element?.y + element?.height) * scaleY,\n };\n};\n\n// Compass directions\n\nconst turnRightClockwise = (dir: ScaleAxis): ScaleAxis => {\n switch (dir) {\n case ScaleAxis.North:\n return ScaleAxis.East;\n case ScaleAxis.East:\n return ScaleAxis.South;\n case ScaleAxis.South:\n return ScaleAxis.West;\n case ScaleAxis.West:\n return ScaleAxis.North;\n case ScaleAxis.Northwest:\n return ScaleAxis.Northeast;\n case ScaleAxis.Northeast:\n return ScaleAxis.Southeast;\n case ScaleAxis.Southeast:\n return ScaleAxis.Southwest;\n case ScaleAxis.Southwest:\n return ScaleAxis.Northwest;\n }\n};\n\n// The (semi-)cardinal direction that you are currently facing if\n// you turned the given rotation from the given orignal direction.\nconst currentDirection = (originalDirection: ScaleAxis, rotation: number): ScaleAxis => {\n if (rotation > 45 && rotation <= 135) {\n return turnRightClockwise(originalDirection);\n }\n if (rotation > 135 && rotation <= 225) {\n return turnRightClockwise(turnRightClockwise(originalDirection));\n }\n if (rotation > 225 && rotation <= 315) {\n return turnRightClockwise(turnRightClockwise(turnRightClockwise(originalDirection)));\n }\n return originalDirection;\n};\n\n/**\n * Computes helpful values about a rotated element, Useful in calculating updated element locations.\n * @param element The element to calculate the vertices for.\n * @returns a, b, c, d starting from top left and moving clockwise. Center represents the point central to\n * all vertices on thge element.\n */\nconst getElementVertices = (\n element: { x: number; y: number; width: number; height: number; rotation: number },\n canvasBounds: Point = { x: 0, y: 0 },\n scale: Point = { x: 1, y: 1 },\n) => {\n const radians = degreesToRadians(element.rotation);\n\n // Find the unrotated vertices of the element. We'll rotate\n // these later to find the rotated vertices.\n\n const unrotatedTopLeft: Point = {\n x: canvasBounds.x + element.x * scale.x,\n y: canvasBounds.x + element.y * scale.y,\n };\n\n const unrotatedTopRight: Point = {\n x: element.x + element.width,\n y: element.y,\n };\n\n const unrotatedBottomRight: Point = {\n x: canvasBounds.x + (element.x + element.width) * scale.x,\n y: canvasBounds.y + (element.height + element.y) * scale.y,\n };\n\n const unrotatedBottomLeft: Point = {\n x: canvasBounds.x + element.x * scale.x,\n y: canvasBounds.y + (element.height + element.y) * scale.y,\n };\n\n // Find the center point of the element.\n // This will be the point that the element rotates on.\n const pointOfRotation: Point = {\n x: (unrotatedBottomLeft.x + unrotatedBottomRight.x) / 2,\n y: unrotatedBottomLeft.y - (element.height * scale.y) / 2,\n };\n\n // Find the actual coordinates of the element's bottom corners by translating to the origin,\n // rotating as required and translating back to current position.\n return {\n a: rotateAroundPoint(unrotatedTopLeft, pointOfRotation, radians),\n b: rotateAroundPoint(unrotatedTopRight, pointOfRotation, radians),\n c: rotateAroundPoint(unrotatedBottomRight, pointOfRotation, radians),\n d: rotateAroundPoint(unrotatedBottomLeft, pointOfRotation, radians),\n center: pointOfRotation,\n };\n};\n\n/**\n * Rotates a point around another point by an angle.\n * @param p The point to rotate.\n * @param c The point to rotate around..\n * @param angleRadians The angle to rotate.\n * @returns A new point transformed by the rotation.\n */\nconst rotateAroundPoint = (p: Point, c: Point, angleRadians: number) => {\n const sin = Math.sin(angleRadians);\n const cos = Math.cos(angleRadians);\n return {\n x: (p.x - c.x) * cos - (p.y - c.y) * sin + c.x,\n y: (p.x - c.x) * sin + (p.y - c.y) * cos + c.y,\n };\n};\n\nexport {\n currentDirection,\n degreesToRadians,\n findAngle,\n getAxisAlignedBoundingBox,\n getNEPoint,\n getNWPoint,\n getPointOfRotation,\n getSEPoint,\n getSWPoint,\n getTrueCoordinates,\n isCloseToValue,\n radiansToDegrees,\n turnRightClockwise,\n getElementVertices,\n rotateAroundPoint,\n};\n\n// All conversion constants are based on 72dpi\nexport const mmPerPixel = 0.352778;\nexport const cmPerPixel = 0.035277;\n","import { ImageElement, PapyrusComponent } from \"../types\";\nimport { degreesToRadians } from \"../util/math\";\n\nexport const Image: PapyrusComponent<Omit<ImageElement, \"type\">> = (props) => {\n const rotation = props.rotation || 0;\n const angleInRadians = degreesToRadians(rotation);\n const rotC = Math.cos(angleInRadians);\n const rotS = -Math.sin(angleInRadians);\n\n return (\n <g mask={props.stepName || props.productOverlay ? undefined : props.mask}>\n <g\n transform={`\n matrix(1, 0, 0, 1, ${props.x}, ${props.y})\n matrix(1, 0, 0, 1, ${props.width / 2}, ${props.height / 2})\n matrix(${rotC}, ${-rotS}, ${rotS}, ${rotC}, 0, 0)\n matrix(1, 0, 0, 1, ${-props.width / 2}, ${-props.height / 2})\n `}\n >\n <image\n xlinkHref={props.src}\n preserveAspectRatio={props.preserveAspectRatio}\n width={props.width}\n height={props.height}\n />\n </g>\n </g>\n );\n};\n","import { GroupElement, LayoutElement, PapyrusComponent } from \"../types\";\nimport { degreesToRadians } from \"../util/math\";\nimport { elementFactory, sortElementsByLayersWithIndex } from \"../CommandContext\";\n\nexport const Group: PapyrusComponent<Omit<GroupElement, \"type\">> = (props) => {\n const clipPathId = `spiff-group-clip-${props.id}`;\n const rotation = props.rotation || 0;\n const angleInRadians = degreesToRadians(rotation);\n const rotC = Math.cos(angleInRadians);\n const rotS = -Math.sin(angleInRadians);\n const sortedElements = sortElementsByLayersWithIndex(props.children);\n const buildDefinitions = () => {\n return (\n <clipPath id={clipPathId} preserveAspectRatio=\"none\">\n {props.clipPath ? (\n <path d={props.clipPath} />\n ) : (\n <rect x={0} y={0} width={props.width} height={props.height} />\n )}\n </clipPath>\n );\n };\n\n return (\n <>\n <defs>{buildDefinitions()}</defs>\n <g\n transform={`\n matrix(1, 0, 0, 1, ${props.x}, ${props.y})\n matrix(1, 0, 0, 1, ${props.width / 2}, ${props.height / 2})\n matrix(${rotC}, ${-rotS}, ${rotS}, ${rotC}, 0, 0)\n matrix(1, 0, 0, 1, ${-props.width / 2}, ${-props.height / 2})\n `}\n >\n {props._renderingConfiguration?.debug ? (\n <rect\n stroke=\"red\"\n opacity={0.3}\n fill=\"none\"\n x={0}\n y={0}\n width={props.width}\n height={props.height}\n />\n ) : undefined}\n {sortedElements\n .map((el) => elementFactory(el as LayoutElement))\n .filter((el) => !!el)\n .map((el) => (\n <g clipPath={`url(#${clipPathId})`}>{el}</g>\n ))}\n </g>\n </>\n );\n};\n","import { FrameElement, IllustrationElement, ImageElement, LayoutElementType, PapyrusComponent } from \"../types\";\nimport { degreesToRadians } from \"../util/math\";\nimport { modifySVGColors } from \"../util/illustration\";\nimport { svgToDataUrl } from \"../util/crossplatform\";\nimport { Group } from \"./Group\";\nimport { Fragment } from \"preact/jsx-runtime\";\n\nexport const Frame: PapyrusComponent<Omit<FrameElement, \"type\">> = (props) => {\n const patternLinkId = `spiff-frame-${props.id}`;\n const thresholdFilterId = `spiff-frame-threshold-${props.id}`;\n\n const getFrameContentSrc = () => {\n if (!props.pattern) {\n return \"\";\n }\n if (props.pattern.svg) {\n const modifiedSvg = modifySVGColors(props.pattern.svg, props.pattern.colors || {}, false);\n return svgToDataUrl(modifiedSvg);\n }\n return props.pattern.src;\n };\n\n if (!getFrameContentSrc()) {\n return <Fragment />;\n }\n\n const thresholdTableValues = (): string => {\n if (!props.threshold) {\n return \"\";\n }\n if (props.invertThreshold) {\n return \"1 \".repeat(props.threshold) + \"0 \".repeat(256 - props.threshold);\n }\n return \"0 \".repeat(props.threshold) + \"1 \".repeat(256 - props.threshold);\n };\n\n const renderDefinitions = () => {\n return (\n <>\n {props.useThreshold && (\n <defs>\n <filter id={thresholdFilterId} color-interpolation-filters=\"sRGB\">\n <feColorMatrix\n type=\"matrix\"\n values={`\n ${props.thresholdSaturation} ${props.thresholdSaturation} ${props.thresholdSaturation} 0 0\n ${props.thresholdSaturation} ${props.thresholdSaturation} ${props.thresholdSaturation} 0 0\n ${props.thresholdSaturation} ${props.thresholdSaturation} ${props.thresholdSaturation} 0 0\n 0 0 0 1 0\n `}\n result=\"greyscale\"\n ></feColorMatrix>\n <feComponentTransfer in=\"greyscale\">\n <feFuncR type=\"discrete\" tableValues={thresholdTableValues()} />\n <feFuncG type=\"discrete\" tableValues={thresholdTableValues()} />\n <feFuncB type=\"discrete\" tableValues={thresholdTableValues()} />\n </feComponentTransfer>\n </filter>\n </defs>\n )}\n </>\n );\n };\n\n // We only want to blur when a pattern is provided.\n const rotation = props.rotation || 0;\n const angleInRadians = degreesToRadians(rotation);\n const rotC = Math.cos(angleInRadians);\n const rotS = -Math.sin(angleInRadians);\n\n const getFrameContent = () => {\n const patternX = props.pattern?.x || 0;\n const patternY = props.pattern?.y || 0;\n const patternWidth = props.pattern?.width || 0;\n const patternHeight = props.pattern?.height || 0;\n const patternScaleX = props.pattern?.scaleX || 1;\n const patternScaleY = props.pattern?.scaleY || 1;\n const patternRotation = props.pattern?.rotation || 0;\n\n const children = props.pattern?.svg\n ? ({\n id: `${patternLinkId}-contents`,\n type: LayoutElementType.Illustration,\n x: patternX,\n y: patternY,\n rotation: patternRotation,\n width: patternWidth * patternScaleX,\n height: patternHeight * patternScaleY,\n src: getFrameContentSrc(),\n svg: props.pattern?.svg,\n colors: props.pattern?.colors,\n } as IllustrationElement)\n : ({\n id: `${patternLinkId}-contents`,\n type: LayoutElementType.Image,\n x: patternX,\n y: patternY,\n rotation: patternRotation,\n width: patternWidth * patternScaleX,\n height: patternHeight * patternScaleY,\n src: getFrameContentSrc(),\n } as ImageElement);\n return [children];\n };\n\n return (\n <>\n {renderDefinitions()}\n <g\n opacity={props.opacity}\n mask={props.stepName ? undefined : props.mask}\n filter={props.useThreshold ? `url(#${thresholdFilterId})` : undefined}\n >\n <g\n transform={`\n matrix(1, 0, 0, 1, ${props.x}, ${props.y})\n matrix(1, 0, 0, 1, ${props.width / 2}, ${props.height / 2})\n matrix(${rotC}, ${-rotS}, ${rotS}, ${rotC}, 0, 0)\n matrix(1, 0, 0, 1, ${-props.width / 2}, ${-props.height / 2})\n matrix(${props.scaleX}, 0, 0, ${props.scaleY}, 0, 0)\n `}\n >\n <Group\n id={patternLinkId}\n x={0}\n y={0}\n rotation={0}\n width={props.width}\n height={props.height}\n clipPath={props.path}\n children={getFrameContent()}\n />\n </g>\n </g>\n </>\n );\n};\n","import opentype, { Font, Glyph } from \"opentype.js\";\nimport { dataUrlToArrayBuffer, fetchAsArrayBuffer, loadFontFaceSet } from \"../util/crossplatform\";\n\nconst metricCache: Map<string, FontMetrics> = new Map();\n\n/**\n * Stores cached information about metrics related to a specific font.\n */\nexport class FontMetrics {\n private font: Font;\n private glyphsFromText: Map<string, Glyph[]>;\n private kerningValues: Map<string, Map<string, number>>;\n private height: number;\n\n constructor(font: Font) {\n this.font = font;\n this.glyphsFromText = new Map();\n this.kerningValues = new Map();\n this.height = this.calculateApproximateHeight();\n }\n\n getFont(): Font {\n return this.font;\n }\n\n getGlyphs(text: string) {\n const oldGlyphs = this.glyphsFromText.get(text);\n if (oldGlyphs) {\n return oldGlyphs;\n }\n const newGlyphs = this.font.stringToGlyphs(text);\n this.glyphsFromText.set(text, newGlyphs);\n return newGlyphs;\n }\n\n /**\n * @returns The approximate height of any text line based on all main characters of the alphabet.\n */\n getApproximateHeight() {\n return this.height;\n }\n\n /**\n * Computes the exact height of a line of text.\n * @param text\n * @returns\n */\n getExactHeight(text: string): number {\n const glyphs = this.font.stringToGlyphs(text);\n let ascent = 0;\n let descent = 0;\n glyphs.forEach((glyph) => {\n const metrics = glyph.getMetrics();\n ascent = Math.max(ascent, metrics.yMax);\n descent = Math.min(descent, metrics.yMin);\n });\n return ascent - descent;\n }\n\n getKerningValue(a: Glyph, b: Glyph) {\n if (!a.name || !b.name) return undefined;\n let valuesForFirst = this.kerningValues.get(a.name);\n if (!valuesForFirst) {\n valuesForFirst = new Map();\n this.kerningValues.set(a.name, valuesForFirst);\n }\n let valueForSecond = valuesForFirst.get(b.name);\n if (!valueForSecond) {\n valueForSecond = this.font.getKerningValue(a, b);\n valuesForFirst.set(b.name, valueForSecond);\n }\n return valueForSecond;\n }\n\n private calculateApproximateHeight(): number {\n const chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n const glyphs = this.font.stringToGlyphs(chars);\n let ascent = 0;\n let descent = 0;\n glyphs.forEach((glyph) => {\n const metrics = glyph.getMetrics();\n ascent = Math.max(ascent, metrics.yMax);\n descent = Math.min(descent, metrics.yMin);\n });\n return ascent - descent;\n }\n}\n\nconst isDataURL = (url: string) => {\n return url.substring(0, 5).toLowerCase().trim() === \"data:\";\n};\n\nconst loadFontCache: Map<string, Promise<Font>> = new Map();\n/**\n * A function for loading and caching a font\n * @param url The URL to load either a web URL or dataURL\n * @param buffer An optional array buffer for the resource if available\n * @returns An opentype font object.\n */\nexport const loadFont = async (url: string): Promise<Font> => {\n if (loadFontCache.has(url)) {\n return loadFontCache.get(url)!;\n }\n const getFont = async () => {\n try {\n const metrics = getFontMetrics(url);\n return metrics.getFont();\n } catch {\n if (isDataURL(url)) {\n const arrayBuffer = dataUrlToArrayBuffer(url);\n const font = opentype.parse(arrayBuffer);\n cacheFontMetrics(url, font);\n return font;\n } else {\n const buffer = await fetchAsArrayBuffer(url, true);\n const font = opentype.parse(buffer);\n cacheFontMetrics(url, font);\n await loadFontFaceSet(font, url);\n return font;\n }\n }\n };\n const promise = getFont();\n loadFontCache.set(url, promise);\n return promise;\n};\n\n/**\n * Loads a font object from a given data URL.\n * @deprecated Use loadFont instead.\n * @param url The data URL to load.\n * @returns A font object.\n */\nexport const _loadFontExternalDataURL = (url: string): Font => {\n const arrayBuffer = dataUrlToArrayBuffer(url);\n const font = opentype.parse(arrayBuffer);\n cacheFontMetrics(url, font);\n return font;\n};\n\nexport const getFontMetrics = (assetUrl: string): FontMetrics => {\n const oldCache = metricCache.get(assetUrl);\n if (oldCache) {\n return oldCache;\n }\n throw new Error(\"Font metrics unavailable for font\");\n};\n\nconst cacheFontMetrics = (assetUrl: string, font: opentype.Font) => {\n const newCache = new FontMetrics(font);\n metricCache.set(assetUrl, newCache);\n return newCache;\n};\n","import { FontMetrics, getFontMetrics } from \"../../util/font\";\nimport { charWidth, defaultLineHeightFactor, lineWidth, textWidth, zip } from \"../shared\";\nimport { CanvasRegion, FontData, Region, TextboxElement } from \"../../types\";\nimport { Font } from \"opentype.js\";\n\nconst clampWidth = (lines: string[], currentWidth: number, fontScale: number, cache: FontMetrics): number => {\n return Math.max(charWidth(lines.join(\"\\n\"), fontScale, cache), currentWidth)\n}\n\n/**\n * Produce an array where text has been broken into lines that can\n * fit the given region with width = region.width and height = auto.\n */\nconst getLines = (\n region: CanvasRegion,\n text: string,\n fontSize: number,\n fontScale: number,\n cache: FontMetrics,\n lineHeight?: number,\n): TraditionalTextResults => {\n const lh = (lineHeight || defaultLineHeightFactor) * cache.getApproximateHeight();\n const lines = text.split(\"\\n\");\n\n try {\n // Split each line into lines that are less wide than the region.\n const processedLines = lines.flatMap(line => splitLineUntilFit(line, region.width, fontScale, cache));\n const calculatedLines = processedLines.flatMap(li => li.lines);\n return {\n lines: calculatedLines,\n requiredHeight: processedLines.flatMap(li => li.lines).length * (fontScale * lh),\n fontSize: fontSize,\n requiredWidth: clampWidth(calculatedLines, region.width, fontScale, cache)\n };\n } catch (e) {\n const allChars = text.split('');\n return {\n lines: allChars,\n requiredHeight: allChars.length * (fontScale * lh),\n fontSize: fontSize,\n requiredWidth: clampWidth(allChars, region.width, fontScale, cache)\n };\n }\n};\n\nconst splitLineUntilFit = (line: string, regionWidth: number, fontScale: number, cache: FontMetrics): { lines: string[], width: number } => {\n const initialWidth = textWidth(line, fontScale, cache);\n if (initialWidth <= regionWidth) {\n return { lines: [line], width: initialWidth };\n }\n\n const lineContainsSpace = line.indexOf(' ') > -1;\n if (!lineContainsSpace) {\n // No space, whole line is one word.\n if (line.length <= 1) {\n throw new Error(`Character ${line} is wider than region`);\n }\n const middle = Math.floor(line.length / 2);\n\n const splitA = splitLineUntilFit(line.slice(0, middle), regionWidth, fontScale, cache);\n const splitB = splitLineUntilFit(line.slice(middle), regionWidth, fontScale, cache);\n return { lines: [...splitA.lines, ...splitB.lines], width: Math.max(splitA.width, splitB.width) };\n }\n\n const allWords = line.split(' ');\n const lines: string[] = [];\n let maxWidth = -Infinity;\n\n let firstWordIndex = 0;\n while (firstWordIndex < allWords.length) {\n const firstWord = allWords[firstWordIndex];\n if (textWidth(firstWord, fontScale, cache) > regionWidth) {\n // First word is too big for one line.\n const split = splitLineUntilFit(firstWord, regionWidth, fontScale, cache);\n lines.push(...split.lines);\n maxWidth = Math.max(maxWidth, split.width);\n firstWordIndex++;\n } else {\n // Add words to temp line until we go over.\n const tempWords = [firstWord];\n maxWidth = Math.max(maxWidth, textWidth(firstWord, fontScale, cache));\n\n let lastWordIndex = firstWordIndex + 1;\n let fits = true;\n while (lastWordIndex < allWords.length && fits) {\n const nextWord = allWords[lastWordIndex];\n const wordsWidth = textWidth(`${tempWords.join(' ')} ${nextWord}`, fontScale, cache);\n if (wordsWidth <= regionWidth) {\n tempWords.push(nextWord);\n maxWidth = Math.max(maxWidth, wordsWidth);\n lastWordIndex++;\n } else {\n fits = false;\n }\n }\n lines.push(tempWords.join(' '));\n\n firstWordIndex = lastWordIndex;\n }\n }\n\n if (maxWidth < 0) {\n throw new Error(`No max width calculated for text: ${lines}.`);\n }\n return { lines, width: maxWidth };\n};\n\nexport interface TraditionalTextResults {\n lines: string[];\n fontSize: number,\n requiredHeight: number;\n requiredWidth: number;\n}\n\nconst calcFontSize = (\n lines: string[],\n cache: FontMetrics,\n font: Font,\n width: number,\n height: number,\n lineHeight?: number\n): number => {\n const lh = (lineHeight ?? defaultLineHeightFactor) * cache.getApproximateHeight();\n const fontScale = 1 / font.unitsPerEm;\n\n const desiredWidth = lineWidth(lines, fontScale, cache);\n const desiredHeight = lines.length * lh * fontScale;\n\n const fontSizeW = width / desiredWidth;\n const fontSizeH = height / desiredHeight;\n return Math.min(fontSizeH, fontSizeW);\n}\n\n/**\n * Automatically fit the dimensions and font size of a textbox, based on how the textbox has been changed\n * @param updatedText The new input text.\n * @param updatedElement The element in its new, updated state.\n * @param previousElement The element before any changes.\n * @param lineHeight The line height of the textbox.\n * @returns A collection of changes that are required to correctly update the textbox.\n */\nexport const refitTextbox = (\n updatedText: string,\n updatedElement: TextboxElement,\n previousElement?: TextboxElement,\n lineHeight?: number,\n): TraditionalTextResults => {\n const cache = getFontMetrics(updatedElement.fontData!.assetUrl);\n const font = cache.getFont();\n const fontScale = updatedElement.fontSize / font.unitsPerEm;\n\n if (!previousElement) {\n return getLines(updatedElement as unknown as CanvasRegion, updatedText, updatedElement.fontSize, fontScale, cache, lineHeight);\n }\n\n // fallbackLines is only used when not re-calculating the lines of text\n let fallbackLines: string[];\n if (!updatedElement.text) {\n fallbackLines = updatedElement.input?.split(\"\\n\") ?? [\"\"];\n } else {\n fallbackLines = updatedElement.text.split(\"\\n\");\n }\n\n // layout has not changed\n if (previousElement.input === updatedText\n && updatedElement.width === previousElement.width\n && updatedElement.height === previousElement.height\n && updatedElement.lineHeight === previousElement.lineHeight) {\n return {\n lines: fallbackLines,\n requiredHeight: updatedElement.height,\n requiredWidth: clampWidth(fallbackLines, updatedElement.width, fontScale, cache),\n fontSize: updatedElement.fontSize\n }\n }\n\n const oneAxisChange = (updatedElement.width !== previousElement.width) !== (updatedElement.height !== previousElement.height);\n if (updatedElement.lineHeight === previousElement.lineHeight\n && !oneAxisChange\n && previousElement.input === updatedText) {\n return {\n lines: fallbackLines,\n requiredHeight: updatedElement.height,\n requiredWidth: clampWidth(fallbackLines, updatedElement.width, fontScale, cache),\n fontSize: calcFontSize(fallbackLines, cache, font, updatedElement.width, updatedElement.height, lineHeight)\n };\n } else {\n return getLines(updatedElement as unknown as CanvasRegion, updatedText, updatedElement.fontSize, fontScale, cache, lineHeight);\n }\n}\n\n/**\n * If a textbox has a fixed font size, it's width should be changed to fit the text.\n */\nexport const recalculateTextboxRegion = (\n currentRegion: Region,\n fontData: FontData,\n fontSize: number,\n textLines: string[],\n align?: string,\n): Region => {\n const cache = getFontMetrics(fontData.assetUrl);\n const font = cache.getFont();\n\n let region = { ...currentRegion };\n const candidateRegion = { ...currentRegion };\n const requiredWidth = lineWidth(textLines, fontSize / font.unitsPerEm, getFontMetrics(fontData.assetUrl));\n\n if (requiredWidth && requiredWidth < region.width) {\n candidateRegion.width = requiredWidth;\n if (align === \"left\") {\n candidateRegion.left += Math.sin((region.rotation * Math.PI) / 360) * (region.width - requiredWidth);\n candidateRegion.top += (Math.sin((region.rotation * Math.PI) / 180) * (requiredWidth - region.width)) / 2;\n } else if (align === \"right\") {\n candidateRegion.left += region.width - requiredWidth;\n } else {\n candidateRegion.left += (region.width - requiredWidth) / 2;\n }\n if (\n textLines &&\n zip(textLines, textLines).every(([lineA, lineB]) => lineA === lineB)\n ) {\n region = candidateRegion;\n }\n }\n return region;\n};\n","import { FontMetrics } from \"../util/font\";\nimport { TextAlgorithm, TextboxElement } from \"../types\";\nimport { refitTextbox } from \"./algorithm/traditional\";\n\n/**\n * The size of a step used to compute font sizes.\n */\nexport const fontSizeStep = 1;\n\n/**\n * Computes the width of text. See the following link for a detailed breakdown.\n * https://developer.tizen.org/community/tip-tech/working-fonts-using-opentype.js?langswitch=en\n * @param text The text to get width for.\n * @param scale The scale\n * @param cache The font metric cache to be used for calculations.\n * @returns The width of the text.\n */\nexport const textWidth = (text: string, scale: number, cache: FontMetrics): number => {\n let width = 0;\n const glyphs = cache.getGlyphs(text);\n\n glyphs.forEach((glyph, idx) => {\n if (glyph.advanceWidth) {\n width += glyph.advanceWidth;\n }\n if (idx < glyphs.length - 1) {\n const kerningValue = cache.getKerningValue(glyph, glyphs[idx + 1]);\n width += kerningValue || 0;\n }\n });\n width *= scale;\n return width;\n};\n\n/**\n * Computes the width of the larges individual character in the input text.\n * @param text The input text.\n * @param scale The scale of the text.\n * @param cache The font metric cache to be used for calculations.\n * @returns The width of the largest character.\n */\nexport const charWidth = (text: string, scale: number, cache: FontMetrics): number => {\n let maxWidth = 0;\n const glyphs = cache.getGlyphs(text);\n\n glyphs.forEach((glyph, idx) => {\n if (glyph.advanceWidth) {\n maxWidth = Math.max(maxWidth, glyph.advanceWidth);\n }\n if (idx < glyphs.length - 1) {\n const kerningValue = cache.getKerningValue(glyph, glyphs[idx + 1]);\n maxWidth = Math.max(maxWidth, kerningValue || 0);\n }\n });\n maxWidth *= scale;\n return maxWidth;\n};\n\n/**\n * Computes the width of the largest line.\n * @param lines The input text split by line.\n * @param fontScale The scale of the text.\n * @param cache The font metric cache to be used for calculations.\n * @returns The width of the largest line.\n */\nexport const lineWidth = (lines: string[], fontScale: number, cache: FontMetrics): number => {\n let maxWidth = 0;\n lines.forEach((line) => {\n maxWidth = Math.max(maxWidth, textWidth(line, fontScale, cache));\n });\n return maxWidth;\n};\n\ninterface TextTransformationConfiguration {\n stripControlCharacters: boolean;\n vertical: boolean;\n uppercase: boolean;\n}\n\nconst transformationDefaults: TextTransformationConfiguration = {\n stripControlCharacters: true,\n vertical: false,\n uppercase: false,\n};\n\n/**\n * Applies a number of different transformations to a piece of text based on configuration\n * @param text The text to transform.\n * @param options The requested options, this will default to sensible defaults if not provided.\n * @returns A string represented the transformed value of the input text.\n */\nexport const applyTextTransformations = (\n text: string,\n options: Partial<TextTransformationConfiguration> = transformationDefaults,\n) => {\n // We apply our own defaults to any fields that aren't supplied.\n const configuration = { ...transformationDefaults, ...options };\n\n let result = text || \"\";\n\n // Control characters are not valid in XML, we strip them from any input to\n // ensure that invalid data doesn't enter the SVG generated by our system.\n // \\u000A and \\u000D are carriage return and newline sequences, we want to keep these.\n // eslint-disable-next-line no-control-regex\n if (configuration.stripControlCharacters) {\n result = result.replace(/^(?![\\u000A\\u000D])[\\u0000-\\u001F\\u007F-\\u009F]/g, \"\");\n }\n\n // Force upper case\n if (configuration.uppercase) {\n result = result.toUpperCase();\n }\n\n // Inserts newlines into text to make a vertical string\n if (configuration.vertical) {\n result = result.split(\"\").join(\"\\n\");\n }\n\n return result;\n};\n\n// https://stackoverflow.com/a/22015771\n// Helpful function for zipping two arrays together\nexport const zip = (xs: any[], ys: any[]) => {\n return xs.map((x, idx) => [x, ys[idx]]);\n};\n\nexport const getTextAlignment = (align: string = \"center\", isVertical: boolean = false) => {\n if (isVertical) {\n return \"center\";\n }\n return align;\n};\n\n/**\n * Returns the correct text anchor for the given alignment.\n */\nexport const getAnchor = (align?: string) => {\n if (align === \"left\") {\n return \"start\";\n }\n if (align === \"right\") {\n return \"end\";\n }\n return \"middle\";\n};\n\nexport const recomputeTextOnElement = (el: TextboxElement, newText: string, oldEl?: TextboxElement): TextboxElement => {\n if (!el.fontData) {\n return el;\n }\n const getCalculatedMixins = () => {\n // TODO: Pull the autosize algorithm in here as well. This means all sizing\n // will occur in one place. Any command that relies on text changes that could affect\n // the textbox size in any way should pass through this function.\n if (el.algorithm === TextAlgorithm.Traditional) {\n const calculatedText = refitTextbox(newText, el, oldEl, el.lineHeight);\n return {\n text: calculatedText.lines.join(\"\\n\"),\n height: calculatedText.requiredHeight,\n width: calculatedText.requiredWidth,\n fontSize: calculatedText.fontSize,\n input: newText,\n };\n } else {\n return {\n text: newText,\n };\n }\n };\n return {\n ...el,\n ...getCalculatedMixins(),\n };\n};\n\n/**\n * The default line height to use in situations where none is specified.\n * Typical default is suggested to be between 1.1 & 1.2\n */\nexport const defaultLineHeightFactor = 1.1;\n","import { defaultLineHeightFactor as fallbackLineheight, getAnchor } from \"../text/shared\";\nimport { PapyrusComponent, TextboxElement } from \"../types\";\nimport { spotColorDefinitionString } from \"../util/color\";\n\nexport const Textbox: PapyrusComponent<Omit<TextboxElement, \"type\">> = (props) => {\n const rotation = props.rotation || 0;\n const angleInRadians = (rotation * Math.PI) / 180.0;\n const rotC = Math.cos(angleInRadians);\n const rotS = -Math.sin(angleInRadians);\n const curvedPathId = `text-path-${props.id}`;\n const textFillId = `text-fill-${props.id}`;\n\n const xTranslation = props.x + (props.curved ? 0 : props.width / 2);\n const yTranslation = props.y + (props.curved ? 0 : props.height / 2);\n\n const lines = (props.text || \"\").split(\"\\n\");\n\n if (props.curved && !props.paths) {\n return null;\n }\n\n if (!props.fontData) {\n return null;\n }\n\n const getFill = (): string => {\n if (props.textFillImage) {\n return `url(\"#${textFillId}\")`;\n }\n if (props._renderingConfiguration?.spotColors && props.fillSpotColorDefinition) {\n return `${props.fill} ${spotColorDefinitionString(props.fillSpotColorDefinition)}`;\n }\n return props.fill;\n };\n\n return (\n <>\n <defs>\n {props.textFillImage && (\n <pattern\n id={textFillId}\n patternUnits=\"userSpaceOnUse\"\n width={props.textFillImage.scale * props.textFillImage.width}\n height={props.textFillImage.scale * props.textFillImage.height}\n x={0}\n y={0}\n >\n <image\n href={props.textFillImage.src}\n xlinkHref={props.textFillImage.src}\n width={props.textFillImage.scale * props.textFillImage.width}\n height={props.textFillImage.scale * props.textFillImage.height}\n />\n </pattern>\n )}\n <style\n type=\"text/css\"\n dangerouslySetInnerHTML={{\n __html: `\n @font-face {\n font-family: '${props.fontData.name}';\n src: url('${props.fontData.assetUrl}') format('truetype');\n }\n `,\n }}\n />\n {props.curved && props.paths ? <path id={curvedPathId} d={props.paths[0]} /> : undefined}\n </defs>\n {props._renderingConfiguration?.debug ? (\n <rect stroke=\"blue\" fill=\"none\" x={props.x} y={props.y} width={props.width} height={props.height} />\n ) : undefined}\n\n <g mask={props.stepName ? undefined : props.mask}>\n <g transform={`matrix(${rotC}, ${-rotS}, ${rotS}, ${rotC}, ${xTranslation}, ${yTranslation})`}>\n <text\n xmlSpace=\"preserve\"\n fontFamily={`'${props.fontData.name}'`}\n fontSize={props.fontSize}\n fontStyle=\"normal\"\n fontWeight=\"normal\"\n fill={getFill()}\n style={{\n whiteSpace: \"pre\",\n userSelect: \"none\",\n }}\n >\n {props.curved ? (\n <TextPath text={props.text || \"\"} curvedPathId={curvedPathId} align={props.align} />\n ) : (\n lines.map((line, idx) => {\n return (\n <TextSpan\n key={idx}\n align={props.vertical ? \"center\" : props.align}\n fontSize={props.fontSize}\n thisLineIdx={idx}\n amountLines={lines.length}\n text={line}\n textboxHeight={props.height}\n textboxWidth={props.width}\n lineHeight={props.lineHeight}\n vertical={props.vertical}\n verticalAlign={props.verticalAlign}\n />\n );\n })\n )}\n </text>\n </g>\n </g>\n </>\n );\n};\n\nconst TextSpan: PapyrusComponent<{\n text: string;\n fontSize: number;\n thisLineIdx: number;\n amountLines: number;\n lineHeight?: number;\n textboxHeight: number;\n textboxWidth: number;\n align?: string;\n vertical?: boolean;\n verticalAlign?: string;\n}> = (props) => {\n const getLineHeight = () => {\n if (props.lineHeight !== undefined) {\n return props.lineHeight;\n }\n return fallbackLineheight;\n };\n\n const getX = () => {\n if (props.align === \"left\") {\n return -props.textboxWidth / 2.0;\n }\n if (props.align === \"right\") {\n return props.textboxWidth / 2.0;\n }\n return 0.0;\n };\n\n // TODO: Write tests for this logic. Check coverage for lines\n const getY = () => {\n const lineHeight = props.fontSize * getLineHeight();\n const halfBoxHeight = props.textboxHeight / 2.0;\n\n if (props.verticalAlign === \"top\") {\n return -halfBoxHeight + (props.fontSize * 3) / 4 + props.thisLineIdx * lineHeight;\n }\n\n if (props.verticalAlign === \"bottom\") {\n const reverseIdx = props.amountLines - 1 - props.thisLineIdx;\n return halfBoxHeight - props.fontSize / 4 - reverseIdx * lineHeight;\n }\n\n // Vertically align to middle.\n // Lines before the middle line shift up,\n // lines after the middle line shift down.\n const middleLineIdx = (props.amountLines - 1) / 2.0;\n return (props.thisLineIdx - middleLineIdx) * lineHeight + props.fontSize / 4;\n };\n\n return (\n <tspan textAnchor={getAnchor(props.align)} x={getX()} y={`${getY()}px`}>\n {props.text}\n </tspan>\n );\n};\n\nconst TextPath: PapyrusComponent<{\n text: string;\n curvedPathId: string;\n align?: string;\n}> = (props) => {\n const targetId = `#${props.curvedPathId}`;\n const getStartOffset = () => {\n if (props.align === \"left\") {\n return \"0%\";\n }\n if (props.align === \"right\") {\n return \"100%\";\n }\n return \"50%\";\n };\n return (\n <textPath\n startOffset={getStartOffset()}\n textAnchor={getAnchor(props.align)}\n href={targetId}\n xlinkHref={targetId}\n >\n {props.text}\n </textPath>\n );\n};\n","import { Image } from \"./Image\";\nimport { modifySVGWithElementProperties } from \"../util/illustration\";\nimport { degreesToRadians } from \"../util/math\";\nimport { IllustrationElement, PapyrusComponent } from \"../types\";\n\nexport const Illustration: PapyrusComponent<Omit<IllustrationElement, \"type\">> = (props) => {\n // When caching is enabled we use the provided cached objectURL, this is much faster\n // than traversing and rendering the svg entirely inline.\n\n if (props.cachedObjectURL && !props._renderingConfiguration?.omitCachedFields) {\n return (\n <Image\n id={props.id}\n src={props.cachedObjectURL}\n x={props.x}\n y={props.y}\n width={props.width}\n height={props.height}\n rotation={props.rotation}\n preserveAspectRatio=\"none\"\n immutable={props.immutable}\n mask={props.stepName ? undefined : props.mask}\n />\n );\n }\n\n const rotation = props.rotation || 0;\n const angleInRadians = degreesToRadians(rotation);\n const rotC = Math.cos(angleInRadians);\n const rotS = -Math.sin(angleInRadians);\n\n const transform = `\n matrix(1, 0, 0, 1, ${props.x}, ${props.y})\n matrix(1, 0, 0, 1, ${props.width / 2}, ${props.height / 2})\n matrix(${rotC}, ${-rotS}, ${rotS}, ${rotC}, 0, 0)\n matrix(1, 0, 0, 1, ${-props.width / 2}, ${-props.height / 2})\n `;\n\n if (!props.svg) {\n throw new Error(\n `Illustration element ${props.id} (stepName ${props.stepName}) lacked svg from src ${props.src} at render time.`,\n );\n }\n\n return (\n <g mask={props.stepName ? undefined : props.mask}>\n <g\n transform={transform}\n dangerouslySetInnerHTML={{\n __html: modifySVGWithElementProperties(\n props.svg,\n props.width,\n props.height,\n props.colors,\n props._renderingConfiguration?.spotColors,\n ),\n }}\n />\n </g>\n );\n};\n","import { SVGLayoutProps, SVGLayout } from \"./Elements/SVGLayout\";\nimport { CanvasCommand, CreateLayoutCommand } from \"./command\";\nimport { Image } from \"./Elements/Image\";\nimport { Frame } from \"./Elements/Frame\";\nimport { Group } from \"./Elements/Group\";\nimport { Textbox } from \"./Elements/Textbox\";\nimport { Illustration } from \"./Elements/Illustration\";\nimport { generate } from \"./util/guid\";\n\nimport {\n LayoutsState,\n ILayout,\n LayoutElement,\n ImageElement,\n FrameElement,\n IllustrationElement,\n TextboxElement,\n RenderingConfiguration,\n LayoutState,\n Layerable,\n PapyrusNode,\n PapyrusComponent,\n LayoutElementType,\n GroupElement,\n} from \"./types\";\n\nexport interface CommandState {\n transaction: LayoutsState;\n}\n\nexport interface LayoutComponentConfiguration {\n renderingConfiguration: RenderingConfiguration;\n outlineArea?: {\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n scale?: number;\n // If true the outline area won't be stroked.\n hidden?: boolean;\n };\n viewBox?: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n maxHeight?: string;\n maxWidth?: string;\n height?: string | number;\n width?: string | number;\n position?: string;\n borderRadius?: number;\n outlineColor?: string;\n backgroundColor?: string;\n}\n\nexport class CommandContext {\n private state: undefined | CommandState;\n private stateCallbacks: (() => void)[];\n private id: string;\n\n private prevCommands: CanvasCommand[];\n private nextCommands: CanvasCommand[];\n\n constructor() {\n this.id = generate();\n this.stateCallbacks = [];\n this.prevCommands = [];\n this.nextCommands = [];\n }\n\n registerStateCallback(callback: () => void) {\n this.stateCallbacks.push(callback);\n }\n\n unregisterStateCallback(callback: () => void) {\n this.stateCallbacks.filter((cb) => cb !== callback);\n }\n\n getState() {\n return this.state;\n }\n\n private runStateCallbacks() {\n this.stateCallbacks.forEach((cb) => cb());\n }\n\n apply(command: CanvasCommand, leaveOffUndoStack?: boolean) {\n if (!this.state) {\n throw new Error(`State not initialized for cc ${this.id}!`);\n }\n this.state = this.commandReducer(this.state, command);\n this.runStateCallbacks();\n this.nextCommands = [];\n if (!leaveOffUndoStack) {\n this.prevCommands.push(command);\n }\n }\n\n undo() {\n if (!this.state) {\n return;\n }\n const mostRecentCommand = this.prevCommands.pop();\n if (!mostRecentCommand) {\n return;\n }\n const undoneState = mostRecentCommand.undo();\n this.state = { ...this.state, transaction: undoneState };\n this.nextCommands.push(mostRecentCommand);\n this.runStateCallbacks();\n }\n\n redo() {\n if (!this.state) {\n return;\n }\n const mostImminentCommand = this.nextCommands.pop();\n if (!mostImminentCommand) {\n return;\n }\n this.state = this.commandReducer(this.state, mostImminentCommand);\n this.runStateCallbacks();\n this.prevCommands.push(mostImminentCommand);\n }\n\n /**\n * Find all commands in history with the given sequence ID,\n * discard all but the last and overwrite its oldState.\n */\n public flattenSequence(sequenceId: string, initialState: LayoutsState) {\n const commandSequence = this.prevCommands.filter((c) => c.sequenceId === sequenceId);\n const mostRecentCommand = commandSequence.pop();\n if (!mostRecentCommand) {\n return;\n }\n this.prevCommands = this.prevCommands.filter((c) => c.sequenceId !== sequenceId);\n mostRecentCommand?.overrideOldState(initialState);\n this.prevCommands.push(mostRecentCommand);\n }\n\n getLayoutById(layoutId: string): LayoutData {\n if (!this.state) {\n throw new Error(`State not initialized for cc ${this.id}!`);\n }\n const transactionState = this.state.transaction?.layouts?.[layoutId];\n const layout = transactionState?.layout;\n if (!layout) {\n throw new Error(`No layout: ${layoutId}`);\n }\n const els = [...(transactionState?.elements || [])];\n return this.getLayoutDataWithState(layout, els);\n }\n\n getAllLayouts() {\n if (!this.state) {\n throw new Error(`State not initialized for cc ${this.id}!`);\n }\n const layoutNamesWithDupes = [...Object.keys(this.state.transaction?.layouts)];\n const layoutNames = [...new Set(layoutNamesWithDupes)];\n return layoutNames.map((id) => this.getLayoutById(id));\n }\n\n private getLayoutDataWithState(layout: ILayout, elements: LayoutElement[]) {\n return {\n layoutState: {\n layout,\n elements,\n },\n getComponentWithProps: (configuration: LayoutComponentConfiguration) => {\n return getSvgElement(layout, elements, configuration);\n },\n } as LayoutData;\n }\n\n initialize(layouts: ILayout[], reloadedState?: LayoutsState) {\n if (reloadedState) {\n this.state = {\n transaction: reloadedState,\n };\n return;\n }\n let newState: LayoutsState = {\n serializableWorkflow: { steps: [] },\n layouts: {},\n };\n layouts.forEach((layout) => {\n newState = new CreateLayoutCommand(layout).apply(newState);\n });\n this.runStateCallbacks();\n this.state = {\n transaction: newState,\n };\n }\n\n private commandReducer(state: CommandState, command: CanvasCommand): CommandState {\n const transactionState = state.transaction || { layouts: {}, serializableWorkflow: { steps: [] } };\n return { ...state, transaction: command.apply(transactionState) };\n }\n}\n\nexport const elementFactory = (element: LayoutElement): PapyrusNode => {\n if (element.type === LayoutElementType.Image) {\n return <Image key={element.id} {...(element as ImageElement)} />;\n }\n if (element.type === LayoutElementType.Frame) {\n return <Frame key={element.id} {...(element as FrameElement)} />;\n }\n if (element.type === LayoutElementType.Illustration) {\n return <Illustration key={element.id} {...(element as IllustrationElement)} />;\n }\n if (element.type === LayoutElementType.Textbox) {\n return <Textbox key={element.id} {...(element as TextboxElement)} />;\n }\n if (element.type === LayoutElementType.Group) {\n return <Group key={element.id} {...(element as GroupElement)} />;\n }\n return null;\n};\n\nexport const getSvgElement = (\n layout: ILayout,\n elements: LayoutElement[],\n configuration: LayoutComponentConfiguration,\n): PapyrusNode => {\n const renderingConfiguration = configuration.renderingConfiguration;\n\n // Filter elements if required, any element can be tagged with exclude for print, meaning\n // that its value will not be sent up to the server.\n const filteredElements = renderingConfiguration?.removeExcludedElements\n ? elements.filter((el) => !el.excludeFromExport)\n : elements;\n\n return (\n <SVGLayout\n preserveAspectRatio={undefined}\n elements={filteredElements}\n backgroundColor={\n layout.transparentBackground\n ? undefined\n : configuration.backgroundColor\n ? configuration.backgroundColor\n : \"white\"\n }\n width={configuration.width || layout.width}\n height={configuration.height || layout.height}\n viewBox={\n renderingConfiguration?.region\n ? {\n x: renderingConfiguration.region.left,\n y: renderingConfiguration.region.top,\n width: renderingConfiguration.region.width,\n height: renderingConfiguration.region.height,\n }\n : {\n x: 0,\n y: 0,\n width: layout.width,\n height: layout.height,\n }\n }\n configuration={renderingConfiguration}\n outlineArea={configuration.outlineArea}\n maxHeight={configuration.maxHeight}\n maxWidth={configuration.maxWidth}\n position={configuration.position}\n borderRadius={configuration.borderRadius}\n outlineColor={configuration.outlineColor}\n />\n );\n};\n\n/**\n * Computes a list of elements sorted by layers first, lowest to highest. Followed by index within that layer, lowest to highest.\n * @returns The original array reference. Sorted in place.\n */\nexport function sortElementsByLayersWithIndex<T extends Layerable>(items: T[]): T[] {\n return items.sort((a, b) => {\n // Sort by layer first as this is the more significant factor.\n const aLayer = a.layer || 0;\n const bLayer = b.layer || 0;\n if (aLayer < bLayer) return -1;\n if (aLayer > bLayer) return 1;\n // If layer is equal, sort by index instead. Elements on the same layer\n // may be re-ordered amongst eachother.\n const aLayerIndex = a.layerIndex || 0;\n const bLayerIndex = b.layerIndex || 0;\n if (aLayerIndex < bLayerIndex) return -1;\n if (aLayerIndex > bLayerIndex) return 1;\n // Otherwise, they are at exactly the same place from a layering perspective, this actually isn't good. It means\n // we would be relying on stable sorting to ensure the elements don't fall out of the order we would expect.\n return 0;\n });\n}\n\nexport interface LayoutData {\n layoutState: LayoutState;\n Component: PapyrusComponent<SVGLayoutProps>;\n getComponentWithProps: (configuration: LayoutComponentConfiguration) => PapyrusComponent<SVGLayoutProps>;\n}\n","import { generate } from \"../util/guid\";\nimport {\n ColorDefinition,\n FontData,\n FrameElement,\n FrameStepData,\n IllustrationElement,\n ImageElement,\n LayoutElementType,\n PictureStepData,\n Region,\n TextAlgorithm,\n TextboxElement,\n TextStepData,\n} from \"../types\";\nimport { getFontMetrics, loadFont } from \"../util/font\";\nimport { generateFrameSVG, getFrameData } from \"../util/frame\";\nimport { applyTextTransformations, getTextAlignment, recomputeTextOnElement, textWidth } from \"../text/shared\";\nimport { getAttributesFromArrayBuffer } from \"../util/image\";\nimport { LayoutData } from \"../CommandContext\";\nimport { generateSVGWithUnknownColors } from \"../util/illustration\";\nimport { Pith } from \"pith\";\nimport { recalculateTextboxRegion } from \"../text/algorithm/traditional\";\nimport { domParser, fetch, fetchAsArrayBuffer, fetchAsString } from \"../util/crossplatform\";\nimport { createCanvas, getDomParser, loadImage } from \"../customCanvas\";\n\nconst nextIndexForLayer = (layout: LayoutData, layer: number): number => {\n const elements = layout.layoutState.elements.filter((el) => el.layer === layer);\n const maxIndex = Math.max(...(elements.map((el) => el.layerIndex).filter((li) => li !== undefined) as number[]));\n return Math.max(maxIndex, 0) + 1;\n};\n\nconst getIllustrationBody = async (src: string): Promise<string> => {\n return new Promise((resolve) => {\n fetchAsString(src as string)\n .then((svg) => {\n resolve(svg);\n })\n .catch((e) => console.error(e));\n });\n};\n\nconst svgPromiseCache = new Map<string, Promise<string>>();\n\n/**\n * @param svg The SVG to get an object URL for.\n * @returns An object URL storing the cached image of this svg file.\n */\nexport const svgObjectURL = async (svg: string): Promise<string> => {\n if (svgPromiseCache.has(svg)) {\n return svgPromiseCache.get(svg)!;\n }\n\n const getCanvasObjectURLAsync = async (canvas: HTMLCanvasElement): Promise<string> => {\n return new Promise((resolve, reject) => {\n try {\n const canBuildObjectURL = !!URL && !!URL.createObjectURL;\n if (!canBuildObjectURL) throw new Error(\"Environment incapable of generating ObjectURL\");\n canvas.toBlob((blob) => {\n if (!blob) {\n if (canvas.width === 0 || canvas.height === 0)\n throw new Error(`Canvas dimensions are invalid (${canvas.width},${canvas.height})`);\n else if (canvas.width * canvas.height >= 268435456)\n throw new Error(`Canvas dimensions exceed device limit (${canvas.width},${canvas.height})`);\n throw new Error(\"Couldn't generate object URL for Illustration, the blob was undefined!\");\n }\n resolve(URL.createObjectURL(blob));\n });\n } catch (e: any) {\n reject(e);\n }\n });\n };\n\n const getPromise = async () => {\n const parser = domParser();\n const parsedSvg = parser.parseFromString(svg, \"image/svg+xml\");\n const root = parsedSvg.firstElementChild;\n\n if (!root) {\n throw new Error(\"Failed to read SVG\");\n }\n\n const serialiser = new XMLSerializer();\n const rebuiltSvg = serialiser.serializeToString(root);\n const canvas = createCanvas();\n const ctx = canvas.getContext(\"2d\")!;\n const pith = await Pith.from(ctx as any, rebuiltSvg, {\n anonymousCrossOrigin: true,\n ignoreDimensions: false,\n createCanvas: createCanvas as any,\n createImage: loadImage as any,\n DOMParser: getDomParser(),\n fetch: fetch,\n });\n\n const widthString = root.getAttribute(\"width\");\n const heightString = root.getAttribute(\"height\");\n const cachedIllustrationQuality = 2048;\n if (heightString && widthString) {\n const height = parseFloat(heightString);\n const width = parseFloat(widthString);\n const aspect = width / height;\n if (aspect > 1) {\n // Wider than high\n pith.resize(cachedIllustrationQuality, cachedIllustrationQuality / aspect);\n } else {\n // Higher than wide\n pith.resize(cachedIllustrationQuality * aspect, cachedIllustrationQuality);\n }\n } else {\n pith.resize(cachedIllustrationQuality, cachedIllustrationQuality);\n }\n\n await pith.render();\n return await getCanvasObjectURLAsync(canvas as any);\n };\n const promise = getPromise();\n svgPromiseCache.set(svg, promise);\n return promise;\n};\n\n/**\n * Calculate a centered and reasonably sized region for the layout and content.\n */\nconst centralRegion = async (\n layout: LayoutData,\n type: LayoutElementType,\n link?: string,\n opts?: { text?: string; fontScale?: number },\n): Promise<Region> => {\n const coords = (layout.layoutState.layout.useEditableArea && layout.layoutState.layout.editableArea) || {\n width: layout.layoutState.layout.width,\n height: layout.layoutState.layout.height,\n x: 0,\n y: 0,\n };\n const lesserDim = coords.width < coords.height ? coords.width : coords.height;\n const size = layout.layoutState.layout.useEditableArea ? lesserDim / 1.3 : lesserDim / 2;\n\n const region = {\n top: coords.y + coords.height / 2 - size / 2,\n left: coords.x + coords.width / 2 - size / 2,\n width: size,\n height: size,\n rotation: 0,\n panelId: layout.layoutState.layout.panelId,\n };\n\n if (link && type === LayoutElementType.Illustration) {\n const svgData = await generateSVGWithUnknownColors(await getIllustrationBody(link));\n const parser = domParser();\n const parsedSvg = parser.parseFromString(svgData.svg, \"image/svg+xml\");\n const svgEl = parsedSvg.firstElementChild as SVGElement;\n const viewBox = svgEl.getAttribute(\"viewBox\");\n if (!viewBox) throw new Error(\"SVG missing viewBox.\");\n const oldHeight = region.height;\n const viewBoxElems = viewBox.split(\" \");\n const viewBoxWidth = parseFloat(viewBoxElems[2]) || 1;\n const viewBoxHeight = parseFloat(viewBoxElems[3]) || 1;\n const aspect = viewBoxWidth / viewBoxHeight;\n region.height = region.width / aspect;\n region.top += (oldHeight - region.height) / 2;\n }\n\n if (link && type === LayoutElementType.Image) {\n const oldHeight = region.height;\n const arrayBuffer = await fetchAsArrayBuffer(link);\n const attributes = await getAttributesFromArrayBuffer(arrayBuffer);\n const aspect = attributes.width / attributes.height;\n region.height = region.width / aspect;\n region.top += (oldHeight - region.height) / 2;\n }\n\n // When font size & text are provided, we compute based on the calculated text width\n if (link && type === LayoutElementType.Textbox && opts?.text && opts?.fontScale) {\n await loadFont(link);\n const cache = getFontMetrics(link);\n const calculatedTextWidth = textWidth(opts.text, opts?.fontScale, cache);\n region.width = Math.min(calculatedTextWidth, coords.width * 0.85);\n region.left = coords.x + coords.width / 2 - region.width / 2;\n }\n\n return region;\n};\n\nexport class LayoutElementFactory {\n static async getFrame(\n layout: LayoutData,\n opts: {\n region?: Region;\n configuration: Partial<FrameStepData>;\n src?: string;\n },\n ): Promise<FrameElement> {\n const frameSvg = await generateFrameSVG(opts.region, opts.src);\n const frameData = await getFrameData(frameSvg);\n\n const region = opts.region || (await centralRegion(layout, LayoutElementType.Frame));\n\n return {\n id: generate(),\n x: region.left,\n y: region.top,\n width: region.width,\n height: region.height,\n layer: region.layer || 0,\n layerIndex: region.layerIndex || nextIndexForLayer(layout, region.layer || 0),\n rotation: region.rotation,\n scaleX: region.width / frameData.width,\n scaleY: region.height / frameData.height,\n path: frameData.path,\n dataWidth: frameData.width,\n dataHeight: frameData.height,\n type: LayoutElementType.Frame,\n disablePlaceholder: opts.configuration.disablePlaceholder,\n focalBlur: opts.configuration.focalBlur,\n focalBlurStrength: opts.configuration.focalBlurStrength,\n focalBlurRadius: opts.configuration.focalBlurRadius,\n forceImageCover: opts.configuration.forceImageCover,\n pattern: undefined,\n immutable: region.immutable,\n };\n }\n\n static async getImage(\n layout: LayoutData,\n opts: {\n region?: Region;\n layout?: LayoutData;\n configuration: Partial<PictureStepData>;\n src: string;\n },\n ): Promise<ImageElement> {\n const region = opts.region || (await centralRegion(layout, LayoutElementType.Image, opts.src));\n\n return {\n id: generate(),\n src: opts.src,\n type: LayoutElementType.Image,\n y: region.top,\n x: region.left,\n rotation: region.rotation,\n width: region.width,\n height: region.height,\n layer: region.layer || 0,\n layerIndex: region.layerIndex || nextIndexForLayer(layout, region.layer || 0),\n immutable: region.immutable,\n preserveAspectRatio: \"none\",\n };\n }\n\n static async getTextbox(\n layout: LayoutData,\n opts: {\n region?: Region;\n configuration: Partial<TextStepData>;\n fontSrc: string;\n designInputStep?: any; // TextDesignInputStepData old generation type from headless\n },\n ): Promise<TextboxElement> {\n const { configuration, fontSrc, designInputStep } = opts;\n\n // Load the font requested.\n const font = await loadFont(fontSrc);\n const fontData: FontData = {\n assetUrl: fontSrc,\n name: font.names.fullName[\"en\"],\n };\n\n const inputText = designInputStep?.text || configuration.defaultText || \"\";\n const replacedText = configuration.replaceableText\n ? configuration.replaceableText.replace(\"{{}}\", inputText)\n : inputText;\n\n // Transform based on configuration\n const text = applyTextTransformations(replacedText, {\n vertical: configuration.vertical,\n uppercase: configuration.uppercase,\n });\n\n const region =\n opts.region ||\n (await centralRegion(layout, LayoutElementType.Textbox, fontSrc, {\n text,\n fontScale: configuration.size ? configuration.size / font.unitsPerEm : undefined,\n }));\n\n const recomputedElement = recomputeTextOnElement(\n {\n id: generate(),\n type: LayoutElementType.Textbox,\n x: region.left,\n y: region.top,\n width: region.width,\n height: region.height,\n align: getTextAlignment(configuration.textAlign, configuration.vertical),\n curved: configuration.curved,\n fill: designInputStep?.color || configuration.colour || \"#000000\",\n fontData,\n layer: region.layer || 0,\n layerIndex: region.layerIndex || nextIndexForLayer(layout, region.layer || 0),\n paths: configuration.paths,\n rotation: region.rotation,\n vertical: configuration.vertical,\n verticalAlign: configuration.verticalAlign || \"middle\",\n algorithm: TextAlgorithm.Traditional,\n fontSize: configuration.size || Math.max(Math.round(region.height * 0.025), 1),\n text,\n input: inputText,\n },\n text,\n );\n const fittedRegion = recalculateTextboxRegion(\n { ...region, height: recomputedElement.height },\n fontData,\n recomputedElement.fontSize,\n recomputedElement?.text?.split(\"\\n\") || [],\n recomputedElement.align,\n );\n return {\n ...recomputedElement,\n x: fittedRegion.left,\n y: fittedRegion.top + (region.height - fittedRegion.height) / 2,\n width: fittedRegion.width,\n height: fittedRegion.height,\n };\n }\n\n static async getShape(layout: LayoutData, opts: { region?: Region; color: string }): Promise<IllustrationElement> {\n const svg = `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n xmlSpace=\"preserve\"\n preserveAspectRatio=\"none\"\n version=\"1.1\"\n width=\"1\"\n height=\"1\"\n viewBox=\"0 0 1 1\"\n >\n <rect\n x=\"0\"\n y=\"0\"\n width=\"1\"\n height=\"1\"\n class=\"spiff-fill-shape\"\n fill=\"${opts.color}\"\n />\n </svg>\n `;\n const colors: { [key: string]: ColorDefinition } = {};\n colors[\"spiff-fill-shape\"] = { browserValue: opts.color };\n\n const region = opts.region || (await centralRegion(layout, LayoutElementType.Illustration));\n\n const elementKey = generate();\n return {\n stepRegion: opts.region,\n colors,\n id: elementKey,\n svg,\n type: LayoutElementType.Illustration,\n y: region.top,\n x: region.left,\n rotation: region.rotation,\n width: region.width,\n height: region.height,\n layer: region.layer || 0,\n layerIndex: region.layerIndex || nextIndexForLayer(layout, region.layer || 0),\n immutable: region.immutable,\n };\n }\n\n static async getIllustration(\n layout: LayoutData,\n opts: { region?: Region; src: string },\n ): Promise<IllustrationElement> {\n const region = opts.region || (await centralRegion(layout, LayoutElementType.Illustration, opts.src));\n\n const svgData = await generateSVGWithUnknownColors(await getIllustrationBody(opts.src));\n const objectURL = await svgObjectURL(svgData.svg);\n const elementKey = generate();\n return {\n cachedObjectURL: objectURL,\n stepRegion: opts.region,\n colors: svgData.colors,\n id: elementKey,\n src: opts.src,\n svg: svgData.svg,\n type: LayoutElementType.Illustration,\n y: region.top,\n x: region.left,\n rotation: region.rotation,\n width: region.width,\n height: region.height,\n layer: region.layer || 0,\n layerIndex: region.layerIndex || nextIndexForLayer(layout, region.layer || 0),\n immutable: region.immutable,\n };\n }\n}\n","import { sortElementsByLayersWithIndex } from \"./CommandContext\";\nimport { svgObjectURL } from \"./Elements/factory\";\nimport {\n LayoutElement,\n LayoutState,\n LayoutsState,\n IllustrationElement,\n FrameElement,\n LayoutElementType,\n TextboxElement,\n} from \"./types\";\nimport { fetchAsString } from \"./util/crossplatform\";\nimport { loadFont } from \"./util/font\";\nimport { generate } from \"./util/guid\";\nimport { generateSVGWithUnknownColors, modifySVGWithElementProperties } from \"./util/illustration\";\n\nexport class ElementNotFoundError extends Error {\n constructor() {\n super(\"Element not found!\");\n Object.setPrototypeOf(this, ElementNotFoundError.prototype);\n }\n}\n\nconst findElement = <T extends LayoutElement>(id: string, layouts: LayoutState[]): T => {\n const layout = findLayoutForElement(id, layouts);\n const element = layout.elements.find((el) => el.id === id);\n return element as T;\n};\n\nconst findLayoutForElement = (id: string, layouts: LayoutState[]): LayoutState => {\n const layoutForElement = Object.values(layouts).find((layoutState: LayoutState) => {\n return layoutState.elements.some((el) => el.id === id);\n });\n if (!layoutForElement) {\n throw new ElementNotFoundError();\n }\n return layoutForElement;\n};\n\nconst updatedLayoutForElement = (element: LayoutElement, state: LayoutState): LayoutState => {\n const updatedElements = [...state.elements.filter((el) => el.id !== element.id), element];\n const layeredElements = sortElementsByLayersWithIndex(updatedElements);\n return {\n layout: state.layout,\n elements: layeredElements,\n modificationID: generate(),\n };\n};\n\nconst rehydrateSerializedLayout = async (transactionState: LayoutsState) => {\n const layoutNamesWithDupes = [...Object.keys(transactionState.layouts)];\n const layoutNames = [...new Set(layoutNamesWithDupes)];\n\n for (let i = 0; i < layoutNames.length; i++) {\n const layoutName = layoutNames[i];\n const layout = transactionState.layouts[layoutName];\n await Promise.all(\n layout.elements.map(async (element) => {\n // Rehydrate any illustrations in the layout.\n if (element.type === \"illustration\") {\n const illustration = element as IllustrationElement;\n if (illustration.src && !illustration.svg) {\n const illustrationBody = await fetchAsString(illustration.src);\n const init = await generateSVGWithUnknownColors(illustrationBody);\n illustration.svg = modifySVGWithElementProperties(\n init.svg,\n illustration.width,\n illustration.height,\n illustration.colors,\n );\n }\n } else if (element.type === \"frame\") {\n const frame = element as FrameElement;\n if (frame.pattern?.colors && frame.pattern?.src) {\n const svgBody = await fetchAsString(frame.pattern?.src);\n const init = await generateSVGWithUnknownColors(svgBody);\n frame.pattern.svg = init.svg;\n }\n }\n // Sanitize values. This likely shouldn't be necessary, but some funky stuff can happen if these values are missing.\n if (isNaN(element.x)) {\n element.x = 0;\n }\n if (isNaN(element.y)) {\n element.y = 0;\n }\n if (isNaN(element.width)) {\n element.width = 0;\n }\n if (isNaN(element.height)) {\n element.height = 0;\n }\n if (isNaN(element.rotation)) {\n element.rotation = 0;\n }\n }),\n );\n }\n\n for (const layoutKey in transactionState.layouts) {\n const illustrations = transactionState.layouts[layoutKey].elements.filter(\n (el) => el.type === LayoutElementType.Illustration,\n );\n for (let i = 0; i < illustrations.length; ++i) {\n const el = illustrations[i] as IllustrationElement;\n if (el.src && el.svg) {\n el.cachedObjectURL = await svgObjectURL(el.svg);\n }\n }\n const fonts = transactionState.layouts[layoutKey].elements.filter(\n (el) => el.type === LayoutElementType.Textbox,\n );\n for (let i = 0; i < fonts.length; ++i) {\n const el = fonts[i] as TextboxElement;\n if (el.fontData?.assetUrl) {\n await loadFont(el.fontData.assetUrl);\n }\n }\n }\n};\n\nexport { findElement, findLayoutForElement, updatedLayoutForElement, rehydrateSerializedLayout };\n","import cloneDeep from \"lodash.clonedeep\";\nimport { ElementNotFoundError, findElement, findLayoutForElement, updatedLayoutForElement } from \"./LayoutsState\";\nimport { recomputeTextOnElement } from \"./text/shared\";\nimport {\n FontData,\n FrameElement,\n FrameOffsets,\n ILayout,\n IllustrationElement,\n ImageElement,\n LayoutElement,\n LayoutsState,\n LayoutState,\n PatternImageData,\n SerializableWorkflow,\n TextAlgorithm,\n TextboxElement,\n TextFillImage,\n TextFillSpotColor,\n} from \"./types\";\nimport { generate } from \"./util/guid\";\n\n/**\n * An abstract base class from which to extend all potential element commands. These commands\n * follow the command design pattern in software development. To learn more about this pattern\n * take a look at the following link.\n *\n * https://sourcemaking.com/design_patterns/command\n *\n */\nexport abstract class CanvasCommand {\n public abstract apply(state: LayoutsState): LayoutsState;\n\n // Undo/redo support.\n protected oldState?: LayoutsState;\n public undo(): LayoutsState {\n if (!this.oldState) {\n throw new Error(\"Cannot undo.\");\n }\n return this.oldState;\n }\n public overrideOldState(state: LayoutsState) {\n this.oldState = state;\n }\n public sequenceId?: string;\n}\n\n/**\n * Sets the serializable workflow in the reducer state.\n */\nexport class UpdateWorkflowStateCommand extends CanvasCommand {\n private serializableWorkflow: SerializableWorkflow;\n\n constructor(serializableWorkflow: SerializableWorkflow) {\n super();\n this.serializableWorkflow = serializableWorkflow;\n }\n\n public apply(state: LayoutsState): LayoutsState {\n this.oldState = state;\n\n return {\n ...state,\n serializableWorkflow: this.serializableWorkflow,\n };\n }\n}\n\n/**\n * Shifts an element with given ID from its current position to a new position.\n */\nexport class MoveCommand extends CanvasCommand {\n private id: string;\n private x: number;\n private y: number;\n\n constructor(id: string, x: number, y: number) {\n super();\n this.id = id;\n this.x = x;\n this.y = y;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n\n const el = findElement(this.id, Object.values(state.layouts));\n if (!el.id) {\n throw new ElementNotFoundError();\n }\n const updatedElement = {\n ...el,\n x: this.x,\n y: this.y,\n };\n const layout = findLayoutForElement(el.id, Object.values(state.layouts));\n const updatedLayout = updatedLayoutForElement(updatedElement, layout);\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [layout.layout.id]: updatedLayout,\n },\n };\n }\n}\n\n/**\n * Rotates an element to a given angle in degrees.\n */\nexport class RotateCommand extends CanvasCommand {\n private id: string;\n private angle: number;\n\n constructor(id: string, angle: number) {\n super();\n this.id = id;\n this.angle = angle;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n\n const el = findElement(this.id, Object.values(state.layouts));\n if (!el.id) {\n throw new ElementNotFoundError();\n }\n const updatedElement = {\n ...el,\n rotation: this.angle,\n };\n const layout = findLayoutForElement(el.id, Object.values(state.layouts));\n const updatedLayout = updatedLayoutForElement(updatedElement, layout);\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [layout.layout.id]: updatedLayout,\n },\n };\n }\n}\n\n/**\n * Updates the width and height of an element to reflect a new size. Negative values will be\n * converted to their absolute value. ie. -10 will become 10.\n */\nexport class ResizeCommand extends CanvasCommand {\n private id: string;\n private width: number;\n private height: number;\n\n constructor(id: string, width: number, height: number) {\n super();\n this.id = id;\n this.width = Math.abs(width);\n this.height = Math.abs(height);\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n\n const el = findElement(this.id, Object.values(state.layouts));\n if (!el.id) {\n throw new ElementNotFoundError();\n }\n let updatedElement = {\n ...el,\n width: this.width,\n height: this.height,\n };\n if (el.type === \"frame\") {\n const frame = updatedElement as FrameElement;\n frame.scaleX = (frame.scaleX * this.width) / el.width;\n frame.scaleY = (frame.scaleY * this.height) / el.height;\n } else if (el.type === \"textbox\") {\n const textbox = updatedElement as TextboxElement;\n const text =\n (!textbox.algorithm || textbox.algorithm === TextAlgorithm.Autosize ? textbox.text : textbox.input) ??\n \"\";\n updatedElement = recomputeTextOnElement(textbox, text, el as TextboxElement);\n }\n\n const layout = findLayoutForElement(el.id, Object.values(state.layouts));\n const updatedLayout = updatedLayoutForElement(updatedElement, layout);\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [layout.layout.id]: updatedLayout,\n },\n };\n }\n}\n\n/**\n * Applys a list of command objects to the current state, the final state\n * will be that of all commands applied in the order of left to right.\n */\nexport class GroupCommand extends CanvasCommand {\n private commands: CanvasCommand[];\n constructor(commands: CanvasCommand[]) {\n super();\n this.commands = commands;\n }\n public apply(state: LayoutsState): LayoutsState {\n this.oldState = state;\n\n return this.commands.reduce<LayoutsState>((accumulatedState, curCommand) => {\n return curCommand.apply(accumulatedState);\n }, state);\n }\n}\n\n/*\n * Creates a new layout with a given layout from the server.\n * in layout array. Ensure to write a test for this as well.\n */\nexport class CreateLayoutCommand extends CanvasCommand {\n private layout: ILayout;\n\n constructor(layout: ILayout) {\n super();\n this.layout = layout;\n }\n\n public apply(state: LayoutsState): LayoutsState {\n this.oldState = state;\n\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [this.layout.id]: {\n elements: [],\n layout: { ...this.layout },\n modificationID: generate(),\n },\n },\n };\n }\n}\n\n/**\n * Clear all elements from a given layout.\n */\nexport class ClearLayoutCommand extends CanvasCommand {\n private panelName: string;\n\n constructor(panelName: string) {\n super();\n this.panelName = panelName;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n\n const layouts = Object.values(state.layouts).map((layout) => {\n const targetLayout = layout.layout.panelId === this.panelName;\n const state: LayoutState = {\n ...layout,\n elements: targetLayout ? [] : [...layout.elements],\n modificationID: generate(),\n };\n return state;\n });\n const finalLayouts: { [key: string]: LayoutState } = {};\n layouts.forEach((layoutState) => {\n finalLayouts[layoutState.layout.id] = layoutState;\n });\n return {\n ...state,\n layouts: finalLayouts,\n };\n }\n}\n\n/**\n * Add an element to the canvas\n */\nexport class CreateElementCommand<T extends LayoutElement> extends CanvasCommand {\n private element: T;\n private layout: ILayout;\n\n /**\n * @param initialParams The initial parameters to be set on this new object\n * @param callback An optional callback function to be notified when the object has been instantiated\n * @param layout\n */\n constructor(element: T, layout: ILayout) {\n super();\n this.element = element;\n this.layout = layout;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n\n if (!state.layouts[this.layout.id]) {\n state.layouts[this.layout.id] = { layout: this.layout, elements: [], modificationID: \"\" };\n }\n\n const currentElementsInLayout = state.layouts[this.layout.id].elements;\n const duplicateElementAlreadyExists = currentElementsInLayout.find((el) => el.id === this.element.id);\n if (duplicateElementAlreadyExists) {\n throw new Error(\n `Failed to apply new ${this.element.type} element because ID ${this.element.id} already taken`,\n );\n }\n\n if (this.element.productOverlay || currentElementsInLayout.length === 0) {\n const newElements = [...currentElementsInLayout, this.element];\n if (this.element.layerIndex === undefined) {\n this.element.layerIndex = this.assignIndex(this.element, newElements);\n }\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [this.layout.id]: {\n ...state.layouts[this.layout.id],\n elements: newElements,\n modificationID: generate(),\n },\n },\n };\n }\n\n // If product overlay exists then it is the final element.\n const finalElement = currentElementsInLayout[currentElementsInLayout.length - 1];\n const productOverlay = finalElement.productOverlay ? finalElement : null;\n\n // Reindex elements.\n if (productOverlay) {\n currentElementsInLayout.pop();\n }\n let updatedLayoutsForElement: LayoutElement[];\n if (this.element.layerIndex !== null && this.element.layerIndex !== undefined) {\n updatedLayoutsForElement = [...currentElementsInLayout, this.element].sort((a, b) => {\n if (a.layerIndex !== undefined && b.layerIndex !== undefined) {\n return a.layerIndex - b.layerIndex;\n }\n return 0;\n });\n } else {\n const newIndex = this.assignIndex(this.element, currentElementsInLayout);\n this.element.layerIndex = newIndex !== undefined ? newIndex : 0;\n updatedLayoutsForElement = [...currentElementsInLayout, this.element];\n }\n if (productOverlay) {\n updatedLayoutsForElement.push(productOverlay);\n }\n\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [this.layout.id]: {\n ...state.layouts[this.layout.id],\n elements: updatedLayoutsForElement,\n modificationID: generate(),\n },\n },\n };\n }\n\n // Calculate layer index for an element that doesn't have an explicit index.\n private assignIndex(target: LayoutElement, elementArray: LayoutElement[]): number {\n if (elementArray.length === 0) {\n return 0;\n }\n // We find the highest index used on the layer of the target element.\n const lastIndexOfLayer = elementArray\n .filter((el) => (el.layer || 0) === (target.layer || 0))\n .sort((a, b) => (a.layerIndex || 0) - (b.layerIndex || 0))[elementArray.length - 1]?.layerIndex;\n\n return lastIndexOfLayer !== undefined ? lastIndexOfLayer + 1 : 0;\n }\n}\n\n/**\n * Delete an element on the canvas\n */\nexport class DeleteElementCommand extends CanvasCommand {\n private id: string;\n\n constructor(id: string) {\n super();\n this.id = id;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n\n let elementFound = false;\n const filteredLayouts = Object.values(state.layouts).map((layout) => {\n const filteredElements = layout.elements.filter((el) => el.id !== this.id);\n if (filteredElements.length !== layout.elements.length) {\n elementFound = true;\n }\n return {\n ...layout,\n elements: layout.elements.filter((el) => {\n return el.id !== this.id;\n }),\n modificationID: generate(),\n };\n });\n if (!elementFound) {\n console.log(`Failed to delete element ${this.id}`);\n }\n const finalLayouts: { [key: string]: LayoutState } = {};\n filteredLayouts.forEach((layoutState) => {\n finalLayouts[layoutState.layout.id] = layoutState;\n });\n return {\n ...state,\n layouts: finalLayouts,\n };\n }\n}\n\nexport class CloneElementCommand extends CanvasCommand {\n private el: LayoutElement;\n private layout: ILayout;\n\n constructor(el: LayoutElement, layout: ILayout) {\n super();\n this.el = cloneDeep(el);\n this.layout = layout;\n this.el.id = generate();\n this.el.x += 5;\n this.el.y += 5;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n\n return new CreateElementCommand(this.el, this.layout).apply(state);\n }\n}\n\nexport class FontColorCommand extends CanvasCommand {\n private id: string;\n private color: string;\n private textFillSpotColor?: TextFillSpotColor;\n\n constructor(id: string, color: string, textFillSpotColor?: TextFillSpotColor) {\n super();\n this.id = id;\n this.color = color;\n this.textFillSpotColor = textFillSpotColor;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n\n const el = findElement(this.id, Object.values(state.layouts)) as TextboxElement;\n if (!el.id) {\n throw new ElementNotFoundError();\n }\n\n const updatedElement = {\n ...el,\n fill: this.color,\n fillSpotColorDefinition: this.textFillSpotColor,\n textFillImage: undefined,\n };\n const layout = findLayoutForElement(el.id, Object.values(state.layouts));\n const updatedLayout = updatedLayoutForElement(updatedElement, layout);\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [layout.layout.id]: updatedLayout,\n },\n };\n }\n}\n\nexport class FontImageFillCommand extends CanvasCommand {\n private id: string;\n private imageFill: TextFillImage;\n\n constructor(id: string, imageFill: TextFillImage) {\n super();\n this.id = id;\n this.imageFill = imageFill;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n\n const el = findElement(this.id, Object.values(state.layouts)) as TextboxElement;\n if (!el.id) {\n throw new ElementNotFoundError();\n }\n\n const updatedElement = {\n ...el,\n textFillImage: this.imageFill,\n };\n const layout = findLayoutForElement(el.id, Object.values(state.layouts));\n const updatedLayout = updatedLayoutForElement(updatedElement, layout);\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [layout.layout.id]: updatedLayout,\n },\n };\n }\n}\n\nexport class FontSizeCommand extends CanvasCommand {\n private id: string;\n private size: number;\n\n constructor(id: string, size: number) {\n super();\n this.id = id;\n this.size = size;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n\n const el = findElement(this.id, Object.values(state.layouts)) as TextboxElement;\n if (!el.id) {\n throw new ElementNotFoundError();\n }\n const updatedElement: TextboxElement = {\n ...el,\n fontSize: this.size,\n };\n const layout = findLayoutForElement(el.id, Object.values(state.layouts));\n // FIXME: The autosize algorithm injects newlines outside of the commands, we need\n // to ignore the input text in that case. See getCalculatedMixins within recomputeTextOnElement\n // The logic for autosize should be shifted into there in the future.\n const text = (!el.algorithm || el.algorithm === TextAlgorithm.Autosize ? el.text : el.input) ?? \"\";\n const updatedLayout = updatedLayoutForElement(recomputeTextOnElement(updatedElement, text), layout);\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [layout.layout.id]: updatedLayout,\n },\n };\n }\n}\n\nexport class FontAlgorithmCommand extends CanvasCommand {\n private id: string;\n private algorithm: TextAlgorithm;\n\n constructor(id: string, algorithm: TextAlgorithm) {\n super();\n this.id = id;\n this.algorithm = algorithm;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n\n const el = findElement(this.id, Object.values(state.layouts));\n if (!el.id) {\n throw new ElementNotFoundError();\n }\n const updatedElement = {\n ...el,\n algorithm: this.algorithm,\n };\n const layout = findLayoutForElement(el.id, Object.values(state.layouts));\n const updatedLayout = updatedLayoutForElement(updatedElement, layout);\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [layout.layout.id]: updatedLayout,\n },\n };\n }\n}\n\nexport class FontSourceCommand extends CanvasCommand {\n private id: string;\n private fontData: FontData;\n\n constructor(id: string, fontData: FontData) {\n super();\n this.id = id;\n this.fontData = fontData;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n\n const el = findElement(this.id, Object.values(state.layouts)) as TextboxElement;\n if (!el.id) {\n throw new ElementNotFoundError();\n }\n const updatedElement: TextboxElement = {\n ...el,\n fontData: this.fontData,\n };\n const layout = findLayoutForElement(el.id, Object.values(state.layouts));\n const text = (!el.algorithm || el.algorithm === TextAlgorithm.Autosize ? el.text : el.input) ?? \"\";\n const updatedLayout = updatedLayoutForElement(recomputeTextOnElement(updatedElement, text), layout);\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [layout.layout.id]: updatedLayout,\n },\n };\n }\n}\n\nexport class FontAlignmentCommand extends CanvasCommand {\n private id: string;\n private align: \"left\" | \"center\" | \"right\";\n\n constructor(id: string, align: \"left\" | \"center\" | \"right\") {\n super();\n this.id = id;\n this.align = align;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n\n const el = findElement(this.id, Object.values(state.layouts)) as TextboxElement;\n if (!el.id) {\n throw new ElementNotFoundError();\n }\n const updatedElement: TextboxElement = {\n ...el,\n align: this.align,\n };\n const layout = findLayoutForElement(el.id, Object.values(state.layouts));\n const updatedLayout = updatedLayoutForElement(updatedElement, layout);\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [layout.layout.id]: updatedLayout,\n },\n };\n }\n}\n\nexport class UpdateFramePattern extends CanvasCommand {\n private id: string;\n private imageData: PatternImageData;\n private offsets: FrameOffsets;\n\n constructor(id: string, imageData: PatternImageData, offsets: FrameOffsets) {\n super();\n this.id = id;\n this.imageData = imageData;\n this.offsets = offsets;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n\n const targetLayout = findLayoutForElement(this.id, Object.values(state.layouts));\n const index = targetLayout.elements.findIndex((el) => el.id === this.id);\n const existingPattern = (targetLayout.elements[index] as FrameElement).pattern;\n\n const newElements = [...targetLayout.elements];\n newElements.splice(index, 1, {\n ...targetLayout.elements[index],\n pattern: {\n ...existingPattern,\n src: this.imageData.src,\n x: this.offsets.x,\n y: this.offsets.y,\n width: this.imageData.width,\n height: this.imageData.height,\n scaleX: this.offsets.zoom,\n scaleY: this.offsets.zoom,\n svg: this.imageData.svg,\n colors: this.imageData.colors,\n },\n } as FrameElement); // FIXME: How can we assign LayoutElement correctly?\n\n const newLayout: LayoutState = {\n ...targetLayout,\n elements: newElements,\n modificationID: generate(),\n };\n\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [targetLayout.layout.id]: newLayout,\n },\n };\n }\n}\n\nexport class UpdateFrameThresholdSettingsCommand extends CanvasCommand {\n private id: string;\n private useThreshold: boolean;\n private invertThreshold: boolean;\n private threshold: number;\n private thresholdSaturation: number;\n\n constructor(\n id: string,\n useThreshold: boolean,\n invertThreshold: boolean,\n threshold: number,\n thresholdSaturation: number,\n ) {\n super();\n this.id = id;\n this.useThreshold = useThreshold;\n this.invertThreshold = invertThreshold;\n this.threshold = threshold;\n this.thresholdSaturation = thresholdSaturation;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n const el = findElement(this.id, Object.values(state.layouts)) as FrameElement;\n if (!el.id) {\n throw new ElementNotFoundError();\n }\n\n const updatedElement = {\n ...el,\n useThreshold: this.useThreshold,\n invertThreshold: this.invertThreshold,\n threshold: this.threshold,\n thresholdSaturation: this.thresholdSaturation,\n };\n\n const layout = findLayoutForElement(el.id, Object.values(state.layouts));\n const updatedLayout = updatedLayoutForElement(updatedElement, layout);\n\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [layout.layout.id]: updatedLayout,\n },\n };\n }\n}\n\nexport class UpdateImageSourceCommand extends CanvasCommand {\n private id: string;\n private src: string;\n\n constructor(id: string, src: string) {\n super();\n this.id = id;\n this.src = src;\n }\n\n public apply(state: LayoutsState): LayoutsState {\n this.oldState = state;\n const el = findElement(this.id, Object.values(state.layouts)) as ImageElement;\n if (!el.id) {\n throw new ElementNotFoundError();\n }\n const updatedElement: ImageElement = {\n ...el,\n src: this.src,\n };\n const layout = findLayoutForElement(el.id, Object.values(state.layouts));\n const updatedLayout = updatedLayoutForElement(updatedElement, layout);\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [layout.layout.id]: updatedLayout,\n },\n };\n }\n}\n\n/**\n * TextChange will modify the text displayed in a text box\n */\nexport class TextChangeCommand extends CanvasCommand {\n private id: string;\n private text: string;\n\n constructor(id: string, text: string) {\n super();\n this.id = id;\n this.text = text;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n const el = findElement(this.id, Object.values(state.layouts)) as TextboxElement;\n if (!el.id) {\n throw new ElementNotFoundError();\n }\n const layout = findLayoutForElement(el.id, Object.values(state.layouts));\n const updatedLayout = updatedLayoutForElement(recomputeTextOnElement(el, this.text, el), layout);\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [layout.layout.id]: updatedLayout,\n },\n };\n }\n}\n\nexport class IllustrationColorCommand extends CanvasCommand {\n private id: string;\n private className: string;\n private fill: string;\n\n constructor(id: string, className: string, fill: string) {\n super();\n this.id = id;\n this.className = className;\n this.fill = fill;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n\n const el = findElement(this.id, Object.values(state.layouts));\n if (!el.id) {\n throw new ElementNotFoundError();\n }\n const newColors = (el as IllustrationElement).colors || {};\n const oldColor = newColors[this.className];\n\n newColors[this.className] = {\n browserValue: this.fill,\n spotColor: oldColor?.spotColor,\n };\n const updatedElement = {\n ...el,\n colors: newColors,\n };\n const layout = findLayoutForElement(el.id, Object.values(state.layouts));\n const updatedLayout = updatedLayoutForElement(updatedElement, layout);\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [layout.layout.id]: updatedLayout,\n },\n };\n }\n}\n\nexport class IllustrationCacheCommand extends CanvasCommand {\n private id: string;\n private svgBody: string;\n private objectURL: string;\n\n constructor(id: string, svgBody: string, objectURL: string) {\n super();\n this.id = id;\n this.svgBody = svgBody;\n this.objectURL = objectURL;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n\n const el = findElement(this.id, Object.values(state.layouts));\n if (!el.id) {\n throw new ElementNotFoundError();\n }\n\n const updatedElement = {\n ...el,\n svg: this.svgBody,\n cachedObjectURL: this.objectURL,\n };\n\n const layout = findLayoutForElement(el.id, Object.values(state.layouts));\n const updatedLayout = updatedLayoutForElement(updatedElement, layout);\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [layout.layout.id]: updatedLayout,\n },\n };\n }\n}\n\nexport class BringToFrontCommand extends CanvasCommand {\n private id: string;\n\n /**\n * @param id The targeted element to bring to the front.\n */\n constructor(id: string) {\n super();\n this.id = id;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n\n const el = findElement(this.id, Object.values(state.layouts));\n if (!el.id) {\n throw new ElementNotFoundError();\n }\n const layout = Object.values(state.layouts).find((l) => l.elements.find((el) => el.id === this.id));\n if (!layout) {\n throw new Error(\"Layout missing from state!\");\n }\n\n // We shift the element in front of the last index and then reorganise the layer indices\n // to suite the new ordering of the element array.\n const fromIndex = layout.elements.findIndex((el) => el.id === this.id);\n layout.elements.push(layout.elements.splice(fromIndex, 1)[0]);\n\n const updatedElements = [...layout.elements];\n updatedElements.forEach((el, idx) => (el.layerIndex = idx));\n\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [layout.layout.id]: {\n ...state.layouts[layout.layout.id],\n elements: updatedElements,\n modificationID: generate(),\n },\n },\n };\n }\n}\n\nexport class BringToBackCommand extends CanvasCommand {\n private id: string;\n\n /**\n * @param id The targeted element to bring to the back.\n */\n constructor(id: string) {\n super();\n this.id = id;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n\n const el = findElement(this.id, Object.values(state.layouts));\n if (!el.id) {\n throw new ElementNotFoundError();\n }\n const layout = Object.values(state.layouts).find((l) => l.elements.find((el) => el.id === this.id));\n if (!layout) {\n throw new Error(\"Layout missing from state!\");\n }\n\n // We shift the element backwards and then reorganise the layer indices\n // to suite the new ordering of the element array.\n const fromIndex = layout.elements.findIndex((el) => el.id === this.id);\n\n layout.elements.splice(fromIndex, 1);\n layout.elements.unshift(el);\n\n const updatedElements = [...layout.elements];\n const element = updatedElements.splice(fromIndex, 1)[0];\n updatedElements.splice(fromIndex, 0, element);\n updatedElements.forEach((el, idx) => (el.layerIndex = idx));\n\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [layout.layout.id]: {\n ...state.layouts[layout.layout.id],\n elements: updatedElements,\n modificationID: generate(),\n },\n },\n };\n }\n}\n\n/**\n * Bring an element forward by one layer. Does nothing if the element is already at the front.\n */\nexport class BringForwardCommand extends CanvasCommand {\n private id: string;\n\n /**\n * @param id The targeted element to bring to the front.\n */\n constructor(id: string) {\n super();\n this.id = id;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n\n const el = findElement(this.id, Object.values(state.layouts));\n if (!el.id) {\n throw new ElementNotFoundError();\n }\n const layout = Object.values(state.layouts).find((l) => l.elements.find((el) => el.id === this.id));\n if (!layout) {\n throw new Error(\"Layout missing from state!\");\n }\n\n // We shift the element forward and then reorganise the layer indices\n // to suite the new ordering of the element array.\n const fromIndex = layout.elements.findIndex((el) => el.id === this.id);\n const toIndex = fromIndex + 1;\n const updatedElements = [...layout.elements];\n const element = updatedElements.splice(fromIndex, 1)[0];\n updatedElements.splice(toIndex, 0, element);\n updatedElements.forEach((el, idx) => (el.layerIndex = idx));\n\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [layout.layout.id]: {\n ...state.layouts[layout.layout.id],\n elements: updatedElements,\n modificationID: generate(),\n },\n },\n };\n }\n}\n\n/**\n * Send an element backwards by one layer. Does nothing if the element is already at the back.\n */\nexport class SendBackwardsCommand extends CanvasCommand {\n private id: string;\n\n /**\n * @param id The targeted element to bring to the front.\n */\n constructor(id: string) {\n super();\n this.id = id;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n\n const el = findElement(this.id, Object.values(state.layouts));\n if (!el.id) {\n throw new ElementNotFoundError();\n }\n const layout = Object.values(state.layouts).find((l) => l.elements.find((el) => el.id === this.id));\n if (!layout) {\n throw new Error(\"Layout missing from state!\");\n }\n\n // We shift the element backwards and then reorganise the layer indices\n // to suite the new ordering of the element array.\n const fromIndex = layout.elements.findIndex((el) => el.id === this.id);\n const toIndex = fromIndex - 1;\n const updatedElements = [...layout.elements];\n const element = updatedElements.splice(fromIndex, 1)[0];\n updatedElements.splice(toIndex, 0, element);\n updatedElements.forEach((el, idx) => (el.layerIndex = idx));\n\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [layout.layout.id]: {\n ...state.layouts[layout.layout.id],\n elements: updatedElements,\n modificationID: generate(),\n },\n },\n };\n }\n}\n\n/**\n * Set the layer value of an element. The layer is half of the system involved with\n * determining order.\n */\nexport class LayerCommand extends CanvasCommand {\n private id: string;\n private value: number;\n\n /**\n * @param id The targeted element to change layer of.\n * @param value The new layer to set this element within.\n */\n constructor(id: string, value: number) {\n super();\n this.id = id;\n this.value = value;\n }\n\n public apply(state: LayoutsState) {\n this.oldState = state;\n\n const el = findElement(this.id, Object.values(state.layouts));\n if (!el.id) {\n throw new ElementNotFoundError();\n }\n\n const layout = Object.values(state.layouts).find((l) => l.elements.find((el) => el.id === this.id));\n if (!layout) {\n throw new Error(\"Layout missing from state!\");\n }\n\n return {\n ...state,\n layouts: {\n ...state.layouts,\n [layout.layout.id]: updatedLayoutForElement({ ...el, layer: this.value }, layout),\n },\n };\n }\n}\n","import { FrameStepStorage, FrameData, FrameThresholdSettings, FrameOffsets, PatternImageData } from \"../../../types\";\nimport debounce from \"lodash.debounce\";\nimport isEqual from \"lodash.isequal\";\nimport { WorkflowManager } from \"../../../WorkflowManager\";\nimport { UnhandledBehaviorError } from \"../../../util/exception\";\nimport { calculateOffsets, frameDataCache, getFrameData } from \"../../../util/frame\";\nimport { modifySVGColors } from \"../../../util/illustration\";\nimport { svgToDataUrl } from \"../../../util/crossplatform\";\nimport { GroupCommand, UpdateFramePattern, UpdateFrameThresholdSettingsCommand } from \"../../../command\";\n\n/**\n * Bounds the offsets for an image to the box, preventing\n * the user from moving the image in a way that wouldn't be intended.\n * @param newOffsets The new intended offsets for the image.\n * @param frameData The current frame information\n * @param borderWidth The width of the border added by the cropper.\n * @param mustCover When true the image sgould be bounded in such a way that it covers the entire frame at all times.\n */\nexport function getBoundedOffsets(\n newOffsets: FrameOffsets,\n frameData: FrameData,\n imageData: PatternImageData,\n mustCover?: boolean,\n) {\n const newWidth = imageData.width * newOffsets.zoom;\n const newHeight = imageData.height * newOffsets.zoom;\n\n if (mustCover) {\n // Find which is smaller: framewidth / imagewidth or frameheight / imageheight\n // Then calculate the min zoom factor based on the smaller\n // of the zoom to atleast fit the image and the users new zoom level.\n const covering = newOffsets;\n const zoomMinimumBound = Math.max(frameData.width / imageData.width, frameData.height / imageData.height);\n covering.zoom = Math.max(zoomMinimumBound, newOffsets.zoom);\n const boundedWidth = imageData.width * covering.zoom;\n const boundedHeight = imageData.height * covering.zoom;\n covering.x = boundToRange(newOffsets.x, frameData.width - boundedWidth, 0);\n covering.y = boundToRange(newOffsets.y, frameData.height - boundedHeight, 0);\n return covering;\n }\n\n // If we don't need to cover we just make sure the users can't drag the image completely off\n // screen which may cause trouble when trying to find the image again.\n const bounded = newOffsets;\n bounded.x = boundToRange(bounded.x, -newWidth, frameData.width);\n bounded.y = boundToRange(bounded.y, -newHeight, frameData.height);\n\n return bounded;\n}\n\n/**\n * Bounds a value to a given range\n * @param value The value to bound\n * @param min The minimum bound that value must be above.\n * @param max The maximum bound the value must be below.\n */\nfunction boundToRange(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nexport type UpdateFrameOffsets = (\n newOffsets: FrameOffsets[],\n imageData: PatternImageData,\n frameData: FrameData[],\n thresholdSettings: FrameThresholdSettings,\n onComplete?: () => void,\n) => void;\n\nexport class FrameService {\n // Internal state\n private offsets: FrameOffsets[];\n private thresholdSettings: FrameThresholdSettings;\n private forceImageCover?: boolean;\n private initialZoom?: number;\n private targetElements: string[]; // A list of canvas element ids that should be updated when changes occur to this frame.\n\n // FIXME: Can we pull these from the element itself?\n private imageData?: PatternImageData; // The current pattern if any.\n // FIXME: Can we pull these from the element itself?\n private frameData?: FrameData[]; // The current frame if any.\n\n // Debounced functions\n\n private readonly _debouncedUpdateFrameOffsets: UpdateFrameOffsets;\n\n // constants\n\n /**\n * The calculated minimum zoom value, per frame.\n */\n public minZoomScale = [0.03];\n /**\n * The calculated maximum zoom value. Note: This is calculated based on the first frame.\n */\n public maxZoomScale = [20];\n\n // Listeners\n\n private onFrameDataChangeListeners: ((frameData: FrameData[] | undefined) => void)[];\n private onZoomChangeListeners: ((zoomValue: number[]) => void)[];\n\n // Workflow manager related logic\n private workflowManager?: WorkflowManager;\n private stepName?: string;\n\n constructor(forceImageCover?: boolean, initialZoom?: number) {\n this._debouncedUpdateFrameOffsets = debounce(this.updateFrameOffsets, 200);\n this.targetElements = [];\n this.onFrameDataChangeListeners = [];\n this.onZoomChangeListeners = [];\n this.forceImageCover = forceImageCover;\n this.initialZoom = initialZoom;\n this.thresholdSettings = {\n useThreshold: false,\n invertThreshold: false,\n threshold: 128,\n thresholdSaturation: 0.5,\n };\n }\n\n /**\n * When we want to connect a workflow manager to the state of the image cropper we\n * can pass it to this function. Inside we'll attach any required event listeners.\n * @param workflowManager The workflow manager to attach.\n * @param stepName The specific step we want to attach to within the manager.\n */\n connectWorkflowManager(workflowManager: WorkflowManager, stepName?: string) {\n if (stepName) {\n workflowManager.addStepSpecificStorageCallback(async (storage) => {\n if (storage) {\n const frameStorage = storage as FrameStepStorage;\n if (frameStorage.currentFrameSources) {\n let changed = false;\n for (let i = 0; i < frameStorage.currentFrameSources.length; i++) {\n const frameSource = frameStorage.currentFrameSources[i];\n const newFrameData = await getFrameData(frameSource);\n const existingFrameData = this.frameData ? this.frameData[i] : undefined;\n if (!isEqual(newFrameData, existingFrameData)) {\n if (!this.frameData) {\n this.frameData = new Array(frameStorage.currentFrameSources.length);\n }\n this.frameData[i] = newFrameData;\n changed = true;\n }\n }\n if (changed) {\n this.onFrameDataChangeListeners.forEach((frameDataChangeListener) =>\n frameDataChangeListener(this.frameData),\n );\n if (this.frameData && this.imageData) {\n this.recalculateOffsets(this.imageData);\n this.updateOffsets(this.offsets);\n this.recalculateZoomLimits(this.imageData, this.frameData);\n }\n }\n }\n }\n }, stepName);\n }\n\n this.workflowManager = workflowManager;\n this.stepName = stepName;\n }\n\n /**\n * Sets the elements that should be update when changes are made to\n * the cropper that owns this service.\n * @param targetElements A list of element Ids to track\n */\n setTargetElements(targetElements: string[]) {\n this.targetElements = targetElements;\n }\n\n /**\n * Gets the current calculated frame data\n * @returns A FrameData object or undefined if no frame has been set.\n */\n getFrameData(): FrameData[] | undefined {\n return this.frameData;\n }\n\n /**\n * Sets the current frame data. Note:\n * @param paths The paths to lookup in our frame data cache.\n */\n setFrameData(paths: string[] | undefined) {\n if (!paths) {\n this.frameData = undefined;\n return;\n }\n paths.forEach((path, index) => {\n const frameData = frameDataCache.get(path);\n if (frameData) {\n if (!this.frameData) {\n this.frameData = new Array(paths.length);\n }\n this.frameData[index] = frameData;\n }\n });\n }\n\n /**\n * Gets the currently set image of the frame..\n * @returns A PatternImageData object, or undefined if no image is set.\n */\n getImageData(): PatternImageData | undefined {\n return this.imageData;\n }\n\n /**\n * Helper function to get the src of the image of the frame, since it can be an svg with modified colors.\n * @returns A url (a data url if svg), or undefined if no image is set.\n */\n getImageSrc(): string | undefined {\n if (!this.imageData) {\n return undefined;\n }\n if (this.imageData.svg) {\n const modifiedSvg = modifySVGColors(this.imageData.svg, this.imageData.colors || {}, false);\n return svgToDataUrl(modifiedSvg);\n }\n return this.imageData.src;\n }\n\n /**\n * Gets the current calculated offsets of the pattern within the frame.\n * @returns A FrameOffsets object or undefined if no offsets are defined.\n */\n getOffsets(): FrameOffsets[] | undefined {\n return this.offsets;\n }\n\n /**\n * Updates the frame offsets explicitly.\n */\n setOffsets(offsets: FrameOffsets[]) {\n this.offsets = offsets;\n }\n\n /**\n * Sets the zoom of the cropper that owns this service.\n * @param zoom The new zoom value, per frame.\n * @param cX The center of zoom on x axis, per frame.\n * @param cY The center of zoom on Y axis, per frame.\n * @param onComplete A function to call when zoom changes have been completed\n */\n setZoom(zoom: number[], cX: number[], cY: number[], onComplete?: () => void) {\n if (this.imageData && this.offsets && this.frameData) {\n if (!this.offsets || this.offsets.length !== this.frameData.length) {\n this.offsets = new Array(this.frameData.length);\n }\n const calculatedOffsets = this.frameData.map((frameData, index) => {\n // Figure out the top/left displacement caused by the zoom.\n const xoff = (cX[index] - this.offsets[index].x) / this.offsets[index].zoom;\n const yoff = (cY[index] - this.offsets[index].y) / this.offsets[index].zoom;\n const dX = cX[index] - xoff * zoom[index];\n const dY = cY[index] - yoff * zoom[index];\n const calculatedOffsets = {\n x: dX,\n y: dY,\n zoom: (this.imageData!.width * zoom[index]) / this.imageData!.width,\n };\n return calculatedOffsets;\n });\n // Applying the new offsets will cause the image to be bounded.\n this.updateOffsets(calculatedOffsets, onComplete);\n this.onZoomChangeListeners.forEach((zoomChangeListener) => zoomChangeListener(zoom));\n }\n }\n\n /**\n * Sets the image currently contained by this frame.\n * @param value The new image as an ImageData property\n * @param [recalculateOffsets=true] Optional: Enable/disable re-calculating of frame offsets. Default: `true`.\n * Note: Will always calculate when offsets have not been calculated.\n */\n setPatternData(value: PatternImageData, recalculateOffsets = true) {\n this.imageData = value;\n if (value && this.frameData) {\n if (recalculateOffsets || !this.offsets) {\n this.recalculateOffsets(value);\n }\n // Applying the new offsets will cause the image to be bounded.\n this.updateOffsets(this.offsets, undefined, true);\n }\n if (this.imageData && this.frameData) {\n this.recalculateZoomLimits(this.imageData, this.frameData);\n }\n }\n\n /**\n * Modify the offsets of the frame.\n * @param value The new FrameOffsets objects.\n * @param onComplete A callback, called when the modification is complete\n * @param forceUpdate When true the offsets will be updated even if they haven't changed.\n */\n updateOffsets(value: FrameOffsets[], onComplete?: () => void, forceUpdate?: boolean) {\n const patternData = this.imageData;\n // If the frame isn't correctly initialized yet just ignore..\n if (!patternData || !this.frameData) {\n return;\n }\n\n if (this.frameData.length !== value.length) {\n throw new UnhandledBehaviorError(\n \"Frame data and offsets are not the same length. This is a bug. Please report it.\",\n );\n }\n\n const changed = this.offsets.some((offset, index) => {\n // If there hasn't been any change let's not set or update\n // the offsets internally. Doing so will trigger re-rendering for no good reason.\n if (value[index].x === offset.x && value[index].y === offset.y && value[index].zoom === offset.zoom) {\n return false;\n }\n return true;\n });\n if (!changed && !forceUpdate) {\n onComplete && onComplete();\n return;\n }\n\n if (!this.offsets || this.offsets.length !== this.frameData.length) {\n this.offsets = new Array(this.frameData.length);\n }\n this.frameData.forEach((frameData, index) => {\n this.offsets[index] = getBoundedOffsets(value[index], frameData, this.imageData!, this.forceImageCover);\n });\n\n // Update anyone who wants to know about changes to the frame.\n this._debouncedUpdateFrameOffsets(\n this.offsets,\n patternData,\n this.frameData,\n this.thresholdSettings,\n onComplete,\n );\n }\n\n getThresholdSettings(): FrameThresholdSettings {\n return this.thresholdSettings;\n }\n\n setThresholdSettings(settings: FrameThresholdSettings) {\n this.thresholdSettings = settings;\n if (this.imageData && this.frameData) {\n this._debouncedUpdateFrameOffsets(this.offsets, this.imageData, this.frameData, settings);\n }\n }\n\n // Allows users of the frame service to listen to frame data changes.\n onFrameDataChanged(newListener: (frameData: FrameData[] | undefined) => void) {\n newListener(this.frameData);\n this.onFrameDataChangeListeners.push(newListener);\n }\n\n /**\n * Append a new listener to zoom events on this frame.\n * @param newListener\n */\n onZoom(newListener: (zoomValue: number[]) => void) {\n this.onZoomChangeListeners.push(newListener);\n }\n\n /**\n * Updates the offsets of the frame\n * @param newOffsets New offset object\n * @param imageData The image data\n * @param frameData The frame data\n * @param targetElements A list of elements that need updating, by ID\n * @param onComplete A callback when the operation is completed.\n */\n private updateFrameOffsets(\n newOffsets: FrameOffsets[],\n imageData: PatternImageData,\n frameData: FrameData[],\n thresholdSettings: FrameThresholdSettings,\n onComplete?: () => void,\n ) {\n if (!frameData || frameData.length === 0 || frameData.some((frame) => !frame)) {\n throw new UnhandledBehaviorError(\"Frame data not set. This is a bug\");\n }\n\n if (!this.workflowManager) throw new UnhandledBehaviorError(\"No workflow manager set, cannot update offsets.\");\n\n const commandDispatcher = this.workflowManager.getCommandDispatcher();\n this.targetElements.forEach((elementID, index) => {\n commandDispatcher(\n new GroupCommand([\n new UpdateFramePattern(elementID, imageData, newOffsets[index]),\n new UpdateFrameThresholdSettingsCommand(\n elementID,\n thresholdSettings.useThreshold,\n thresholdSettings.invertThreshold,\n thresholdSettings.threshold,\n thresholdSettings.thresholdSaturation,\n ),\n ]),\n );\n });\n\n if (this.stepName) {\n this.workflowManager.updateStorage(this.stepName, {\n frameOffsetsList: newOffsets,\n });\n }\n\n onComplete && onComplete();\n }\n\n /**\n * Determines limitations of zoom based on relative size of image and frame.\n * @param imageData The image to include in calculations\n * @param frameData The frame to include in calculations.\n */\n private recalculateZoomLimits(imageData: PatternImageData, frameData: FrameData[]) {\n if (this.minZoomScale.length !== frameData.length || this.maxZoomScale.length !== frameData.length) {\n this.minZoomScale = new Array(frameData.length);\n this.maxZoomScale = new Array(frameData.length);\n }\n frameData.forEach((frame, index) => {\n const minimumScale = Math.max(frame.width / imageData.width, frame.height / imageData.height);\n if (this.forceImageCover) {\n this.minZoomScale[index] = minimumScale;\n this.maxZoomScale[index] = minimumScale * 2.5;\n } else {\n this.minZoomScale[index] = minimumScale / 10;\n this.maxZoomScale[index] = minimumScale * 2.5;\n }\n });\n }\n\n private recalculateOffsets(imageData: PatternImageData) {\n if (!this.frameData) return;\n if (!this.offsets || this.offsets.length !== this.frameData.length) {\n this.offsets = new Array(this.frameData.length);\n }\n this.frameData.forEach((frameData, index) => {\n this.offsets[index] = calculateOffsets(\n imageData,\n frameData,\n this.initialZoom && !this.forceImageCover ? { scale: this.initialZoom } : undefined,\n this.forceImageCover,\n );\n });\n this._debouncedUpdateFrameOffsets(this.offsets, imageData, this.frameData, this.thresholdSettings);\n }\n}\n","import { CanvasCommand, CreateElementCommand } from \"../../command\";\nimport { svgObjectURL } from \"../../Elements/factory\";\nimport { ILayout, IllustrationElement, ImageElement, LayoutElementType, Region, RegionElement, SilentStepData, Step, StepType } from \"../../types\";\nimport { Product } from \"../../types\";\nimport { fetchAsString } from \"../../util/crossplatform\";\nimport { LayoutNotFoundError, MisconfigurationError } from \"../../util/exception\";\nimport { generate } from \"../../util/guid\";\nimport { generateSVGWithUnknownColors } from \"../../util/illustration\";\n\nexport interface SilentStepTriggerResult {\n regionElement: RegionElement;\n command: CanvasCommand;\n}\n\nexport class SilentStepHandler {\n private configuration: Step<SilentStepData>;\n private layouts: ILayout[];\n private product?: Product;\n\n constructor(config: Step<SilentStepData>, layouts: ILayout[], product?: Product) {\n this.configuration = config;\n this.layouts = layouts;\n this.product = product ? product : undefined;\n }\n\n async trigger(): Promise<SilentStepTriggerResult[]> {\n if (!this.configuration.data.regions) {\n throw new MisconfigurationError(this.configuration, \"Missing regions.\");\n }\n if (this.configuration.type === StepType.SilentIllustration) {\n const promises = this.configuration.data.regions.map(this.processRegion);\n return Promise.all(promises);\n } else if (this.configuration.type === StepType.ProductOverlay) {\n return Promise.all(\n this.configuration.data.regions.map((region) => {\n const layout = this.layouts.find((layout: ILayout) => region.panelId === layout.panelId);\n if (!layout) {\n throw new LayoutNotFoundError(region);\n }\n return this.processRegion(region);\n }),\n );\n } else {\n return Promise.reject(\"Unknown silent step. This is a bug\");\n }\n }\n\n private processRegion = async (region: Region): Promise<SilentStepTriggerResult> => {\n const layout = this.layouts.find((layout: ILayout) => layout.panelId === region.panelId);\n if (!layout) {\n throw new LayoutNotFoundError(region);\n }\n\n let assetUrl = \"\";\n if (this.configuration.type === StepType.ProductOverlay) {\n // Check related product for a overlay key\n let assetFromProduct = \"\";\n if (this.product?.overlayImageUrl) {\n assetFromProduct = this.product.overlayImageUrl;\n }\n assetUrl = assetFromProduct;\n if (!assetFromProduct) {\n throw new MisconfigurationError(this.configuration, \"Couldn't find an asset for product overlay step\");\n }\n }\n\n const assetType = this.evaluateAssetType();\n\n if (assetType === LayoutElementType.Image) {\n const assetUrl =\n this.configuration.type === StepType.SilentIllustration\n ? (this.configuration.data.asset?.fileLink)\n : (this.product?.overlayImageUrl);\n if (!assetUrl) {\n throw new Error(\"Undefined raster silent step source\");\n }\n const newElement: ImageElement = {\n stepName: this.configuration.stepName,\n id: generate(),\n src: assetUrl,\n type: assetType,\n y: region.top,\n x: region.left,\n width: region.width,\n height: region.height,\n layer: region.layer,\n layerIndex: region.layerIndex,\n immutable: region.immutable,\n productOverlay: this.configuration.type === StepType.ProductOverlay ? true : undefined,\n rotation: region.rotation,\n excludeFromExport: this.configuration.data.excludeFromPrint,\n preserveAspectRatio: \"none\",\n };\n return {\n regionElement: {\n id: newElement.id,\n region,\n },\n command: new CreateElementCommand<ImageElement>(newElement, layout),\n };\n } else {\n const src =\n this.configuration.type === StepType.SilentIllustration ? this.configuration.data.asset?.fileLink : assetUrl;\n const getIllustrationBody = async (): Promise<string> => {\n return new Promise((resolve, reject) => {\n if (!src) {\n reject(\"Undefined vector silent step source\");\n return;\n }\n fetchAsString(src, true)\n .then((svg) => {\n resolve(svg);\n })\n .catch((e) => console.error(e));\n });\n };\n const svgData = await generateSVGWithUnknownColors(await getIllustrationBody());\n const newElement: IllustrationElement = {\n stepName: this.configuration.stepName,\n id: generate(),\n cachedObjectURL: await svgObjectURL(svgData.svg),\n src: src,\n svg: svgData.svg,\n colors: svgData.colors,\n type: assetType,\n y: region.top,\n x: region.left,\n width: region.width,\n height: region.height,\n layer: region.layer,\n layerIndex: region.layerIndex,\n rotation: region.rotation,\n immutable: region.immutable,\n productOverlay: this.configuration.type === StepType.ProductOverlay ? true : undefined,\n excludeFromExport: this.configuration.data.excludeFromPrint,\n };\n return {\n regionElement: {\n id: newElement.id!,\n region,\n },\n command: new CreateElementCommand<IllustrationElement>(newElement, layout),\n };\n }\n };\n\n private evaluateAssetType(): LayoutElementType {\n // Try to determine the type by asset path.\n const url =\n this.configuration.type === StepType.ProductOverlay && this.product?.overlayImageUrl\n ? this.product.overlayImageUrl.toLowerCase()\n : this.configuration.data.asset?.fileLink?.toLowerCase().split(\"?\")[0];\n if (\n url?.startsWith(\"data:image/png\") ||\n url?.endsWith(\".jpeg\") ||\n url?.endsWith(\".jpg\") ||\n url?.endsWith(\".png\")\n ) {\n return LayoutElementType.Image;\n }\n if (url?.endsWith(\".svg\") || url?.startsWith(\"image/svg+xml\")) {\n return LayoutElementType.Illustration;\n }\n return LayoutElementType.Illustration;\n }\n}\n","import { spiffCoreConfiguration } from \"../Configuration\";\nimport { ResourceGenerationError } from \"../util/exception\";\nimport { fetch } from \"../util/crossplatform\";\n\nexport const shortenUrl = async (longUrl: string): Promise<string> => {\n const shortenerUrl = `${spiffCoreConfiguration.getServicesApiUrl()}/shortener`;\n try {\n const response = await fetch(shortenerUrl, {\n method: \"POST\",\n body: JSON.stringify({ longUrl }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n const json = await response.json();\n return json.shortUrl;\n } catch (e) {\n console.error(e);\n throw new ResourceGenerationError(\"Failed to shorten URL, see console.\");\n }\n};\n","// Something that periodically checks a condition and\n// executes a callback once that condition is true.\nexport class Poller {\n // The ID of the window setInterval call.\n private pollingId: number;\n\n // The amount of times that the condition has been checked.\n private attempts: number;\n\n // How long to wait between each poll.\n private readonly interval: number;\n\n // The maximum amount of times to check the condition.\n private readonly maxAttempts: number;\n\n // The condition to check.\n private readonly predicate: () => Promise<boolean>;\n\n // The function to execute when the condition is fulfilled.\n private readonly onSuccess: () => void;\n\n // The function to execute when the maximum polling attempts have been\n // hit and no success result was returned by the predicate.\n private readonly onFailure: () => void;\n\n private async poll() {\n try {\n if (await this.predicate()) {\n this.onSuccess();\n if (this.pollingId > -1) {\n window.clearInterval(this.pollingId);\n }\n return;\n }\n } catch (e) {\n //console.log(`Poller attempt ${this.attempts + 1} failed. Max attempts: ${this.maxAttempts}`);\n }\n this.attempts += 1;\n if (this.attempts < this.maxAttempts) {\n this.pollingId = window.setTimeout(this.poll.bind(this), this.interval);\n } else {\n this.onFailure();\n }\n }\n\n /**\n * Constructs a new polling service.\n * @param predicate An async function that returns true when polling has returned a successful result.\n * @param onSuccess The callback to be called when polling has returned a successful result.\n * @param onFailure The callback to be called when polling has returned a failed result.\n * @param interval The number of milliseconds to wait between each poll.\n * @param maxAttempts The maximum amount of times to check the condition.\n */\n constructor(\n predicate: () => Promise<boolean>,\n onSuccess: () => void,\n onFailure: () => void,\n interval: number = 3000,\n maxAttempts: number = 10,\n ) {\n this.onSuccess = onSuccess;\n this.onFailure = onFailure;\n this.predicate = predicate;\n this.attempts = 0;\n this.pollingId = -1;\n this.interval = interval;\n this.maxAttempts = maxAttempts;\n this.poll();\n }\n}\n","import { StepService, RegionElement, CommandWithFollowup, DigitalContentStepData, Step, LayoutsState, Region, ILayout, ImageElement, LayoutElementType } from \"../../types\";\nimport { toString as urlToString } from \"qrcode\";\nimport { shortenUrl } from \"../shortener\";\nimport { WorkflowManager } from \"../../WorkflowManager\";\nimport { Poller } from \"../../util/Poller\";\nimport {\n LayoutNotFoundError,\n MisconfigurationError,\n ResourceGenerationError,\n ResourceNotFoundError,\n} from \"../../util/exception\";\nimport { getAssets } from \"../asset\";\nimport { CreateElementCommand, DeleteElementCommand, GroupCommand } from \"../../command\";\nimport { generate } from \"../../util/guid\";\n\nexport const MAX_UPLOAD_SIZE_IN_MB = 100;\n\nclass DigitalContentStepService implements StepService<DigitalContentStepData> {\n async init(\n stepData: Step<DigitalContentStepData>,\n workflowManager: WorkflowManager,\n reducerState?: LayoutsState,\n ): Promise<CommandWithFollowup | null> {\n if (reducerState) {\n await this.reload(stepData, workflowManager, reducerState);\n }\n return null;\n }\n\n private async reload(\n stepData: Step<DigitalContentStepData>,\n workflowManager: WorkflowManager,\n reducerState: LayoutsState,\n ) {\n const serializedStep = workflowManager.getSerializedStep(\n stepData.stepName,\n reducerState.serializableWorkflow.steps,\n );\n const layouts = Object.values(reducerState.layouts);\n const elements = layouts.map((layout) => layout.elements).flat();\n const elementsForStep = elements.filter((el) => el.stepName === stepData.stepName);\n const regionElements = elementsForStep.map((el) => ({ id: el.id, region: el.stepRegion }));\n await workflowManager.setSelectionsAndElements(stepData.stepName, [], regionElements, async () => {\n const shortUrl = serializedStep?.storage?.videoShortUrl;\n const url = serializedStep?.storage?.videoUrl;\n workflowManager.updateStorage(stepData.stepName, {\n videoShortUrl: shortUrl,\n videoUrl: url,\n });\n });\n }\n\n async regenerateQRCode(\n elements: RegionElement[],\n assetKey: string,\n workflowManager: WorkflowManager,\n stepData: Step<DigitalContentStepData>,\n ) {\n const getMpegLink = async () => {\n const asset = (await getAssets([assetKey]))[0];\n const link = asset?.versions?.find((v) => v.name === \"mpeg4\")?.link;\n return { asset, link };\n };\n\n // Asset versions are attached to the asset shortly after asset upload. We poll to find these versions and\n // grab the link for the mp4 variant.\n const videoLink = await new Promise<{ rel: string; href: string }>((resolve, reject) => {\n new Poller(\n async () => !!(await getMpegLink()).link,\n async () => {\n const linkData = await getMpegLink();\n if (!linkData.link || !linkData.link) {\n throw new ResourceNotFoundError(linkData.asset);\n }\n resolve({\n rel: \"mpeg4\",\n href: linkData.link,\n });\n },\n () => {\n reject(\"Poller timed out with 40 attempts @ 3 second interval\");\n },\n 3000,\n 40,\n );\n });\n\n elements.forEach((elem) => workflowManager.getCommandDispatcher()(new DeleteElementCommand(elem.id)));\n const protocolPrefix = stepData.data.baseUrl.slice(0, 4) === \"http\" ? \"\" : \"https://\";\n const urlBuilder = new URL(protocolPrefix + stepData.data.baseUrl);\n urlBuilder.searchParams.append(\"video\", btoa(JSON.stringify([videoLink])));\n\n //iOS does not recognise a URL without the trailing slash on the pathname,\n urlBuilder.pathname = urlBuilder.pathname + (urlBuilder.pathname.slice(-1) === \"/\" ? \"\" : \"/\");\n\n const builtUrl = urlBuilder.toString();\n if (builtUrl.length >= 2000) {\n throw new ResourceGenerationError(\"Cannot create QR code, URL too long.\");\n }\n const shortUrl = await shortenUrl(builtUrl);\n\n if (!stepData.data || !stepData.data.regions) {\n throw new MisconfigurationError(stepData, \"Missing regions.\");\n }\n const regionElements = await this.regionElements(stepData);\n const result = await this.command(shortUrl, regionElements, workflowManager, stepData.stepName);\n if (result) {\n result.command && workflowManager.getCommandDispatcher()(result.command);\n result.followup && (await result.followup());\n }\n await workflowManager.setSelectionsAndElements(stepData.stepName, [], regionElements, async () => {\n workflowManager.updateStorage(stepData.stepName, {\n videoShortUrl: shortUrl,\n videoUrl: videoLink.href,\n });\n });\n\n return shortUrl;\n }\n\n private async regionElements(stepData: Step<DigitalContentStepData>): Promise<RegionElement[]> {\n const createElementForRegion = (region: Region): RegionElement => {\n const elementKey = generate();\n return { id: elementKey, region };\n };\n\n return stepData.data.regions.map(createElementForRegion);\n }\n\n private async command(\n shortUrl: string,\n regionElements: RegionElement[],\n workflowManager: WorkflowManager,\n stepName: string,\n ): Promise<CommandWithFollowup | null> {\n const layouts = workflowManager.getLayouts();\n const base64data = btoa(await urlToString(shortUrl, { type: \"svg\" }));\n const dataUri = `data:image/svg+xml;base64,${base64data}`;\n const commands = regionElements.map((regionElement) => {\n const region = regionElement.region;\n const layout = layouts.find((layout: ILayout) => layout.panelId === region?.panelId);\n\n if (!layout && region) {\n throw new LayoutNotFoundError(region);\n }\n\n if (layout && !region) {\n throw new Error(\"Region not found\");\n }\n\n if (!layout || !region) {\n throw new Error(\"Neither a region or layout found!\");\n }\n\n return new CreateElementCommand<ImageElement>(\n {\n stepRegion: region,\n stepName: stepName,\n id: regionElement.id,\n src: dataUri,\n type: LayoutElementType.Image,\n y: region.top,\n x: region.left,\n width: region.width,\n height: region.height,\n rotation: 0,\n },\n layout,\n );\n });\n return { command: new GroupCommand(commands), followup: async () => {} };\n }\n}\n\nexport const digitalContentStepService = new DigitalContentStepService();\n","import { optionService } from \"../../option\";\nimport {\n RegionElement,\n StepService,\n CommandWithFollowup,\n FrameData,\n ColorOption,\n GlobalPropertyStateFileUploadStorage,\n FrameStepData,\n Step,\n LayoutsState,\n VariantResource,\n Asset,\n Region,\n ILayout,\n FrameElement,\n LayoutElementType,\n ColorDefinition,\n} from \"../../../types\";\nimport { Poller } from \"../../../util/Poller\";\nimport { WorkflowManager } from \"../../../WorkflowManager\";\nimport { assetService } from \"../../asset\";\nimport { FrameService } from \"./Service\";\nimport { LayoutNotFoundError, ResourceGenerationError, ResourceNotFoundError } from \"../../../util/exception\";\nimport { AssetNotFoundError } from \"../../../util/exception\";\nimport { browserColorToHex } from \"../../../util/color\";\nimport { fetch, fetchAsArrayBuffer, fetchAsString } from \"../../../util/crossplatform\";\nimport {\n calculateOffsets,\n generateDefaultRectangleFrameSvg,\n getFrameData,\n GetSVGDimensions,\n patternImageDataCache,\n} from \"../../../util/frame\";\nimport { CreateElementCommand, DeleteElementCommand, GroupCommand } from \"../../../command\";\nimport { generateSVGWithUnknownColors } from \"../../../util/illustration\";\nimport { getAttributesFromArrayBuffer } from \"../../../util/image\";\nimport { generate } from \"../../../util/guid\";\n\nexport interface FrameCreateOpts {\n stepName?: string;\n frameData: FrameData;\n disablePlaceholder?: boolean;\n pattern?: any;\n}\n\nclass FrameStepService implements StepService<FrameStepData> {\n async init(\n stepData: Step<FrameStepData>,\n workflowManager: WorkflowManager,\n reducerState?: LayoutsState,\n ): Promise<CommandWithFollowup | null> {\n // If existing state then use it.\n if (reducerState) {\n await this.reload(stepData, workflowManager, reducerState);\n return null;\n }\n\n if (stepData.mandatory) {\n workflowManager.setMandatoryFulfilled(stepData.stepName, false);\n }\n workflowManager.markStepsAsInitialised([stepData.stepName]);\n\n // When a bundle is present we load the frame aspect.\n let initialPatternOverride: string | undefined = undefined;\n const bundle = workflowManager.getWorkflowExperience().getBundle();\n if (bundle && stepData.globalPropertyAspectConfigurations) {\n const stateManager = bundle.getGlobalPropertyStateManager();\n // FIXME: This might not be robust enough. I think we support more than Upload on frames.\n const uploadAspect = stepData.globalPropertyAspectConfigurations[0];\n const key = stateManager.getAspectStorage<GlobalPropertyStateFileUploadStorage>(uploadAspect.aspectName!);\n if (key && key.originalAssetKey) {\n initialPatternOverride = (await assetService.getLocalOrFromServer(key.originalAssetKey)).fileLink;\n }\n }\n\n // If an option exists then determine if there's a default variant.\n if (stepData.option && stepData.option.variants && stepData.option.variants.length > 0) {\n const option = stepData.option;\n const defaultVariant = optionService.getDefaultVariant(option);\n if (defaultVariant) {\n return this.selectVariantCommand(\n stepData,\n defaultVariant,\n [],\n workflowManager,\n undefined,\n initialPatternOverride ? initialPatternOverride : stepData.data.placeholderImageUrl,\n );\n }\n return null;\n }\n\n // If no option then create a square box.\n return this.selectVariantCommand(\n stepData,\n undefined,\n [],\n workflowManager,\n undefined,\n initialPatternOverride ? initialPatternOverride : stepData.data.placeholderImageUrl,\n );\n }\n\n private async reload(stepData: Step<FrameStepData>, workflowManager: WorkflowManager, reducerState: LayoutsState) {\n const serializedStep = workflowManager.getSerializedStep(\n stepData.stepName,\n reducerState.serializableWorkflow.steps,\n );\n const layouts = Object.values(reducerState.layouts);\n const elements = layouts.map((layout) => layout.elements).flat();\n const elementsForStep = elements.filter((el) => el.stepName === stepData.stepName);\n const regionElements = elementsForStep.map((el) => ({ id: el.id, region: el.stepRegion }));\n if (!stepData.option || (stepData.option.variants || []).length === 0) {\n const frameSvgs = stepData.data.regions.map((region) => generateDefaultRectangleFrameSvg(region));\n workflowManager.updateStorage(stepData.stepName, {\n currentFrameSources: frameSvgs,\n });\n }\n if (serializedStep) {\n const finish = async () => {\n const storageColors = serializedStep.storage?.colors;\n const patternSrc = serializedStep.storage?.framePatternSrc;\n const offsets = serializedStep.storage?.frameOffsetsList;\n workflowManager.updateMetadata(stepData.stepName, {\n frameOffsetsList: offsets,\n framePatternSrc: patternSrc,\n });\n if (patternSrc) {\n const frameService = workflowManager.getStepSpecificServices(stepData.stepName)?.frameService;\n if (!frameService) throw new Error(\"Frame service unavailable, cannot load pattern!\");\n // Load the pattern and recalculate offsets. Deserialized offsets will potentially be applied after.\n await this.loadPatternFromString(patternSrc, frameService, true, storageColors);\n workflowManager.updateMetadata(stepData.stepName, { image: patternSrc });\n workflowManager.updateStorage(stepData.stepName, {\n framePatternSrc: patternSrc,\n });\n this.validateColorCount(stepData, workflowManager);\n }\n if (offsets?.some((offset) => offset.zoom)) {\n const frameService = workflowManager.getStepSpecificServices(stepData.stepName)?.frameService;\n if (!frameService) throw new Error(\"Frame service unavailable, cannot load pattern!\");\n frameService.updateOffsets(offsets);\n }\n workflowManager.setMandatoryFulfilled(stepData.stepName, true);\n };\n\n if (serializedStep.selectedVariants && serializedStep.selectedVariants.length > 0) {\n const variantId = serializedStep.selectedVariants[0].id;\n if (stepData.option && variantId) {\n const variant = stepData.option.variants?.find((variant) => variant.id === variantId);\n if (variant) {\n await workflowManager.setSelectionsAndElements(\n stepData.stepName,\n [variant],\n regionElements,\n async () => {\n const frameSvgs = await Promise.all(\n stepData.data.regions.map((region) => this.frameSourceSvg(variant, region)),\n );\n workflowManager.updateStorage(stepData.stepName, { currentFrameSources: frameSvgs });\n await finish();\n },\n );\n }\n }\n } else {\n await workflowManager.setSelectionsAndElements(stepData.stepName, [], regionElements, finish);\n }\n }\n }\n\n async availableColors(stepData: Step<FrameStepData>, _workflowManager: WorkflowManager): Promise<ColorOption[]> {\n const colorOption = stepData.data.colorOption;\n return (\n colorOption?.variants?.map((variant: VariantResource) => {\n return {\n fill: variant.color,\n stroke: variant.color,\n variant,\n pmsValue: variant.name,\n };\n }) ?? []\n );\n }\n\n selectImage(\n stepData: Step<FrameStepData>,\n asset: Asset,\n workflowManager: WorkflowManager,\n recalculateOffsets = true,\n ): Promise<void> {\n const assetSrc = this.patternSource(asset);\n const existingSrc = workflowManager.getStepStorage(stepData.stepName)?.framePatternSrc;\n if (existingSrc && existingSrc === assetSrc) {\n return Promise.resolve();\n }\n workflowManager.setEditedStatus(stepData.stepName, true);\n const src = asset.fileLink || \"\";\n\n // TODO: Use mime type instead of extension\n if (src.endsWith(\".pdf\") || src.endsWith(\".eps\") || src.endsWith(\".ai\")) {\n // In the case of PDF we need to transcode first as\n // we don't have first class support for PDF files in frames.\n return new Promise<void>((resolve) => {\n workflowManager.addPoller(\n new Poller(\n async () => {\n const assetResponse = await assetService.getFromServer(asset.key || \"\");\n const svgVersion = assetResponse.versions?.find((v) => v.name === \"svg\");\n if (!svgVersion) return false;\n const fetchResult = await fetch(svgVersion.link);\n return fetchResult.status === 200;\n },\n () => {\n assetService.getLocalOrFromServer(asset.key || \"\").then((response) => {\n this.loadPatternFromAsset(response, stepData, workflowManager, recalculateOffsets).then(\n resolve,\n );\n });\n },\n () => {\n throw new ResourceGenerationError(\"Failed to resolve transcoded PDF\");\n },\n ),\n );\n });\n } else {\n return this.loadPatternFromAsset(asset, stepData, workflowManager, recalculateOffsets);\n }\n }\n\n async selectVariant(\n stepData: Step<FrameStepData>,\n variant: VariantResource | undefined,\n elements: RegionElement[],\n workflowManager: WorkflowManager,\n setFrameIsUpdating?: (status: boolean) => void,\n ) {\n const result = await this.selectVariantCommand(\n stepData,\n variant,\n elements,\n workflowManager,\n setFrameIsUpdating,\n );\n if (result) {\n result.command && workflowManager.getCommandDispatcher()(result.command);\n result.followup && (await result.followup());\n }\n }\n\n getCreateElementCommand(id: string, region: Region, layout: ILayout, options: FrameCreateOpts) {\n return new CreateElementCommand<FrameElement>(\n {\n id,\n type: LayoutElementType.Frame,\n x: region.left,\n y: region.top,\n width: region.width,\n height: region.height,\n layer: region.layer,\n layerIndex: region.layerIndex,\n rotation: region.rotation,\n scaleX: region.width / options.frameData.width,\n scaleY: region.height / options.frameData.height,\n path: options.frameData.path,\n dataWidth: options.frameData.width,\n dataHeight: options.frameData.height,\n stepRegion: region,\n stepName: options.stepName,\n disablePlaceholder: options.disablePlaceholder,\n pattern: options.pattern,\n immutable: region.immutable,\n },\n layout,\n );\n }\n\n async loadPatternFromString(\n src: string,\n frameService: FrameService,\n recalculateOffsets = true,\n colors:\n | {\n [key: string]: ColorDefinition;\n }\n | undefined = undefined,\n colorSafeSvg?: boolean,\n ) {\n if (src.endsWith(\"svg\")) {\n const svgData = await GetSVGDimensions(src);\n const width = svgData.width;\n const height = svgData.height;\n const originalSvg = await fetchAsString(src);\n if (colorSafeSvg) {\n const matches = originalSvg.match(/<(image|linearGradient|radialGradient)(\\s|>|\\/>)/gim);\n if (matches && matches.length > 0) {\n throw new Error(\n \"Vector files may not include images or gradients when a color limit is specified.\",\n );\n }\n }\n const svgAndColors = await generateSVGWithUnknownColors(originalSvg);\n const data = {\n src: src,\n width,\n height,\n aspect: width / height,\n svg: svgAndColors.svg,\n colors: colors ?? svgAndColors.colors,\n };\n patternImageDataCache.set(src, data);\n frameService.setPatternData(data, recalculateOffsets);\n } else {\n const arrayBuffer = await fetchAsArrayBuffer(src, true);\n const attributes = await getAttributesFromArrayBuffer(arrayBuffer);\n const data = {\n src: src,\n width: attributes.width,\n height: attributes.height,\n aspect: attributes.width / attributes.height,\n svg: undefined,\n colors: undefined,\n };\n patternImageDataCache.set(src, data);\n frameService.setPatternData(data, recalculateOffsets);\n }\n }\n\n changeColors(\n stepData: Step<FrameStepData>,\n workflowManager: WorkflowManager,\n newFills: Map<string, ColorDefinition>,\n ) {\n const frameService = workflowManager.getStepSpecificServices(stepData.stepName)?.frameService;\n if (!frameService || !frameService.getImageData()?.svg) {\n console.warn(\"changeColors was called without an SVG being assigned to a frame step\");\n return;\n }\n const colorData = this.calculateColorMetadata(frameService, stepData, newFills);\n workflowManager.updateMetadata(stepData.stepName, { colors: colorData.metadataColors });\n workflowManager.updateStorage(stepData.stepName, {\n colors: colorData.storageColors,\n });\n // Update image data without updating offsets\n frameService.setPatternData(\n {\n ...frameService.getImageData()!,\n colors: colorData.newColors,\n },\n false,\n );\n this.validateColorCount(stepData, workflowManager);\n }\n\n getUniqueColorCount(stepData: Step<FrameStepData>, workflowManager: WorkflowManager): number {\n const frameService = workflowManager.getStepSpecificServices(stepData.stepName)?.frameService;\n if (!frameService) return 0;\n const colors = frameService.getImageData()?.colors ?? {};\n const unique: string[] = [];\n for (const key in colors) {\n const color = colors[key];\n if (color.pmsValue) {\n const pms = color.pmsValue.trim().toLocaleLowerCase();\n if (!unique.includes(pms)) {\n unique.push(pms);\n }\n } else if (color.browserValue) {\n // browserColorToHex already sanitizes value\n const hex = browserColorToHex(color.browserValue);\n if (!unique.includes(hex)) {\n unique.push(hex);\n }\n }\n }\n return unique.length;\n }\n\n private calculateColorMetadata(\n frameService: FrameService,\n stepData: Step<FrameStepData>,\n newFills: Map<string, ColorDefinition>,\n ) {\n if (!frameService.getImageData()?.svg) {\n return {\n newColors: undefined,\n metadataColors: undefined,\n storageColors: undefined,\n };\n }\n // Compute change in color and apply to metadata\n const newColors: { [key: string]: ColorDefinition } = { ...(frameService.getImageData()!.colors ?? {}) };\n const storageColors: any = {};\n Object.entries(newColors).forEach(([key, value]) => {\n const color: any = { browserValue: value.browserValue };\n storageColors[key] = color;\n });\n for (const [className, newFill] of newFills.entries()) {\n newColors[className] = { browserValue: newFill.browserValue, pmsValue: newFill.pmsValue };\n storageColors[className] = newFill;\n }\n\n let colors = Array.from(Object.values(newColors)).map((c) => c.browserValue);\n const colorOption = stepData.data.colorOption;\n if (colorOption) {\n colorOption.variants?.forEach((v: VariantResource) => {\n colors = colors.map((c) => (c.toLowerCase() === v.color?.toLowerCase() ? v.name : c));\n });\n }\n return {\n newColors,\n metadataColors: colors,\n storageColors,\n };\n }\n\n private validateColorCount(stepData: Step<FrameStepData>, workflowManager: WorkflowManager) {\n const maxColors = stepData.data.colorPickerEnabled ? stepData.data.maxColors ?? 0 : 0;\n workflowManager.setStepError(\n stepData.stepName,\n \"colors\",\n maxColors > 0 && this.getUniqueColorCount(stepData, workflowManager) > maxColors\n ? \"workflow.steps.frame.tooManyColors\"\n : undefined,\n );\n }\n\n private async selectVariantCommand(\n stepData: Step<FrameStepData>,\n variant: VariantResource | undefined,\n elements: RegionElement[],\n workflowManager: WorkflowManager,\n setFrameIsUpdating?: (status: boolean) => void,\n loadedPattern?: string,\n ): Promise<CommandWithFollowup | null> {\n const frameService = workflowManager.getStepSpecificServices(stepData.stepName)?.frameService;\n if (!frameService) throw new Error(\"Frame service unavailable, cannot load pattern!\");\n const frameSvgs = await Promise.all(\n stepData.data.regions.map((region) => this.frameSourceSvg(variant, region)),\n );\n setFrameIsUpdating && setFrameIsUpdating(true);\n const initZoom = stepData.data.initialZoomLevel;\n const createdData = await Promise.all(\n stepData.data.regions.map(async (r, index) => {\n const newFrameData = await getFrameData(frameSvgs[index]);\n const existingImage = frameService.getImageData();\n const removeExistingCommands = elements.map((elem) => new DeleteElementCommand(elem.id));\n const newOffsets = existingImage\n ? calculateOffsets(\n existingImage,\n newFrameData,\n initZoom && !stepData.data.forceImageCover ? { scale: initZoom } : undefined,\n stepData.data.forceImageCover,\n )\n : undefined;\n const pattern = existingImage\n ? {\n id: generate(),\n src: existingImage.src,\n x: newOffsets?.x || 0,\n y: newOffsets?.y || 0,\n width: existingImage.width,\n height: existingImage.height,\n scaleX: newOffsets?.zoom || 1,\n scaleY: newOffsets?.zoom || 1,\n rotation: 0,\n }\n : undefined;\n\n const newElementId = generate();\n const layouts = workflowManager.getLayouts();\n const layout = layouts.find((layout: ILayout) => layout.panelId === r.panelId);\n if (!layout) {\n throw new LayoutNotFoundError(r);\n }\n return {\n command: this.getCreateElementCommand(newElementId, r, layout, {\n frameData: newFrameData,\n pattern,\n disablePlaceholder: stepData.data.disablePlaceholder,\n stepName: stepData.stepName,\n }),\n regionEl: {\n id: newElementId,\n region: r,\n },\n removeExistingCommands,\n };\n }),\n );\n\n const createCommands = createdData.map((d) => d.command);\n const removeExistingCommands = createdData.map((d) => d.removeExistingCommands).flat();\n return {\n command: new GroupCommand([...createCommands, ...removeExistingCommands]),\n followup: async () => {\n setFrameIsUpdating && setFrameIsUpdating(false);\n await workflowManager.setSelectionsAndElements(\n stepData.stepName,\n variant ? [variant] : [],\n [...createdData.map((d) => d.regionEl)],\n async () => {\n workflowManager.updateStorage(stepData.stepName, { currentFrameSources: frameSvgs });\n if (loadedPattern) {\n const frameService = workflowManager.getStepSpecificServices(\n stepData.stepName,\n )?.frameService;\n if (!frameService) throw new Error(\"Frame service unavailable, cannot load pattern!\");\n await this.loadPatternFromString(loadedPattern, frameService, true);\n }\n },\n );\n },\n };\n }\n\n private frameSourceSvg = async (variant: undefined | VariantResource, region: Region): Promise<string> => {\n if (!variant) {\n return generateDefaultRectangleFrameSvg(region);\n }\n const asset = variant.asset;\n if (!asset) {\n throw new AssetNotFoundError(variant);\n }\n const link = asset.fileLink;\n if (link) {\n return fetchAsString(link, true);\n }\n throw new ResourceNotFoundError(asset);\n };\n\n /**\n * Grab the source to be used for a frame from the variant or throw otherwise.\n */\n private patternSource(asset: Asset) {\n const svgVersion = asset.versions?.find((v) => v.name === \"svg\");\n if (svgVersion) {\n return svgVersion.link;\n }\n const cdnLink = asset.fileLink;\n if (cdnLink) {\n return cdnLink;\n }\n throw new ResourceNotFoundError(asset);\n }\n\n private async loadPatternFromAsset(\n asset: Asset,\n stepData: Step<FrameStepData>,\n workflowManager: WorkflowManager,\n recalculateOffsets: boolean,\n ): Promise<void> {\n const src = this.patternSource(asset);\n const updateId = workflowManager.markUpdatePending();\n const frameService = workflowManager.getStepSpecificServices(stepData.stepName)?.frameService;\n if (!frameService) {\n workflowManager.markUpdateCompleted(updateId);\n throw new Error(\"Frame service unavailable, cannot load pattern!\");\n }\n try {\n await this.loadPatternFromString(\n src,\n frameService,\n recalculateOffsets,\n undefined,\n stepData.data.colorPickerEnabled && !!stepData.data.maxColors && stepData.data.maxColors > 0,\n );\n } catch (e: any) {\n workflowManager.markUpdateCompleted(updateId);\n throw e;\n }\n const colorData = this.calculateColorMetadata(\n frameService,\n stepData,\n new Map(Object.entries(frameService.getImageData()?.colors ?? {})),\n );\n workflowManager.updateMetadata(stepData.stepName, { image: src, colors: colorData.metadataColors });\n workflowManager.updateStorage(stepData.stepName, {\n framePatternSrc: src,\n colors: colorData.storageColors,\n });\n workflowManager.markUpdateCompleted(updateId);\n\n workflowManager.setMandatoryFulfilled(stepData.stepName, true);\n workflowManager.setInformationResults(\n workflowManager.getInformationResults().filter((it) => it.stepID === stepData.stepName),\n );\n this.validateColorCount(stepData, workflowManager);\n }\n}\n\nexport const frameStepService = new FrameStepService();\n","import { optionService } from \"../option\";\nimport { ColorDefinition, CommandWithFollowup, ILayout, IllustrationElement, IllustrationStepData, LayoutElementType, LayoutsState, Region, Step, VariantResource } from \"../../types\";\nimport { RegionElement, StepService } from \"../../types\";\nimport { WorkflowManager } from \"../../WorkflowManager\";\nimport { LayoutNotFoundError, MisconfigurationError, ResourceNotFoundError } from \"../../util/exception\";\nimport { AssetNotFoundError } from \"../../util/exception\";\nimport { fetchAsString } from \"../../util/crossplatform\";\nimport { CanvasCommand, CreateElementCommand, DeleteElementCommand, GroupCommand, IllustrationCacheCommand, IllustrationColorCommand } from \"../../command\";\nimport { findElement } from \"../../LayoutsState\";\nimport { generateSVGWithUnknownColors, modifySVGWithElementProperties } from \"../../util/illustration\";\nimport { svgObjectURL } from \"../../Elements/factory\";\nimport { LayoutData } from \"../../CommandContext\";\nimport { generate } from \"../../util/guid\";\n\nexport interface SVGCreateOpts {\n stepName?: string;\n src: string;\n objectURL: string;\n svg: {\n svg: string;\n colors: { [key: string]: ColorDefinition };\n };\n}\n\nclass IllustrationStepService implements StepService<IllustrationStepData> {\n async getIllustrationBody(src: string): Promise<string> {\n return new Promise((resolve) => {\n fetchAsString(src as string, true)\n .then((svg) => {\n resolve(svg);\n })\n .catch((e) => console.error(e));\n });\n }\n\n getCreateElementCommand(id: string, region: Region, layout: ILayout, options: SVGCreateOpts) {\n return new CreateElementCommand<IllustrationElement>(\n {\n stepRegion: region,\n stepName: options.stepName,\n colors: options.svg.colors,\n id,\n src: options.src,\n svg: options.svg.svg,\n cachedObjectURL: options.objectURL,\n type: LayoutElementType.Illustration,\n y: region.top,\n x: region.left,\n rotation: region.rotation,\n width: region.width,\n height: region.height,\n layer: region.layer,\n layerIndex: region.layerIndex,\n immutable: region.immutable,\n },\n layout,\n );\n }\n\n getColors(stepData: Step<IllustrationStepData>, workflowManager: WorkflowManager) {\n const regionEls = workflowManager.getRegionElements(stepData.stepName) || [];\n if (regionEls.length === 0) return [];\n try {\n const layoutElement = findElement(\n regionEls[0].id,\n workflowManager.getAllLayoutData(),\n ) as IllustrationElement;\n return layoutElement.colors;\n } catch (e) {\n return [];\n }\n }\n\n async init(\n stepData: Step<IllustrationStepData>,\n workflowManager: WorkflowManager,\n reducerState?: LayoutsState,\n ): Promise<CommandWithFollowup | null> {\n const option = stepData.option;\n if (!option) {\n return null;\n }\n if (reducerState) {\n return this.reload(stepData, workflowManager, reducerState);\n } else {\n const defaultVariant = optionService.getDefaultVariant(option);\n if (defaultVariant) {\n return await this.selectVariantCommand(stepData, defaultVariant, [], () => {}, workflowManager);\n }\n }\n return null;\n }\n\n private async reload(\n stepData: Step<IllustrationStepData>,\n workflowManager: WorkflowManager,\n reducerState: LayoutsState,\n ) {\n const serializedStep = workflowManager.getSerializedStep(\n stepData.stepName,\n reducerState.serializableWorkflow.steps,\n );\n const layouts = Object.values(reducerState.layouts);\n const elements = layouts.map((layout) => layout.elements).flat();\n const elementsForStep = elements.filter((el) => el.stepName === stepData.stepName);\n const option = stepData.option;\n if (serializedStep?.selectedVariants) {\n const variantId = serializedStep.selectedVariants[0].id;\n if (option && variantId) {\n const variant = option.variants?.find((variant: VariantResource) => variant.id === variantId);\n if (variant) {\n const regionElements = elementsForStep.map((el) => ({ id: el.id, region: el.stepRegion }));\n await workflowManager.setSelectionsAndElements(\n stepData.stepName,\n [variant],\n regionElements,\n async () => {\n workflowManager.updateMetadata(stepData.stepName, {\n colors: serializedStep.storage?.colors,\n });\n workflowManager.setMandatoryFulfilled(stepData.stepName, true);\n },\n );\n }\n } else throw new Error(\"Required illustration variant no longer available\");\n }\n return null;\n }\n\n async availableColors(stepData: Step<IllustrationStepData>, _workflowManager: WorkflowManager) {\n const colorOption = stepData.data.colorOption;\n if (colorOption) {\n return colorOption\n ? colorOption.variants?.map((variant: VariantResource) => {\n return {\n fill: variant.color,\n stroke: variant.color,\n variant,\n };\n })\n : [];\n }\n return [];\n }\n\n async changeColorsCommand(\n svg: string,\n illustrationWidth: number,\n illustrationHeight: number,\n elements: string[],\n newFills: Map<string, string>,\n ): Promise<CanvasCommand> {\n const newColors: { [key: string]: ColorDefinition } = {};\n for (const [className, newFill] of newFills.entries()) {\n newColors[className] = { browserValue: newFill, spotColor: newColors[className]?.spotColor };\n }\n const svgData = modifySVGWithElementProperties(svg, illustrationWidth, illustrationHeight, newColors);\n const objectURL = await svgObjectURL(svgData);\n const commands: CanvasCommand[] = [];\n for (const id of elements) {\n for (const [className, newFill] of newFills.entries()) {\n commands.push(new IllustrationColorCommand(id, className, newFill));\n }\n commands.push(new IllustrationCacheCommand(id, svgData, objectURL));\n }\n return new GroupCommand(commands);\n }\n\n async changeColors(\n stepData: Step<IllustrationStepData>,\n elements: RegionElement[],\n workflowManager: WorkflowManager,\n getAllLayouts: () => LayoutData[],\n newFills: Map<string, string>,\n ) {\n if (elements.length === 0) {\n return;\n }\n\n const layoutElement = findElement(\n elements[0].id,\n getAllLayouts().map((layout) => layout.layoutState),\n ) as IllustrationElement;\n\n // Compute change in color and apply to metadata\n const newColors: { [key: string]: ColorDefinition } = { ...(layoutElement as IllustrationElement).colors };\n const storageColors: any = {};\n Object.entries(newColors).forEach(([key, value]) => {\n const color: any = { browserValue: value.browserValue };\n const spotColor = value.spotColor;\n if (spotColor) {\n color[\"spotColor\"] = { profileName: spotColor.profileName, namedColor: spotColor.namedColor };\n }\n storageColors[key] = color;\n });\n for (const [className, newFill] of newFills.entries()) {\n newColors[className] = { browserValue: newFill, spotColor: newColors[className]?.spotColor };\n storageColors[className] = { browserValue: newFill };\n }\n\n let colors = Array.from(Object.values(newColors)).map((c) => c.browserValue);\n\n const colorOption = stepData.data.colorOption;\n if (colorOption) {\n colorOption.variants?.forEach((v: VariantResource) => {\n colors = colors.map((c) => (c.toLowerCase() === v.color?.toLowerCase() ? v.name : c));\n });\n }\n workflowManager.updateMetadata(stepData.stepName, { colors });\n const colorsForCommand: Map<string, string> = new Map();\n Object.entries(newColors).forEach(([key, value]) => {\n colorsForCommand.set(key, value.browserValue);\n });\n\n if (!layoutElement.svg) {\n throw new Error(\"Colors changed before SVG loaded. This should never happen!\");\n }\n\n const command = await this.changeColorsCommand(\n layoutElement.svg,\n layoutElement.width,\n layoutElement.height,\n elements.map((el) => el.id),\n colorsForCommand,\n );\n workflowManager.updateStorage(stepData.stepName, {\n colors: storageColors,\n });\n workflowManager.getCommandDispatcher()(command);\n }\n\n async selectVariant(\n stepData: Step<IllustrationStepData>,\n variant: VariantResource,\n elements: RegionElement[],\n setIsUpdating: (isUpdating: boolean) => void,\n workflowManager: WorkflowManager,\n ) {\n const result = await this.selectVariantCommand(stepData, variant, elements, setIsUpdating, workflowManager);\n if (result) {\n result.command && workflowManager.getCommandDispatcher()(result.command);\n result.followup && (await result.followup());\n }\n }\n\n private async selectVariantCommand(\n stepData: Step<IllustrationStepData>,\n variant: VariantResource,\n elements: RegionElement[],\n setIsUpdating: (isUpdating: boolean) => void,\n workflowManager: WorkflowManager,\n ): Promise<CommandWithFollowup | null> {\n if (!stepData.data || !stepData.data.regions) {\n throw new MisconfigurationError(stepData, \"Missing regions.\");\n }\n setIsUpdating(true);\n const deletionCommands = elements.map((el) => new DeleteElementCommand(el.id));\n if (stepData.mandatory) {\n workflowManager.setMandatoryFulfilled(stepData.stepName, false);\n }\n const asset = variant.asset;\n if (!asset) {\n throw new AssetNotFoundError(variant);\n }\n const link = asset.fileLink;\n\n if (!link) {\n throw new ResourceNotFoundError(asset);\n }\n\n const svgData = await generateSVGWithUnknownColors(await this.getIllustrationBody(link));\n const objectURL = await svgObjectURL(svgData.svg);\n const createElementForRegion = (region: Region) => {\n const layout = workflowManager.getLayouts().find((layout: ILayout) => layout.panelId === region.panelId);\n if (!layout) {\n throw new LayoutNotFoundError(region);\n }\n const elementKey = generate();\n return {\n regionElement: { id: elementKey, region },\n command: this.getCreateElementCommand(elementKey, region, layout, {\n stepName: stepData.stepName,\n src: link,\n objectURL,\n svg: svgData,\n }),\n };\n };\n const elementsWithCommands = stepData.data.regions.map(createElementForRegion);\n const createCommands = elementsWithCommands.map((r) => r.command);\n const commandList: CanvasCommand[] = [...createCommands, ...deletionCommands];\n\n let colors = Array.from(Object.values(svgData.colors)).map((c) => c.browserValue);\n const colorOption = stepData.data.colorOption;\n if (colorOption) {\n colorOption.variants?.forEach((v: VariantResource) => {\n colors = colors.map((c) => (c.toLowerCase() === v.color?.toLowerCase() ? v.name : c));\n });\n }\n\n workflowManager.updateMetadata(stepData.stepName, { colors: colors });\n return {\n command: new GroupCommand(commandList),\n followup: async () => {\n await workflowManager.setSelectionsAndElements(\n stepData.stepName,\n [variant],\n elementsWithCommands.map((r) => r.regionElement),\n async () => {\n workflowManager.setMandatoryFulfilled(stepData.stepName, true);\n setIsUpdating(false);\n },\n );\n\n // When the color picker is enabled & only 1 variant is available, we immediately apply\n // the variant to the illustration.\n const availableColors = (await this.availableColors(stepData, workflowManager)) || [];\n const colorEntries = Object.keys(svgData.colors);\n if (stepData.data.colorPickerEnabled && availableColors.length === 1 && colorEntries.length === 1) {\n const color = availableColors[0];\n const entry = colorEntries[0];\n await this.changeColors(\n stepData,\n elementsWithCommands.map((r) => r.regionElement),\n workflowManager,\n () => workflowManager.getCommandContext().getAllLayouts(),\n new Map([[entry, color.variant.color!]]),\n );\n } else if (stepData.data.colorPickerEnabled) {\n // This \"change\" is just to populate color metadata.\n await this.changeColors(\n stepData,\n elementsWithCommands.map((r) => r.regionElement),\n workflowManager,\n () => workflowManager.getCommandContext().getAllLayouts(),\n new Map(),\n );\n }\n },\n };\n }\n}\n\nexport const illustrationStepService = new IllustrationStepService();\n","import { optionService } from \"../option\";\nimport { CommandWithFollowup, LayoutsState, MaterialStepData, Step, StepService, VariantResource } from \"../../types\";\nimport { WorkflowManager } from \"../../WorkflowManager\";\nimport { AssetNotFoundError, OptionNotFoundError } from \"../../util/exception\";\n\nclass MaterialStepService implements StepService<MaterialStepData> {\n async init(\n stepData: Step<MaterialStepData>,\n workflowManager: WorkflowManager,\n reducerState?: LayoutsState,\n ): Promise<null | CommandWithFollowup> {\n const option = stepData.option;\n if (!option) {\n throw new OptionNotFoundError(stepData);\n }\n if (reducerState) {\n await this.reload(stepData, workflowManager, reducerState);\n } else {\n const defaultVariant = optionService.getDefaultVariant(option);\n if (defaultVariant) {\n return await this.selectVariantLambda(stepData, defaultVariant, workflowManager, () => {});\n }\n }\n return null;\n }\n\n private async reload(\n stepData: Step<MaterialStepData>,\n workflowManager: WorkflowManager,\n reducerState: LayoutsState,\n ) {\n const serializedStep = workflowManager.getSerializedStep(\n stepData.stepName,\n reducerState.serializableWorkflow.steps,\n );\n const layouts = Object.values(reducerState.layouts);\n const elements = layouts.map((layout) => layout.elements).flat();\n const elementsForStep = elements.filter((el) => el.stepName === stepData.stepName);\n const option = stepData.option;\n if (!option) throw new OptionNotFoundError(stepData);\n if (serializedStep?.selectedVariants) {\n const variantId = serializedStep.selectedVariants[0].id;\n if (variantId) {\n const variant = option.variants?.find((variant: VariantResource) => variant.id === variantId);\n if (variant) {\n const material = variant.material;\n const regionElements = elementsForStep.map((el) => ({ id: el.id, region: el.stepRegion }));\n await workflowManager.setSelectionsAndElements(\n stepData.stepName,\n [variant],\n regionElements,\n async () => {\n const modelContainer = workflowManager.getModelContainer();\n if (modelContainer) {\n const variantPromises = stepData.data.targetMaterials.map((matName) => {\n return modelContainer.applyMaterialVariant(\n matName,\n option.id || \"\",\n material || {},\n );\n });\n Promise.all(variantPromises).then(() =>\n workflowManager.setMandatoryFulfilled(stepData.stepName, true),\n );\n }\n },\n );\n }\n }\n }\n }\n\n async selectVariant(\n step: Step<MaterialStepData>,\n variant: VariantResource,\n workflowManager: WorkflowManager,\n setApplying: (status: boolean) => void,\n ) {\n const result = await this.selectVariantLambda(step, variant, workflowManager, setApplying);\n if (result) {\n result.command && workflowManager.getCommandDispatcher()(result.command);\n result.followup && (await result.followup());\n }\n }\n\n private async selectVariantLambda(\n step: Step<MaterialStepData>,\n variant: VariantResource,\n workflowManager: WorkflowManager,\n setApplying: (status: boolean) => void,\n ): Promise<CommandWithFollowup | null> {\n const modelContainer = workflowManager.getModelContainer();\n setApplying(true);\n const material = variant.material;\n if (!material) {\n setApplying(false);\n throw new AssetNotFoundError(variant);\n }\n return {\n command: undefined,\n followup: async () => {\n await workflowManager.setSelectionsAndElements(step.stepName, [variant], [], async () => {\n try {\n if (modelContainer) {\n step.data.targetMaterials.forEach((matName) => {\n step.option &&\n modelContainer.applyMaterialVariant(matName, step.option.id || \"\", material);\n });\n }\n workflowManager.setMandatoryFulfilled(step.stepName, true);\n } finally {\n setApplying(false);\n }\n });\n },\n };\n }\n}\n\nexport const materialStepService = new MaterialStepService();\n","import { optionService } from \"../option\";\nimport { CommandWithFollowup, LayoutsState, ModelStepData, Step, StepService, VariantResource } from \"../../types\";\nimport { WorkflowManager } from \"../../WorkflowManager\";\nimport { OptionNotFoundError } from \"../../util/exception\";\nimport { AssetNotFoundError } from \"../../util/exception\";\n\nclass ModelStepService implements StepService<ModelStepData> {\n async init(\n stepData: Step<ModelStepData>,\n workflowManager: WorkflowManager,\n reducerState?: LayoutsState,\n ): Promise<CommandWithFollowup | null> {\n const option = stepData.option;\n if (!option) throw new OptionNotFoundError(stepData);\n if (reducerState) {\n await this.reload(stepData, workflowManager, reducerState);\n } else {\n const defaultVariant = optionService.getDefaultVariant(option);\n if (defaultVariant) {\n return await this.selectVariantLambda(stepData, defaultVariant, workflowManager, () => {});\n }\n }\n return null;\n }\n\n private async reload(stepData: Step<ModelStepData>, workflowManager: WorkflowManager, reducerState: LayoutsState) {\n const serializedStep = workflowManager.getSerializedStep(\n stepData.stepName,\n reducerState.serializableWorkflow.steps,\n );\n const layouts = Object.values(reducerState.layouts);\n const elements = layouts.map((layout) => layout.elements).flat();\n const elementsForStep = elements.filter((el) => el.stepName === stepData.stepName);\n const option = stepData.option;\n if (serializedStep?.selectedVariants) {\n const variantId = serializedStep.selectedVariants[0].id;\n if (option && variantId) {\n const variant = option.variants?.find((variant: VariantResource) => variant.id === variantId);\n if (variant) {\n const regionElements = elementsForStep.map((el) => ({ id: el.id, region: el.stepRegion }));\n await workflowManager.setSelectionsAndElements(\n stepData.stepName,\n [variant],\n regionElements,\n async () => {\n const modelContainer = workflowManager.getModelContainer();\n if (modelContainer && stepData.option) {\n const highlightedRef = variant.asset?.fileLink;\n if (!highlightedRef) throw new AssetNotFoundError(variant);\n await modelContainer.applyModelVariant(\n stepData.stepName || \"\",\n {\n model: highlightedRef,\n contextService: workflowManager.getLayoutPreviewService(),\n },\n stepData.data.replaceProductModel || false,\n );\n workflowManager.setMandatoryFulfilled(stepData.stepName, true);\n }\n },\n );\n }\n }\n }\n }\n\n async selectVariant(\n step: Step<ModelStepData>,\n variant: VariantResource,\n workflowManager: WorkflowManager,\n setApplying: (status: boolean) => void,\n ) {\n const result = await this.selectVariantLambda(step, variant, workflowManager, setApplying);\n if (result) {\n result.command && workflowManager.getCommandDispatcher()(result.command);\n result.followup && (await result.followup());\n }\n }\n\n private async selectVariantLambda(\n step: Step<ModelStepData>,\n variant: VariantResource,\n workflowManager: WorkflowManager,\n setApplying: (status: boolean) => void,\n ): Promise<CommandWithFollowup | null> {\n setApplying(true);\n const modelRef = variant.asset?.fileLink;\n if (!modelRef) {\n throw new AssetNotFoundError(variant);\n }\n return {\n command: undefined,\n followup: async () => {\n await workflowManager.setSelectionsAndElements(step.stepName, [variant], [], async () => {\n try {\n const modelContainer = workflowManager.getModelContainer();\n // We let selection logic apply. But if the preview service has failed\n // to load we don't want to throw an error. Instead we just don't\n // load the 3D model.\n if (modelContainer) {\n await modelContainer.applyModelVariant(\n step.stepName,\n {\n model: modelRef,\n contextService: workflowManager.getLayoutPreviewService(),\n },\n step.data.replaceProductModel || false,\n );\n }\n workflowManager.setMandatoryFulfilled(step.stepName, true);\n } finally {\n setApplying(false);\n }\n });\n },\n };\n }\n}\n\nexport const modelStepService = new ModelStepService();\n","import { CanvasCommand, CreateElementCommand, DeleteElementCommand, GroupCommand } from \"../../command\";\nimport { RegionElement, StepService, CommandWithFollowup, ModuleStepData, Step, LayoutsState, Region, ILayout, IllustrationElement, LayoutElementType } from \"../../types\";\nimport { generate } from \"../../util/guid\";\nimport { WorkflowManager } from \"../../WorkflowManager\";\nimport { split } from \"unicode-default-word-boundary\";\n\nclass ModuleStepService implements StepService<ModuleStepData> {\n async init(\n stepData: Step<ModuleStepData>,\n workflowManager: WorkflowManager,\n reducerState?: LayoutsState,\n ): Promise<CommandWithFollowup | null> {\n if (reducerState) {\n await this.reload(stepData, workflowManager, reducerState);\n } else {\n workflowManager.updateMetadata(stepData.stepName, { text: \"\" });\n return this.changeTextCommand(stepData, \"\", workflowManager, \"\", () => {});\n }\n return null;\n }\n\n private async reload(stepData: Step<ModuleStepData>, workflowManager: WorkflowManager, reducerState: LayoutsState) {\n const serializedStep = workflowManager.getSerializedStep(\n stepData.stepName,\n reducerState.serializableWorkflow.steps,\n );\n const layouts = Object.values(reducerState.layouts);\n const elements = layouts.map((layout) => layout.elements).flat();\n const elementsForStep = elements.filter((el) => el.stepName === stepData.stepName);\n const regionElements = elementsForStep.map((el) => ({ id: el.id, region: el.stepRegion }));\n await workflowManager.setSelectionsAndElements(stepData.stepName, [], regionElements, async () => {\n workflowManager.updateStorage(stepData.stepName, { text: serializedStep?.storage?.text });\n workflowManager.setMandatoryFulfilled(stepData.stepName, serializedStep?.storage?.text !== \"\");\n });\n }\n\n async changeText(\n stepData: Step<ModuleStepData>,\n input: string,\n workflowManager: WorkflowManager,\n error: string,\n setError: (e: string) => void,\n ) {\n const result = await this.changeTextCommand(stepData, input, workflowManager, error, setError);\n if (result) {\n result.command && workflowManager.getCommandDispatcher()(result.command);\n result.followup && (await result.followup());\n }\n }\n\n private async changeTextCommand(\n stepData: Step<ModuleStepData>,\n input: string,\n workflowManager: WorkflowManager,\n error: string,\n setError: (e: string) => void,\n ): Promise<CommandWithFollowup | null> {\n const elements = workflowManager.getRegionElements(stepData.stepName);\n\n const module = workflowManager.getStepSpecificServices(stepData.stepName)?.module;\n if (!module) {\n console.error(\"Missing module.\");\n return null;\n }\n\n const profanityFilter = workflowManager.getProfanities();\n if (!this.validateInput(stepData, input, profanityFilter, setError)) {\n workflowManager.setMandatoryFulfilled(stepData.stepName, false);\n console.error(error);\n return null;\n }\n workflowManager.setMandatoryFulfilled(stepData.stepName, input !== \"\");\n\n if (!stepData.data || !stepData.data.regions || stepData.data.regions.length <= 0) {\n console.error(\"Missing configuration.\");\n return null;\n }\n\n workflowManager.updateStorage(stepData.stepName, { text: input });\n workflowManager.updateMetadata(stepData.stepName, { text: input });\n\n const createElementFromRegion = (svg: string, region: Region, existingKey?: string) => {\n const elementKey = existingKey || generate();\n const layouts = workflowManager.getLayouts();\n const layout = layouts.find((layout: ILayout) => layout.panelId === region.panelId);\n if (!layout) {\n console.error(`Can not find layout for region: ${region.panelId}`);\n return null;\n }\n\n const commands: CanvasCommand[] = [];\n if (existingKey) {\n commands.push(new DeleteElementCommand(elementKey));\n }\n commands.push(\n new CreateElementCommand<IllustrationElement>(\n {\n stepRegion: region,\n stepName: stepData.stepName,\n colors: {},\n id: elementKey,\n svg: svg,\n type: LayoutElementType.Illustration,\n y: region.top,\n x: region.left,\n rotation: region.rotation,\n width: region.width,\n height: region.height,\n layer: region.layer,\n layerIndex: region.layerIndex,\n immutable: region.immutable,\n },\n layout,\n ),\n );\n return {\n id: elementKey,\n region,\n command: new GroupCommand(commands),\n };\n };\n\n if (elements.length > 0) {\n // Create new elements from passed in elements' regions.\n const results = elements\n .map((regionElement) => {\n if (!regionElement.region) {\n return null;\n }\n const svg = module.svgPrint(input, regionElement.region);\n return createElementFromRegion(svg, regionElement.region, regionElement.id);\n })\n .filter((x) => !!x);\n const commands = results.filter((r) => !!r).map((r) => r && r.command);\n return {\n command: new GroupCommand(commands as CanvasCommand[]),\n followup: async () => {},\n };\n } else {\n // Create new elements from workflow step's regions.\n const results = stepData.data.regions.map((region) =>\n createElementFromRegion(module.svgPrint(input, region), region),\n );\n const commands = results.filter((r) => !!r).map((r) => r && r.command);\n return {\n command: new GroupCommand(commands as CanvasCommand[]),\n followup: async () => {\n const newElements = results.filter((r) => r).map((r) => r && { id: r.id, region: r.region });\n await workflowManager.setSelectionsAndElements(\n stepData.stepName,\n [],\n newElements as RegionElement[],\n );\n },\n };\n }\n }\n\n private validateInput(\n stepData: Step<ModuleStepData>,\n input: string,\n profanityFilter: string[],\n setError: (e: string) => void,\n ): boolean {\n if (stepData.data && stepData.data.maxLength) {\n const maxLength = stepData.data.maxLength;\n if (input.length > maxLength) {\n setError(\"Too many characters.\");\n return false;\n }\n }\n\n // Regex for filtering unwanted characters\n if (!/^$|^[a-zA-Z0-9 ]+$/.test(input)) {\n setError(\"Unsupported characters.\");\n return false;\n }\n\n // Check text against our blacklist\n const words = split(input.toLowerCase());\n for (const word of words) {\n for (const i in profanityFilter) {\n const profanity = profanityFilter[i].toLowerCase().replace(/\\s/g, \"\");\n const match = word === profanity;\n if (match) {\n setError(\"Blocked profanity.\");\n return false;\n }\n }\n }\n\n setError(\"\");\n return true;\n }\n}\n\nexport const moduleStepService = new ModuleStepService();\n","import { CommandWithFollowup, ILayout, ImageElement, LayoutElementType, LayoutsState, PictureStepData, Region, Step, VariantResource } from \"../../types\";\nimport { StepService } from \"../../types\";\nimport { WorkflowManager } from \"../../WorkflowManager\";\nimport { LayoutNotFoundError } from \"../../util/exception\";\nimport { AssetNotFoundError } from \"../../util/exception\";\nimport { CreateElementCommand, DeleteElementCommand, GroupCommand } from \"../../command\";\nimport { generate } from \"../../util/guid\";\n\nclass PictureStepService implements StepService<PictureStepData> {\n async init(\n stepData: Step<PictureStepData>,\n workflowManager: WorkflowManager,\n reducerState?: LayoutsState,\n ): Promise<CommandWithFollowup | null> {\n const option = stepData.option;\n if (!option) {\n return null;\n }\n if (reducerState) {\n await this.reload(stepData, workflowManager, reducerState);\n } else {\n if (option.defaultVariant) {\n workflowManager.markStepsAsInitialised([stepData.stepName]);\n return this.selectVariantCommand(stepData, option.defaultVariant, workflowManager, () => {});\n }\n }\n workflowManager.markStepsAsInitialised([stepData.stepName]);\n return null;\n }\n\n private async reload(\n stepData: Step<PictureStepData>,\n workflowManager: WorkflowManager,\n reducerState: LayoutsState,\n ) {\n const serializedStep = workflowManager.getSerializedStep(\n stepData.stepName,\n reducerState.serializableWorkflow.steps,\n );\n const layouts = Object.values(reducerState.layouts);\n const elements = layouts.map((layout) => layout.elements).flat();\n const elementsForStep = elements.filter((el) => el.stepName === stepData.stepName);\n const option = stepData.option;\n if (serializedStep?.selectedVariants) {\n const variantId = serializedStep.selectedVariants[0].id;\n if (option && variantId) {\n const variant = option.variants?.find((variant: VariantResource) => variant.id === variantId);\n if (variant) {\n const regionElements = elementsForStep.map((el) => ({ id: el.id, region: el.stepRegion }));\n await workflowManager.setSelectionsAndElements(\n stepData.stepName,\n [variant],\n regionElements,\n async () => {\n workflowManager.setMandatoryFulfilled(stepData.stepName, true);\n },\n );\n }\n }\n }\n }\n\n async selectVariant(\n stepData: Step<PictureStepData>,\n variant: VariantResource,\n workflowManager: WorkflowManager,\n setIsUpdating: (status: boolean) => void,\n ) {\n const result = await this.selectVariantCommand(stepData, variant, workflowManager, setIsUpdating);\n if (result) {\n result.command && workflowManager.getCommandDispatcher()(result.command);\n result.followup && (await result.followup());\n }\n }\n\n private async selectVariantCommand(\n stepData: Step<PictureStepData>,\n variant: VariantResource,\n workflowManager: WorkflowManager,\n setIsUpdating: (status: boolean) => void,\n ): Promise<CommandWithFollowup | null> {\n const asset = variant.asset;\n if (!asset) {\n throw new AssetNotFoundError(variant);\n }\n const link = asset?.fileLink;\n if (!link) {\n console.error(\"No URL for picture!\");\n return null;\n }\n\n setIsUpdating(true);\n if (stepData.mandatory) {\n workflowManager.setMandatoryFulfilled(stepData.stepName, false);\n }\n\n // Remove existing images.\n const elements = workflowManager.getRegionElements(stepData.stepName);\n const deletionCommands = elements.map((elem) => new DeleteElementCommand(elem.id));\n\n // If images exists, delete them in preparation for creating new images.\n const createElementForRegion = (region: Region) => {\n const layouts = workflowManager.getLayouts();\n const layout = layouts.find((layout: ILayout) => layout.panelId === region.panelId);\n if (!layout) {\n throw new LayoutNotFoundError(region);\n }\n // Create a new image.\n const elementKey = generate();\n return {\n regionElement: { id: elementKey, region },\n command: new CreateElementCommand<ImageElement>(\n {\n stepName: stepData.stepName,\n stepRegion: region,\n id: elementKey,\n src: link,\n type: LayoutElementType.Image,\n y: region.top,\n x: region.left,\n rotation: region.rotation,\n width: region.width,\n height: region.height,\n layer: region.layer,\n layerIndex: region.layerIndex,\n immutable: region.immutable,\n preserveAspectRatio: \"none\",\n },\n layout,\n ),\n };\n };\n\n const newElements = stepData.data.regions.map(createElementForRegion);\n return {\n command: new GroupCommand([...deletionCommands, ...newElements.map((el) => el.command)]),\n followup: async () => {\n await workflowManager.setSelectionsAndElements(\n stepData.stepName,\n [variant],\n newElements.map((el) => el.regionElement),\n async () => {\n workflowManager.setMandatoryFulfilled(stepData.stepName, true);\n setIsUpdating(false);\n },\n );\n },\n };\n }\n}\n\nexport const pictureStepService = new PictureStepService();\n","import { optionService } from \"../option\";\nimport { CommandWithFollowup, LayoutsState, QuestionStepData, Step, StepService, VariantResource } from \"../../types\";\nimport { WorkflowManager } from \"../../WorkflowManager\";\n\nclass QuestionStepService implements StepService<QuestionStepData> {\n async init(\n stepData: Step<QuestionStepData>,\n workflowManager: WorkflowManager,\n reducerState?: LayoutsState,\n ): Promise<CommandWithFollowup | null> {\n const option = stepData.option;\n if (!option) {\n return null;\n }\n if (reducerState) {\n await this.reload(stepData, workflowManager, reducerState);\n } else {\n const variants = option.variants;\n const defaultVariant = optionService.getDefaultVariant(option);\n if (defaultVariant) {\n const variant = variants?.find((variant: VariantResource) => variant.id === option.defaultVariant?.id);\n return this.selectVariantLambda(stepData, variant?.id || \"\", workflowManager);\n }\n }\n return null;\n }\n\n private async reload(\n stepData: Step<QuestionStepData>,\n workflowManager: WorkflowManager,\n reducerState: LayoutsState,\n ) {\n const serializedStep = workflowManager.getSerializedStep(\n stepData.stepName,\n reducerState.serializableWorkflow.steps,\n );\n const option = stepData.option;\n if (serializedStep?.selectedVariants) {\n const variantId = serializedStep.selectedVariants[0].id;\n if (option && variantId) {\n const variant = option.variants?.find((variant) => variant.id === variantId);\n if (variant) {\n await workflowManager.setSelectionsAndElements(stepData.stepName, [variant], []);\n }\n }\n }\n }\n\n async selectVariant(stepData: Step<QuestionStepData>, variantId: string, workflowManager: WorkflowManager) {\n // Ensure workflow is initialized prior to making a selection.\n await workflowManager.getInitializationPromise();\n // Select variant.\n const result = await this.selectVariantLambda(stepData, variantId, workflowManager);\n if (result) {\n result.command && workflowManager.getCommandDispatcher()(result.command);\n result.followup && (await result.followup());\n }\n }\n\n private async selectVariantLambda(\n stepData: Step<QuestionStepData>,\n variantId: string,\n workflowManager: WorkflowManager,\n ): Promise<CommandWithFollowup | null> {\n const option = stepData.option;\n if (!option) {\n return null;\n }\n const variants = option.variants;\n if (!variants) {\n return null;\n }\n const variant =\n variants.length > 1 ? variants.find((variant: VariantResource) => variant.id === variantId) : variants[0];\n if (!variant) {\n throw new Error(`Failed to find selected variant ${variantId} in option ${option.id} of step ${stepData.stepName} (${stepData.stepTitle})`);\n }\n\n return {\n command: undefined,\n followup: async () => {\n await workflowManager.setSelectionsAndElements(stepData.stepName, [variant], [], async () => {\n workflowManager.setMandatoryFulfilled(stepData.stepName, true);\n });\n },\n };\n }\n}\n\nexport const questionStepService = new QuestionStepService();\n","import { optionService } from \"../option\";\nimport { RegionElement, StepService, ColorOption, CommandWithFollowup, ShapeStepData, Step, VariantResource, ILayout, LayoutsState, Region, ColorDefinition, IllustrationElement, LayoutElementType } from \"../../types\";\nimport { WorkflowManager } from \"../../WorkflowManager\";\nimport { LayoutNotFoundError, OptionNotFoundError } from \"../../util/exception\";\nimport { CanvasCommand, CreateElementCommand, GroupCommand, IllustrationColorCommand } from \"../../command\";\nimport { generate } from \"../../util/guid\";\n\nclass ShapeStepService implements StepService<ShapeStepData> {\n readonly shapeFillId = \"spiff-fill-shape\";\n\n // Get the step's options.\n async availableColours(stepData: Step<ShapeStepData>) {\n const option = stepData.option;\n if (option) {\n return (\n option.variants?.map((variant: VariantResource) => {\n return {\n fill: variant.color,\n stroke: variant.color,\n variant,\n };\n }) || []\n );\n }\n return [];\n }\n\n setCustomColor(color: string, stepData: Step<ShapeStepData>, manager: WorkflowManager) {\n const layouts = manager.getLayouts();\n const elements = manager.getRegionElements(stepData.stepName) || [];\n const commands = elements\n .map((stepElement: RegionElement) => {\n const region = stepElement.region;\n const layout = layouts.find((layout: ILayout) => layout.panelId === region?.panelId);\n if (!layout) throw new LayoutNotFoundError(region!);\n return new IllustrationColorCommand(stepElement.id, this.shapeFillId, color);\n })\n .filter((c) => !!c);\n manager.getCommandDispatcher()(new GroupCommand(commands));\n manager.updateStorage(stepData.stepName, { colour: color });\n }\n\n async init(\n stepData: Step<ShapeStepData>,\n workflowManager: WorkflowManager,\n reducerState?: LayoutsState,\n ): Promise<CommandWithFollowup | null> {\n const option = stepData.option;\n if (!option) {\n throw new OptionNotFoundError(stepData);\n }\n if (reducerState) {\n await this.reload(stepData, workflowManager, reducerState);\n } else {\n const variant = optionService.getDefaultVariant(option);\n if (!variant) {\n return null;\n }\n return this.selectVariantCommand(\n stepData,\n {\n fill: variant.color,\n stroke: variant.color,\n variant,\n },\n [],\n workflowManager,\n );\n }\n return null;\n }\n\n async selectVariant(\n stepData: Step<ShapeStepData>,\n colourOption: ColorOption,\n elements: RegionElement[],\n workflowManager: WorkflowManager,\n ) {\n const result = await this.selectVariantCommand(stepData, colourOption, elements, workflowManager);\n if (result) {\n result.command && workflowManager.getCommandDispatcher()(result.command);\n result.followup && (await result.followup());\n }\n }\n\n private async reload(stepData: Step<ShapeStepData>, workflowManager: WorkflowManager, reducerState: LayoutsState) {\n const serializedStep = workflowManager.getSerializedStep(\n stepData.stepName,\n reducerState.serializableWorkflow.steps,\n );\n const layouts = Object.values(reducerState.layouts);\n const elements = layouts.map((layout) => layout.elements).flat();\n const elementsForStep = elements.filter((el) => el.stepName === stepData.stepName);\n const option = stepData.option;\n if (serializedStep?.selectedVariants) {\n const variantId = serializedStep.selectedVariants[0].id;\n if (option && variantId) {\n const variant = option.variants?.find((variant) => variant.id === variantId);\n if (variant) {\n const regionElements = elementsForStep.map((el) => ({ id: el.id, region: el.stepRegion }));\n await workflowManager.setSelectionsAndElements(\n stepData.stepName,\n [variant],\n regionElements,\n async () => {\n workflowManager.updateStorage(stepData.stepName, {\n colour: serializedStep?.storage?.colour || \"\",\n });\n workflowManager.setMandatoryFulfilled(stepData.stepName, true);\n },\n );\n }\n }\n }\n }\n\n private async selectVariantCommand(\n stepData: Step<ShapeStepData>,\n colourOption: ColorOption,\n elements: RegionElement[],\n workflowManager: WorkflowManager,\n ): Promise<CommandWithFollowup | null> {\n const layouts = workflowManager.getLayouts();\n const existingColor = workflowManager.getStepStorage(stepData.stepName)?.colour;\n const getColor = () => {\n if (colourOption.variant?.color === \"#custom\") return existingColor || \"#FFFFFF\";\n if (colourOption.variant?.color) return colourOption.variant.color;\n throw new Error(\"Failed to resolve color for shape step.\");\n };\n if (elements.length > 0) {\n const updateCommand = (stepElement: RegionElement) => {\n const region = stepElement.region;\n const layout = layouts.find((layout: ILayout) => layout.panelId === region?.panelId);\n if (!layout) {\n throw new LayoutNotFoundError(region!);\n }\n const newColor = getColor();\n return new IllustrationColorCommand(stepElement.id, this.shapeFillId, newColor);\n };\n const commands = elements.map(updateCommand).filter((c) => !!c);\n return {\n command: new GroupCommand(commands as CanvasCommand[]),\n followup: async () => {\n await workflowManager.setSelectionsAndElements(\n stepData.stepName,\n colourOption.variant ? [colourOption.variant] : [],\n elements,\n );\n workflowManager.updateStorage(stepData.stepName, { colour: getColor() });\n },\n };\n } else {\n // No existing elements, create new ones.\n const createElementForRegion = (region: Region) => {\n const layout = layouts.find((layout: ILayout) => layout.panelId === region.panelId);\n if (!layout) {\n throw new LayoutNotFoundError(region);\n }\n const newColor = getColor();\n const svg = `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n xmlSpace=\"preserve\"\n preserveAspectRatio=\"none\"\n version=\"1.1\"\n width=\"1\"\n height=\"1\"\n viewBox=\"0 0 1 1\"\n >\n <rect\n x=\"0\"\n y=\"0\"\n width=\"1\"\n height=\"1\"\n class=\"${this.shapeFillId}\"\n fill=\"${newColor}\"\n />\n </svg>\n `;\n const colors: { [key: string]: ColorDefinition } = {};\n colors[this.shapeFillId] = { browserValue: newColor };\n\n const elementKey = generate();\n return {\n id: elementKey,\n region,\n command: new CreateElementCommand<IllustrationElement>(\n {\n stepRegion: region,\n stepName: stepData.stepName,\n colors,\n id: elementKey,\n svg,\n type: LayoutElementType.Illustration,\n y: region.top,\n x: region.left,\n rotation: region.rotation,\n width: region.width,\n height: region.height,\n layer: region.layer,\n layerIndex: region.layerIndex,\n immutable: region.immutable,\n excludeFromExport: stepData.data.excludeFromPrint,\n },\n layout,\n ),\n };\n };\n const results = stepData.data.regions.map(createElementForRegion);\n const commands = results.filter((r) => !!r).map((r) => r?.command);\n const elements = results\n .filter((r) => !!r)\n .map((r) => {\n return { id: r!.id, region: r!.region };\n });\n return {\n command: new GroupCommand(commands as CanvasCommand[]),\n followup: async () => {\n await workflowManager.setSelectionsAndElements(\n stepData.stepName,\n colourOption.variant ? [colourOption.variant] : [],\n elements,\n async () => {\n workflowManager.updateStorage(stepData.stepName, { colour: getColor() });\n },\n );\n },\n };\n }\n }\n}\n\nexport const shapeStepService = new ShapeStepService();\n","import { InformationMessageType } from \"../WorkflowManager\";\n\nexport type ToastCallback = (callbackOptions: {\n toastMessage: null | string;\n toastType: InformationMessageType | null;\n}) => void;\n\nclass Toast {\n private latestToast: null | string;\n private toastType: InformationMessageType | null;\n\n private toastCallbacks: ToastCallback[];\n\n constructor() {\n this.latestToast = null;\n this.toastType = null;\n this.toastCallbacks = [];\n }\n\n addToastCallback(callback: ToastCallback) {\n callback({\n toastMessage: this.latestToast,\n toastType: this.toastType,\n });\n this.toastCallbacks.push(callback);\n }\n\n removeToastCallback(callback: ToastCallback) {\n this.toastCallbacks = this.toastCallbacks.filter((it) => it !== callback);\n }\n\n setLatestToast(errorMessage: null | string, errorType: InformationMessageType | null) {\n this.latestToast = errorMessage;\n this.toastType = errorType;\n this.onToastChange();\n }\n\n private onToastChange() {\n this.toastCallbacks.forEach((callback) =>\n callback({\n toastMessage: this.latestToast,\n toastType: this.toastType,\n }),\n );\n }\n}\n\nconst toast = new Toast();\nexport { toast };\n","import { FontMetrics, getFontMetrics } from \"../../util/font\";\nimport { FontData, Region, SizeRange } from \"../../types\";\nimport { fontSizeStep, textWidth } from \"../shared\";\n\n/**\n * Produce an array where text has been broken into lines that can\n * fit the region at the current size.\n * If it can't be done then return null;\n */\nconst linesThatFit = (\n region: Region,\n linesToBreak: string[],\n fontSize: number,\n fontScale: number,\n cache: FontMetrics,\n): [null | string[], null | number] => {\n if (linesToBreak.some(line => line === undefined || line === null)) {\n throw new Error(`Failed to autosize lines: ${linesToBreak.join(\", \")}`);\n }\n let lines = linesToBreak.map(line => line.split(\"\\n\")).flat();\n let amountLines = lines.length;\n let widthsPerLine = lines.map((line) => textWidth(line, fontScale, cache));\n const lineHeight = cache.getApproximateHeight() * fontScale;\n\n let couldStillFit = true;\n while (couldStillFit) {\n // Determine if textbox would be too high.\n // If the textbox is too high, line breaking isn't going to help.\n // Height of the textbox is the height of the last line plus its vertical offset.\n const textboxHeight = lineHeight + (amountLines - 1) * fontSize;\n if (textboxHeight > region.height) {\n return [null, null];\n }\n\n // Determine if textbox would be too wide.\n // It's not too high, so if it's not too wide then we've succeeded.\n // Width of the whole textbox is the width of the longest line.\n const textboxWidth = Math.max(...widthsPerLine);\n if (textboxWidth <= region.width) {\n return [lines, textboxWidth];\n }\n\n // It's too wide. Find the widest line and look for a space.\n const idxWidestLine = widthsPerLine.reduce((iMax, x, i, arr) => (x > arr[iMax] ? i : iMax), 0);\n const widestLine = lines[idxWidestLine];\n\n // Find the latest space to split at that makes the current widest line fit.\n let foundGoodSpacing = false;\n let idxOfSpace = widestLine.length;\n while (!foundGoodSpacing && idxOfSpace > -1) {\n idxOfSpace = widestLine.lastIndexOf(\" \", idxOfSpace - 1);\n const splitLine = [widestLine.slice(0, idxOfSpace), widestLine.slice(idxOfSpace + 1)];\n const splitWidths = splitLine.map((line) => textWidth(line, fontScale, cache));\n const firstWidth = splitWidths[0];\n if (firstWidth <= region.width) {\n lines = [...lines.slice(0, idxWidestLine), ...splitLine, ...lines.slice(idxWidestLine + 1)];\n widthsPerLine = [\n ...widthsPerLine.slice(0, idxWidestLine),\n ...splitWidths,\n ...widthsPerLine.slice(idxWidestLine + 1),\n ];\n amountLines += 1;\n foundGoodSpacing = true;\n }\n }\n if (!foundGoodSpacing) {\n couldStillFit = false;\n }\n }\n\n // No way to fit.\n return [null, null];\n};\n\n/**\n * Determine what the font size for a text element should be,\n * taking autosizing into account.\n * @Deprecated Old Text system, Transition to new system when Autosizing has been brought across in a way that makes sense.\n */\nexport const determineCorrectFontSizeAndLines = (\n curFontSize: number,\n fontData: FontData,\n region: Region,\n linesToBreak: string[],\n sizeRange: SizeRange,\n): [number, null | string[], null | number] => {\n let lines;\n let requiredWidth;\n\n const cache = getFontMetrics(fontData.assetUrl);\n const font = cache.getFont();\n\n // Fixed Mode: Text is computed based on fixed text size.\n if (sizeRange.size) {\n const fontScale = curFontSize / font.unitsPerEm;\n [lines, requiredWidth] = linesThatFit(region, linesToBreak, curFontSize, fontScale, cache);\n return [sizeRange.size, lines, requiredWidth];\n }\n\n // Variable Mode: Text is computed based on a range\n const nonUserMin = 6;\n let calculatedFontSize = nonUserMin - fontSizeStep;\n if (linesToBreak.length > 0) {\n let lines: null | string[] = linesToBreak;\n let fontScale = 0;\n while ((!sizeRange.maxSize || calculatedFontSize <= sizeRange.maxSize) && lines) {\n calculatedFontSize += fontSizeStep;\n fontScale = calculatedFontSize / font.unitsPerEm;\n [lines, requiredWidth] = linesThatFit(region, linesToBreak, calculatedFontSize, fontScale, cache);\n }\n }\n if (calculatedFontSize > nonUserMin) {\n // Correct for final enlargement.\n calculatedFontSize -= fontSizeStep;\n }\n if (sizeRange.minSize && calculatedFontSize < sizeRange.minSize) {\n // Correct for minimum font size.\n calculatedFontSize = sizeRange.minSize;\n }\n const fontScale = calculatedFontSize / font.unitsPerEm;\n [lines, requiredWidth] = linesThatFit(region, linesToBreak, calculatedFontSize, fontScale, cache);\n return [calculatedFontSize, lines, requiredWidth];\n};\n\n// https://stackoverflow.com/a/22015771\nconst zip = (xs: any[], ys: any[]) => {\n return xs.map((x, idx) => [x, ys[idx]]);\n};\n\n/**\n * If a textbox has a fixed font size, it's width should be changed to fit the text.\n * Needs to take rotation into consideration.\n * The left alignment case appears to be resolved but the other cases have not been addressed.\n * @Deprecated Old Text system, Transition to new system when Autosizing has been brought across in a way that makes sense.\n */\nexport const determineCorrectTextboxRegion = (\n currentRegion: Region,\n fontData: FontData,\n fontSize: number,\n textLines: string[],\n align?: string,\n): Region => {\n let region = { ...currentRegion };\n const candidateRegion = { ...currentRegion };\n // requiredWidth could be const but the others must be let.\n // eslint-disable-next-line prefer-const\n let [calculatedFontSize, goodLines, requiredWidth] = determineCorrectFontSizeAndLines(\n fontSize,\n fontData,\n candidateRegion,\n textLines,\n { size: 0, minSize: fontSize, maxSize: fontSize },\n );\n if (requiredWidth && requiredWidth < region.width) {\n candidateRegion.width = requiredWidth;\n if (align === \"left\") {\n candidateRegion.left += Math.sin((region.rotation * Math.PI) / 360) * (region.width - requiredWidth);\n candidateRegion.top += (Math.sin((region.rotation * Math.PI) / 180) * (requiredWidth - region.width)) / 2;\n } else if (align === \"right\") {\n candidateRegion.left += region.width - requiredWidth;\n } else {\n candidateRegion.left += (region.width - requiredWidth) / 2;\n }\n [calculatedFontSize, goodLines] = determineCorrectFontSizeAndLines(fontSize, fontData, candidateRegion, textLines, {\n size: fontSize,\n });\n if (\n calculatedFontSize === fontSize &&\n goodLines &&\n zip(textLines, goodLines).every(([lineA, lineB]) => lineA === lineB)\n ) {\n region = candidateRegion;\n }\n }\n return region;\n};\n","import {\n ColorOption,\n CommandWithFollowup,\n FontData,\n ILayout,\n LayoutElementType,\n LayoutsState,\n OptionResource,\n Region,\n RegionElement,\n Step,\n StepService,\n TextboxElement,\n TextFillImage,\n TextStepData,\n TextStepStorage,\n VariantResource,\n} from \"../../../types\";\nimport { InformationMessageType, WorkflowManager } from \"../../../WorkflowManager\";\nimport { optionService } from \"../../option\";\nimport { toast } from \"../../toast\";\nimport { AssetNotFoundError, ResourceNotFoundError, UnhandledBehaviorError } from \"../../../util/exception\";\nimport { split } from \"unicode-default-word-boundary\";\nimport {\n CanvasCommand,\n CreateElementCommand,\n FontAlignmentCommand,\n FontColorCommand,\n FontImageFillCommand,\n FontSizeCommand,\n FontSourceCommand,\n GroupCommand,\n TextChangeCommand,\n} from \"../../../command\";\nimport { getPatternImageData } from \"../../../util/frame\";\nimport { findElement } from \"../../../LayoutsState\";\nimport { getFontMetrics, loadFont } from \"../../../util/font\";\nimport { applyTextTransformations } from \"../../../text/shared\";\nimport { determineCorrectFontSizeAndLines } from \"../../../text/algorithm/autosize\";\nimport { generate } from \"../../../util/guid\";\n\n/**\n * The font size used when the font size is not specified in configuration.\n */\nconst defaultFontSize = 30;\ninterface TextFillSpotColor {\n profileName: string;\n namedColor: string;\n}\ninterface CreatedElementData {\n regionElement: RegionElement;\n commands: CanvasCommand[];\n newElement: TextboxElement;\n fontData: FontData;\n}\n\ninterface TextUpdateResult {\n command?: GroupCommand;\n helperData: {\n charactersRemaining?: number;\n };\n errorData?: TextErrorData;\n}\n\nexport interface TextErrorData {\n blockedProfanity?: boolean;\n doesNotFit?: boolean;\n hitCharacterLimit?: boolean;\n illegalMultipleLines?: boolean;\n}\n\n// https://joefallon.net/2018/09/typescript-try-catch-finally-and-custom-errors/\nclass FontLoadError extends Error {\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = FontLoadError.name;\n }\n}\n\n// A set of allowable glyphs, open type doesn't see these glyphs as valid\n// but they're generally always actually supplied. To prevent filtering them out\n// we check if a glyph matches this list.\nconst allowableGlyphs = [\"‘\", \"’\", \"“\", \"”\", \"\\n\"];\n\nclass RegionLayoutMissingError extends Error {\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = RegionLayoutMissingError.name;\n }\n}\n\nclass TextStepService implements StepService<TextStepData> {\n // A cache of computed possible colors. We store here to get a stable reference\n // to prevent react from re-rendering\n private cachedColors = new Map<string, ColorOption[]>();\n\n public async init(\n stepData: Step<TextStepData>,\n workflowManager: WorkflowManager,\n reducerState?: LayoutsState,\n ): Promise<CommandWithFollowup | null> {\n const option = stepData.option;\n if (!option) {\n return null;\n }\n if (reducerState) {\n await this.reload(stepData, workflowManager, reducerState);\n } else {\n const defaultImageFillVariant = this.getDefaultImageFillVariant(stepData.data);\n const imageFillLink = defaultImageFillVariant?.asset?.fileLink;\n const imageFillDataRaw = imageFillLink ? await getPatternImageData(imageFillLink) : undefined;\n const imageFillData = imageFillDataRaw\n ? {\n src: imageFillDataRaw.src,\n height: imageFillDataRaw.height,\n width: imageFillDataRaw.width,\n scale: stepData.data.imageFillScale || 1,\n }\n : undefined;\n workflowManager.updateStorage(stepData.stepName, {\n text: stepData.data.defaultText || \"\",\n inputText: stepData.data.defaultText || \"\",\n color:\n (await this.getDefaultColorVariant(stepData.data))?.color ||\n (await this.getDefaultColor(stepData.data)),\n fillImage: imageFillData,\n });\n workflowManager.updateMetadata(stepData.stepName, {\n text: stepData.data.defaultText || \"\",\n color:\n (await this.getDefaultColorVariant(stepData.data))?.name ||\n (await this.getDefaultColor(stepData.data)),\n fillImage: defaultImageFillVariant?.name,\n });\n\n const defaultVariant = optionService.getDefaultVariant(option);\n if (defaultVariant) {\n return this.selectVariantCommand(\n stepData,\n defaultVariant,\n {},\n [],\n workflowManager,\n () => {},\n () => {},\n imageFillData,\n );\n }\n }\n return null;\n }\n\n public findLayoutElements(workflowManager: WorkflowManager, step: Step<TextStepData>) {\n const elements = workflowManager.getRegionElements(step.stepName);\n const foundElements = elements.map((el) => {\n return findElement(el.id, workflowManager.getAllLayoutData()) as TextboxElement;\n });\n return foundElements;\n }\n\n /**\n * Get the colors that can be used for a given text step.\n * @param stepData The text step to get colors for.\n * @returns A list of color objects containg fill, stroke and variant if available.\n */\n public availableFillColors(stepData: Step<TextStepData>): ColorOption[] {\n // Check cache first.\n const cached = this.cachedColors.get(stepData.stepName);\n if (cached) {\n return cached;\n }\n\n // Otherwise check option\n const colorOption = stepData.data.colorOption;\n if (colorOption) {\n const colors =\n colorOption.variants?.map((variant: VariantResource) => {\n return {\n fill: variant.color,\n stroke: variant.color,\n variant,\n };\n }) || [];\n this.cachedColors.set(stepData.stepName, colors);\n return colors;\n }\n\n return [];\n }\n\n public changeAlignment(\n stepData: Step<TextStepData>,\n alignment: \"left\" | \"center\" | \"right\",\n elements: RegionElement[],\n workflowManager: WorkflowManager,\n ) {\n if (!stepData.data || !stepData.data.regions) {\n return;\n }\n const commandDispatcher = workflowManager.getCommandDispatcher();\n\n for (const regionElement of elements) {\n const command = new FontAlignmentCommand(regionElement.id, alignment);\n commandDispatcher(command);\n }\n }\n\n public async changeFillColor(\n stepData: Step<TextStepData>,\n newColor: ColorOption,\n elements: RegionElement[],\n workflowManager: WorkflowManager,\n ) {\n if (!stepData.data || !stepData.data.regions) {\n return;\n }\n const commandDispatcher = workflowManager.getCommandDispatcher();\n\n if (newColor.variant) {\n workflowManager.updateMetadata(stepData.stepName, { color: newColor.variant.name });\n } else {\n workflowManager.updateMetadata(stepData.stepName, { color: newColor.fill });\n }\n // Handle generation of spot color information if required.\n const colorOption = stepData.data.colorOption;\n const textFillSpotColor = colorOption\n ? this.createTextFillSpotColor(colorOption, newColor.variant!)\n : undefined;\n if (colorOption) {\n workflowManager.updateStorage(stepData.stepName, {\n color: newColor.fill,\n colorProfileAssetKey: colorOption.colorProfile?.key,\n });\n } else {\n workflowManager.updateStorage(stepData.stepName, {\n color: newColor.fill,\n });\n }\n // Apply color changes to each element targeted by the step.\n for (const regionElement of elements) {\n if (!newColor.fill) {\n throw new Error(\"Fill not set on new color selection!\");\n }\n const command = new FontColorCommand(regionElement.id, newColor.fill, textFillSpotColor);\n commandDispatcher(command);\n }\n }\n\n public async availableFillImages(stepData: Step<TextStepData>): Promise<TextFillImage[]> {\n const imageFillOption = stepData.data.imageFillOption;\n if (imageFillOption) {\n const imageFillUrls =\n (imageFillOption.variants?.map((v) => v.asset?.fileLink)?.filter((url) => !!url) as string[]) || [];\n return Promise.all(\n imageFillUrls.map(async (url) => {\n const data = await getPatternImageData(url);\n return {\n src: url,\n width: data.width,\n height: data.height,\n scale: stepData.data.imageFillScale || 1,\n };\n }),\n );\n }\n return Promise.resolve([]);\n }\n\n public async changeFillImage(\n stepData: Step<TextStepData>,\n fillImage: TextFillImage,\n elements: RegionElement[],\n workflowManager: WorkflowManager,\n ) {\n if (!stepData.data || !stepData.data.regions) {\n return;\n }\n const commandDispatcher = workflowManager.getCommandDispatcher();\n const variant = stepData.option?.variants?.find((v) => v.asset?.fileLink === fillImage.src);\n workflowManager.updateMetadata(stepData.stepName, { fillImage: variant?.name });\n workflowManager.updateStorage(stepData.stepName, {\n fillImage,\n });\n\n for (const regionElement of elements) {\n const command = new FontImageFillCommand(regionElement.id, fillImage);\n commandDispatcher(command);\n }\n }\n\n /**\n * Given an element and a string, filters any characters from the string that are\n * not supported by the font of the given element.\n * @param text The text string to filter.\n * @param fontData An optional fontData object, when provided, we use the font table to determine glyphs that aren't provided and additionally strip these out also.\n * @returns A new string representing the passed string with unsupported characters removed.\n */\n public filterUnsupportedCharacters = (text: string, fontData?: FontData): string => {\n // A list of character code ranges that we don't support. Mostly known emoji ranges.\n let filteredText = text.replace(\n /(\\r\\n|\\r|(\\u2665|\\u00a9|\\u00ae|[\\u2000-\\u2017]|[\\u201E-\\u3300]]|\\ud83c[\\ud000-\\udfff]|\\ud83d[\\ud000-\\udfff]|\\ud83e[\\ud000-\\udfff]))/gm,\n \"\",\n );\n // Use opentype to determine if the font supports the character, remove otherwise.\n // There are special cases however. Refer to 'allowableGlyphs'\n const badCharacterCodes: string[] = [];\n const opentypeFont = fontData ? getFontMetrics(fontData.assetUrl) : undefined;\n if (opentypeFont) {\n const searchableGlyphs = filteredText\n .split(\"\")\n .filter((char) => !allowableGlyphs.includes(char))\n .join(\"\");\n const glyphs = searchableGlyphs.split(\"\").map((char) => opentypeFont.getFont().charToGlyph(char));\n // Find all characters in the input text that don't work with our system.\n for (let i = 0; i < glyphs.length; i++) {\n const undefinedGlyph = glyphs[i].name === \".notdef\";\n if (undefinedGlyph) {\n badCharacterCodes.push(String.fromCharCode(searchableGlyphs.charCodeAt(i)));\n }\n }\n }\n // Once we have a list of unsupported character codes, let's remove them.\n for (let i = 0; i < badCharacterCodes.length; i++) {\n filteredText = filteredText.replaceAll(badCharacterCodes[i], \"\");\n }\n return filteredText;\n };\n\n public getProcessedInput(input: string, stepData: TextStepData, customiseAllText: boolean): string {\n const injectedText = customiseAllText ? input : this.injectReplaceableText(input, stepData);\n return applyTextTransformations(injectedText, {\n vertical: stepData.vertical,\n uppercase: stepData.uppercase,\n });\n }\n\n public updateInputText(\n input: string,\n elements: TextboxElement[],\n step: Step<TextStepData>,\n workflowManager: WorkflowManager,\n ): TextUpdateResult {\n const storage = workflowManager.getStepStorage(step.stepName) as TextStepStorage;\n const processedText = this.getProcessedInput(input, step.data, !!storage.customiseAllText);\n\n const response: TextUpdateResult = {\n command: undefined,\n helperData: {},\n errorData: this.getErrorsForText(input, step, workflowManager),\n };\n\n // Check the input text for validity.\n if (response.errorData) {\n return response;\n }\n\n // Otherwise set helper text to character limit\n response.helperData.charactersRemaining = step.data.maxLength - processedText.length;\n\n // Calculate font size and lines with new text.\n // TODO: We need to shift this into TextChangeCommand\n const commands: CanvasCommand[] = [];\n const correctFontSizes = new Map<string, number>();\n const correctLineLists = new Map<string, null | string[]>();\n for (const el of elements) {\n if (!el.fontData) throw new UnhandledBehaviorError(\"Failed to resolve font data for text.\");\n const [newFontSize, newLines] = determineCorrectFontSizeAndLines(\n el.fontSize,\n el.fontData,\n { left: el.x, top: el.y, width: el.width, height: el.height, rotation: el.rotation, panelId: \"\" },\n [processedText],\n { size: step.data.size, minSize: step.data.minSize, maxSize: step.data.maxSize },\n );\n correctFontSizes.set(el.id, newFontSize);\n correctLineLists.set(el.id, newLines);\n const newText = step.data.curved ? processedText : (newLines || []).join(\"\\n\");\n commands.push(this.generateTextChangeCommandsForRegion(newFontSize, step.data, el.id, newText));\n }\n\n if (!step.data.curved && elements.length > 0) {\n const allFit = Array.from(correctLineLists.values()).every((x) => x);\n if (!allFit) {\n if (!response.errorData) {\n response.errorData = {};\n }\n response.errorData.doesNotFit = true;\n return response;\n }\n }\n\n // Notify workflow of text changes.\n workflowManager.updateStorage(step.stepName, { text: input });\n workflowManager.updateMetadata(step.stepName, {\n text: processedText,\n });\n\n if (storage.defaultCleared || !step.data.deleteDefaultOnFocus) {\n workflowManager.setMandatoryFulfilled(step.stepName, true);\n }\n\n response.command = new GroupCommand(commands);\n return response;\n }\n\n public async selectVariant(\n step: Step<TextStepData>,\n variant: VariantResource,\n workflowManager: WorkflowManager,\n setError: (status: boolean) => void,\n setHelperText: (text: string) => void,\n ) {\n const result = await this.selectVariantCommand(\n step,\n variant,\n workflowManager.getStepStorage(step.stepName) || {},\n workflowManager.getRegionElements(step.stepName),\n workflowManager,\n setError,\n setHelperText,\n );\n if (result) {\n result.command && workflowManager.getCommandDispatcher()(result.command);\n result.followup && (await result.followup());\n }\n }\n\n public textAlign = (stepData: TextStepData) => {\n if (stepData.vertical) {\n return \"center\";\n }\n return stepData.textAlign || \"center\";\n };\n\n public createTextFillSpotColor(\n colorOption: OptionResource,\n variant: VariantResource,\n ): TextFillSpotColor | undefined {\n const colorProfileAsset = colorOption.colorProfile;\n if (colorProfileAsset) {\n const profileNameStrWithoutSpaces = (colorProfileAsset.name || \"\").replace(/\\s/g, \"-\");\n const amountToSlice = profileNameStrWithoutSpaces.lastIndexOf(\"/\");\n const profileNameFiltered = profileNameStrWithoutSpaces.slice(amountToSlice + 1); // Removes all characters before the last instance of /\n const finalFilteredName = profileNameFiltered.slice(0, -4); // Removes last 4 characters in the string which is the file extension (eg .icc)\n if (!variant.namedColor) throw new Error(\"variant named color not set!\");\n return {\n profileName: finalFilteredName,\n namedColor: variant.namedColor,\n };\n }\n\n return undefined;\n }\n\n private async reload(stepData: Step<TextStepData>, workflowManager: WorkflowManager, reducerState: LayoutsState) {\n const serializedStep = workflowManager.getSerializedStep(\n stepData.stepName,\n reducerState.serializableWorkflow.steps,\n );\n const layouts = Object.values(reducerState.layouts);\n const elements = layouts.map((layout) => layout.elements).flat();\n const elementsForStep = elements.filter((el) => el.stepName === stepData.stepName);\n const option = stepData.option;\n if (serializedStep?.selectedVariants) {\n const variantId = serializedStep.selectedVariants[0].id;\n if (option && variantId) {\n const variant = option.variants?.find((variant: VariantResource) => variant.id === variantId);\n if (variant) {\n const fontData = await this.fontDataFromVariant(variant);\n const regionElements = elementsForStep.map((el) => ({ id: el.id, region: el.stepRegion }));\n const color = serializedStep.storage?.color;\n const text = serializedStep.storage?.text;\n await workflowManager.setSelectionsAndElements(\n stepData.stepName,\n [variant],\n regionElements,\n async () => {\n workflowManager.updateMetadata(stepData.stepName, { color, text });\n workflowManager.updateStorage(stepData.stepName, { text, inputText: text });\n const fontSourceCommands = elementsForStep.map((el) => {\n const command = new FontSourceCommand(el.id, fontData);\n return command;\n });\n const groupCommand = new GroupCommand(fontSourceCommands);\n workflowManager.getCommandDispatcher()(groupCommand);\n },\n );\n\n const { command } = textStepService.updateInputText(\n text || \"\",\n elementsForStep as TextboxElement[],\n stepData,\n workflowManager,\n );\n command && workflowManager.getCommandDispatcher()(command);\n }\n }\n }\n }\n\n private async getDefaultColorVariant(step: TextStepData): Promise<VariantResource | undefined> {\n const colorOption = step.colorOption;\n if (!colorOption) return undefined;\n return optionService.getDefaultVariant(colorOption);\n }\n\n private async getDefaultColor(step: TextStepData): Promise<string | undefined> {\n const colorOption = step.colorOption;\n if (!colorOption) return undefined;\n const defaultVariant = optionService.getDefaultVariant(colorOption);\n return defaultVariant?.color;\n }\n\n private getDefaultImageFillVariant(step: TextStepData): VariantResource | undefined {\n const option = step.imageFillOption;\n if (!option) return undefined;\n return optionService.getDefaultVariant(option);\n }\n\n /**\n * Validates a string of text based on step confoiguration.\n * @param text The text to validate\n * @param step The step providing configuration\n * @param workflowManager Workflow manager for access to workflow state\n * @returns A list of errors. Empty if the text passes validation.\n */\n private getErrorsForText = (\n text: string,\n step: Step<TextStepData>,\n workflowManager: WorkflowManager,\n ): undefined | TextErrorData => {\n let errorData: undefined | TextErrorData = undefined;\n\n // Ensure character limit is maintained\n if (!!step.data && !!step.data.maxLength && text.length > step.data.maxLength) {\n if (!errorData) {\n errorData = {};\n }\n errorData.hitCharacterLimit = true;\n }\n\n // Check text against our blacklist\n const profanityFilter = workflowManager.getProfanities();\n const words = split(text.toLowerCase());\n for (const word of words) {\n for (const i in profanityFilter) {\n const profanity = profanityFilter[i].toLowerCase().replace(/\\s/g, \"\");\n const match = word === profanity;\n if (match) {\n if (!errorData) {\n errorData = {};\n }\n errorData.blockedProfanity = true;\n break;\n }\n }\n }\n\n // Potentially don't allow newlines.\n const breaksNewlineRule = !step.data.allowNewlines && (text.includes(\"\\n\") || text.includes(\"\\r\"));\n if (breaksNewlineRule) {\n if (!errorData) {\n errorData = {};\n }\n errorData.illegalMultipleLines = true;\n }\n\n return errorData;\n };\n\n private async fontDataFromVariant(variant: VariantResource): Promise<FontData> {\n const fontAsset = variant.asset;\n if (!fontAsset) {\n throw new AssetNotFoundError(variant);\n }\n const fontUrl = fontAsset.fileLink;\n if (!fontUrl) {\n throw new ResourceNotFoundError(fontAsset);\n }\n const opentypeFont = await loadFont(fontUrl);\n return {\n assetUrl: fontUrl,\n name: opentypeFont.names.fullName[\"en\"],\n };\n }\n\n private async selectVariantCommand(\n step: Step<TextStepData>,\n variant: VariantResource,\n storage: TextStepStorage,\n elements: RegionElement[],\n workflowManager: WorkflowManager,\n setError: (status: boolean) => void,\n setHelperText: (text: string) => void,\n imageFillData?: { src: string; height: number; width: number; scale: number },\n ): Promise<CommandWithFollowup | null> {\n const updateId = workflowManager.markUpdatePending();\n\n const fontData = await this.fontDataFromVariant(variant);\n\n if (elements.length > 0) {\n const commands: CanvasCommand[] = elements.map((elem) => {\n const command = new FontSourceCommand(elem.id, fontData);\n return command;\n });\n\n if (imageFillData) {\n const imageFillCommands = elements.map((elem) => new FontImageFillCommand(elem.id, imageFillData));\n commands.push(...imageFillCommands);\n }\n\n const sizingCommand = await this.changeInputTextWithRegion(\n step,\n step.data.size || defaultFontSize,\n fontData,\n storage.text || \"\",\n storage,\n workflowManager,\n !!storage.customiseAllText,\n setError,\n setHelperText,\n );\n sizingCommand && commands.push(sizingCommand);\n const command = new GroupCommand(commands);\n return {\n command: command,\n followup: async () => {\n workflowManager.markUpdateCompleted(updateId);\n await workflowManager.setSelectionsAndElements(step.stepName, [variant], elements);\n },\n };\n } else {\n const newlyCreatedData = await this.createTextboxRegions(\n step.stepName,\n variant,\n step.data,\n fontData,\n storage,\n workflowManager,\n );\n\n const sizingCommand = await this.changeInputTextWithRegion(\n step,\n step.data.size || defaultFontSize,\n fontData,\n newlyCreatedData[0]?.newElement.input || storage.text || step.data.defaultText || \"\",\n storage,\n workflowManager,\n !!storage.customiseAllText,\n setError,\n setHelperText,\n );\n\n const commands = newlyCreatedData.flatMap((data) => data.commands);\n if (imageFillData) {\n const imageFillCommands = newlyCreatedData.map(\n (data) => new FontImageFillCommand(data.regionElement.id, imageFillData),\n );\n commands.push(...imageFillCommands);\n }\n sizingCommand && commands.push(sizingCommand);\n const groupCommand = new GroupCommand(commands);\n\n return {\n command: groupCommand,\n followup: async () => {\n workflowManager.markUpdateCompleted(updateId);\n },\n };\n }\n }\n\n /**\n * When a text step specifies replaceable text, the text input by the user will replace\n * a specific token within a larger string of text specified in the step configuration. Otherwise\n * this function will just return the text it's given when the feature is disabled.\n */\n private injectReplaceableText(text: string, stepData: TextStepData) {\n if (stepData.replaceableText) {\n return stepData.replaceableText.replace(`{{}}`, text);\n } else {\n return text;\n }\n }\n\n private async createTextboxRegions(\n stepName: string,\n variant: VariantResource,\n stepData: TextStepData,\n fontData: FontData,\n storage: TextStepStorage,\n workflowManager: WorkflowManager,\n ): Promise<CreatedElementData[]> {\n if (!stepData || !stepData.regions) {\n throw new Error(\"Step data not supplied\");\n }\n\n const currentText = storage.text || stepData.defaultText || \"\";\n const transformedText = this.getProcessedInput(currentText, stepData, false);\n const addFontToRegion = async (region: Region): Promise<CreatedElementData> => {\n const layouts = workflowManager.getLayouts();\n const layout = layouts.find((layout: ILayout) => layout.panelId === region.panelId);\n\n // Create new element.\n const elementId = generate();\n try {\n if (!layout) {\n throw new RegionLayoutMissingError(\"Failed to find layout for region: \" + region.panelId);\n }\n const colorOption = stepData.colorOption;\n\n let textFillSpotColor: TextFillSpotColor | undefined = undefined;\n if (colorOption && colorOption.variants) {\n const defaultVariant =\n colorOption.variants.find((v) => v.id === colorOption.defaultVariant?.id) ||\n colorOption.variants[0];\n textFillSpotColor = this.createTextFillSpotColor(colorOption, defaultVariant);\n workflowManager.updateStorage(stepName, {\n colorProfileAssetKey: colorOption.colorProfile?.key,\n });\n }\n\n const defaultColor = await this.getDefaultColor(stepData);\n const startingFill = defaultColor ? defaultColor : \"#000000\";\n\n const newElement: TextboxElement = {\n stepRegion: region,\n stepName: stepName,\n align: this.textAlign(stepData),\n fill: storage.color ? storage.color : startingFill,\n fontSize: stepData.size || defaultFontSize,\n fontData,\n id: elementId,\n layer: region.layer,\n layerIndex: region.layerIndex,\n rotation: region.rotation,\n text: transformedText,\n input: currentText,\n type: LayoutElementType.Textbox,\n vertical: stepData.vertical,\n x: region.left,\n y: region.top,\n height: region.height,\n width: region.width,\n immutable: region.immutable,\n verticalAlign: stepData.verticalAlign || \"middle\",\n curved: stepData.curved,\n paths: stepData.paths,\n fillSpotColorDefinition: textFillSpotColor,\n };\n\n const sizingCommands: CanvasCommand[] = [];\n const correctFontSizes = new Map<string, number>();\n const correctLineLists = new Map<string, null | string[]>();\n if (!newElement.fontData) throw new UnhandledBehaviorError(\"Failed to resolve font data for text.\");\n const [newFontSize, newLines] = determineCorrectFontSizeAndLines(\n newElement.fontSize,\n newElement.fontData,\n {\n left: newElement.x,\n top: newElement.y,\n width: newElement.width,\n height: newElement.height,\n rotation: newElement.rotation,\n panelId: \"\",\n },\n [transformedText],\n { size: stepData.size, minSize: stepData.minSize, maxSize: stepData.maxSize },\n );\n correctFontSizes.set(newElement.id, newFontSize);\n correctLineLists.set(newElement.id, newLines);\n const newText = stepData.curved || stepData.vertical ? transformedText : (newLines || []).join(\"\\n\");\n sizingCommands.push(\n this.generateTextChangeCommandsForRegion(newFontSize, stepData, newElement.id, newText),\n );\n\n const newCommand = new CreateElementCommand(newElement, layout);\n\n return {\n regionElement: { id: elementId, region },\n commands: [newCommand, ...sizingCommands],\n newElement,\n fontData,\n };\n } catch (err) {\n console.log(err);\n throw new FontLoadError(\"Error adding font to region\");\n }\n };\n\n const newElementData = await Promise.all(stepData.regions.map(addFontToRegion)).catch((e) => {\n if (e instanceof FontLoadError) {\n toast.setLatestToast(\"Failed to load font.\", InformationMessageType.Error);\n throw e;\n } else if (e instanceof RegionLayoutMissingError) {\n throw e;\n } else {\n throw new Error(e);\n }\n });\n\n await workflowManager.setSelectionsAndElements(\n stepName,\n [variant],\n newElementData.map((e) => e.regionElement),\n async () => {\n workflowManager.updateMetadata(stepName, {\n text: currentText,\n });\n workflowManager.updateStorage(stepName, {\n text: currentText,\n });\n },\n );\n\n return newElementData;\n }\n\n private generateTextChangeCommandsForRegion(\n correctFontSize: number,\n stepData: TextStepData,\n elementId: string,\n newText: string,\n ): GroupCommand {\n const commands: CanvasCommand[] = [];\n const textChangeCommand = new TextChangeCommand(elementId, newText);\n commands.push(textChangeCommand);\n // If the user has specified a font size range as opposed to a\n // static font size then do sizing.\n if (!stepData.size) {\n const fontSizeCommand = new FontSizeCommand(elementId, correctFontSize);\n commands.push(fontSizeCommand);\n }\n const groupCommand = new GroupCommand(commands);\n return groupCommand;\n }\n\n /**\n * @deprecated\n */\n private async changeInputTextWithRegion(\n step: Step<TextStepData>,\n /**\n * @deprecated\n */\n curFontSize: number,\n /**\n * @deprecated\n */\n curFontData: FontData,\n input: string | undefined,\n storage: TextStepStorage,\n workflowManager: WorkflowManager,\n customiseAllText: boolean,\n setError: (status: boolean) => void,\n setHelperText: (text: string) => void,\n setFlashRedError?: (status: boolean) => void,\n ): Promise<GroupCommand | undefined> {\n // Control characters are not valid in XML, we strip them from any input to\n // ensure that invalid data doesn't enter the SVG generated by our system.\n // \\u000A and \\u000D are carriage return and newline sequences, we want to keep these.\n // eslint-disable-next-line no-control-regex\n const newText = (input || \"\").replace(/^(?![\\u000A\\u000D])[\\u0000-\\u001F\\u007F-\\u009F]/g, \"\");\n const transformedText = this.getProcessedInput(newText, step.data, customiseAllText);\n\n const existingRegionEls = workflowManager.getRegionElements(step.stepName);\n const correctFontSizes = new Map<string, number>();\n const correctLineLists = new Map<string, null | string[]>();\n\n // Calculate font size and lines with new text.\n for (const regionElement of existingRegionEls) {\n if (regionElement.region) {\n const [newFontSize, newLines] = determineCorrectFontSizeAndLines(\n curFontSize,\n curFontData,\n regionElement.region,\n [transformedText],\n { size: step.data.size, minSize: step.data.minSize, maxSize: step.data.maxSize },\n );\n correctFontSizes.set(regionElement.id, newFontSize);\n correctLineLists.set(regionElement.id, newLines);\n }\n }\n\n const helperTextGenerator = () => {\n // Ensure character limit is maintained\n if (!!step.data && !!step.data.maxLength && transformedText.length > step.data.maxLength) {\n if (setFlashRedError) {\n setFlashRedError(true);\n }\n return { info: \"0\" };\n }\n\n // Check text against our blacklist\n const profanityFilter = workflowManager.getProfanities();\n const words = split(transformedText.toLowerCase());\n for (const word of words) {\n for (const i in profanityFilter) {\n const profanity = profanityFilter[i].toLowerCase().replace(/\\s/g, \"\");\n const match = word === profanity;\n if (match) {\n setError(true);\n return { error: \"Blocked profanity.\" };\n }\n }\n }\n\n // Potentially don't allow newlines.\n if (\n !step.data.vertical &&\n !step.data.allowNewlines &&\n (transformedText.includes(\"\\n\") || transformedText.includes(\"\\r\"))\n ) {\n setError(true);\n return { error: \"Cannot span multiple lines.\" };\n }\n\n if (!step.data.curved) {\n const allFit = Array.from(correctLineLists.values()).every((x) => x);\n if (!allFit) {\n setError(true);\n return { error: \"Does not fit.\" };\n }\n }\n\n setError(false);\n return { info: (step.data.maxLength - transformedText.length).toString() };\n };\n\n // Check the input text for validity.\n const newHelperText = helperTextGenerator();\n\n if (newHelperText.error) {\n setHelperText(newHelperText.error);\n return;\n }\n\n setHelperText(`${newHelperText.info} characters remaining` || \"\");\n\n if (setFlashRedError) {\n return;\n }\n\n workflowManager.updateStorage(step.stepName, { text: newText });\n workflowManager.updateMetadata(step.stepName, {\n text: this.injectReplaceableText(newText, step.data),\n });\n\n if (storage.defaultCleared || !step.data.deleteDefaultOnFocus) {\n workflowManager.setMandatoryFulfilled(step.stepName, true);\n }\n const commands: CanvasCommand[] = [];\n for (const regionElement of existingRegionEls) {\n const newText = step.data.curved\n ? transformedText\n : (correctLineLists.get(regionElement.id) || []).join(\"\\n\");\n commands.push(\n this.generateTextChangeCommandsForRegion(\n correctFontSizes.get(regionElement.id) || 1,\n step.data,\n regionElement.id,\n newText,\n ),\n );\n }\n\n const groupCommand = new GroupCommand(commands);\n return groupCommand;\n }\n}\n\nexport const textStepService = new TextStepService();\n","import { Region } from \"../types\";\n\nexport abstract class ModuleProduct {\n /**\n * Name used by class. Usually product or brand name.\n */\n abstract moduleName: string;\n\n /**\n * SVG with styled path positioned on a background image. To be displayed to user.\n */\n abstract svgPreview(text: string, region: Region): string;\n\n /**\n * SVG with styled path positioned on a background image. To be submitted for print.\n */\n abstract svgPrint(text: string, region: Region): string;\n}\n","export const fontWoffDataUrl =\n \"data:application/font-woff;base64,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\";\n","export const backgroundSvg = `<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->\n<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n\t width=\"289.691px\" height=\"204.059px\" viewBox=\"0 0 289.691 204.059\" enable-background=\"new 0 0 289.691 204.059\"\n\t xml:space=\"preserve\">\n<g id=\"Layer_3\">\n\t<g>\n\t\t<g>\n\t\t\t<defs>\n\t\t\t\t<path id=\"SVGID_1_\" d=\"M132.799,0L132.799,0c-2.85,0-5.611,0.376-8.204,1.119c-6.512,1.865-14.407,8.455-17.575,17.447\n\t\t\t\t\tc-5.374,1.759-16.263,6.039-18.474,16.876c-12.301,4.695-59.215,23.718-76.41,46.864c-1.783,2.067-14.076,17.86-11.873,42.198\n\t\t\t\t\tc2.083,23.017,14.66,39.637,20.03,46.733c0.496,0.655,0.925,1.223,1.271,1.697c3.272,4.502,16.448,20.198,29.967,27.96\n\t\t\t\t\tc0.985,0.565,2.526,1.337,3.598,1.671c9.286,2.898,13.053,0.684,13.053,0.684l-5.734-6.704\n\t\t\t\t\tc-0.113-0.047-1.555-2.104-2.024-3.528c-0.401-1.1-0.683-3.708,1.941-8.822c1.92-3.74,8.466-11.905,30.74-24.556\n\t\t\t\t\tc19.286-10.953,45.665-22.672,78.404-34.831c0.384-0.138,43.36-15.521,71.448-17.843l0.084-0.007l0.084-0.01\n\t\t\t\t\tc0.056-0.006,5.722-0.659,11.761-0.659c7.122,0,10.06,0.898,11.094,1.355l0.378,9.638c0,0,5.87-4.852,7.88-7.117\n\t\t\t\t\tc2.01-2.264,12.031-11.822,14.79-47.407c0.084-0.941,1.244-14.374,0.202-25.831c-0.428-4.706-2.167-9.042-5.03-12.54\n\t\t\t\t\tc-4.914-6.004-15.065-13.686-35.521-16.2c-0.84-0.118-8.692-1.176-21.503-1.176c-14.431,0-29.204,1.305-43.952,3.882\n\t\t\t\t\tc-1.858-1.395-4.78-2.782-9.053-2.782c-0.427,0-0.861,0.014-1.303,0.043c-1.604-2.318-4.231-4.531-8.237-5.259\n\t\t\t\t\tc-0.396-0.076-1.797-0.315-3.752-0.315c-0.897,0-1.798,0.051-2.676,0.152h-0.001c-0.244,0.007-1.149-0.008-2.428-0.517\n\t\t\t\t\tc-0.623-0.317-2.157-1.062-3.567-1.46c-0.945-0.267-2.142-0.54-3.842-0.54c-1.387,0-2.951,0.186-4.78,0.569l-0.214,0.045\n\t\t\t\t\tl-0.073,0.023c-0.141,0.032-0.727,0.154-1.455,0.154c-0.378,0-0.727-0.033-1.036-0.098C139.516,0.637,136.489,0,132.799,0z\"/>\n\t\t\t</defs>\n\t\t\t<clipPath id=\"SVGID_2_\">\n\t\t\t\t<use xlink:href=\"#SVGID_1_\" overflow=\"visible\"/>\n\t\t\t</clipPath>\n\t\t\t\n\t\t\t\t<radialGradient id=\"SVGID_3_\" cx=\"0.6661\" cy=\"211.1478\" r=\"1\" gradientTransform=\"matrix(196.7466 -33.1074 59.2188 355.3871 -12531.9229 -75128.1562)\" gradientUnits=\"userSpaceOnUse\">\n\t\t\t\t<stop offset=\"0\" style=\"stop-color:#31006F\"/>\n\t\t\t\t<stop offset=\"0.7044\" style=\"stop-color:#31006F\"/>\n\t\t\t\t<stop offset=\"0.9025\" style=\"stop-color:#8663A8\"/>\n\t\t\t\t<stop offset=\"0.9837\" style=\"stop-color:#380874\"/>\n\t\t\t</radialGradient>\n\t\t\t<path clip-path=\"url(#SVGID_2_)\" fill=\"url(#SVGID_3_)\" d=\"M289.231,36.928c0-15.893-21.025-34.603-52.712-35.045\n\t\t\t\tc-15.771-0.22-99.017-1.969-102.404-3.731C132.43-2.669,102,8.514,99.071,14.978c-1.352,2.989-12.46,12.774-12.087,16.225\n\t\t\t\tC43.908,47.213,14.509,73.752,3.19,93.894c-4.256,7.574-5.912,24.772,1.863,48.426c7.171,21.815,39.719,65.369,55.762,70.653\n\t\t\t\tc34.873-19.08-3.701-15.168,25.189-33.173c37.467-23.352,96.365-43.82,128.896-51.007c51.454-11.366,72.09-9.938,70.905-8.055\n\t\t\t\tC293.781,108.06,291.07,57.024,289.231,36.928z\"/>\n\t\t</g>\n\t\t<path fill=\"#F4F5F5\" d=\"M273.502,102.985c0,0-0.484,7.046-0.92,8.889l-0.856,0.768l-1.487,1.343c0,0,0.746-3.28,0.676-7.538\n\t\t\tL273.502,102.985z\"/>\n\t\t<g>\n\t\t\t<defs>\n\t\t\t\t<path id=\"SVGID_4_\" d=\"M273.495,103.048l-0.914,8.826l-6.223,5.407l-0.378-9.638c-3.51-1.84-20.124-1.91-40.523,1.965\n\t\t\t\t\tc-20.398,3.875-55.726,13.5-108.591,37.875c-52.865,24.375-56.042,40.035-56.3,41.165c-0.258,1.129-0.609,2.871-0.246,4.106\n\t\t\t\t\tc0.363,1.234,1.566,3.062,1.566,3.062c0.622,0.875,6.294,7.434,6.294,7.434c-0.243,0.139-0.713,0.296-0.713,0.296\n\t\t\t\t\tc-3.776-1.363-10.024-5.048-12.507-6.55c-0.105-0.059-0.211-0.109-0.316-0.168c-0.213-0.126-0.425-0.267-0.634-0.411\n\t\t\t\t\tl-0.127-0.079l-0.016-0.022c-4.346-3.133-7.493-10.523,1.153-21.838c7.623-9.975,16.641-15.494,27.199-21.737\n\t\t\t\t\tc35.97-21.271,88.653-41.928,128.445-51.065c20.468-4.7,37.871-6.713,47.404-5.994\n\t\t\t\t\tC270.766,96.641,274.312,100.216,273.495,103.048z M103.152,50.182c-0.754,0.298-4.411,1.78-5.162,2.081\n\t\t\t\t\tc-46.711,18.73-75.543,39.262-85.429,55.22c-4.89,7.894-6.183,14.713-7.333,23.376c-0.528,3.979-0.264,9.917,0.182,13.905\n\t\t\t\t\tc0.098,0.872,0.196,1.558,0.285,1.837c-6.447-20.414-0.184-36.278,3.696-43.319c10.903-19.787,49.756-42.606,92.09-58.743\n\t\t\t\t\tC101.625,47.168,102.123,48.443,103.152,50.182z M289.642,46.027c0,0-1.68-8.208-8.18-16.932\n\t\t\t\t\tC281.44,29.064,260.598,16,235.788,15.96c-15.584-0.025-35.217,2.462-56.404,6.836c0.858,0.69,2.004,2.132,1.76,4.812\n\t\t\t\t\tc21.139-4.514,40.632-7.022,56.269-6.997c16.325,0.026,32.385,3.661,38.959,8.397c2.862,2.062,6.187,5.337,8.039,8.968\n\t\t\t\t\tc0.562,1.011,3.167,5.866,5.214,12.307C289.626,50.282,289.762,47.693,289.642,46.027z\"/>\n\t\t\t</defs>\n\t\t\t<clipPath id=\"SVGID_5_\">\n\t\t\t\t<use xlink:href=\"#SVGID_4_\" overflow=\"visible\"/>\n\t\t\t</clipPath>\n\t\t\t<rect x=\"282.522\" y=\"30.129\" clip-path=\"url(#SVGID_5_)\" fill=\"#95979A\" width=\"7.146\" height=\"21.322\"/>\n\t\t\t\n\t\t\t\t<radialGradient id=\"SVGID_6_\" cx=\"0.6661\" cy=\"211.1478\" r=\"1\" gradientTransform=\"matrix(270.0389 19.3946 -19.0497 267.9429 3989.5959 -56677.875)\" gradientUnits=\"userSpaceOnUse\">\n\t\t\t\t<stop offset=\"0\" style=\"stop-color:#000000\"/>\n\t\t\t\t<stop offset=\"0.0996\" style=\"stop-color:#242425\"/>\n\t\t\t\t<stop offset=\"0.2741\" style=\"stop-color:#4E4F51\"/>\n\t\t\t\t<stop offset=\"0.5029\" style=\"stop-color:#757779\"/>\n\t\t\t\t<stop offset=\"0.7746\" style=\"stop-color:#A6A8AB\"/>\n\t\t\t\t<stop offset=\"0.8165\" style=\"stop-color:#E2E3E4\"/>\n\t\t\t\t<stop offset=\"0.8338\" style=\"stop-color:#ECEDED\"/>\n\t\t\t\t<stop offset=\"0.8581\" style=\"stop-color:#F2F2F3\"/>\n\t\t\t\t<stop offset=\"0.9255\" style=\"stop-color:#F3F4F4\"/>\n\t\t\t\t<stop offset=\"0.9497\" style=\"stop-color:#85878A\"/>\n\t\t\t\t<stop offset=\"0.9601\" style=\"stop-color:#77787B\"/>\n\t\t\t\t<stop offset=\"0.9911\" style=\"stop-color:#C8CACC\"/>\n\t\t\t</radialGradient>\n\t\t\t<path clip-path=\"url(#SVGID_5_)\" fill=\"url(#SVGID_6_)\" d=\"M274.97,104.208c-1.015,1.477-1.895,7.095-2.389,7.667\n\t\t\t\tc0.266-0.396-6.223,5.407-6.223,5.407S53.633,196.961,60.248,199.321c-1.672-0.501-3.655-1.4-5.602-2.491\n\t\t\t\tc-4.713-2.786-8.78-10.369,0.376-22.35c7.623-9.975,16.641-15.494,27.199-21.736c35.97-21.271,88.653-41.929,128.445-51.066\n\t\t\t\tc20.468-4.7,37.871-6.713,47.404-5.994C271.591,96.703,276.421,101.309,274.97,104.208z M101.481,44.54\n\t\t\t\tc-42.334,16.137-81.187,38.956-92.09,58.743c-3.88,7.042-10.143,22.905-3.696,43.319c-0.089-0.279-0.188-0.965-0.285-1.837\n\t\t\t\tc-0.446-3.989-0.711-9.927-0.182-13.905c1.15-8.662,2.444-15.482,7.333-23.376c9.886-15.959,38.718-36.49,85.429-55.219\n\t\t\t\tc0.752-0.301,4.408-1.784,5.162-2.081C102.123,48.443,101.625,47.168,101.481,44.54z M235.789,15.959\n\t\t\t\tc-15.583-0.025-35.217,2.462-56.404,6.835c0.858,0.69,2.004,2.132,1.76,4.812c21.139-4.514,40.632-7.022,56.269-6.997\n\t\t\t\tc16.325,0.026,32.385,3.661,38.959,8.397c2.862,2.062,7.305,5.886,8.059,9.237c-0.04-1.016-0.352-2.27-0.408-2.911\n\t\t\t\tC283.11,25.107,267.1,16.009,235.789,15.959z\"/>\n\t\t</g>\n\t\t<path fill=\"#DCDDDE\" d=\"M60.273,199.427l7.908,3.825l-5.24-6.101C62.941,197.152,58.272,198.786,60.273,199.427\"/>\n\t\t\n\t\t\t<radialGradient id=\"SVGID_7_\" cx=\"0.6661\" cy=\"211.1478\" r=\"1\" gradientTransform=\"matrix(270.0424 19.3949 -19.05 267.9464 3989.6995 -56678.5859)\" gradientUnits=\"userSpaceOnUse\">\n\t\t\t<stop offset=\"0\" style=\"stop-color:#000000\"/>\n\t\t\t<stop offset=\"0.0996\" style=\"stop-color:#242425\"/>\n\t\t\t<stop offset=\"0.2741\" style=\"stop-color:#4E4F51\"/>\n\t\t\t<stop offset=\"0.5029\" style=\"stop-color:#757779\"/>\n\t\t\t<stop offset=\"0.7746\" style=\"stop-color:#A6A8AB\"/>\n\t\t\t<stop offset=\"0.8338\" style=\"stop-color:#ECEDED\"/>\n\t\t\t<stop offset=\"0.8581\" style=\"stop-color:#F2F2F3\"/>\n\t\t\t<stop offset=\"0.9255\" style=\"stop-color:#F3F4F4\"/>\n\t\t\t<stop offset=\"0.9601\" style=\"stop-color:#77787B\"/>\n\t\t\t<stop offset=\"0.9911\" style=\"stop-color:#C8CACC\"/>\n\t\t</radialGradient>\n\t\t<path fill=\"url(#SVGID_7_)\" d=\"M273.283,103.591c-1.014,1.477-1.926,2.342-2.419,2.914c1.213-1.808-4.269-10.909-55.135-0.044\n\t\t\tc-20.898,4.464-58.364,17.017-91.77,32.224c-14.657,6.627-44.582,21.095-57.613,32.959c-12.456,11.341-14.277,24.658-5.817,27.676\n\t\t\tc-1.672-0.501-3.937-1.4-5.884-2.491c-4.713-2.786-8.78-10.369,0.376-22.35c7.623-9.975,16.641-15.494,27.199-21.737\n\t\t\tc35.97-21.271,88.653-41.928,128.445-51.065c20.468-4.7,37.871-6.713,47.404-5.994\n\t\t\tC271.591,96.703,274.735,100.692,273.283,103.591z M101.481,44.54c-42.334,16.137-81.187,38.956-92.09,58.743\n\t\t\tc-3.88,7.042-10.143,22.905-3.696,43.319c-0.089-0.279-0.188-0.965-0.285-1.837c-0.446-3.989-0.711-9.927-0.182-13.905\n\t\t\tc1.15-8.662,2.444-15.482,7.333-23.376c9.886-15.959,38.718-36.49,85.429-55.219c0.752-0.301,4.408-1.784,5.162-2.081\n\t\t\tC102.123,48.443,101.625,47.168,101.481,44.54z M235.789,15.959c-15.583-0.025-35.217,2.462-56.404,6.835\n\t\t\tc0.858,0.69,2.004,2.132,1.76,4.812c21.139-4.514,40.632-7.022,56.269-6.997c16.325,0.026,32.385,3.661,38.959,8.397\n\t\t\tc2.862,2.062,6.771,6.064,8.179,9.197c-0.546-1.213-0.441-2.314-0.498-2.954C283.141,25.023,267.1,16.009,235.789,15.959z\"/>\n\t</g>\n</g>\n<g id=\"Layer_2\">\n\t<g opacity=\"0.7\">\n\t\t<defs>\n\t\t\t\n\t\t\t\t<rect id=\"SVGID_8_\" x=\"112.559\" y=\"3.607\" transform=\"matrix(0.1079 -0.9942 0.9942 0.1079 82.6225 182.4761)\" opacity=\"0.7\" width=\"60.856\" height=\"83.188\"/>\n\t\t</defs>\n\t\t<clipPath id=\"SVGID_9_\">\n\t\t\t<use xlink:href=\"#SVGID_8_\" overflow=\"visible\"/>\n\t\t</clipPath>\n\t\t<g clip-path=\"url(#SVGID_9_)\">\n\t\t\t<g>\n\t\t\t\t<defs>\n\t\t\t\t\t\n\t\t\t\t\t\t<rect id=\"SVGID_10_\" x=\"112.559\" y=\"3.607\" transform=\"matrix(0.1079 -0.9942 0.9942 0.1079 82.6225 182.4761)\" width=\"60.856\" height=\"83.188\"/>\n\t\t\t\t</defs>\n\t\t\t\t<clipPath id=\"SVGID_11_\">\n\t\t\t\t\t<use xlink:href=\"#SVGID_10_\" overflow=\"visible\"/>\n\t\t\t\t</clipPath>\n\t\t\t\t<g transform=\"matrix(1 0 7.450581e-09 1 -7.629395e-06 0)\" clip-path=\"url(#SVGID_11_)\">\n\t\t\t\t\t\n\t\t\t\t\t\t<image overflow=\"visible\" enable-background=\"new \" width=\"636\" height=\"465\" xlink:href=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnwAAAHRCAYAAADwh2T7AAAACXBIWXMAAAsSAAALEgHS3X78AAAA\nGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAyOdJREFUeNrsvQmYJddVJnhuRLwt\nX26VSlWpnC4ttiTLwrIMwiC7PcYG3MYbiw0NxgZ6eub7hvVjuoH5mOlvtp6mu5mmm8GAaRpk424w\ntpFNgxdZNjZehCRbaClbaLNcUqmcVapSKisrt5dviYiJGxXnvT/OuxEvsyqztjz/p9B7GW+tFxH3\n/vc/5/yHSKFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKh\nUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQ\nKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAo\nFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgU\nCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQK\nhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqF\nQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVC\noVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKh\nUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQ\nKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUCoVCoVAoFAqFQqFQKBQKhUKhUCgUik0gjmNj\nt628ZmJi0ktuvEaj4We77OvtPj/bvGzfdnw/n7dOp+u1Ox0vDENvs9/bPqfX6xl4ncfvF0WRr2eA\nQqFQKBSKSx4JiTJ228RTzf79+71rr72OiV0QBJWA7ydbJdmq2VbJ9vmOLSWLb33rD3o/+3O/4I36\n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\nX4m2Sibqakbo8W26c7doKZ0/f3/pF3/pV0ovv/Kqn7wev9/vexx1nFKIAgAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHCz+fwEGABq0\nIfnI8vaNAAAAAElFTkSuQmCC\" transform=\"matrix(0.13 0.0141 -0.0141 0.1301 104.926 10.4696)\">\n\t\t\t\t\t</image>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t</g>\n\t</g>\n\t<g>\n\t\t<path fill=\"#ED1C24\" d=\"M174.957,30.203c-0.284-0.646-1.032-1.349-2.281-1.388c-0.213-0.007-0.435,0.007-0.667,0.04\n\t\t\tc-0.904,0.135-1.788,0.676-2.397,1.515c-0.402-0.719-1.081-1.196-1.905-1.321c-0.113-0.015-0.225-0.023-0.335-0.027\n\t\t\tc-0.035-0.001-0.07-0.002-0.105-0.002c0.172-0.292,0.28-0.589,0.333-0.87c0.131-0.693-0.072-1.291-0.545-1.601\n\t\t\tc-0.191-0.125-0.416-0.196-0.65-0.203c-0.414-0.013-0.742,0.159-1.09,0.342c-0.158,0.083-0.322,0.169-0.491,0.236\n\t\t\tc-0.302,0.121-0.62,0.221-0.948,0.31c-0.029-0.454-0.146-0.885-0.436-1.223c-0.197-0.229-0.553-0.506-1.131-0.524\n\t\t\tc-0.063-0.002-0.128-0.001-0.194,0.004c-0.966,0.063-1.745,0.958-2.372,2.727c-0.002-0.19-0.031-0.381-0.09-0.567\n\t\t\tc-0.244-0.763-0.938-1.273-1.766-1.299c-0.319-0.01-0.649,0.055-0.953,0.188c-1.049,0.458-1.616,1.61-1.291,2.623\n\t\t\tc0.025,0.077,0.057,0.15,0.091,0.222c-1.238,0.182-2.105,1.065-2.674,1.944c-0.238-0.137-0.515-0.227-0.835-0.237\n\t\t\tc-0.169-0.005-0.339,0.014-0.506,0.058c-0.744,0.195-1.028,0.664-1.142,1.25c-0.255-0.728-0.738-1.205-1.626-1.278\n\t\t\tc-0.04-0.003-0.08-0.006-0.119-0.007c-0.921-0.029-2.08,0.433-2.367,2.796c-0.036,0.299-0.063,0.607-0.082,0.909\n\t\t\tc-0.185-0.607-0.511-1.198-1.091-1.689c-0.646-0.547-1.254-0.676-1.651-0.689c-0.637-0.02-1.129,0.236-1.377,0.481\n\t\t\tc-0.597,0.589-0.39,1.317-0.29,1.724c0.101,0.407,0.175,0.841,0.148,1.094c-0.193-0.645-0.454-1.168-0.971-1.624\n\t\t\tc-0.483-0.427-1.119-0.664-1.84-0.686c-0.187-0.006-0.378,0.003-0.569,0.027c-1.897,0.236-3.379,1.794-4.103,4.067\n\t\t\tc-0.137-0.23-0.291-0.438-0.46-0.621c-0.752-0.814-1.642-1.242-2.643-1.273c-0.282-0.009-0.576,0.014-0.874,0.068l-0.035,0.007\n\t\t\tc-0.416,0.089-1.162,0.321-1.482,0.869c-0.247,0.423-0.376,1.01,0.169,1.614c-0.218-0.108-0.428-0.184-0.624-0.236\n\t\t\tc-0.283-0.076-0.568-0.119-0.846-0.128c-0.847-0.026-1.578,0.258-1.956,0.761c-0.202,0.269-0.366,0.639-0.279,1.093\n\t\t\tc-0.423-0.205-0.899-0.324-1.389-0.34c-0.248-0.008-0.501,0.011-0.752,0.055c-1.608,0.242-2.789,1.427-3.544,3.038\n\t\t\tc-0.073-0.026-0.149-0.046-0.227-0.059l-0.102-0.013l-0.051-0.002c-0.585-0.018-0.94,0.353-1.176,0.599\n\t\t\tc-0.035,0.036-0.07,0.073-0.108,0.111c-0.072-0.797-0.11-1.449-0.109-2.219c0.002-1.13,0.277-1.776,0.46-2.081l0.108-0.037\n\t\t\tc0.742-0.252,1.458-0.494,2.075-0.713c1.449-0.513,2.455-0.881,3.21-1.315c1.468-0.844,2.565-2.057,2.934-3.245\n\t\t\tc0.274-0.882,0.244-1.625-0.086-2.15c-0.22-0.35-0.557-0.574-0.947-0.631l-0.09-0.012l-0.063-0.002\n\t\t\tc-0.458-0.014-0.795,0.195-1.15,0.417c-0.257,0.16-0.576,0.359-1.07,0.584c-1.027,0.468-2.291,0.943-4.226,1.588\n\t\t\tc-2.061,0.687-4.653,1.655-6.419,3.049c-1.906,1.505-2.48,3.077-2.625,4.121c-0.222,1.504,0.493,1.941,0.939,2.068\n\t\t\tc0.108,0.03,0.218,0.048,0.329,0.051c0.725,0.023,1.146-0.487,1.453-0.86l0.116-0.139c0.058-0.068,0.217-0.242,0.521-0.483\n\t\t\tc-0.311,1.478-0.287,3.07-0.178,4.325c-0.914,0.725-1.319,1.77-1.384,2.545c-0.083,1.003,0.31,1.736,1.028,1.915l0.123,0.029\n\t\t\tl0.115,0.004c0.321,0.01,0.567-0.108,0.757-0.244c0.609,4.554,0.717,8.077,0.29,9.801l-0.016,0.064\n\t\t\tc-0.387,1.52,0.233,2.055,0.822,2.236l0.046,0.014l0.047,0.01c0.123,0.026,0.251,0.042,0.379,0.046\n\t\t\tc1.267,0.04,2.568-0.992,3.313-2.627c0.805-1.768,0.616-5.234,0.038-9.882c0.532,3.639,2.059,5.666,4.39,5.738\n\t\t\tc0.124,0.004,0.251,0.001,0.368-0.009c0.849-0.062,1.602-0.463,2.178-1.159c0.355-0.43,0.617-0.941,0.809-1.457\n\t\t\tc0.11,0.087,0.225,0.168,0.344,0.243c0.554,0.365,1.192,0.568,1.845,0.588c1.091,0.034,2.317-0.442,2.439-1.389\n\t\t\tc0.013-0.096,0.022-0.263-0.018-0.454c1.075-0.184,2.154-1.507,2.94-3.632c0.244-0.61,0.524-1.38,0.754-2.37\n\t\t\tc0.905,1.882,2.357,2.659,3.709,2.702c0.195,0.006,0.395-0.002,0.594-0.025c1.006-0.116,1.957-0.705,2.679-1.659\n\t\t\tc0.437-0.578,0.776-1.268,1.008-2.029c0.451,0.709,1.149,1.203,2.224,1.267l0.046,0.002c1.327,0.023,2.306-0.963,2.955-2.236\n\t\t\tc0.959,1.074,1.995,1.336,2.721,1.359c0.829,0.026,1.462-0.254,1.695-0.376c0.59-0.307,0.946-0.813,0.963-1.342\n\t\t\tc1.498-0.553,1.303-2.42,1.236-3.064c-0.027-0.256-0.048-0.613-0.06-1.022c0.391,3.088,2.039,3.501,2.788,3.524l0,0\n\t\t\tc0.15,0.005,0.304-0.004,0.458-0.026c1.034-0.145,1.704-0.783,1.915-1.46c0.426,0.451,0.991,0.741,1.74,0.764\n\t\t\tc0.067,0.002,0.133,0.002,0.199-0.001c0.842-0.031,1.792-0.53,2.195-1.222c0.463,0.425,1.031,0.713,1.71,0.813\n\t\t\tc0.143,0.021,0.287,0.034,0.429,0.039c1.101,0.034,1.976-0.421,2.642-1.037c0.006,0.012,0.012,0.024,0.018,0.035\n\t\t\tc0.269,0.491,0.752,0.65,0.988,0.699c0.12,0.028,0.256,0.044,0.408,0.049c1.154,0.036,2.81-0.562,3.673-2.358\n\t\t\tc0.97-1.986,0.067-3.915-0.472-5.068c-0.1-0.213-0.194-0.414-0.246-0.554c-0.098-0.265-0.126-0.473-0.126-0.618\n\t\t\tc0.146,0.07,0.336,0.137,0.569,0.144l0,0c0.134,0.004,0.268-0.012,0.4-0.05c0.389-0.113,0.702-0.386,0.881-0.77\n\t\t\tC175.21,31.395,175.199,30.754,174.957,30.203z\"/>\n\t\t<g opacity=\"0.5\">\n\t\t\t<g>\n\t\t\t\t<g>\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t<rect id=\"SVGID_12_\" x=\"122.62\" y=\"13.483\" transform=\"matrix(0.1079 -0.9942 0.9942 0.1079 82.8799 180.6859)\" width=\"38.995\" height=\"61.358\"/>\n\t\t\t\t\t</defs>\n\t\t\t\t\t<clipPath id=\"SVGID_13_\">\n\t\t\t\t\t\t<use xlink:href=\"#SVGID_12_\" overflow=\"visible\"/>\n\t\t\t\t\t</clipPath>\n\t\t\t\t\t<path clip-path=\"url(#SVGID_13_)\" fill=\"#595959\" d=\"M157.669,27.744c0.539-0.235,1.102-0.034,1.257,0.45\n\t\t\t\t\t\tc0.155,0.484-0.156,1.067-0.695,1.302s-1.102,0.034-1.257-0.45C156.819,28.563,157.13,27.98,157.669,27.744z M119.826,43.655\n\t\t\t\t\t\tc-0.307-0.039-0.601,0.927-2.176,1.357c-0.184-1.752-0.28-2.686-0.278-3.95c0.003-1.842,0.643-2.734,0.871-2.994\n\t\t\t\t\t\tc0.889-0.302,1.761-0.595,2.492-0.854c1.426-0.504,2.373-0.855,3.031-1.233c1.285-0.739,2.168-1.752,2.44-2.628\n\t\t\t\t\t\tc0.263-0.848,0.108-1.352-0.159-1.391c-0.268-0.04-0.628,0.384-1.766,0.903c-1.137,0.518-2.508,1.022-4.332,1.63\n\t\t\t\t\t\tc-1.822,0.608-4.417,1.551-6.091,2.872c-1.67,1.319-2.117,2.651-2.225,3.43c-0.095,0.645,0.021,0.83,0.164,0.871\n\t\t\t\t\t\tc0.261,0.074,0.47-0.245,0.779-0.608c0.34-0.4,1.422-1.42,3.907-2.374c-2.038,1.607-1.804,5.732-1.598,7.467\n\t\t\t\t\t\tc-1.159,0.567-1.417,1.691-1.45,2.084c-0.032,0.393,0.058,0.739,0.21,0.777c0.161,0.04,0.533-0.636,1.571-0.962\n\t\t\t\t\t\tc0.69,4.555,1.107,9.428,0.505,11.861c-0.075,0.302-0.256,0.905,0.074,1.007c0.727,0.155,1.8-0.473,2.483-1.972\n\t\t\t\t\t\tc0.704-1.547,0.439-5.103-0.081-9.294c-0.117-0.94-0.224-1.812-0.321-2.628c1.211-0.291,1.874-1.491,2.028-1.952\n\t\t\t\t\t\tC120.088,44.523,120.118,43.702,119.826,43.655z M130.074,51.611c-0.265-0.039-0.868-0.51-1.296-1.466\n\t\t\t\t\t\tc-0.428-0.956-0.667-2.03-0.996-4.399c-0.33-2.376-0.494-2.793-1.161-2.785c-1.585,0.11-1.332,3.047-1.225,4.474\n\t\t\t\t\t\tc-0.121,2.203-0.473,3.913-1.194,3.923c-0.693,0.009-1.276-0.779-1.295-4.642c0.132-5.085,2.759-4.477,3.032-4.377\n\t\t\t\t\t\tc0.26,0.095,0.382,0.213,0.49,0.129c0.164-0.13-0.002-0.695-0.34-1.104s-1.109-0.875-2.144-0.688\n\t\t\t\t\t\tc-2.001,0.292-3.796,3.05-3.633,7.367c0.164,4.356,1.895,6.263,3.668,6.12c2.348-0.172,2.497-4.137,2.494-4.163\n\t\t\t\t\t\tc0.1,0.365,0.627,1.421,1.498,1.957c1.252,0.833,2.599,0.21,2.629-0.029C130.633,51.688,130.339,51.65,130.074,51.611z\n\t\t\t\t\t\t M131.157,36.977c-0.397,0.085-0.709,0.243-0.775,0.358c-0.29,0.497,0.606,0.526,1.43,1.498\n\t\t\t\t\t\tc0.597,0.704,1.088,1.814,1.094,4.28c0.007,2.777-0.854,4.389-0.854,4.389s-0.213-3.202-0.935-5.373\n\t\t\t\t\t\tc-0.606-1.823-1.491-2.673-2.404-2.919c-0.85-0.228-1.487,0.01-1.658,0.238s-0.076,0.389,0.168,0.665\n\t\t\t\t\t\tc0.244,0.276,1.377,1.501,2.216,4.524c0.789,2.842,0.893,3.765,1.024,4.472s0.258,1.386,0.905,1.443\n\t\t\t\t\t\tc0.46,0.04,1.424-0.8,2.219-2.96c0.423-1.054,0.808-2.278,1.011-3.944c0.381-3.08-0.149-4.973-0.91-5.796\n\t\t\t\t\t\tC133.158,37.278,132.392,36.753,131.157,36.977z M139.529,47.213c1.948-0.224,3.569-3.052,2.982-6.673\n\t\t\t\t\t\tc-0.106-0.653-0.375-1.867-0.943-2.583c-0.426-0.538-0.973-0.891-1.403-0.615c-0.26,0.236-0.128,0.378,0.164,1.215\n\t\t\t\t\t\tc0.292,0.836,0.412,1.987,0.38,3.117c-0.039,1.394-0.291,2.961-1.279,2.961c-1.021,0-1.49-1.887-1.492-3.975\n\t\t\t\t\t\tc-0.002-2.093,0.829-4.31,2.061-4.3c0.628,0.012,0.855,0.441,1.052,0.375c0.272-0.091,0.413-0.952-0.313-1.592\n\t\t\t\t\t\tc-0.413-0.365-1.001-0.466-1.56-0.397c-2.419,0.301-3.811,3.434-3.624,6.951C135.752,45.425,137.38,47.46,139.529,47.213z\n\t\t\t\t\t\t M145.628,44.787c1.515,0.026,2.403-2.327,2.68-3.779c0.203,0.594,0.482,1.172,0.864,1.664c1.306,1.69,2.804,1.247,3.31,0.984\n\t\t\t\t\t\tc0.268-0.139,0.403-0.329,0.379-0.45c-0.014-0.073-0.086-0.121-0.221-0.12c-0.761-0.005-1.35-0.307-1.926-1.249\n\t\t\t\t\t\tc-0.545-0.911-0.744-3.102-0.662-6.233c0.076-2.898-0.336-3.145-0.888-3.191c-0.947-0.078-1.215,0.941-1.324,1.842\n\t\t\t\t\t\tc-0.15,1.235-0.122,2.681-0.105,3.1c0.01,0.243,0.023,0.688,0.077,1.236c-0.174,1.228-0.597,3.492-1.341,3.448\n\t\t\t\t\t\tc-0.899-0.054-0.589-3.584-0.614-4.841c-0.02-1.043-0.045-2.252-0.962-3.028c-0.822-0.696-1.46-0.372-1.57-0.263\n\t\t\t\t\t\tc-0.175,0.173-0.065,0.431,0.043,0.857c0.12,0.474,0.2,2.01,0.238,4.057C143.646,40.891,143.24,44.643,145.628,44.787z\n\t\t\t\t\t\t M157.653,33.034c-1.42-0.098-1.575,2.98-1.534,4.971c0.052,2.5,0.824,3.789,2.097,3.61c0.758-0.106,1.073-0.619,1.056-0.869\n\t\t\t\t\t\tc-0.025-0.362-0.44-0.311-0.717-1.207c-0.34-1.504-0.41-2.85-0.249-4.672C158.452,33.225,158.059,33.062,157.653,33.034z\n\t\t\t\t\t\t M159.146,31.495c0.26,0.093,0.283-0.215,1.269-0.659c0.037-0.016,0.075-0.029,0.111-0.043\n\t\t\t\t\t\tc-0.167,0.823-0.362,2.163-0.43,4.646c-0.122,4.802,1.093,5.506,2.084,5.469c0.708-0.026,1.348-0.566,1.35-0.83\n\t\t\t\t\t\tc0.003-0.321-0.308-0.301-0.523-0.704c-0.487-0.802-0.629-2.096-0.625-4.917c0.044-1.726,0.21-3.044,0.374-4.116\n\t\t\t\t\t\tc0.462-0.075,1.018-0.172,1.714-0.317c2.379-0.495,2.569-2.178,2.294-2.358c-0.195-0.128-0.631,0.233-1.238,0.475\n\t\t\t\t\t\tc-0.829,0.331-1.742,0.524-2.532,0.685c0.024-0.163,0.046-0.321,0.064-0.473c0.165-1.38-0.145-1.597-0.572-1.57\n\t\t\t\t\t\tc-0.738,0.048-1.35,1.713-1.615,2.592c-0.501,0.186-0.913,0.419-1.261,0.725C159.065,30.582,158.878,31.4,159.146,31.495z\n\t\t\t\t\t\t M169.767,37.669c-0.163,0.581-1.266,3.171-3.484,2.843c-2.028-0.3-2.627-3.201-2.293-5.576\n\t\t\t\t\t\tc0.252-1.79,1.569-4.898,3.883-4.603c1.266,0.193,1.987,1.876,0.644,4.281c-0.739,1.323-1.79,2.002-2.322,2.279\n\t\t\t\t\t\tc0.213,0.858,0.64,1.375,1.301,1.421c0.713,0.049,1.354-0.274,1.843-0.843c0.154-0.18,0.277-0.33,0.393-0.312\n\t\t\t\t\t\tC169.872,37.181,169.841,37.405,169.767,37.669z M166.053,35.928c0.386-0.343,1.023-1.013,1.459-2.014\n\t\t\t\t\t\tc0.637-1.461,0.445-2.312,0.018-2.358c-0.569-0.061-1.407,1.512-1.485,3.318C166.029,35.25,166.031,35.602,166.053,35.928z\n\t\t\t\t\t\t M174.271,30.85c-0.17-0.386-0.72-0.87-1.799-0.714c-1.189,0.178-2.432,1.418-2.263,3.34c0.164,1.861,0.986,2.894,1.051,4.055\n\t\t\t\t\t\tc0.06,1.08-0.326,1.672-0.87,2.138c-0.257,0.219-0.283,0.328-0.229,0.428c0.054,0.099,0.193,0.148,0.274,0.163\n\t\t\t\t\t\tc0.317,0.085,2.019,0.054,2.875-1.728c0.914-1.871-0.402-3.806-0.759-4.771c-0.391-1.049-0.161-1.942,0.416-2.143\n\t\t\t\t\t\tc0.642-0.224,0.869,0.281,1.138,0.203C174.391,31.739,174.445,31.245,174.271,30.85z M153.379,42.311\n\t\t\t\t\t\tc0.913-0.181,0.801-1.27,0.726-1.99c-0.097-0.932-0.125-3.023,0.072-4.446c0.223-1.611,0.891-3.178,2.191-3.604\n\t\t\t\t\t\tc1.146-0.376,1.619,0.165,1.894-0.117c0.232-0.238-0.183-1.484-1.721-1.509c-1.773-0.029-2.703,2.153-2.97,2.93\n\t\t\t\t\t\tc0,0-0.437-1.385-1.277-1.166c-0.465,0.122-0.385,0.411-0.432,2.009c-0.047,1.596-0.18,3.627,0.031,5.384\n\t\t\t\t\t\tC152.104,41.557,152.467,42.492,153.379,42.311z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t</g>\n\t\t<path fill=\"#FFF200\" d=\"M157.366,27.533c0.539-0.235,1.102-0.034,1.257,0.45c0.155,0.484-0.156,1.067-0.695,1.302\n\t\t\tc-0.539,0.236-1.102,0.034-1.257-0.45C156.515,28.351,156.827,27.768,157.366,27.533z M119.523,43.443\n\t\t\tc-0.307-0.039-0.601,0.927-2.176,1.357c-0.184-1.752-0.28-2.686-0.278-3.95c0.003-1.842,0.643-2.734,0.871-2.994\n\t\t\tc0.889-0.302,1.761-0.595,2.492-0.854c1.426-0.504,2.373-0.854,3.031-1.233c1.285-0.739,2.168-1.752,2.44-2.628\n\t\t\tc0.263-0.848,0.108-1.352-0.159-1.391c-0.268-0.04-0.628,0.384-1.766,0.902c-1.137,0.518-2.508,1.022-4.332,1.63\n\t\t\tc-1.822,0.608-4.417,1.551-6.091,2.872c-1.67,1.319-2.117,2.651-2.225,3.43c-0.095,0.645,0.021,0.83,0.164,0.871\n\t\t\tc0.261,0.074,0.47-0.245,0.779-0.608c0.34-0.4,1.422-1.42,3.907-2.374c-2.038,1.607-1.804,5.732-1.598,7.467\n\t\t\tc-1.159,0.567-1.417,1.691-1.45,2.084c-0.032,0.393,0.058,0.739,0.21,0.777c0.161,0.04,0.533-0.636,1.571-0.962\n\t\t\tc0.69,4.555,1.107,9.428,0.505,11.861c-0.075,0.302-0.256,0.905,0.074,1.007c0.727,0.155,1.8-0.473,2.483-1.972\n\t\t\tc0.704-1.547,0.439-5.103-0.081-9.294c-0.117-0.94-0.224-1.812-0.321-2.628c1.211-0.291,1.874-1.491,2.028-1.952\n\t\t\tC119.785,44.311,119.815,43.491,119.523,43.443z M129.771,51.4c-0.265-0.039-0.868-0.51-1.296-1.466\n\t\t\tc-0.428-0.956-0.666-2.03-0.996-4.399c-0.33-2.376-0.494-2.793-1.161-2.785c-1.585,0.11-1.332,3.047-1.225,4.474\n\t\t\tc-0.121,2.203-0.473,3.913-1.194,3.923c-0.693,0.009-1.276-0.779-1.295-4.642c0.132-5.085,2.759-4.477,3.032-4.377\n\t\t\tc0.26,0.094,0.382,0.213,0.49,0.129c0.164-0.13-0.002-0.695-0.34-1.104s-1.109-0.875-2.144-0.688\n\t\t\tc-2.001,0.292-3.796,3.05-3.633,7.367c0.164,4.356,1.895,6.263,3.668,6.12c2.348-0.172,2.497-4.137,2.494-4.163\n\t\t\tc0.1,0.365,0.627,1.421,1.498,1.957c1.252,0.833,2.599,0.21,2.629-0.029C130.33,51.477,130.036,51.439,129.771,51.4z\n\t\t\t M130.853,36.765c-0.397,0.085-0.709,0.243-0.775,0.358c-0.29,0.497,0.606,0.526,1.43,1.498c0.597,0.704,1.088,1.814,1.094,4.28\n\t\t\tc0.007,2.777-0.854,4.389-0.854,4.389s-0.213-3.202-0.935-5.373c-0.606-1.823-1.491-2.673-2.404-2.919\n\t\t\tc-0.85-0.228-1.487,0.01-1.658,0.238s-0.076,0.389,0.168,0.665c0.244,0.276,1.377,1.501,2.216,4.524\n\t\t\tc0.789,2.842,0.893,3.765,1.024,4.472c0.131,0.706,0.258,1.386,0.905,1.443c0.46,0.04,1.424-0.8,2.219-2.96\n\t\t\tc0.423-1.054,0.808-2.278,1.011-3.944c0.381-3.08-0.149-4.973-0.91-5.796C132.854,37.066,132.088,36.542,130.853,36.765z\n\t\t\t M139.225,47.001c1.948-0.224,3.569-3.052,2.982-6.673c-0.106-0.653-0.375-1.867-0.943-2.583\n\t\t\tc-0.426-0.538-0.973-0.891-1.403-0.615c-0.26,0.236-0.128,0.378,0.164,1.215c0.292,0.836,0.412,1.987,0.38,3.117\n\t\t\tc-0.039,1.394-0.291,2.961-1.279,2.961c-1.021,0-1.49-1.887-1.492-3.975c-0.002-2.093,0.829-4.31,2.061-4.3\n\t\t\tc0.628,0.012,0.855,0.441,1.052,0.375c0.272-0.091,0.412-0.951-0.313-1.592c-0.413-0.365-1.001-0.466-1.56-0.397\n\t\t\tc-2.419,0.301-3.811,3.434-3.624,6.951C135.449,45.214,137.077,47.248,139.225,47.001z M145.325,44.575\n\t\t\tc1.515,0.026,2.403-2.327,2.68-3.779c0.203,0.594,0.482,1.172,0.864,1.664c1.306,1.69,2.804,1.247,3.31,0.984\n\t\t\tc0.268-0.139,0.403-0.329,0.379-0.451c-0.014-0.073-0.086-0.121-0.221-0.12c-0.761-0.005-1.35-0.307-1.926-1.249\n\t\t\tc-0.545-0.911-0.744-3.102-0.662-6.232c0.076-2.898-0.336-3.145-0.888-3.191c-0.947-0.078-1.215,0.941-1.324,1.842\n\t\t\tc-0.15,1.235-0.122,2.68-0.105,3.1c0.01,0.243,0.023,0.688,0.077,1.236c-0.174,1.228-0.597,3.492-1.341,3.448\n\t\t\tc-0.899-0.053-0.589-3.584-0.614-4.841c-0.02-1.043-0.045-2.252-0.962-3.028c-0.822-0.696-1.46-0.372-1.57-0.263\n\t\t\tc-0.175,0.173-0.065,0.431,0.043,0.857c0.12,0.474,0.2,2.01,0.238,4.057C143.342,40.679,142.937,44.431,145.325,44.575z\n\t\t\t M157.349,32.822c-1.42-0.098-1.575,2.98-1.534,4.971c0.052,2.5,0.824,3.789,2.097,3.61c0.757-0.106,1.073-0.619,1.056-0.869\n\t\t\tc-0.025-0.362-0.44-0.311-0.717-1.207c-0.34-1.504-0.41-2.85-0.249-4.672C158.149,33.014,157.756,32.85,157.349,32.822z\n\t\t\t M158.843,31.284c0.26,0.093,0.283-0.215,1.269-0.659c0.037-0.016,0.074-0.029,0.111-0.043c-0.167,0.823-0.362,2.163-0.43,4.646\n\t\t\tc-0.122,4.802,1.093,5.506,2.084,5.469c0.708-0.026,1.348-0.566,1.35-0.83c0.003-0.321-0.308-0.301-0.523-0.704\n\t\t\tc-0.487-0.802-0.629-2.096-0.625-4.917c0.044-1.726,0.21-3.044,0.374-4.116c0.462-0.075,1.018-0.172,1.715-0.317\n\t\t\tc2.379-0.495,2.569-2.178,2.294-2.358c-0.195-0.128-0.631,0.233-1.238,0.475c-0.829,0.331-1.742,0.524-2.532,0.685\n\t\t\tc0.024-0.163,0.046-0.321,0.064-0.473c0.165-1.38-0.145-1.597-0.572-1.57c-0.738,0.048-1.35,1.713-1.615,2.592\n\t\t\tc-0.501,0.186-0.914,0.419-1.261,0.725C158.762,30.371,158.575,31.188,158.843,31.284z M169.464,37.457\n\t\t\tc-0.163,0.581-1.266,3.171-3.484,2.843c-2.028-0.3-2.627-3.201-2.293-5.576c0.252-1.79,1.569-4.898,3.883-4.603\n\t\t\tc1.266,0.193,1.987,1.876,0.644,4.281c-0.739,1.323-1.79,2.002-2.322,2.279c0.213,0.858,0.64,1.375,1.301,1.421\n\t\t\tc0.713,0.049,1.354-0.274,1.843-0.843c0.154-0.18,0.277-0.33,0.393-0.312C169.569,36.97,169.538,37.194,169.464,37.457z\n\t\t\t M165.75,35.716c0.386-0.343,1.023-1.013,1.459-2.014c0.637-1.461,0.445-2.312,0.018-2.358c-0.569-0.061-1.407,1.512-1.485,3.318\n\t\t\tC165.725,35.038,165.728,35.391,165.75,35.716z M173.968,30.638c-0.17-0.386-0.72-0.87-1.799-0.714\n\t\t\tc-1.189,0.178-2.432,1.418-2.263,3.34c0.164,1.861,0.986,2.894,1.051,4.055c0.06,1.08-0.326,1.672-0.87,2.138\n\t\t\tc-0.257,0.219-0.283,0.328-0.228,0.428c0.054,0.099,0.193,0.148,0.274,0.163c0.317,0.085,2.019,0.054,2.875-1.728\n\t\t\tc0.914-1.871-0.402-3.805-0.759-4.77c-0.391-1.049-0.161-1.943,0.416-2.143c0.642-0.224,0.869,0.281,1.138,0.203\n\t\t\tC174.087,31.527,174.141,31.033,173.968,30.638z M153.075,42.099c0.913-0.181,0.801-1.27,0.726-1.99\n\t\t\tc-0.097-0.932-0.125-3.023,0.072-4.446c0.223-1.611,0.891-3.178,2.191-3.604c1.146-0.376,1.619,0.165,1.894-0.117\n\t\t\tc0.232-0.238-0.183-1.484-1.721-1.509c-1.773-0.029-2.703,2.153-2.97,2.93c0,0-0.437-1.385-1.277-1.166\n\t\t\tc-0.465,0.122-0.385,0.411-0.432,2.009c-0.047,1.596-0.18,3.627,0.031,5.384C151.801,41.345,152.163,42.28,153.075,42.099z\"/>\n\t</g>\n\t\n\t\t<linearGradient id=\"cadbury_logo_2_\" gradientUnits=\"userSpaceOnUse\" x1=\"151.1472\" y1=\"251.8356\" x2=\"178.1811\" y2=\"232.0889\" gradientTransform=\"matrix(0.99 0.1407 0.1407 -0.99 -56.0405 236.3141)\">\n\t\t<stop offset=\"0\" style=\"stop-color:#986E3A\"/>\n\t\t<stop offset=\"0.511\" style=\"stop-color:#D6B37C\"/>\n\t\t<stop offset=\"1\" style=\"stop-color:#9A673B\"/>\n\t</linearGradient>\n\t<path id=\"cadbury_logo_1_\" fill=\"url(#cadbury_logo_2_)\" d=\"M160.872,15.197c0.086-0.372,0.157-0.937-0.174-1.216\n\t\tc-0.116-0.072-0.243-0.08-0.381-0.036c-0.196,0.076-0.326,0.259-0.39,0.459c-0.353,0.937-0.622,1.924-1.184,2.793\n\t\tc-0.168,0.259-0.395,0.583-0.658,0.576c-0.065-0.004-0.117-0.039-0.155-0.17c-0.175-0.763,0.2-1.636,0.454-2.383\n\t\tc0.091-0.22,0.15-0.53,0.046-0.738c-0.059-0.109-0.167-0.174-0.284-0.184c-0.334-0.017-0.534,0.258-0.7,0.522\n\t\tc-0.606,1.125-1.099,2.418-1.915,3.445c-0.122,0.126-0.242,0.298-0.432,0.28c-0.082-0.012-0.148-0.077-0.178-0.183\n\t\tc-0.106-0.462,0.035-1.152,0.243-1.692c0.152-0.393,0.327-0.638,0.402-1.033c0.03-0.212-0.035-0.402-0.231-0.509\n\t\tc-0.105-0.045-0.209-0.066-0.358,0.006c-0.282,0.153-0.53,0.382-0.862,0.444c0.066-0.236,0.151-0.459,0.136-0.708\n\t\tc-0.02-0.211-0.089-0.449-0.284-0.531c-0.189-0.069-0.423-0.018-0.597,0.134c-0.499,0.5-0.529,1.315-0.303,1.961\n\t\tc-0.157,0.821-0.547,1.604-0.992,2.3c-0.166,0.224-0.328,0.479-0.608,0.514c-0.188,0.001-0.279-0.133-0.327-0.364\n\t\tc0.275-0.536,0.607-1.127,0.758-1.694c0.119-0.441,0.282-1.121,0.01-1.539c-0.058-0.102-0.194-0.172-0.338-0.161\n\t\tc-0.27,0.011-0.47,0.209-0.628,0.407c-0.595,0.865-0.739,1.875-0.754,2.904c-0.107,0.328-0.283,0.666-0.545,0.914\n\t\tc-0.124,0.123-0.334,0.24-0.5,0.161c-0.094-0.062-0.15-0.161-0.169-0.275c-0.096-0.637,0.147-1.258,0.35-1.852\n\t\tc0.362-1.059,0.739-1.311,0.551-1.759c-0.073-0.165-0.239-0.27-0.407-0.277c-0.219-0.021-0.469,0.105-0.604,0.312\n\t\tc-0.295,0.49-0.602,1.004-1.025,1.409c-0.249,0.222-0.459,0.429-0.829,0.589c-0.023-0.205-0.069-0.415-0.131-0.603\n\t\tc-0.197-0.605-0.578-1.196-1.284-1.15c-0.245,0.015-0.485,0.143-0.651,0.244c0.09-0.875,0.321-1.735,0.74-2.5\n\t\tc0.255-0.467,0.664-0.939,0.713-1.334c0.026-0.212-0.065-0.419-0.243-0.524c-0.186-0.096-0.374-0.096-0.583,0.004\n\t\tc-0.423,0.242-0.674,0.708-0.888,1.135c-0.402,0.443-1.005,0.643-1.614,0.777c-0.808,0.21-1.324-0.023-1.864-0.518\n\t\tc-0.147-0.116-0.328-0.243-0.541-0.226c-0.222-0.002-0.444,0.199-0.531,0.354c-0.114,0.182-0.118,0.435-0.006,0.61\n\t\tc0.457,0.663,1.038,1.173,1.296,2.062c0.059,0.206,0.106,0.411,0.107,0.626c-1.579,0.918-2.489,2.841-2.42,4.606\n\t\tc-0.157,0.514-0.311,1.399-0.913,1.365c-0.304-0.063-0.729-1.071,0.118-4.043c0.044-0.447,0.176-0.92-0.058-1.35\n\t\tc-0.134-0.242-0.449-0.288-0.698-0.28c-1.978,0.201-3.175,2.511-4.069,4.116c-1.125,1.8-2.473,2.883-3.843,3.561\n\t\tc-3.361,1.665-7.159,1.041-7.425-2.664c-0.255-3.531,1.91-7.598,6.584-9.522c3.61-1.485,5.994-0.295,5.953,1.836\n\t\tc-0.02,1.037-0.719,4.227-5.229,5.846c-0.775,0.278-2.187,0.391-2.762-0.277c-0.902-1.064-0.583-2.368-0.007-3.289\n\t\tc1.005-1.489,2.717-2.402,4.498-2.85c0.146-0.029,0.267-0.096,0.342-0.259c0.044-0.111,0.042-0.214-0.014-0.355\n\t\tc-0.096-0.19-0.278-0.234-0.459-0.215c-1.623,0.229-3.108,0.916-4.264,1.891c-1.366,1.243-2.38,2.854-2.253,4.68\n\t\tc0.092,1.191,0.898,2.265,2.078,2.571c1.308,0.292,3.093-0.317,4.279-0.927c2.478-1.401,4.552-3.835,4.883-6.584\n\t\tc0.121-1.23-0.477-2.475-1.557-3.129c-1.735-0.995-5.294-0.958-8.865,1.322c-1.286,0.823-3.225,2.255-4.59,4.855\n\t\tc-1.364,2.601-1.449,6.171,0.654,8.159c1.531,1.447,4.03,1.905,6.552,1.207c1.826-0.506,3.653-1.959,5.125-3.85\n\t\tc-0.081,1.148,0.661,1.663,1.375,1.677c1.581,0.02,2.267-1.975,2.267-1.975c0.19,0.575,0.264,0.837,0.872,0.994\n\t\tc1.026,0.261,1.476-0.572,1.657-1.215c0.175,0.408,0.636,0.79,1.117,0.739c0.759-0.073,1.291-0.769,1.577-1.373\n\t\tc1.009-2.136,1.002-4.585,0.396-6.807c0.431-0.025,0.712-0.134,1.084-0.257c0.21-0.068,0.373-0.122,0.579-0.205\n\t\tc-0.345,1.389-0.567,2.831-0.558,4.315c0.044,0.98,0.096,2.118,0.788,2.783c0.298,0.306,0.729,0.407,1.152,0.268\n\t\tc0.539-0.158,0.988-0.897,1.171-1.439c0.132-0.331,0.325-1.121,0.373-1.659c0.214-0.151,0.435-0.286,0.641-0.451\n\t\tc0.085-0.069,0.13-0.101,0.212-0.169c-0.101,0.607-0.207,1.302-0.064,1.912c0.091,0.424,0.355,0.799,0.773,0.9\n\t\tc0.688,0.142,1.395-0.759,1.801-1.273c0.137,0.243,0.307,0.499,0.589,0.593c0.332,0.109,0.784-0.029,1.067-0.36\n\t\tc0.826-0.967,1.176-2.288,1.596-3.486l0.045-0.125c0.215-0.056,0.397-0.136,0.595-0.257c-0.181,0.503-0.33,1.025-0.396,1.563\n\t\tc-0.089,0.655,0.013,1.49,0.571,1.83c0.286,0.15,0.666-0.028,0.87-0.193c0.658-0.565,1.088-1.383,1.492-2.119l0.031-0.05\n\t\tc-0.014,0.404,0.055,0.946,0.254,1.288c0.114,0.201,0.361,0.368,0.583,0.35c0.677-0.078,1.008-0.707,1.391-1.23\n\t\tc0.066-0.09,0.136-0.209,0.177-0.266c-0.169,0.857-0.485,1.799-0.675,2.663c-0.049,0.22-0.204,0.705-0.125,0.998\n\t\tc0.089,0.332,0.34,0.563,0.83,0.614c0.091,0.008,0.139-0.037,0.148-0.106c-0.116-0.546,0.002-0.992,0.22-1.791\n\t\tC160.065,18.438,160.489,16.803,160.872,15.197z M137.211,19.107c-0.455,1.511-1.221,3.579-1.733,4.151\n\t\tc-0.694,0.776-1.06-0.081-0.88-0.598c0.272-1.31,0.914-3.001,1.948-3.999c0.137-0.115,0.473-0.4,0.664-0.182\n\t\tC137.279,18.616,137.261,18.942,137.211,19.107z M141.501,20.641c-0.125,0.378-0.278,0.806-0.557,1.127\n\t\tc-0.081,0.099-0.235,0.216-0.368,0.117c-0.328-0.263-0.291-0.978-0.222-1.421c0.131-0.847,0.558-1.744,1.347-2.201l0.043-0.022\n\t\tC141.852,19.053,141.705,19.865,141.501,20.641z M145.322,20.76c-0.086,0.025-0.165,0.006-0.233-0.034\n\t\tc-0.314-0.245-0.397-0.973-0.422-1.517c-0.02-0.431,0.041-1.236,0.425-1.577c0.242-0.179,0.531-0.126,0.629,0.136\n\t\tc0.209,0.505,0.213,1.379,0.116,1.958C145.779,20.072,145.676,20.676,145.322,20.76z\"/>\n</g>\n</svg>\n\n`;\n","/**\n * Functions for creating SVGs and SVG elements.\n */\n\nimport { createElement, createElementNS } from \"../../util/crossplatform\";\nimport { generate } from \"../../util/guid\";\n\n\nexport const svgElem = (type: string): SVGElement => {\n return createElementNS(\"http://www.w3.org/2000/svg\", type);\n};\n\nexport const svgRect = (height: number, width: number): SVGElement => {\n const el = svgElem(\"rect\");\n el.setAttribute(\"height\", `${height}`);\n el.setAttribute(\"width\", `${width}`);\n return el;\n};\n\nexport const svgRoot = (): SVGElement => {\n const el = svgElem(\"svg\");\n el.setAttribute(\"xmlns\", \"http://www.w3.org/2000/svg\");\n el.setAttribute(\"xmlns:xlink\", \"http://www.w3.org/1999/xlink\");\n el.setAttribute(\"version\", \"1.1\");\n return el;\n};\n\nexport const svgUse = (link: string): SVGElement => {\n const el = svgElem(\"use\");\n el.setAttribute(\"xlink:href\", link); // For environments where plain href is not supported.\n el.setAttribute(\"href\", link); // For environments where xlink:href is deprecated.\n return el;\n};\n\n// Create SVG with height and width of supplied SVG string.\nexport function initSvgFromBackground(img: string): [SVGElement | null, number, number] {\n const svg = svgRoot();\n\n // Get dimensions\n const matches = /viewBox=\"0 0 (.+?) (.+?)\"/.exec(img) || [\"0\", \"0\"];\n const bgWidth = parseFloat(matches[1]);\n const bgHeight = parseFloat(matches[2]);\n\n svg.setAttribute(\"height\", `${bgHeight}`);\n svg.setAttribute(\"width\", `${bgWidth}`);\n return [svg, bgHeight, bgWidth];\n}\n\n// Create SVG with supplied height and width.\nexport function initSvgFromDimensions(bgHeight: number, bgWidth: number): SVGElement {\n const svg = svgRoot();\n svg.setAttribute(\"height\", `${bgHeight}`);\n svg.setAttribute(\"width\", `${bgWidth}`);\n return svg;\n}\n\n// Add a definition by setting innerHTML to defText.\nexport const addDef = (defs: SVGElement, defText: string, id: string) => {\n const elem = svgElem(\"g\");\n defs.appendChild(elem);\n elem.setAttribute(\"id\", id);\n elem.innerHTML = defText;\n};\n\n// Add background image to SVG.\nexport function addBackground(svg: SVGElement, defs: SVGElement, backgroundImg: string) {\n const uuid = generate();\n addDef(defs, backgroundImg, `bgdef-${uuid}`);\n svg.appendChild(svgUse(`#bgdef-${uuid}`));\n}\n\n// Definition for drop shadow.\nexport const dropShadow = (dx: number, dy: number, blur: number, id: string): HTMLElement => {\n const shadow = createElement(\"filter\");\n shadow.setAttribute(\"id\", id);\n shadow.setAttribute(\"height\", \"200%\");\n shadow.setAttribute(\"width\", \"200%\");\n shadow.setAttribute(\"x\", \"-50%\");\n shadow.setAttribute(\"y\", \"-50%\");\n\n const feOffset = createElement(\"feOffset\");\n shadow.appendChild(feOffset);\n feOffset.setAttribute(\"result\", \"offOut\");\n feOffset.setAttribute(\"in\", \"SourceAlpha\");\n feOffset.setAttribute(\"dx\", `${dx}`);\n feOffset.setAttribute(\"dy\", `${dy}`);\n\n const feGaussianBlur = createElement(\"feGaussianBlur\");\n shadow.appendChild(feGaussianBlur);\n feGaussianBlur.setAttribute(\"result\", \"blurOut\");\n feGaussianBlur.setAttribute(\"in\", \"offOut\");\n feGaussianBlur.setAttribute(\"stdDeviation\", `${blur}`);\n\n const feBlend = createElement(\"feBlend\");\n shadow.appendChild(feBlend);\n feBlend.setAttribute(\"in\", \"SourceGraphic\");\n feBlend.setAttribute(\"in2\", \"blurOut\");\n feBlend.setAttribute(\"mode\", \"normal\");\n\n return shadow;\n};\n","/**\n * Functions for modifying SVGs and SVG elements.\n */\n\nimport { BBox } from \"svg-path-bbox\";\n\n/**\n * The innerHTML/outerHTML properties of an element does not respect case.\n * This function restores case to case-sensitive elements.\n */\nexport const fixCase = (svg: string): string => {\n let str = svg;\n str = str.replace(/feoffset/gi, \"feOffset\");\n str = str.replace(/fegaussianblur/gi, \"feGaussianBlur\");\n str = str.replace(/feblend/gi, \"feBlend\");\n str = str.replace(/lineargradient/gi, \"linearGradient\");\n str = str.replace(/stddeviation/gi, \"stdDeviation\");\n return str;\n};\n\n// Translate and scale the group containing the text.\nexport function transformTextEnclosure(\n textEnclosure: SVGElement,\n textBbox: BBox,\n boundsHeight: number,\n boundsWidth: number,\n heightPaddingFactor?: number,\n widthPaddingFactor?: number,\n) {\n const heightPadFactor = heightPaddingFactor || 1;\n const widthPadFactor = widthPaddingFactor || 1;\n\n const textRect = {\n x: textBbox[0],\n y: textBbox[1],\n width: textBbox[2] - textBbox[0],\n height: textBbox[3] - textBbox[1],\n };\n if (textRect.width <= 0) {\n return;\n }\n const scaleFactor = boundsScaleFactor(textRect.height, textRect.width, boundsHeight*heightPadFactor, boundsWidth*widthPadFactor);\n const shiftLeft = (boundsWidth - scaleFactor * textRect.width) / 2 - scaleFactor * textRect.x;\n const shiftTop = (boundsHeight - scaleFactor * textRect.height) / 2 - scaleFactor * textRect.y;\n textEnclosure.setAttribute(\"transform\", `translate(${shiftLeft} ${shiftTop}) scale(${scaleFactor} ${scaleFactor})`);\n}\n\n// Factor to multiply text dimensions by to scale it to the supplied bounds.\nfunction boundsScaleFactor(textRectHeight: number, textRectWidth: number, boundsHeight: number, boundsWidth: number) {\n const heightRatio = boundsHeight / textRectHeight;\n const widthRatio = boundsWidth / textRectWidth;\n if (heightRatio > 1 && widthRatio > 1) {\n // Text smaller than bounds.\n return Math.min(heightRatio, widthRatio);\n } else if (heightRatio > 1 && widthRatio < 1) {\n // Text shorter but wider than bounds.\n return widthRatio;\n } else if (heightRatio < 1 && widthRatio > 1) {\n // Text narrower but taller than bounds.\n return heightRatio;\n }\n return Math.min(heightRatio, widthRatio); // Text larger than bounds.\n}\n","import { ParseError } from \"../../util/exception\";\n\ntype Coords = number[];\n\n// A function from [x, y] to [x', y'].\ntype Transformer = (coords: Coords) => Coords;\n\ninterface Path {\n pathElement: SVGPathElement;\n pathData: Segment[];\n}\n\ninterface Segment {\n type: string;\n relative: boolean;\n // Plus any data stuck in for the segment.\n}\n\nconst segmentSchemas: { [key: string]: string[] } = {\n m: [\"x\", \"y\"],\n z: [],\n l: [\"x\", \"y\"],\n h: [\"x\"],\n v: [\"y\"],\n c: [\"x1\", \"y1\", \"x2\", \"y2\", \"x\", \"y\"],\n s: [\"x2\", \"y2\", \"x\", \"y\"],\n q: [\"x1\", \"y1\", \"x\", \"y\"],\n t: [\"x\", \"y\"],\n a: [\"rx\", \"ry\", \"xRotation\", \"largeArc\", \"sweep\", \"x\", \"y\"],\n};\n\n// An object that warps an SVG element.\n// Based on Warp.js.\nexport class Warp {\n private paths: Path[];\n\n constructor(elem: SVGElement) {\n const pathElements = Array.from(elem.querySelectorAll(\"path\"));\n this.paths = pathElements.map((pathElement: SVGPathElement) => {\n const pathString = pathElement.getAttribute(\"d\") || \"\";\n const pathData: Segment[] = this.parsePath(pathString);\n return { pathElement, pathData };\n });\n }\n\n transform(transformer: Transformer): void {\n for (const path of this.paths) {\n path.pathData = this.runTransformer(path.pathData, transformer);\n }\n this.update();\n }\n\n private encodePath(pathData: Segment[]): string {\n let prevType = \"\";\n const magnitude = 10 ** 2;\n const callback = (segment: Segment) => {\n const output: string[] = [];\n const outputType = segment.relative ? segment.type : segment.type.toUpperCase();\n let first = prevType !== outputType;\n const schema: string[] = segmentSchemas[segment.type];\n if (first) {\n output.push(outputType);\n prevType = outputType;\n }\n for (const property of schema) {\n const value = (segment as any)[property];\n let outputValue;\n switch (typeof value) {\n case \"boolean\":\n {\n outputValue = (value as any) | 0;\n }\n break;\n case \"number\":\n {\n outputValue = ((value * magnitude) | 0) / magnitude;\n }\n break;\n default:\n throw new ParseError(\"Failed to encode path.\");\n }\n if (!first) {\n output.push(\" \");\n }\n output.push(outputValue);\n first = false;\n }\n return output.join(\"\");\n };\n return pathData.map(callback).join(\"\");\n }\n\n private parsePath(pathString: string): Segment[] {\n const segmentExpr = /([mzlhvcsqta])([^mzlhvcsqta]*)/gi;\n const numberExpr = /-?[0-9]*\\.?[0-9]+(?:e[-+]?\\d+)?/gi;\n\n const pathData: { type; relative }[] = [];\n let segmentMatch;\n segmentExpr.lastIndex = 0;\n\n while ((segmentMatch = segmentExpr.exec(pathString))) {\n const type = segmentMatch[1].toLowerCase();\n const numbers = (segmentMatch[2].match(numberExpr) || []).map(parseFloat);\n const relative = type === segmentMatch[1];\n const schema: string[] = segmentSchemas[type];\n if (numbers.length < schema.length) {\n throw new ParseError(\n `Path type \"${type}\" given ${numbers.length} arguments, expected ${schema.length}.`,\n );\n }\n if (schema.length > 0) {\n if (numbers.length % schema.length !== 0) {\n throw new ParseError(\n `Path type \"${type}\" given ${numbers.length} arguments, not divisible by ${schema.length}`,\n );\n }\n for (let i = 0; i < numbers.length / schema.length; i++) {\n const segmentData = { type, relative };\n for (let j = 0; j < schema.length; j++) {\n (segmentData as any)[schema[j]] = numbers[i * schema.length + j];\n }\n pathData.push(segmentData);\n }\n } else {\n pathData.push({ type, relative });\n }\n }\n\n return pathData;\n }\n\n private runTransformer(path: any, transformer: Transformer): any {\n const pointGroups = [\n [\"x1\", \"y1\"],\n [\"x2\", \"y2\"],\n [\"x\", \"y\"],\n ];\n\n const callback = (segment: Segment) => {\n for (let i = 0; i < pointGroups.length; i++) {\n const [x, y]: string[] = pointGroups[i];\n if (x in segment && y in segment) {\n const oldPoints: Coords = [(segment as any)[x], (segment as any)[y]];\n const newPoints = transformer(oldPoints);\n if (newPoints.length < 2) {\n throw new ParseError(\"Transformer must return at least 2 points.\");\n }\n (segment as any)[x] = newPoints[0];\n (segment as any)[y] = newPoints[1];\n }\n }\n return segment;\n };\n\n return this.transformPath(path, callback as any);\n }\n\n private transformPath(path: any, transformer: Transformer): any {\n const newPath: number[] = [];\n for (let i = 0; i < path.length; i++) {\n const segment = JSON.parse(JSON.stringify(path[i]));\n const result: Coords = transformer(segment);\n if (Array.isArray(result)) {\n newPath.push(...result);\n } else if (result) {\n newPath.push(result);\n }\n }\n return newPath;\n }\n\n private update(): void {\n for (const { pathElement, pathData } of this.paths) {\n const pathString = this.encodePath(pathData);\n pathElement.setAttribute(\"d\", pathString);\n }\n }\n}\n","import { ModuleProduct } from \"../../ModuleProduct\";\nimport { fontWoffDataUrl } from \"./font\";\nimport { backgroundSvg } from \"./background\";\nimport svgPathBbox from \"svg-path-bbox\";\nimport { svgElem, dropShadow, initSvgFromBackground, addBackground, svgRect } from \"../../svg/elements\";\nimport { transformTextEnclosure, fixCase } from \"../../svg/modify\";\nimport { Warp } from \"../../svg/Warp\";\nimport { Path } from \"opentype.js\";\nimport { _loadFontExternalDataURL } from \"../../../util/font\";\n\nexport class Favourites extends ModuleProduct {\n moduleName = \"Favourites\";\n\n svgPreview(text: string): string {\n return this.svg(text);\n }\n\n svgPrint(text: string): string {\n return this.svg(text);\n }\n\n private svg(text: string): string {\n const font = _loadFontExternalDataURL(fontWoffDataUrl);\n const capitalise = (word: string): string => word.charAt(0).toUpperCase() + word.substr(1).toLowerCase();\n const parsedtext = text !== \"\" ? capitalise(text) : \"\";\n const basePath = font.getPath(parsedtext, 0, 72, 72);\n return this.brandSvg(basePath, backgroundSvg);\n }\n\n private brandSvg(basePath: Path, backgroundImg: string): string {\n const pathSvg = basePath.toSVG(2);\n const box = basePath.getBoundingBox();\n const pathWidth = box.x2 - box.x1;\n const pathData = basePath.toPathData(3);\n\n const textSvg = (): SVGElement => {\n const g = svgElem(\"g\");\n const gdefs = svgElem(\"defs\");\n g.appendChild(gdefs);\n gdefs.appendChild(dropShadow(3, 7, 4, \"shadow\"));\n\n const layer0 = svgElem(\"g\");\n g.appendChild(layer0);\n layer0.setAttribute(\"filter\", \"url(#shadow)\");\n layer0.innerHTML = pathSvg;\n\n const layer1 = svgElem(\"g\");\n g.appendChild(layer1);\n layer1.setAttribute(\"fill\", \"red\");\n layer1.setAttribute(\"stroke\", \"red\");\n layer1.setAttribute(\"stroke-width\", \"9\");\n layer1.innerHTML = pathSvg;\n\n const layer2 = svgElem(\"g\");\n g.appendChild(layer2);\n layer2.setAttribute(\"fill\", \"#9d2621\");\n layer2.setAttribute(\"transform\", \"translate(1,1)\");\n layer2.innerHTML = pathSvg;\n\n const layer3 = svgElem(\"g\");\n g.appendChild(layer3);\n layer3.setAttribute(\"fill\", \"yellow\");\n layer3.innerHTML = pathSvg;\n\n const warp = new Warp(g);\n warp.transform(([x, y]) => [x, y + (pathWidth / 2 - x) ** 2 / (pathWidth * 2.9)]);\n return g;\n };\n\n const [svg, bgHeight, bgWidth] = initSvgFromBackground(backgroundImg);\n if (!svg) {\n return \"\";\n }\n\n const defs = svgElem(\"defs\");\n svg.appendChild(defs);\n addBackground(svg, defs, backgroundImg);\n\n const boundsHeight = bgHeight * 0.23;\n const boundsWidth = bgWidth * 0.94;\n const boundsLeft = bgWidth * 0.04;\n const boundsTop = bgHeight * 0.53;\n\n const bounds = svgElem(\"g\");\n svg.appendChild(bounds);\n bounds.setAttribute(\"transform\", `translate(${boundsLeft} ${boundsTop}) rotate(-21)`);\n\n const boundsRect = svgRect(boundsHeight, boundsWidth);\n boundsRect.setAttribute(\"opacity\", \"0\");\n bounds.appendChild(boundsRect);\n\n const textEnclosure = svgElem(\"g\");\n bounds.appendChild(textEnclosure);\n\n const text = textSvg();\n textEnclosure.appendChild(text);\n\n const textBbox = svgPathBbox(pathData);\n transformTextEnclosure(textEnclosure, textBbox, boundsHeight, boundsWidth);\n return fixCase(svg.outerHTML);\n }\n}\n","export const fontTtfDataUrl =\n \"data:application/octet-stream;base64,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ZWxmIE1ha2VyIDIuMy41AABNAGEAbAB0AGUAcwBlAHIAcwBSAGUAZwB1AGwAYQByAABNYWx0ZXNlcnNSZWd1bGFyAABNAGEAbAB0AGUAcwBlAHIAcwAATWFsdGVzZXJzAABSAGUAZwB1AGwAYQByAABSZWd1bGFyAAAAAAACAAAAAAAA/4MAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAKwAAAABAAIBAgEDAAMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQCsAQQBBQEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMBFAEVARYBFwEYARkBGgEbARwBHQEeAR8BIAEhASIBIwEkASUBJgEnASgBKQEqASsBLAEtAS4BLwEwATEBMgEzATQBNQE2ATcBOAE5AToBOwE8AT0BPgE/AUABQQFCAUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOAU8BUAFRAVIBUwFUAVUBVgFXAVgBWQFaAVsBXAFdAV4BXwFgAWEBYgFjAWQBZQFmAWcBaAFpAWoBawFsAW0BbgFvAXABcQFyAXMBdAljb250cm9sTEYJY29udHJvbENSB0FwLmxpZ2EHQWoubGlnYQdFdC5saWdhB0VmLmxpZ2EHRWoubGlnYQdFay5saWdhB0VsLmxpZ2EHRWIubGlnYQdGdC5saWdhB0ZoLmxpZ2EHRmsubGlnYQdGbC5saWdhB0ZiLmxpZ2EHSHQubGlnYQdIZi5saWdhB0l0LmxpZ2EHSXAubGlnYQdJZi5saWdhB0lqLmxpZ2EHSWwubGlnYQdJYi5saWdhB0p0LmxpZ2EHSmYubGlnYQdKaC5saWdhB0prLmxpZ2EHSmwubGlnYQdKYi5saWdhB0t0LmxpZ2EHS3AubGlnYQdLeS5saWdhB0xqLmxpZ2EHTWoubGlnYQdNaC5saWdhB01mLmxpZ2EHTnQubGlnYQdOZi5saWdhB09mLmxpZ2EHT3oubGlnYQdQcS5saWdhB1B3LmxpZ2EHUHIubGlnYQdQdC5saWdhB1B5LmxpZ2EHUHUubGlnYQdQaS5saWdhB1BmLmxpZ2EHUGgubGlnYQdQai5saWdhB1BrLmxpZ2EHUGwubGlnYQdQei5saWdhB1B4LmxpZ2EHUHYubGlnYQdQYi5saWdhB1BuLmxpZ2EHUG0ubGlnYQdScC5saWdhB1JmLmxpZ2EHUmoubGlnYQdUdC5saWdhB1RmLmxpZ2EHVGgubGlnYQdUay5saWdhB1RsLmxpZ2EHVGIubGlnYQdVdC5saWdhB1VzLmxpZ2EHVWYubGlnYQdWdC5saWdhB1ZzLmxpZ2EHVmYubGlnYQdWbC5saWdhB1d0LmxpZ2EHV2YubGlnYQdYcC5saWdhB1l0LmxpZ2EHWWkubGlnYQdZZi5saWdhB1loLmxpZ2EHWWwubGlnYQdZay5saWdhB1liLmxpZ2EHQWYubGlnYQdDeS5saWdhB0VoLmxpZ2EHR3IubGlnYQdPcC5saWdhB2J0LmxpZ2EHYnIubGlnYQdiZi5saWdhB2JqLmxpZ2EHYnoubGlnYQdkdC5saWdhB2VmLmxpZ2EHZnQubGlnYQdmaC5saWdhB2ZiLmxpZ2EHZmsubGlnYQdnai5saWdhB2pqLmxpZ2EHeWoubGlnYQd0dC5saWdhB3RmLmxpZ2EHdGgubGlnYQd0aS5saWdhB3RrLmxpZ2EHdGwubGlnYQh0dGgubGlnYQhlZmYubGlnYQhlZmIubGlnYQdmZi5saWdhB2ZpLmxpZ2EHZmwubGlnYQAAAAAAAAH//wACAAEAAAAMAAAAHAAAAAIAAgADADoAAQA7AKsAAgAEAAAAAgAAAAEAAAAKAB4ALAABbGF0bgAIAAQAAAAA//8AAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQQIAB0AQABaAGQAngDIANIA5AEWAUgBYgFsAYYBmAGyAkQCXgKQAqoCzALeAugDIgNMA1YDdAOuA7gDwgP+AAMACAAOABQAjQACACUAPAACACkAOwACAC8AAQAEAI4AAgA4AAcAEAAWABwAIgAoAC4ANACPAAIAJwBCAAIAIQBBAAIAKwBAAAIAKgA/AAIAKQA+AAIAJQA9AAIAMwAFAAwAEgAYAB4AJABHAAIAIQBGAAIAKwBFAAIAKgBEAAIAJwBDAAIAMwABAAQAkAACADEAAgAGAAwASQACACUASAACADMABgAOABQAGgAgACYALABPAAIAIQBOAAIAKwBNAAIAKQBMAAIAJQBLAAIALwBKAAIAMwAGAA4AFAAaACAAJgAsAFUAAgAhAFQAAgArAFMAAgAqAFIAAgAnAFEAAgAlAFAAAgAzAAMACAAOABQAWAACADgAVwACAC8AVgACADMAAQAEAFkAAgApAAMACAAOABQAXAACACUAWwACACcAWgACACkAAgAGAAwAXgACACUAXQACADMAAwAIAA4AFACRAAIALwBgAAIAOQBfAAIAJQASACYALAAyADgAPgBEAEoAUABWAFwAYgBoAG4AdAB6AIAAhgCMAHIAAgAsAHEAAgAtAHAAAgAhAG8AAgA1AG4AAgA3AG0AAgA5AGwAAgArAGsAAgAqAGoAAgApAGkAAgAnAGgAAgAlAGcAAgAoAGYAAgA0AGUAAgA4AGQAAgAzAGMAAgAxAGIAAgA2AGEAAgAwAAMACAAOABQAdQACACkAdAACACUAcwACAC8ABgAOABQAGgAgACYALAB7AAIAIQB6AAIAKwB5AAIAKgB4AAIAJwB3AAIAJQB2AAIAMwADAAgADgAUAH4AAgAlAH0AAgAyAHwAAgAzAAQACgAQABYAHACCAAIAKwCBAAIAJQCAAAIAMgB/AAIAMwACAAYADACEAAIAJQCDAAIAMwABAAQAhQACAC8ABwAQABYAHAAiACgALgA0AIwAAgAhAIsAAgAqAIoAAgArAIkAAgAnAIgAAgAlAIcAAgAoAIYAAgAzAAUADAASABgAHgAkAJYAAgA5AJUAAgApAJQAAgAlAJMAAgAxAJIAAgAzAAEABACXAAIAMwADAAgAEAAYAKgAAwAlACEApwADACUAJQCYAAIAJQAHABAAFgAcACIAKAAuADQAqwACACsAqgACACgAqQACACUAnAACACoAmwACACEAmgACACcAmQACADMAAQAEAJ0AAgApAAEABACeAAIAKQAHABAAGAAeACQAKgAwADYApgADADMAJwClAAIAKwCkAAIAKgCjAAIAKACiAAIAJwChAAIAJQCgAAIAMwABAAQAnwACACkAAQAdAAYACAAKAAsADAANAA4ADwAQABEAEgATABQAFQAXABkAGgAbABwAHQAeACEAIwAkACUAJgApADMAOAAAAAEAAAAKAB4ALAABbGF0bgAIAAQAAAAA//8AAQAAAAFrZXJuAAgAAAABAAAAAQAEAAIAAAABAAgAAQPGAAQAAABEAJIAnADSAOABIgEoATYBPAFKAVABXgFkAW4BfAGKAawBsgHAAcYB1AHiAewB/gIIAhYCSAJiAnAChgKcAqoCvALKAtAC6gL0AvoDAAMKAxADGgMgAyYDLAMyAzgDOAMyAz4DRANOAz4DVANaA2ADIANmA2wDcgN4A34DiAOOA5gDngOkA7IDvAACAC7//AA3//IADQAl/+oAKP/8ACn/9AAq//AAK//6ACz//gAt//4AMf/qADP//AA0//wANf/+ADb/+AA5//QAAwAt//wALv/8ADb//AAQACT//AAl/+wAJv/6ACf//AAp/+wAKv/0ACv/+gAs//gALf/8AC//7gAx//gAMv/0ADT/9gA3/+oAOP/6ADn/5AABADf/+gADADX//AA3/+gAOf/6AAEALv/2AAMAKP/8ACn/6AAy/+QAAQAu//IAAwAo/+4AL//2ADX/5gABACT/8AACABgAAgAoAAQAAwAo//4ALv/wADL/+AADACf/9gAv/+4Ao//sAAgAKf/qACv/9AAu//wAL//uADH/7gAy//IAN//mAJX/9AABADYADgADACAABAAjAAQAM//4AAEAMv/8AAMAJv/+ACr/+AA3//4AAwAo//gALv/0AJn/7AACACMAAgAl/+wABAAk//wAL//8ADT/9AA4//4AAgAt//IAq//iAAMAJf/sACb/+AA3//wADAAk//wAJv/+ACj/+gAp/+AAK//+ACz/9gAt//wAL//qADH/7AAy//IAN//cAKP/4gAGACQAAgAl/9oAK//yAC//4gAx/+gAMv/8AAMAKQB+ADL/7ACeAIgABQAg//wAIv/4ACb//AAu//YANQAEAAUAKf/0ACr/+AAv//QAM//mAKP/3gADACEAHAAkAAIALv/4AAQAJf/0AC3//gAv//wAmf/8AAMAJP/wACf/+AAp/+4AAQAk//oABgAg//QAIf/wACj/9gAu/+wAL//0ADP/9AACACH//gA3//IAAQApAEIAAQAnACgAAgAzADQAqgAoAAEAMwA0AAIAMwAyAKEARgABADL/6gABADMALAABACkANAABAJoAGAABADMAMgABACkAOAABADMAMAACACUAEgAzAC4AAQApAHgAAQApADYAAQAzAC4AAQAzADgAAQAzAEIAAQAzAEwAAQAz//IAAQAnAEgAAgAl/+4Amv/oAAEAKQBiAAIAKQBaAJ4AUAABACkAVgABAKEARAADADMANgCaABIAogBKAAIAJwAsAKEARgACAC3/8gA3/+oAAQBEAAYABwAIAAkACgAMABEAFAAVABgAHQAgACEAIgAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOQA8AD0APgBIAEkASwBMAE0AUABRAFkAWgBcAF4AXwBhAGgAagB+AIEAhACIAI0AkQCYAJoAnQCeAJ8AoAChAKkAqgAAAAAAAQAAAADUGBYRAAAAANfpcqUAAAAA1+lypQ==\";\n","import { ModuleProduct } from \"../../ModuleProduct\";\nimport { fontTtfDataUrl } from \"./font\";\nimport svgPathBbox from \"svg-path-bbox\";\nimport { svgElem, initSvgFromBackground, addBackground, svgRect } from \"../../svg/elements\";\nimport { transformTextEnclosure } from \"../../svg/modify\";\nimport { Warp } from \"../../svg/Warp\";\nimport { Path } from \"opentype.js\";\nimport { _loadFontExternalDataURL } from \"../../../util/font\";\n\nexport class Maltesers extends ModuleProduct {\n moduleName = \"Maltesers\";\n private shortLength = 5; // Use alternate background if text is shorter than this.\n\n private readonly backgroundSvg: string;\n private readonly backgroundShortSvg: string;\n\n constructor(backgroundSvg: string, backgroundShortSvg: string) {\n super();\n this.backgroundSvg = backgroundSvg;\n this.backgroundShortSvg = backgroundShortSvg;\n }\n\n svgPreview(text: string): string {\n return this.svg(text);\n }\n\n svgPrint(text: string): string {\n return this.svg(text);\n }\n\n private svg(text: string): string {\n const font = _loadFontExternalDataURL(fontTtfDataUrl);\n const capitalise = (word: string): string => word.charAt(0).toUpperCase() + word.substr(1).toLowerCase();\n const parsedtext = text !== \"\" ? capitalise(text) : \"\";\n const basePath = font.getPath(parsedtext, 0, 72, 72);\n const useShort = text.length < this.shortLength;\n const backgroundToUse = useShort ? this.backgroundShortSvg : this.backgroundSvg;\n return this.brandSvg(basePath, backgroundToUse, useShort);\n }\n\n private brandSvg(basePath: Path, backgroundImg: string, useShort: boolean): string {\n const pathSvg = basePath.toSVG(2);\n const box = basePath.getBoundingBox();\n const pathHeight = box.y2 - box.y1;\n const pathWidth = box.x2 - box.x1;\n const pathData = basePath.toPathData(3);\n\n const textSvg = (): SVGElement => {\n const g = svgElem(\"g\");\n\n const layer1 = svgElem(\"g\");\n g.appendChild(layer1);\n layer1.setAttribute(\"stroke\", \"#5C1A0D\");\n layer1.setAttribute(\"stroke-width\", \"4\");\n layer1.setAttribute(\"transform\", \"translate(1,1)\");\n layer1.innerHTML = pathSvg;\n\n const layer2 = svgElem(\"g\");\n g.appendChild(layer2);\n layer2.setAttribute(\"fill\", \"#FFE386\");\n layer2.setAttribute(\"transform\", \"translate(1,1)\");\n layer2.innerHTML = pathSvg;\n\n const layer3 = svgElem(\"g\");\n g.appendChild(layer3);\n layer3.setAttribute(\"fill\", \"white\");\n layer3.innerHTML = pathSvg;\n\n const warp = new Warp(g);\n warp.transform(([x, y]) => [x, y + ((pathWidth - x) * y) ** 2 / (pathWidth * 50000)]); // Pull down on bottom left\n warp.transform(([x, y]) => [\n x,\n y + ((pathWidth / 3 - x) ** 2 / pathWidth) * this.indicator(x < pathWidth / 3),\n ]); // Curve start to bottom left\n warp.transform(([x, y]) => [x - ((pathHeight - y) * (pathWidth - x)) / 800, y]); // Tug top-left corner left\n return g;\n };\n\n const [svgRoot, bgHeight, bgWidth] = initSvgFromBackground(backgroundImg);\n if (!svgRoot) {\n return \"\";\n }\n\n const defs = svgElem(\"defs\");\n svgRoot.appendChild(defs);\n addBackground(svgRoot, defs, backgroundImg);\n\n let boundsHeight: number;\n let boundsWidth: number;\n let boundsLeft: number;\n let boundsTop: number;\n\n if (useShort) {\n boundsHeight = bgHeight * 0.25 * (1 + 0.1);\n boundsWidth = (bgWidth / 2) * (1 + 0.1);\n boundsLeft = bgWidth * 0.22;\n boundsTop = bgHeight * 0.32;\n } else {\n boundsHeight = bgHeight * 0.22 * (1 + 0.1);\n boundsWidth = bgWidth * 0.8;\n boundsLeft = bgWidth * 0.067;\n boundsTop = bgHeight * 0.33;\n }\n\n const bounds = svgElem(\"g\");\n svgRoot.appendChild(bounds);\n bounds.setAttribute(\"transform\", `translate(${boundsLeft} ${boundsTop}) rotate(-10)`);\n\n const boundsRect = svgRect(boundsHeight, boundsWidth);\n boundsRect.setAttribute(\"opacity\", \"0\");\n bounds.appendChild(boundsRect);\n\n const textEnclosure = svgElem(\"g\");\n bounds.appendChild(textEnclosure);\n\n const text = textSvg();\n textEnclosure.appendChild(text);\n\n const textBbox = svgPathBbox(pathData);\n transformTextEnclosure(textEnclosure, textBbox, boundsHeight, boundsWidth);\n return svgRoot.outerHTML;\n }\n\n private indicator = (b: boolean): number => (b ? 1 : 0); // 1 if true, 0 if false.\n}\n","export const fontTtfDataUrl =\n \"data:application/octet-stream;base64,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DOYNZA3mDlQOyg88D54QEBCGEQARchHsEmIS1BOWFAwUghTwFWIV1BaiFxQXkhgEGMYZdBomGtQbfhwYHL4dYB3+HpgfPh/oIJYhPCHmIpQjRiPsJJolSCXuJpQnQifoKJIpRAAmAAn/8QAK//sADP/7AA3/+wAO//sAD//7ABD/+wAR//sAEv/7ABP/+wAU//sAFf/xABb/8QAZ//sAHf/2AB7/+wAf//sAIP/xACH/+wAi//sAI//7ACT/+wAl//EAJv/2ACf/8QAo//sAKf/2ACr/+wAr//sALP/sAC3/7AAu/+IAL//dADD/9gAx/+wAMv/7ADP/+wA0//YAKwAG//EACP/nAAn/4gAK/9MAC//iAAz/9gAN/+IADv/sAA//4gAQ/9gAEf/iABL/1QAT//EAFP/nABX/8QAW/9gAMf/TADL/pgAz//MANP/nADX/8QA2//EAN//7ADj/7gA5//YAOv/7ADv/2AA8//EAPf/2AD7/9gA///EAQP/sAEH/+wBC/+wAQ//xAET/7ABF/+wARv/2AEf/3QBI/90ASf/EAEr/zgBL//YAKwAG//YAB//2AAn/3QAL/+wADP/sAA3/8QAO//YAD//sABD/8QAR/+wAEv/iABP/5wAU/+wAFf/dABb/7AAX/78AMf/YADL/sAAz/+IANP/iADX/8QA2/+cAN//xADj/3QA5/+wAOv/2ADv/4gA8//EAPf/xAD7/8QA///YAQP/YAEH/9gBC/+cAQ//sAET/7ABF/+wARv/xAEf/zgBI/9MASf/OAEr/zgBL/+wAKgAG//YAB//iAAj/4gAK/+IADP/dAA3/ugAO/+IAD//iABD/5wAR/+IAEv/dABP/yQAU/90AFf+mABb/0wAx/5gAMv/YADP/4gA0/9MANf/xADb/7AA3/+wAOP/iADn/7AA6//EAO//dADz/5wA9/+wAPv/sAD//5wBA/9gAQf/sAEL/zgBD/+wARP/YAEX/tQBG/90AR/+hAEj/oQBJ/8QASv+DAEv/7AAqAAb/8QAH/90ACP/YAAn/oQAL/8kADP/iAA3/sAAO/+cAD//YABD/4gAR/90AEv/bABP/4gAU/+IAFf/TABb/5wAg/+QAMf/nADL/3AAz//QANP/rADX/9AA2//IAN//4ADj/8AA5//QAOv/1ADv/7AA8/+oAPf/7AD7/9wA///IAQP/tAEH/+wBC/+IAQ//2AET/4wBF/7YARv/vAEf/pgBK/6MAS//yACYAB//TAAj/8QAK/84ADP/dAA3/9gAO//EAD//dABD/pgAR/8kAEv+6ABP/7AAU/90AFf/OADH/xAAy/5IAM//sADT/3QA1/+cANv/xADf/9gA4/90AO/9WADz/5wA9//EAPv/sAD//5wBA/84AQf/dAEL/0wBD/+cARP/nAEX/5wBG/+cAR//dAEj/2ABJ/7oASv/JAEv/4gAsAAb/+wAH//sACP/xAAn/zgAK/+cAC//dAAz/9gAN/9gADv/tAA//7AAQ/+kAEf/rABL/3QAT/90AFP/hABX/3QAW/90AMf/nADL/vwAz/+cANP/nADX/8QA2//EAN//sADj/5wA5//YAOv/2ADv/4gA8//EAPf/2AD7/+wA///sAQP/2AEH/+wBC/+wAQ//7AET/7ABF/9MARv/7AEf/yQBI/84ASf+wAEr/xABL/+cADgAG//sACf/xAAv/7AAN//sADv/7AA8AAAAR//EAEv/0ABP/9gAU//EAFf/xABb/7AAx//YAQP/2ACkABv/7AAf/9gAI//sACf/iAAr/5wAL/+wADP/vAA3/3QAO//sAD//qABD/8QAR/+wAEv/nABP/8QAU/+cAFf/iABb/7AAx/+cAMv/vADP//AA0/+cANf/7ADb//gA4//EAOf/8ADr//AA7/+kAPP/6AD3//QA+//4AP//7AEL/6gBD//0ARP/2AEX/7ABG//EAR//YAEj/4gBJ/+wASv/LAEv//AAsAAb/+wAH//EACP/2AAn/0wAK/+IAC//JAAz/5wAN/90ADv/iAA//7AAQ/+cAEf/sABL/3QAT/9MAFP/iABX/zgAW/+cAMf/YADL/xAAz/+wANP/dADX/6AA2//EAN//xADj/4wA5//EAOv/2ADv/7AA8/+wAPf/sAD7/9gA//+wAQP/iAEH/8QBC/90AQ//nAET/5wBF/8QARv/mAEf/xABI/8kASf+1AEr/rQBL/+IALAAG//sAB//7AAj/9gAJ/9MACv/2AAv/ugAM/+kADf/dAA7/9gAP/+wAEP/2ABH/8AAS//EAE//2ABT/5wAV/9gAFv/sADH/vwAy/9UAM//eADT/3wA1//EANv/xADf/9gA4/+IAOf/xADr/9gA7/+wAPP/xAD3/9gA+//EAP//2AED/2ABB//EAQv/nAEP/9gBE/+cARf/TAEb/8QBH/9gASP/YAEn/xgBK/78AS//xACsABv/7AAf/9gAI/+wACf/TAAr/5wAL/90ADP/lAA3/zgAO/90AD//dABD/7AAR/+IAEv/iABP/2AAU/+IAFf/JABb/5wAx/90AMv/EADP/6wA0/+EANf/wADb/8AA4/9wAOf/dADr/7AA7/9gAPP/sAD3/5wA+/+wAP//iAED/0wBB/+IAQv/YAEP/4gBE/84ARf/JAEb/4gBH/8kASP/OAEn/vwBK/8kAS//TACwABv/7AAf/3wAI/+cACf+wAAr/4wAL/8kADP/dAA3/xwAO/+cAD//dABD/7AAR/+cAEv/iABP/yQAU/9cAFf+/ABb/4gAa/+kAMf/YADL/uwAz/+EANP/dADb/6wA3//MAOP/lADn/8QA6//IAO//eADz/5wA9/+4APv/zAD//8ABA/+IAQf/2AEL/6gBD//YARP/kAEX/zABG/+8AR/+0AEj/uwBJ/64ASv+vAEv/5QAsAAb/+wAH/90ACP/nAAn/4gAK/9MAC//nAAz/3QAN//YADv/eAA//3QAQ/7AAEf/OABL/sAAT//sAFP/dABX/0wAW/9MAMf/iADL/iAAz//YANP/OADX/9gA2//EAN//xADj/0wA5//YAOv/zADv/gAA8//EAPf/7AD7/+wA///YAQP/OAEH/7gBC/84AQ//2AET/2ABF//sARv/2AEf/5wBI/+cASf/TAEr/4gBL/+wALAAG//sAB//2AAj/8QAJ/9gACv/nAAv/3QAM/+IADf/dAA7/4gAP/+IAEP/nABH/5wAS/9gAE//YABT/3QAV/84AFv/sADH/5wAy/78AM//nADT/2AA1/+cANv/nADf/7AA4/90AOf/sADr/7AA7/+cAPP/sAD3/8QA+/+wAP//xAED/4gBB//EAQv/dAEP/5wBE/+IARf/YAEb/5wBH/78ASP/HAEn/sABK/7UAS//dACsABv/xAAf/8QAI/+IACf/dAAr/0wAL/+IADP/iAA3/3QAO/+cAD//dABD/zgAR/9MAEv/EABP/0wAU/84AFv/dADH/4gAy/6EAM//jADT/3QA1/+wANv/sADf/5wA4/90AOf/nADr/8QA7/78APP/xAD3/9gA+/+wAP//nAED/3QBB/+cAQv/nAEP/5wBE/+IARf/OAEb/3QBH/8QASP/JAEn/lwBK/7oAS//YACkABv/sAAf/0wAI/90ACf/OAAr/3QAM/90ADf/EAA7/5wAP/9gAEP/YABH/3QAS/9MAE//YABT/4gAV/90AMf/sADL/wAAz/+8ANP/kADX/6wA2//AAN//2ADj/5AA5//EAOv/uADv/1gA8//QAPf/2AD7/8QA///AAQP/dAEH/7ABD/+gARP/YAEX/1QBG/+wAR/+3AEj/wwBJ/7UASv+wAEv/5gAeAAf/zgAi/+4AI//5ACT/7wAy/9AAM//pADT/sQA1/+sANv/nADf/5gA4/7oAOf/vADr/9wA7/9AAPP/sAD3/6wA+/+YAP//sAED/uwBB/+kAQv+7AEP/5ABE/9QARf+6AEb/0ABH/34ASP+SAEn/zQBK/5sAS//nABwAF//RACT//wAy/9EAM//uADT/5wA1/+8ANv/3ADf/7gA4/+gAOf/3ADr/+wA7/9oAPP/vAD3/9wA+/+4AP//vAED/4QBB//cAQv/nAEP/7wBE/+4ARf/QAEb/9wBH/8EASP/MAEn/wwBK/7sAS//nABwAF//QABv/+QAy/8EAM//zADT/6wA1//sANv/zADf/+wA4/+8AOf/zADr//gA7/+EAPP/vAD3/9wA+//kAP//3AED/4gBB//kAQv/jAEP/8wBE/+YARf/VAEb/+QBH/84ASP/JAEn/twBK/8EAS//rAB8ABv/7ABL/3wAX/8kAJf/5ACv/7wAy/7oAM//zADT/6wA1/+8ANv/uADf/8wA4/+oAOf/vADr/7wA7/9QAPP/5AD3//gA+//EAP//vAED/4wBB//MAQv/mAEP/7gBE/+cARf/XAEb/6wBH/8kASP/JAEn/twBK/7cAS//nACAABv/7ACQAAgAl/+8AJ//5AC3//gAv//4AMv/oADP//QA0/+sANf/7ADb/+gA3//sAOP/jADn/9wA6//oAO//kADz//wA9//0APv/+AD8AAABA/+gAQf/7AEL/6ABD//sARP/sAEX/8QBG//sAR//qAEj/6wBJ/+cASv/qAEv/+QAbAAb/+wAl/+8AMv+5ADP/+wA0/+8ANf/7ADb/+wA3//0AOP/vADn/+wA6AAAAO/+7ADz//gA9//4APv/7AED/7ABB//4AQv/nAEP/+QBE//kARf/7AEb/+QBH//MASP/rAEn/4gBK/+8AS//7AB0ABv/2ABf/zgAl/+8AMv+3ADP/9wA0/+sANf/3ADb/8QA3//kAOP/uADn/8wA6//sAO//YADz/8wA9/+4APv/3AD//8wBA/+MAQf/3AEL/6QBD/+8ARP/nAEX/1ABG/+8AR//JAEj/zABJ/6YASv/JAEv/3AAcAAb/+wAX//MAJf/7ADL/6wAz//4ANP/uADX/+wA2//4AN//+ADj/8wA5//0AOv/+ADv/7gA8//4APf/+AD7/+wA///4AQP/uAEL/9wBD//4ARP/+AEX/+QBG//4AR//uAEj/9wBJ/+4ASv/zAEv//gAYAAb/+wAx//YAMv/rADP//wA0//MANf//ADYAAQA3//8AOP/zADv/6AA8//4APf/+AD4AAQBA/+4AQf//AEL/8wBD//4ARP/4AEX//QBH/+wASP/3AEn/7ABK//EASwABABwABv/2ABf/4QAy/8oAM//9ADT/+QA1//4ANv/7ADf//gA4//MAOf/+ADr//wA7/+EAPP/7AD3//gA+//4AP//+AED/7wBB//4AQv/zAEP//gBE//sARf/7AEb//gBH/+8ASP/5AEn/2gBK//oAS//+AB0ABv/nABf/5wAx/7AAMv/hADP/7gA0/7QANf/rADb/5wA3/+4AOP+sADn/6wA6//kAO/+3ADz/6gA9/+8APv/nAD//5wBA/6wAQf/uAEL/rgBD/+cARP+8AEX/3ABG/9oAR//cAEj/0QBJ/9oASv/RAEv/7wAeAAb/9gAX//cAI//9ADH/vwAy/+4AM//5ADT/2gA1//4ANv/3ADf/+wA4/9oAOf/3ADr/+wA7/+cAPP/7AD3/+QA+//cAP//5AED/1ABB//sAQv/cAEP/9wBE/+8ARf/JAEb/6wBH/8QASP++AEn/5wBK/8EAS//+ABwAF//7ADH/7AAy/+QAM//+ADT/7gA1//4ANgAAADf//QA4//cAOf/7ADr//gA7/+4APP/+AD3//gA+//0AP//7AED/7wBB//4AQv/uAEP//gBE//cARf/7AEb/+QBH/+gASP/vAEn/6wBK/+gAS//+AB4ABv/7ABf/8wAa//4AHf/3ACX/9wAq//4AMf/2ADL/5AAz//0ANP/zADX/+wA2//4AN//+ADj/+QA7/+4APf/+AD7/+wA///4AQP/2AEH/+gBC/+4AQ//7AET/+QBF//sARv/+AEf/8wBI/+8ASf/zAEr/6wBL//4AHQAG//EAJP/3ADH/7AAy/7sAM//sADT/4wA1/+8ANv/vADf/9wA4/+QAOf/qADr/9wA7/98APP/vAD3/9wA+/+sAP//uAED/4wBB/+4AQv/mAEP/7wBE/+IARf/VAEb/7gBH/8MASP/GAEn/uwBK/7oAS//fABwABv/sACT//gAy/54AM//rADT/6gA1//EANv/rADf/9wA4/+MAOf/oADr/9wA7/64APP/sAD3/8QA+/+wAP//sAED/4QBB//MAQv/oAEP/5ABE/9gARf/kAEb/7gBH/9EASP/QAEn/uwBK/8QAS//zADAAF//3ABj//wAZ/+kAGv//ABv//QAc//4AHf/pAB7/+wAf//8AIP/iACH//gAi//8AI//+ACT//wAl/+IAJ//uACj//gAp/+cAKv/hACv/+QAs/8MALf/QAC7/5AAv/8wAMP//ADL/4QAz//4ANP/jADX/9wA3//kAOP/fADn/9wA7/+IAPP/5AD3/+gA+//EAP//6AED/2gBB/+8AQv/aAET/7wBF/9cARv/qAEf/xgBI/7sASf/qAEr/tABL//sAHQAG/+cAF//oACT/+gAy/+IAM//xADT/zAA1/+8ANv/sADf/+gA4/8wAOf/3ADr/8wA7/8kAPP/uAD3/7wA+/+wAP//rAED/yQBB//cAQv/MAEP/+ABE/9QARf/KAEb/2gBH/8EASP/EAEn/4gBK/7cAS//vAB0ABv/xABv/+QAl/+4AMv+8ADP/7wA0/9wANf/zADb/6AA3//cAOP/hADn/5gA6//MAO//aADz/6QA9//MAPv/pAD//6wBA/+MAQf/3AEL/2gBD/+kARP/rAEX/1ABG/+kAR//JAEj/zABJ/7QASv+7AEv/5wAbAAb/9gAy/6YAM//9ADT/0wA1//oANv/+ADf//QA4/9UAOf/3ADr//wA7/7kAPP/6AD3//gA+//sAP//7AED/0ABB//oAQv/XAEP/+QBE/+IARf/zAEb/9wBH/+8ASP/vAEn/6gBK/+cAS//6ABwABv/7ACQAAgAy/9UAM//7ADT/7wA1//cANv/9ADf//wA4/+4AOf/7ADr//wA7/+sAPP/+AD3//gA+//0AP//6AED/7gBB//sAQv/sAEP/+wBE/+8ARf/7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ABX/3QAx//YAMv+5ADP/+AA0/+MANf/3ADb/+AA3//kAOP/iADn/+gA6//0AO//OADz//QA9//4APv/5AD///ABA/+YAQv/jAEP/9wBE/+YARf/vAEb//gBH/+cASP/vAEn/0QBK/+YAS//9ACgAB//2AAj/4gAJ/90ACv/sAAv/4gAM/+gADf/iAA7/9QAP/+gAEP/dABH/4AAS/+YAE//OABT/4gAV/90AJP/7ADH/9gAy/8EAM//vADT/3wA2//QAN//4ADj/4wA5/+kAOv/6ADv/0QA8/+YAPf/zAD7/6QA///EAQP/qAEL/3ABD/+gARP/fAEb/+ABH/7sASP+7AEn/rwBK/68AS//jACcACP/xAAn/7AAK//gADP/2AA7/9wAP//YAEP/xABH/5wAS/+cAE//xABT/7AAV/+UAMf/2ADL/6AAz//kANP/qADX/+wA2//oAN//7ADj/6wA5//cAOv//ADv/4wA8//sAPf/+AD7/+wA///oAQP/sAEH/+gBC/+MAQ//5AET/7wBF/+oARv/7AEf/4wBI/+wASf/jAEr/6gBL//4AJgAH//sACP/7AAn/5wAK//oADP/2AA7/9gAP//YAEP/xABH/8QAS//IAE//xABT/5wAV//EAMv/nADP/+wA0//EANf/9ADb//gA3//4AOP/uADn/+wA6//4AO//oAD0AAAA+//sAP//+AED/7wBB//4AQv/qAEP//wBE//EARf/3AEb/+wBH/+YASP/3AEn/2gBK/+QAS//7ACkAB//2AAj/9gAJ/90ACv/yAAz/8QAO//EAD//wABD/6gAR/+wAEv/mABP/9AAU/+wAFf/rABf/zgAx//YAMv/OADP/7wA0/+oANf/5ADb//gA3//0AOP/oADn/+QA6//0AO//YADz//gA9//8APv/6AD//+QBA/+4AQf/5AEL/4wBD//gARP/qAEX/+QBG//oAR//pAEj/6QBJ/9UASv/rAEv/+gAqAAf/sgAI/8kACf+wAAr/ugAL/7UADP+1AA3/3QAO/+QAD/+6ABD/sgAR/7UAEv+xABP/4gAU/6sAFf+mADH/lwAy/9oAM//jADT/qwA1/+IANv/iADf/4wA4/5oAOf/XADr/7gA7/7QAPP/kAD3/6wA+/+4AP//mAED/rQBB/+8AQv+qAEP/6gBE/74ARf/XAEb/2gBH/9AASP/SAEn/1QBK/80AS//qACsAB//nAAj/8QAJ/6YACv/sAAv/nAAM/90ADf+6AA7/9gAP/+IAEP/sABH/3QAS/9oAE//sABT/3QAV/8QAJP/+ADH/pgAy/+sAM//vADT/ygA1//0ANv/zADf/+wA4/9MAOf/vADr/+wA7/9gAPP/3AD3/9wA+//EAP//7AED/1QBB//cAQv/PAEP/8wBE/+YARf+7AEb/5wBH/7UASP/JAEn/2gBK/6UAS//zACkAB//2AAn/7AAK//kAC//sAAz/9gAO//oAD//2ABD/7AAR/+cAEv/vABP/9gAU//EAFf/sABcAAQAx/+YAMv/pADP/+QA0/+oANf/zADb/+wA3//oAOP/nADn/9wA6//4AO//uADz/+QA9//oAPv/7AD//+QBA/+8AQf/3AEL/6QBD//oARP/sAEX/8wBG//gAR//pAEj/6QBJ/+MASv/nAEv//QAqAAf/9gAI//sACf/sAAr/9wAL/+wADP/7AA7/+gAP//EAEP/2ABH/7AAS//EAE//2ABT/9gAV/+QAFwABADH/8QAy/+kAM//3ADT/6QA1//kANv/5ADf/+QA4/+8AOf/6ADr//gA7/+8APP/7AD3/+gA+//oAP//4AED/7wBB//sAQv/rAEP//QBE/+8ARf/3AEb/+gBH/+4ASP/rAEn/4QBK/+wAS//5ACsAB//xAAj/4gAJ/9gACv/sAAv/2AAM//YADf/iAA7/8QAP/90AEP/iABH/0wAS/+IAE//JABT/4gAV/94AJP/7ADH/3QAy/7QAM//pADT/4QA1/+wANv/vADf/6gA4/+IAOf/qADr/+gA7/9oAPP/pAD3/6wA+/+wAP//pAED/4QBB/+sAQv/cAEP/6wBE/+IARf/JAEb/7gBH/7wASP/BAEn/pgBK/7UAS//kACwAB//iAAj/5wAJ/+IACv/OAAv/2AAM/+cADf/nAA7/8AAP/90AEP+6ABH/xAAS/9cAE//XABT/2AAV/9gAG//3ACT/+wAx/+IAMv+gADP/6QA0/+MANf/mADb/7wA3/+sAOP/aADn/6AA6//YAO/+xADz/6wA9/+4APv/oAD//7wBA/9oAQf/oAEL/1wBD/+MARP/aAEX/2ABG/+cAR//PAEj/yQBJ/7kASv/BAEv/6AApAAf/8QAI/+wACf/OAAr/6gAL/84ADP/nAA3/2AAO//YAD//fABD/4gAR/9gAEv/lABP/5wAU/+IAFf/YADH/4gAy/+cAM//3ADT/2gA1//gANv/5ADf/+wA4/9wAOf/3ADr//gA7/+MAPP/3AD3//QA+//cAP//3AED/1QBC/9UAQ//9AET/6QBF/+EARv/pAEf/ugBI/8QASf/aAEr/wgBL//sAKwAH/8kACP/YAAn/xAAK/9MAC/+/AAz/yQAN/9gADv/nAA//xAAQ/7oAEf+1ABL/wQAT/9gAFP+6ABX/vwAk//sAMf+/ADL/2gAz/+gANP/KADX/6QA2/+kAN//oADj/xgA5/+QAOv/nADv/uQA8/+wAPf/uAD7/6QA//+cAQP/GAEH/7ABC/8kAQ//mAET/2ABF/84ARv/VAEf/wQBI/7wASf/GAEr/tABL/+8AKwAH//EACP/2AAn/yQAK/+oAC//TAAz/3QAN/+cADv/sAA//4gAQ/+IAEf/YABL/3wAT/90AFP/dABX/2AAk//sAMf/nADL/xgAz//MANP/iADX/7wA2/+4AN//3ADj/4wA5/+kAOv/vADv/1wA8/+4APf/zAD7/6gA//+0AQP/kAEH/9wBC/98AQ//qAET/5wBF/9AARv/vAEf/yQBI/9AASf/PAEr/xABL/+8AKQAH/+cACP/sAAn/5wAK/+kAC//dAAz/2AAO/+wAD//XABD/qwAR/8kAEv/AABP/9gAU/9MAFf/OADH/2AAy/7AAM//5ADT/2gA1//0ANv/6ADf//gA4/98AOf/3ADr//QA7/8YAPP/7AD3//gA+//gAP//4AED/1QBB//0AQv/VAEP/+ABE/+MARf/zAEb/+QBH/+4ASP/zAEn/4gBK/+cAS//zACkACP/2AAn/5wAK//QAC//sAAz/+wAN//4ADv/2AA//5QAQ/+wAEf/nABL/8wAT//EAFP/nABX/3QAx/+QAMv/KADP/+QA0/+wANf/6ADb/+gA3//sAOP/vADn/+gA6AAAAO//hADz//wA9//0APv/5AD///gBA/+wAQf/7AEL/7ABD//sARP/vAEX/9wBG//sAR//zAEj/6gBJ/+EASv/jAEv/+wArAAf/zgAI/84ACf/YAAr/ygAL/9gADP/JAA3/+wAO/9kAD//JABD/ogAR/7oAEv+5ABP/5wAU/8QAFf+9ACT/+wAx/7oAMv+FADP/+wA0/7sANf/qADb/6wA3/+wAOP++ADn/5gA6/+8AO/+iADz/6AA9/+oAPv/sAD//7wBA/8MAQf/mAEL/uwBD/+YARP/KAEX/6QBG/+8AR//jAEj/3wBJ/9MASv/hAEv/6wApAAf/zgAI/84ACf/TAAv/2AAM/84ADv/eAA//xAAQ/7AAEf/TABL/sQAT/+wAFP/FABX/yQAk//sAMf/JADL/lQAz//MANP/BADX/+QA2//MAN//3ADj/xgA5//sAOv/3ADv/pQA8/+8APf/+AD7/7gA//+oAQP/DAEH/7gBC/8QAQ//vAET/0ABF/+4ARv/uAEf/6QBI/+QASf/aAEr/5gBL//cAKgAH/8QACP/OAAn/pgAL/7oADP+rAA3/3QAO/+cAD/+5ABD/twAR/8QAEv+zABP/0wAU/7AAFf+cACT/+wAx/6EAMv/aADP/4wA0/7cANf/4ADb/4wA3//0AOP+3ADn/7gA6/+8AO/+7ADz/7gA9//EAPv/jAD//6ABA/7oAQf/zAEL/uQBD/+sARP/OAEX/3wBG/+EAR//aAEj/2ABJ/9gASv/MAEv/7gAsAAf/yQAI/84ACf/JAAr/wgAL/8kADP/JAA3//gAO/8kAD/+6ABD/jQAR/7oAEv+gABP/4gAU/7UAFf+6AB7/8QAk//sAMf+1ADL/lwAz/+8ANP+7ADX/5gA2/+4AN//uADj/uQA5/+gAOv/3ADv/hAA8/+8APf/sAD7/7AA//+oAQP+6AEH/7ABC/7kAQ//pAET/ygBF/+8ARv/vAEf/6ABI/+kASf/fAEr/5ABL//EAJgAH//YACf/iAAr/7AAL/+cADP/iAA3//wAO//UAD//nABD/7AAR/+IAEv/gABP/7AAU/90AFf/TADH/4gAy/+sAM//+ADT/6AA1//4ANgAEADf//wA4/9wAOf/6ADv/5gA8//8APf//AD///QBA/+MAQf//AEMAAABE/+8ARf/4AEb/+wBH//cASP/rAEn/6QBK/+kAS//9AAIAAQAGAEsAAAAAAAAAAQAAAADUGBYRAAAAANmXsTQAAAAA2ZexNA==\";\n","import { ModuleProduct } from \"../../ModuleProduct\";\nimport { fontTtfDataUrl } from \"./font\";\nimport { svgElem, dropShadow, svgRect } from \"../../svg/elements\";\nimport { fixCase, transformTextEnclosure } from \"../../svg/modify\";\nimport { Warp } from \"../../svg/Warp\";\nimport svgPathBbox from \"svg-path-bbox\";\nimport { Region } from \"../../../types\";\nimport { _loadFontExternalDataURL } from \"../../../util/font\";\n\nexport class Vegemite extends ModuleProduct {\n moduleName = \"Vegemite\";\n\n svgPreview(text: string, region: Region): string {\n return this.svgElement(text, region);\n }\n\n svgPrint(text: string, region: Region): string {\n return this.svgElement(text, region);\n }\n\n private svgElement(text: string, region: Region): string {\n const font = _loadFontExternalDataURL(fontTtfDataUrl);\n const capitalise = (word: string): string => word.charAt(0).toUpperCase() + word.substr(1).toLowerCase();\n const parsedtext = text !== \"\" ? capitalise(text) : \"\";\n const basePath = font.getPath(parsedtext, 0, 72, 72);\n const pathSvg = basePath.toSVG(2);\n\n const box = basePath.getBoundingBox();\n const pathWidth = box.x2 - box.x1;\n const pathData = basePath.toPathData(3);\n\n const textSvg = (): SVGElement => {\n const g = svgElem(\"g\");\n g.classList.add(\"module-text-group\");\n const gdefs = svgElem(\"defs\");\n g.appendChild(gdefs);\n gdefs.appendChild(dropShadow(0, 2, 2, \"shadow\"));\n\n const thick = svgElem(\"path\");\n thick.setAttribute(\"d\", pathData);\n thick.setAttribute(\"stroke\", \"black\");\n thick.setAttribute(\"stroke-width\", \"3\");\n gdefs.appendChild(thick);\n\n const layer0 = svgElem(\"g\");\n layer0.classList.add(\"module-layer0\");\n g.appendChild(layer0);\n layer0.setAttribute(\"filter\", \"url(#shadow)\");\n layer0.innerHTML = thick.outerHTML;\n\n const layer1 = svgElem(\"g\");\n layer1.classList.add(\"module-layer1\");\n g.appendChild(layer1);\n layer1.setAttribute(\"stroke-width\", \"3\");\n layer1.setAttribute(\"stroke\", \"rgb(45,41,38)\");\n layer1.setAttribute(\"fill\", \"rgb(45,41,38)\");\n layer1.setAttribute(\"transform\", \"translate(0.5,0)\");\n layer1.innerHTML = pathSvg;\n\n const layer2 = svgElem(\"g\");\n layer2.classList.add(\"module-layer2\");\n g.appendChild(layer2);\n layer2.setAttribute(\"fill\", \"rgb(255,209,0)\");\n layer2.setAttribute(\"transform\", \"translate(1,-0.1)\");\n layer2.innerHTML = pathSvg;\n\n const layer3 = svgElem(\"g\");\n layer3.classList.add(\"module-layer3\");\n g.appendChild(layer3);\n layer3.setAttribute(\"fill\", \"white\");\n layer3.innerHTML = pathSvg;\n\n const warp = new Warp(g);\n warp.transform(([x, y]) => [x, y + (pathWidth / 2 - x) ** 2 / (pathWidth * 6)]); // Curve down from center\n return g;\n };\n\n const rootElement = svgElem(\"g\");\n rootElement.classList.add(\"module-root\");\n\n const defs = svgElem(\"defs\");\n rootElement.appendChild(defs);\n\n const bounds = svgElem(\"g\");\n bounds.classList.add(\"module-bounds\");\n rootElement.appendChild(bounds);\n const boundsRect = svgRect(region.height, region.width);\n boundsRect.setAttribute(\"opacity\", \"0\");\n bounds.appendChild(boundsRect);\n\n const textEnclosure = svgElem(\"g\");\n textEnclosure.classList.add(\"module-text-enclosure\");\n rootElement.appendChild(textEnclosure);\n\n const textGroup = textSvg();\n textEnclosure.appendChild(textGroup);\n\n const textBbox = svgPathBbox(pathData);\n transformTextEnclosure(textEnclosure, textBbox, region.height, region.width, 0.35, 0.65);\n\n return fixCase(rootElement.outerHTML);\n }\n}\n","import { fetchAsString } from \"../util/crossplatform\";\nimport { UnhandledBehaviorError } from \"../util/exception\";\nimport { ModuleProduct } from \"./ModuleProduct\";\nimport { Favourites } from \"./products/Favourites\";\nimport { Maltesers } from \"./products/Maltesers\";\nimport { Vegemite } from \"./products/Vegemite\";\n\nexport default async function moduleResolver(moduleName: string): Promise<ModuleProduct> {\n if (moduleName === \"Favourites\") {\n return new Favourites();\n }\n if (moduleName === \"Maltesers\") {\n // We pull background resources from assets to leverage cache and keep them seperate from bundle code.\n const bg = fetchAsString(\"https://assets.spiff.com.au/public/modules/img/MaltesersBackground.svg\");\n const bgShort = fetchAsString(\"https://assets.spiff.com.au/public/modules/img/MaltesersBackgroundShort.svg\");\n const backgrounds = await Promise.all([bg, bgShort]);\n return new Maltesers(backgrounds[0], backgrounds[1]);\n }\n if (moduleName === \"Vegemite\") {\n return new Vegemite();\n }\n throw new UnhandledBehaviorError(`Failed to resolve Module, Module ${moduleName} not found`);\n}\n","import { gql } from \"@apollo/client/core\";\n\nexport const globalPropertyStateAspectFragment = gql`\n fragment GlobalPropertyStateAspectFields on GlobalPropertyStateAspect {\n name\n value\n type\n storage {\n ... on GlobalPropertyStateColorOptionStorage {\n customColor\n }\n ... on GlobalPropertyStateFileUploadStorage {\n originalAssetKey\n backgroundRemovedAssetKey\n useOriginalAsset\n }\n }\n }\n`;\n\nexport const createGlobalPropertyStateMutation = gql`\n ${globalPropertyStateAspectFragment}\n mutation CreateGlobalPropertyState($bundleId: String!) {\n globalPropertyStateCreate(bundleId: $bundleId) {\n id\n aspects {\n ...GlobalPropertyStateAspectFields\n }\n }\n }\n`;\n\nexport const updateGlobalPropertyStateMutation = gql`\n ${globalPropertyStateAspectFragment}\n mutation UpdateGlobalPropertyState($id: String!, $aspects: [GlobalPropertyStateAspectInput]!) {\n globalPropertyStateUpdate(id: $id, aspects: $aspects) {\n id\n aspects {\n ...GlobalPropertyStateAspectFields\n }\n }\n }\n`;\n\nexport const getGlobalPropertyStateQuery = gql`\n ${globalPropertyStateAspectFragment}\n query GetGlobalPropertyState($bundleId: String!) {\n globalPropertyState(bundleId: $bundleId) {\n id\n aspects {\n ...GlobalPropertyStateAspectFields\n }\n }\n }\n`;\n","import { gql } from \"@apollo/client/core\";\nimport { additionalProductFragment } from \"../query\";\nimport { globalPropertyStateAspectFragment } from \"../GlobalPropertyStateManager/query\";\n\nconst productFields = gql`\n ${additionalProductFragment}\n fragment ProductFields on Product {\n id\n basePrice\n enabled\n imageUrl\n integrationProducts {\n id\n externalProductId\n externalVariantId\n additionalExternalProductId\n additionalExternalVariantId\n additionalIntegrationProduct {\n ...AdditionalIntegrationProductFields\n }\n integration {\n id\n enabled\n externalIntegrationId\n type\n isCurrent\n }\n }\n modelUrl\n name\n description\n overlayImageUrl\n preloadImageUrl\n sku\n skuCode\n workflows {\n id\n index\n friendlyName\n isPresent\n workflowName\n imageUrl\n }\n productTags {\n id\n name\n }\n }\n`;\n\nconst productCollectionProductFieldsFragment = gql`\n ${productFields}\n fragment ProductCollectionProductFields on ProductCollectionProduct {\n id\n productId\n workflowId\n product {\n ...ProductFields\n }\n }\n`;\n\nconst productCollectionFieldsFragment = (eagerFetchProducts: boolean) => gql`\n ${eagerFetchProducts ? productCollectionProductFieldsFragment : \"\"}\n fragment ProductCollectionFields on ProductCollection {\n id\n name\n description\n image {\n key\n name\n fileLink\n }\n globalPropertyConfiguration {\n id\n aspects {\n name\n type\n title\n description\n entityId\n conditions {\n targetAspectName\n action\n requiredVariantSelections\n }\n }\n }\n ${eagerFetchProducts ? \"productCollectionProducts { ...ProductCollectionProductFields }\" : \"\"}\n transformCollection {\n id\n name\n transforms {\n id\n name\n position {\n x\n y\n z\n }\n rotation {\n x\n y\n z\n }\n scale {\n x\n y\n z\n }\n }\n }\n }\n`;\n\nexport const getBundleQuery = (eagerFetchProducts: boolean) => gql`\n ${globalPropertyStateAspectFragment}\n ${productCollectionFieldsFragment(eagerFetchProducts)}\n query GetBundle($id: String!) {\n globalPropertyState(bundleId: $id) {\n id\n aspects {\n ...GlobalPropertyStateAspectFields\n }\n }\n bundles(ids: [$id]) {\n id\n completed\n workflowViewerLink\n workflowViewerAmendLink\n bundleStateData\n metadata {\n key\n value\n }\n name\n partner {\n id\n }\n productCollection {\n ...ProductCollectionFields\n }\n transactions {\n id\n }\n bundleShareActions {\n id\n title\n type\n stakeholderType\n precedence\n url\n }\n }\n }\n`;\n\nexport const getBundleStakeholdersQuery = gql`\n query GetBundleStakeholders($id: String!) {\n bundles(ids: [$id]) {\n id\n completed\n workflowViewerLink\n workflowViewerAmendLink\n currentBundleStakeholder {\n id\n authorizationStatus\n authorizationDate\n authorizationNote\n customer {\n id\n emailAddress\n firstName\n lastName\n phoneNumber\n partner {\n id\n }\n }\n type\n }\n bundleStakeholders {\n id\n authorizationStatus\n authorizationDate\n authorizationNote\n customer {\n id\n emailAddress\n firstName\n lastName\n phoneNumber\n partner {\n id\n }\n }\n type\n }\n }\n }\n`;\n\nexport const getBundlesForCustomerQuery = gql`\n query GetBundlesForCustomer($id: String!) {\n customers(ids: [$id]) {\n bundleStakeholders {\n id\n authorizationStatus\n authorizationDate\n authorizationNote\n type\n bundle {\n id\n completed\n workflowViewerLink\n workflowViewerAmendLink\n name\n createdAt\n metadata {\n key\n value\n }\n partner {\n id\n }\n }\n }\n }\n }\n`;\n\nexport const getProductCollectionProductsQuery = gql`\n ${productCollectionProductFieldsFragment}\n query GetProductCollectionProducts($id: String!, $productIds: [String!]) {\n productCollections(ids: [$id], productIds: $productIds) {\n id\n productCollectionProducts {\n ...ProductCollectionProductFields\n }\n }\n }\n`;\n\nexport const getProductCollectionProductsFilteredQuery = gql`\n query GetProductCollectionForFilteredProducts($id: String!, $filters: ProductCollectionProductFilterInput!) {\n productCollections(ids: [$id]) {\n id\n productCollectionProducts(filters: $filters) {\n id\n product {\n id\n }\n }\n }\n }\n`;\n\nexport const createBundleMutation = (eagerFetchProducts: boolean) => gql`\n ${productCollectionFieldsFragment(eagerFetchProducts)}\n mutation CreateBundle(\n $collectionId: String\n $initialMetadata: [MetadataInput!]\n $marketplaceThemeInstallId: String\n $marketplaceThemeInstallConfigurationId: String\n ) {\n bundleCreate(\n collectionId: $collectionId\n metadata: $initialMetadata\n marketplaceThemeInstallId: $marketplaceThemeInstallId\n marketplaceThemeInstallConfigurationId: $marketplaceThemeInstallConfigurationId\n ) {\n id\n bundleOwnerId\n metadata {\n key\n value\n }\n name\n partner {\n id\n }\n productCollection {\n ...ProductCollectionFields\n }\n }\n }\n`;\n\nexport const duplicateBundleMutation = (eagerFetchProducts: boolean) => gql`\n ${productCollectionFieldsFragment(eagerFetchProducts)}\n mutation DuplicateBundle(\n $id: String!\n $template: Boolean\n $marketplaceThemeInstallId: String\n $marketplaceThemeInstallConfigurationId: String\n $duplicateTransactions: Boolean\n ) {\n bundleDuplicate(\n id: $id\n template: $template\n marketplaceThemeInstallId: $marketplaceThemeInstallId\n marketplaceThemeInstallConfigurationId: $marketplaceThemeInstallConfigurationId\n duplicateTransactions: $duplicateTransactions\n ) {\n id\n bundleOwnerId\n metadata {\n key\n value\n }\n name\n partner {\n id\n }\n productCollection {\n ...ProductCollectionFields\n }\n }\n }\n`;\n\nexport const updateBundleMutation = gql`\n mutation UpdateBundle($id: String!, $name: String, $metadata: [MetadataInput!], $bundleStateData: String) {\n bundleUpdate(id: $id, name: $name, metadata: $metadata, bundleStateData: $bundleStateData) {\n id\n }\n }\n`;\n\nexport const bundleAddTransactionMutation = gql`\n mutation BundleAddTransaction($id: String!, $transactionId: String!) {\n bundleAddTransaction(id: $id, transactionId: $transactionId) {\n id\n }\n }\n`;\n\nexport const bundleAddTransactionsMutation = gql`\n mutation BundleAddTransactions($id: String!, $transactionIds: [String!]!, $transactionOwnerIds: [String!]) {\n bundleAddTransactions(id: $id, transactionIds: $transactionIds, transactionOwnerIds: $transactionOwnerIds) {\n id\n }\n }\n`;\n\nexport const bundleRemoveTransactionMutation = gql`\n mutation BundleRemoveTransaction(\n $id: String!\n $transactionId: String!\n $name: String\n $metadata: [MetadataInput!]\n $bundleStateData: String\n ) {\n bundleRemoveTransaction(id: $id, transactionId: $transactionId) {\n id\n }\n bundleUpdate(id: $id, name: $name, metadata: $metadata, bundleStateData: $bundleStateData) {\n id\n }\n }\n`;\n\nexport const bundleRemoveTransactionsMutation = gql`\n mutation BundleRemoveTransactions(\n $id: String!\n $transactionIds: [String!]!\n $name: String\n $metadata: [MetadataInput!]\n $bundleStateData: String\n ) {\n bundleRemoveTransactions(id: $id, transactionIds: $transactionIds) {\n id\n }\n bundleUpdate(id: $id, name: $name, metadata: $metadata, bundleStateData: $bundleStateData) {\n id\n }\n }\n`;\n\nexport const bundleAddStakeholderMutation = gql`\n mutation BundleAddStakeholder($id: String!, $details: CustomerDetailsInput!, $type: String!) {\n bundleAddStakeholder(id: $id, details: $details, type: $type) {\n id\n bundleStakeholders {\n id\n customer {\n id\n emailAddress\n firstName\n lastName\n phoneNumber\n partner {\n id\n }\n }\n type\n }\n }\n }\n`;\n\nexport const bundleRemoveStakeholderMutation = gql`\n mutation BundleAddStakeholder($id: String!, $emailAddress: String!) {\n bundleRemoveStakeholder(id: $id, emailAddress: $emailAddress) {\n id\n }\n }\n`;\n\nexport const bundleUpdateStakeholdersMutation = gql`\n mutation BundleUpdateStakeholders($id: String!, $input: [BundleStakeholderInput!]!) {\n bundleUpdateStakeholders(id: $id, input: $input) {\n id\n bundleStakeholders {\n id\n customer {\n id\n emailAddress\n firstName\n lastName\n phoneNumber\n partner {\n id\n }\n }\n type\n }\n }\n }\n`;\n\nexport const bundleUpdateTransactionOrderMutation = gql`\n mutation BundleUpdateTransactionOrder($id: String!, $transactionIds: [String!]!) {\n bundleUpdateTransactionOrder(id: $id, transactionIds: $transactionIds) {\n id\n }\n }\n`;\n\nexport const bundleAssignProductCollectionMutation = (eagerFetchProducts: boolean) => gql`\n ${productCollectionFieldsFragment(eagerFetchProducts)}\n mutation BundleAssignProductCollection($id: String!, $productCollectionId: String!) {\n bundleAssignProductCollection(id: $id, collectionId: $productCollectionId) {\n id\n productCollection {\n ...ProductCollectionFields\n }\n }\n }\n`;\n\nexport const customerBundlesFeedQuery = (includeMetadata: boolean) => gql`\n query CustomerBundlesFeed($id: String!, $limit: Int!, $offset: Int!, $template: Boolean, $templateStatus: BundleTemplateStatus) {\n customerBundlesFeed(id: $id, limit: $limit, offset: $offset, template: $template, templateStatus: $templateStatus) {\n items {\n id\n name\n template\n templateStatus\n productCollection {\n id\n name\n description\n image {\n key\n name\n fileLink\n }\n }\n ${includeMetadata ? \"metadata { key, value }\" : \"\"}\n }\n total\n }\n }\n`;\n\nexport const finalizeUpdateBundleMutation = gql`\n mutation FinalizeUpdateBundle($bundleId: String!) {\n bundleFinalizeUpdate(bundleId: $bundleId)\n }\n`;\n\nexport const bundleApprovalQuery = gql`\n mutation ApproveBundle($id: String!, $note: String) {\n bundleApprove(id: $id, note: $note)\n }\n`;\n\nexport const bundleRejectionQuery = gql`\n mutation RejectBundle($id: String!, $note: String) {\n bundleReject(id: $id, note: $note)\n }\n`;\n\nexport const transactionApprovalQuery = gql`\n mutation ApproveTransaction($id: String!, $note: String) {\n transactionApprove(id: $id, note: $note)\n }\n`;\n\nexport const transactionRejectionQuery = gql`\n mutation RejectTransaction($id: String!, $note: String) {\n transactionReject(id: $id, note: $note)\n }\n`;\n","import {\n FrameMetadata,\n IllustrationMetadata,\n ModuleMetadata,\n RegionElement,\n TextMetadata,\n StepSelections,\n Transaction,\n CommandWithFollowup,\n Product,\n Customer,\n SilentStepData,\n Placeable,\n StepStorage,\n VariantResource,\n ILayout,\n LayoutState,\n SerializableStep,\n Workflow,\n LayoutsState,\n StepType,\n ModelStepData,\n MaterialStepData,\n SerializableWorkflow,\n IllustrationElement,\n FrameElement,\n Step,\n AnyStepData,\n DigitalContentStepData,\n FrameStepData,\n IllustrationStepData,\n ModuleStepData,\n PictureStepData,\n QuestionStepData,\n ShapeStepData,\n TextStepData,\n} from \"../types\";\nimport {\n getAllScenes,\n getActiveScenes,\n getRenderableRelevantScenes,\n stepConditionsAreSatisfied,\n WorkflowScene,\n} from \"./scenes\";\nimport { PromiseQueue, QueueablePromise } from \"../util/PromiseQueue\";\nimport { FetchResult, MutationOptions } from \"@apollo/client/core\";\nimport { FrameService } from \"../services/steps/frame/Service\";\nimport { Poller } from \"../util/Poller\";\nimport cloneDeep from \"lodash.clonedeep\";\nimport isEqual from \"lodash.isequal\";\nimport { SilentStepHandler, SilentStepTriggerResult } from \"../services/SilentStepHandler\";\nimport { digitalContentStepService } from \"../services/steps/digitalContent\";\nimport { frameStepService } from \"../services/steps/frame\";\nimport { illustrationStepService } from \"../services/steps/illustration\";\nimport { materialStepService } from \"../services/steps/material\";\nimport { modelStepService } from \"../services/steps/model\";\nimport { moduleStepService } from \"../services/steps/module\";\nimport { pictureStepService } from \"../services/steps/picture\";\nimport { questionStepService } from \"../services/steps/question\";\nimport { shapeStepService } from \"../services/steps/shape\";\nimport { textStepService } from \"../services/steps/text\";\nimport { ModuleProduct } from \"../module/ModuleProduct\";\nimport moduleResolver from \"../module/resolver\";\nimport { UnhandledBehaviorError } from \"../util/exception\";\nimport { LayoutPreviewService } from \"./LayoutPreviewService\";\nimport type { ModelContainer, ThreeDPreviewService } from \"@spiffcommerce/preview\";\nimport { SpiffCommerceClient } from \"../client\";\nimport { graphQlManager } from \"../services/server\";\nimport { getTransactionStakeholdersQuery } from \"../query\";\nimport { WorkflowExperience } from \"../WorkflowExperience\";\nimport { CanvasCommand, DeleteElementCommand, GroupCommand, UpdateWorkflowStateCommand } from \"../command\";\nimport { CommandContext, CommandState } from \"../CommandContext\";\nimport { generate } from \"../util/guid\";\nimport { transactionApprovalQuery, transactionRejectionQuery } from \"../Bundle/query\";\n\nexport interface SilentIllustrationStepData extends SilentStepData, Placeable {}\n\nexport interface ProductOverlayStepData extends SilentStepData, Placeable {}\n\nexport interface EditedSteps {\n [stepName: string]: boolean;\n}\n\nexport interface MandatorySteps {\n [stepName: string]: boolean;\n}\n\nexport type StepElements = {\n [key: string]: RegionElement[];\n};\n\nexport type StepInitialised = {\n [key: string]: boolean;\n};\n\nexport type StepMetadata = FrameMetadata | IllustrationMetadata | ModuleMetadata | TextMetadata;\n\n// Non-variant decisions made in each step.\nexport interface WorkflowStorage {\n [stepName: string]: StepStorage;\n}\n\nexport interface WorkflowMetadata {\n [stepName: string]: StepMetadata;\n}\n\nexport interface WorkflowSelections {\n [stepName: string]: {\n selections: VariantResource[];\n };\n}\n\nexport interface InformationResult {\n message: string;\n messageType: InformationMessageType;\n stepID: string;\n}\n\nexport enum InformationMessageType {\n Error = \"Error\",\n Warning = \"Warning\",\n Info = \"Info\",\n}\n\n/**\n * Services required for the operation of individual steps.\n */\nexport interface StepSpecificServices {\n frameService?: FrameService;\n module?: ModuleProduct;\n}\n\nexport interface ValidationErrors {\n steps: Map<string, Map<string, string>>;\n}\n\nexport type DesignCreationProgressUpdate = (message: string) => void;\nexport type ConfirmCallback = (isConfirmed: boolean) => void;\nexport type EditedCallback = (editedSteps: EditedSteps) => void;\nexport type ElementsCallback = (elements: StepElements) => void;\nexport type EnsuredInitialisedCallback = (ensuredInitialised: boolean) => void;\nexport type InformationResultCallback = (messages: InformationResult[]) => void;\nexport type InitCallback = (stepInitialised: StepInitialised) => void;\nexport type MakingAdjustmentsCallback = (makingAdjustments: string) => void;\nexport type MandatoryCallback = (mandatorySteps: MandatorySteps) => void;\nexport type MetadataCallback = (metadata: WorkflowMetadata) => void;\nexport type SelectionCallback = (callbackOptions: {\n selectionCost: number;\n selections: StepSelections;\n traversableScenes: WorkflowScene[];\n}) => void;\nexport type StepSpecificStorageCallback = (selections: StepStorage) => void;\nexport type StorageCallback = (storage: WorkflowStorage) => void;\nexport type ValidationCallback = (validationErrors: ValidationErrors) => void;\n\nexport type StateMutationFunc = (\n options?: Omit<MutationOptions, \"mutation\">,\n) => Promise<FetchResult<any, Record<string, any>, Record<string, any>>>;\n\nexport const STATE_DEBOUNCE_TIME = 1000;\n\n/**\n * Encapsulates the behavior of updating layout state against a transaction on the server.\n */\nexport class WorkflowStatePromise extends QueueablePromise {\n private readonly update: () => Promise<any>;\n public readonly createdAt: Date = new Date();\n\n constructor(update: () => Promise<any>) {\n super();\n this.update = update;\n }\n public async execute() {\n await this.update();\n await new Promise<void>((resolve) => {\n window.setTimeout(() => {\n resolve();\n }, STATE_DEBOUNCE_TIME);\n });\n }\n}\n\nexport interface WorkflowManager {\n addPoller: (poller: Poller) => void;\n addConfirmCallback: (callback: ConfirmCallback) => void;\n addEditedCallback: (callback: EditedCallback) => void;\n addElementsCallback: (callback: ElementsCallback) => void;\n addInformationResultCallback: (callback: InformationResultCallback) => void;\n addInitCallback: (callback: InitCallback) => void;\n addMakingAdjustmentsCallback: (callback: MakingAdjustmentsCallback) => void;\n addMandatoryCallback: (callback: MandatoryCallback) => void;\n addMetadataCallback: (callback: MetadataCallback) => void;\n addSelectionCallback: (callback: SelectionCallback) => void;\n addStepSpecificStorageCallback: (callback: StepSpecificStorageCallback, stepName: string) => void;\n addStorageCallback: (callback: StorageCallback) => void;\n addValidationCallback: (callback: ValidationCallback) => void;\n getCommandDispatcher: () => (command: CanvasCommand) => void;\n getCommandContext: () => CommandContext;\n getLayouts: () => ILayout[];\n getAllLayoutData: () => LayoutState[];\n getLayoutPreviewService: () => LayoutPreviewService | undefined;\n getPreviewService: () => ThreeDPreviewService | undefined;\n getProfanities: () => string[];\n getRegionElements: (stepName: string) => RegionElement[];\n getSerializedStep: (stepName: string, serializedSteps: SerializableStep[]) => SerializableStep | undefined;\n getStepSpecificServices: (stepName: string) => StepSpecificServices | undefined;\n getStepStorage: (stepName: string) => StepStorage | undefined;\n getMetadata: (stepName: string) => StepMetadata | undefined;\n getWorkflowMetadata: () => WorkflowMetadata;\n getInformationResults(): InformationResult[];\n getTransaction: () => Transaction;\n getTransactionCustomer: () => Customer | undefined;\n setTransactionCustomer: (customer: Customer) => void;\n /**\n * @deprecated Use setTransactionCustomer instead.\n */\n setTransactionCustomerDetails: (details: { email: string }) => void;\n getWorkflow: () => Workflow;\n getWorkflowSelections: () => WorkflowSelections;\n getStepSelections: () => StepSelections;\n getProduct: () => Product;\n /**\n * A promise resolving when the initial state of the workflow has completed loading.\n */\n getInitializationPromise: () => Promise<void>;\n /**\n * Returns true when the initial state of the workflow has been loaded and settled.\n */\n isInitialized(): boolean;\n markStepsAsInitialised: (stepNames: string[]) => void;\n getUpdatesPending: () => boolean;\n markUpdateCompleted: (id: string) => void;\n markUpdatePending: () => string;\n outstandingRequestsPromise: () => Promise<void>;\n reset: () => Promise<void>;\n setCurrentAdjustingStepId: (stepId: string) => void;\n setEditedStatus: (stepName: string, status: boolean) => void;\n setInformationResults: (results: InformationResult[]) => void;\n setMandatoryFulfilled: (stepName: string, status: boolean) => void;\n setSelectionsAndElements: (\n stepName: string,\n variants: VariantResource[],\n elements: RegionElement[],\n callback?: () => Promise<void>,\n ) => Promise<void>;\n setStepError: (stepName: string, field: string, error: string | undefined) => void;\n /** Gets any validation errors for a specific step, or `undefined` if there are none. */\n getStepErrors: (stepName: string) => Map<string, string> | undefined;\n /** Gets validation errors for all steps. Only steps with errors will be present. */\n getValidationErrors: () => ValidationErrors;\n toggleDesignConfirmed: () => void;\n updateMetadata: (stepName: string, update: any) => void;\n /**\n * @deprecated State updates are being pulled internally. This function will be removed in the future.\n */\n updateStateWithServerImmediate: (getReducerState: () => CommandState) => Promise<void>;\n updateStorage: (stepName: string, update: StepStorage) => void;\n\n getModelContainer: () => ModelContainer | undefined;\n setModelContainer: (container: ModelContainer) => void;\n\n /**\n * Injects the model of this product into the preview service.\n * This also overwrites the internal preview service.\n * @param previewService The preview service to inject into.\n * @param refocusCamera Optional: Run camera focus Defaults to `true`.\n */\n injectIntoPreviewService(previewService: ThreeDPreviewService, refocusCamera?: boolean): Promise<void>;\n\n /**\n * Ejects the model of this product from the preview service. This also sets the internal preview service to undefined.\n */\n ejectFromPreviewService(): void;\n\n /**\n * Enables or disables uploading of workflow state to the server.\n * @param enabled When true, workflow state will be uploaded to the server.\n */\n setWorkflowStateSyncEnabled: (enabled: boolean) => void;\n\n /**\n * Returns the client that was responsible for spawning this manager.\n */\n getClient(): SpiffCommerceClient;\n\n /**\n * Returns the workflow experience that was responsible for creating this manager.\n */\n getWorkflowExperience(): WorkflowExperience;\n\n /**\n * Re-fetches the transactionShareActions for this WorkflowManager's Transaction object.\n * The updated transactionShareActions overwrite the existing values on the Transaction object returned by `getTransaction()`.\n */\n updateTransactionShareActions(): Promise<void>;\n\n /**\n * Re-fetches the stakeholders and currentStakeholder for this WorkflowManager's Transaction object.\n * The updated stakeholders and currentStakeholder overwrite the existing values on the Transaction object returned by `getTransaction()`.\n */\n updateTransactionStakeholders(): Promise<void>;\n\n /**\n * Returns the tags for a step.\n */\n getStepTags(stepId: string): string[];\n \n approveTransaction(note?: string): Promise<void>;\n\n rejectTransaction(note?: string): Promise<void>;\n}\n\nexport class InternalWorkflowManager implements WorkflowManager {\n readonly client: SpiffCommerceClient;\n readonly experience: WorkflowExperience;\n\n private reloadedState?: LayoutsState;\n private transaction: Transaction;\n private ownerCustomer?: Customer;\n private updateTransaction: StateMutationFunc;\n private confirmedDesign: boolean;\n private editedSteps: EditedSteps;\n private informationResults: InformationResult[];\n private layouts: ILayout[];\n private mandatorySteps: MandatorySteps;\n private pendingUpdates: string[];\n private selectionCost: number;\n private workflow: Workflow;\n private stepSpecificServices: { [stepName: string]: StepSpecificServices };\n private previewService: ThreeDPreviewService | undefined;\n private profanityFilter: string[];\n private pollers: Poller[];\n private commandContext: CommandContext;\n private validationErrors: ValidationErrors;\n\n private stepElements: StepElements;\n private stepInitialised: StepInitialised;\n private stepMetadata: WorkflowMetadata;\n private stepSelections: StepSelections;\n private storage: WorkflowStorage;\n\n private confirmCallbacks: ConfirmCallback[];\n private editedCallbacks: EditedCallback[];\n private elementsCallbacks: ElementsCallback[];\n private informationResultCallbacks: InformationResultCallback[];\n private initCallbacks: InitCallback[];\n private makingAdjustmentsCallback: MakingAdjustmentsCallback[];\n private mandatoryCallbacks: MandatoryCallback[];\n private metadataCallbacks: MetadataCallback[];\n private selectionCallbacks: SelectionCallback[];\n private stepSpecificStorageCallbacks: {\n [stepName: string]: StepSpecificStorageCallback[];\n };\n private storageCallbacks: StorageCallback[];\n private validationCallbacks: ValidationCallback[];\n\n private allScenes: WorkflowScene[];\n private product: Product;\n\n private currentAdjustingStepId: string;\n\n private renderableContextService?: LayoutPreviewService;\n private workflowStatePromiseQueue: PromiseQueue<WorkflowStatePromise> = new PromiseQueue<WorkflowStatePromise>(1);\n\n private initializationPromise: Promise<void>; // A promise that resolves when the initial state of the workflow has been loaded and settled.\n private initialized: boolean = false; // True when the initial state of the workflow has been loaded and settled.\n private readOnly: boolean = false;\n private modelContainer: ModelContainer | undefined;\n private isReloadedTransaction: boolean = false; // True when the transaction is being reloaded, rather than newly created.\n\n private singleVariantsRenderable: boolean = false;\n private stepTags: { [stepId: string]: string[] } = {};\n\n constructor(\n experience: WorkflowExperience,\n client: SpiffCommerceClient,\n workflow: Workflow,\n profanityFilter: string[],\n layouts: ILayout[],\n commandContext: CommandContext,\n updateTransaction: StateMutationFunc,\n transaction: Transaction,\n product: Product,\n previewService?: ThreeDPreviewService,\n renderableContextService?: LayoutPreviewService,\n reloadedState?: LayoutsState,\n readOnly: boolean = false,\n modelContainer?: ModelContainer,\n isReloadedTransaction: boolean = false,\n singleVariantsRenderable: boolean = false,\n delayWorkflowStateSync: boolean = false,\n ) {\n this.experience = experience;\n this.client = client;\n this.updateTransaction = updateTransaction;\n\n this.commandContext = commandContext;\n this.reloadedState = reloadedState;\n this.transaction = transaction;\n this.readOnly = readOnly;\n this.singleVariantsRenderable = singleVariantsRenderable;\n\n this.confirmedDesign = false;\n this.editedSteps = {};\n this.informationResults = [];\n this.mandatorySteps = {};\n this.pendingUpdates = [];\n this.selectionCost = 0;\n this.workflow = workflow;\n this.stepSpecificServices = {};\n this.profanityFilter = profanityFilter;\n this.pollers = [];\n this.allScenes = [];\n this.layouts = layouts;\n this.product = product;\n this.previewService = previewService;\n this.modelContainer = modelContainer;\n\n this.stepElements = {};\n this.stepInitialised = {};\n this.stepMetadata = {};\n this.stepSelections = {};\n this.storage = {};\n this.validationErrors = { steps: new Map() };\n\n this.confirmCallbacks = [];\n this.editedCallbacks = [];\n this.elementsCallbacks = [];\n this.informationResultCallbacks = [];\n this.initCallbacks = [];\n this.mandatoryCallbacks = [];\n this.makingAdjustmentsCallback = [];\n this.metadataCallbacks = [];\n this.selectionCallbacks = [];\n this.stepSpecificStorageCallbacks = {};\n this.storageCallbacks = [];\n this.validationCallbacks = [];\n\n this.currentAdjustingStepId = \"\";\n this.renderableContextService = renderableContextService;\n\n this.isReloadedTransaction = isReloadedTransaction;\n\n this.workflow.steps.forEach((step) => {\n this.stepTags[step.stepName] = step.tags ?? [];\n });\n\n if (delayWorkflowStateSync) {\n this.workflowStatePromiseQueue.enabled = false;\n }\n\n // Fire initialisation process.\n this.initializationPromise = this.initializeDefaultWorkflowState(workflow);\n this.initializationPromise.then(() => {\n this.initialized = true;\n });\n this.initializationPromise.catch((e) => {\n console.error(e);\n this.initialized = false;\n throw new Error(\"Workflow initialization failed due to an error. See console.\");\n });\n this.initializationPromise.finally(() =>\n this.getCommandContext().registerStateCallback(() => {\n this.updateStateWithServer();\n this.renderLayouts();\n }),\n );\n }\n\n private async initializeDefaultWorkflowState(workflow: Workflow) {\n const fireReloadAnimation = () => {\n const finalConfig = this.workflow.finalizeStepConfig;\n if (!finalConfig) return;\n const lookAt = finalConfig.lookAtAnimation;\n const modelAnim = finalConfig.modelAnimation;\n if (lookAt) this.previewService?.executeCameraAnimation(lookAt);\n if (modelAnim) this.modelContainer?.executeAnimation(modelAnim);\n };\n\n // If a reloaded state exists, we want to load the state from that instead of initializing with defaults.\n if (this.reloadedState) {\n this.reloadedState.serializableWorkflow.steps.forEach((step) => {\n this.storage[step.stepName] = step.storage || {};\n });\n }\n\n // We set the scenes the workflow should start with\n this.allScenes = await getAllScenes(workflow);\n\n // Initialize any relevant starting silent steps.\n const activeScenes = getActiveScenes(this.allScenes, this.stepSelections);\n const introducedSilentSteps = activeScenes.map((scene) => scene.silentSteps).flat();\n const { stepElements: silentStepElements, commands: silentCommands } =\n await this.stepElementsForIntroducedSilentSteps(introducedSilentSteps, !!this.reloadedState);\n this.commandContext.apply(new GroupCommand(silentCommands), true);\n this.stepElements = { ...this.stepElements, ...silentStepElements };\n\n // Begin by setting the initial state of the workflow.\n await this.ensureStepsAreLoaded();\n\n // Sync the initial state\n !this.isReloadedTransaction && this.updateStateWithServer();\n\n // Initial render of the 3D scene.\n this.renderLayouts();\n\n // If we're dealing with a reloaded state, we want to fire of the initial animations at this point.\n this.reloadedState && fireReloadAnimation();\n }\n\n getWorkflowExperience() {\n return this.experience;\n }\n\n getClient() {\n return this.client;\n }\n\n setWorkflowStateSyncEnabled(enabled: boolean) {\n this.workflowStatePromiseQueue.enabled = enabled;\n }\n\n getProduct() {\n return this.product;\n }\n\n getInitializationPromise() {\n return this.initializationPromise;\n }\n\n isInitialized() {\n return this.initialized;\n }\n\n addConfirmCallback(callback: ConfirmCallback) {\n callback(this.confirmedDesign);\n this.confirmCallbacks.push(callback);\n }\n\n addEditedCallback(callback: EditedCallback) {\n callback(this.editedSteps);\n this.editedCallbacks.push(callback);\n }\n\n addElementsCallback(callback: ElementsCallback) {\n callback(this.stepElements);\n this.elementsCallbacks.push(callback);\n }\n\n addInformationResultCallback(callback: InformationResultCallback) {\n callback(this.informationResults);\n this.informationResultCallbacks.push(callback);\n }\n\n addInitCallback(callback: InitCallback) {\n callback(this.stepInitialised);\n this.initCallbacks.push(callback);\n }\n\n addMandatoryCallback(callback: MandatoryCallback) {\n callback(this.mandatorySteps);\n this.mandatoryCallbacks.push(callback);\n }\n\n addMetadataCallback(callback: MetadataCallback) {\n callback(this.stepMetadata);\n this.metadataCallbacks.push(callback);\n }\n\n async addSelectionCallback(callback: SelectionCallback) {\n callback({\n selectionCost: this.selectionCost,\n selections: this.stepSelections,\n traversableScenes: await this.traversableScenes(),\n });\n this.selectionCallbacks.push(callback);\n }\n\n addStepSpecificStorageCallback(callback: StepSpecificStorageCallback, stepName: string) {\n if (!Object.keys(this.storage).includes(stepName)) {\n this.storage[stepName] = {};\n }\n callback(this.storage[stepName]);\n if (!Object.keys(this.stepSpecificStorageCallbacks).includes(stepName)) {\n this.stepSpecificStorageCallbacks[stepName] = [];\n }\n this.stepSpecificStorageCallbacks[stepName].push(callback);\n }\n\n /**\n * @deprecated Any call to this causes all renderable steps to re-render even if they don't care about change.\n */\n addStorageCallback(callback: StorageCallback) {\n callback(this.storage);\n this.storageCallbacks.push(callback);\n }\n\n addMakingAdjustmentsCallback(callback: MakingAdjustmentsCallback) {\n callback(this.currentAdjustingStepId);\n this.makingAdjustmentsCallback.push(callback);\n }\n\n addPoller(poller: Poller) {\n this.pollers.push(poller);\n }\n\n addValidationCallback(callback: ValidationCallback) {\n this.validationCallbacks.push(callback);\n callback(this.validationErrors);\n }\n\n getLayouts(): ILayout[] {\n return this.layouts;\n }\n\n getAllLayoutData(): LayoutState[] {\n return this.commandContext.getAllLayouts().map((l) => l.layoutState);\n }\n\n getLayoutPreviewService(): LayoutPreviewService | undefined {\n return this.renderableContextService;\n }\n\n getInformationResults(): InformationResult[] {\n return this.informationResults;\n }\n\n getPreviewService() {\n return this.previewService;\n }\n\n getProfanities(): string[] {\n return this.profanityFilter;\n }\n\n getCommandContext(): CommandContext {\n return this.commandContext;\n }\n\n getRegionElements(stepName: string): RegionElement[] {\n return this.stepElements[stepName] || [];\n }\n\n getStepSpecificServices(stepName: string): StepSpecificServices | undefined {\n return this.stepSpecificServices[stepName];\n }\n\n getTransaction(): Transaction {\n return this.transaction;\n }\n\n getTransactionCustomer(): Customer | undefined {\n return this.ownerCustomer;\n }\n\n setTransactionCustomer(customer: Customer) {\n this.ownerCustomer = customer;\n }\n\n setTransactionCustomerDetails(details: { email: string }) {\n this.ownerCustomer = { ...this.ownerCustomer, emailAddress: details.email };\n }\n\n getModelContainer(): ModelContainer | undefined {\n return this.modelContainer;\n }\n\n setModelContainer(container: ModelContainer): void {\n if (!container || (this.previewService && this.previewService.getAllModels().includes(container))) {\n this.modelContainer = container;\n if (container && container.metadata && container.metadata instanceof Map) {\n this.modelContainer.metadata.set(\"workflowManager\", this);\n }\n }\n }\n\n /**\n * An internal helper for setting changes on the transaction.\n * @param transaction The updated transaction details.\n * @returns void\n */\n setTransaction(transaction: Transaction) {\n this.transaction = transaction;\n }\n\n getWorkflow(): Workflow {\n return this.workflow;\n }\n\n getCommandDispatcher() {\n return (command: CanvasCommand) => this.commandContext.apply(command, !this.initialized);\n }\n\n getWorkflowSelections(): WorkflowSelections {\n const selections: WorkflowSelections = {};\n this.workflow.steps.forEach((step) => {\n const stepStorage = this.stepSelections[step.stepName];\n if (stepStorage && stepStorage.selectedVariants && stepStorage.selectedVariants.length > 0) {\n selections[step.stepName] = {\n selections: stepStorage.selectedVariants,\n };\n }\n });\n return selections;\n }\n\n getStepSelections(): StepSelections {\n return this.stepSelections;\n }\n\n markStepsAsInitialised(stepNames: string[]) {\n const stepInitialised = { ...this.stepInitialised };\n stepNames.forEach((stepName) => {\n stepInitialised[stepName] = true;\n });\n this.stepInitialised = stepInitialised;\n this.onInitChange();\n }\n\n getUpdatesPending() {\n return this.pendingUpdates.length > 0;\n }\n\n markUpdateCompleted(id: string) {\n this.pendingUpdates = this.pendingUpdates.filter((up) => up !== id);\n }\n\n markUpdatePending() {\n const updateId = generate();\n this.pendingUpdates = [...this.pendingUpdates, updateId];\n return updateId;\n }\n\n setEditedStatus(stepName: string, status: boolean) {\n this.editedSteps = { ...this.editedSteps, [stepName]: status };\n this.onEditedChange();\n }\n\n setInformationResults(results: InformationResult[]) {\n this.informationResults = [...results];\n this.onInformationResultChange();\n }\n\n setCurrentAdjustingStepId(stepId: string) {\n this.currentAdjustingStepId = stepId;\n this.onMakingAdjustmentsChange();\n }\n\n setMandatoryFulfilled(stepName: string, status: boolean) {\n // If the value hasn't changed don't notify listeners.\n if (this.mandatorySteps[stepName] === status) {\n return;\n }\n // Otherwise update mandatory structure and notify\n this.mandatorySteps = { ...this.mandatorySteps, [stepName]: status };\n this.setInformationResults([]);\n this.onMandatoryChange();\n }\n\n setStepError(stepName: string, field: string, error: string | undefined) {\n let changed = false;\n if (!this.validationErrors.steps.has(stepName) && error) {\n // New step entry\n changed = true;\n this.validationErrors.steps.set(stepName, new Map([[field, error]]));\n } else if (this.validationErrors.steps.has(stepName)) {\n const stepErrors = this.validationErrors.steps.get(stepName)!;\n if (error && error !== stepErrors.get(field)) {\n // New or changed\n changed = true;\n stepErrors.set(field, error);\n } else if (!error) {\n // Deleted entry\n changed = true;\n stepErrors.delete(field);\n if (stepErrors.size === 0) {\n // Delete step if no errors\n this.validationErrors.steps.delete(stepName);\n }\n }\n }\n\n if (changed) {\n this.onValidationChange();\n }\n }\n\n getStepErrors(stepName: string) {\n return this.validationErrors.steps.get(stepName);\n }\n\n getValidationErrors() {\n return this.validationErrors;\n }\n\n toggleDesignConfirmed() {\n this.confirmedDesign = !this.confirmedDesign;\n this.onConfirmChange();\n }\n\n toggleMakingAdjustmentsCallback(callback: MandatoryCallback) {\n callback(this.mandatorySteps);\n this.mandatoryCallbacks.push(callback);\n }\n\n async injectIntoPreviewService(previewService: ThreeDPreviewService, refocusCamera?: boolean): Promise<void> {\n if (this.modelContainer) {\n throw new Error(\"You must eject from the preview service before injecting again.\");\n }\n this.previewService = previewService;\n if (!this.getProduct().modelUrl || !this.previewService) return;\n const container = previewService.loadModel(\n {\n model: this.getProduct().modelUrl,\n contextService: this.getLayoutPreviewService(),\n },\n { refocusCamera },\n );\n this.setModelContainer(container);\n const scenes = getActiveScenes(this.allScenes, this.stepSelections).filter((scene) => scene);\n const steps = scenes\n .map((scene) => scene.renderableSteps)\n .flat()\n .filter((step) => step.type === StepType.Model || step.type === StepType.Material);\n steps.forEach((step) => {\n if (!step.option?.id) {\n console.error(`Failed to read option id from step: ${step.stepName}`);\n return;\n }\n const selectedVariants = this.stepSelections[step.stepName]?.selectedVariants || [];\n if (selectedVariants.length === 0) return;\n const variant = selectedVariants[0];\n if (step.type === StepType.Model) {\n if (!this.modelContainer)\n throw new UnhandledBehaviorError(\n \"We should always have a model container when injecting a preview!\",\n );\n const modelRef = variant.asset?.fileLink;\n if (!modelRef) {\n console.error(`Failed to read model url from variant: ${variant.id} for step: ${step.stepName}`);\n return;\n }\n const data = step.data as ModelStepData;\n this.modelContainer.applyModelVariant(\n step.stepName,\n {\n model: modelRef,\n contextService: this.getLayoutPreviewService(),\n },\n data.replaceProductModel || false,\n );\n } else {\n const material = variant.material;\n if (!material) {\n console.error(`Failed to read material from variant: ${variant.id} for step: ${step.stepName}`);\n return;\n }\n const data = step.data as MaterialStepData;\n data.targetMaterials.forEach((matName) => {\n if (!this.modelContainer)\n throw new UnhandledBehaviorError(\n \"We should always have a model container when injecting a preview!\",\n );\n this.modelContainer.applyMaterialVariant(matName, step.option!.id!, material);\n });\n }\n });\n await container.getInitializationPromise();\n this.renderLayouts();\n }\n\n ejectFromPreviewService(): void {\n if (this.modelContainer) {\n if (!this.modelContainer.dispose) {\n throw new Error(\"This feature is not supported in the current preview service.\");\n }\n this.modelContainer.dispose();\n this.modelContainer = undefined;\n }\n this.previewService = undefined;\n }\n\n updateStorage(stepName: string, update: StepStorage) {\n const newStorage = {\n ...this.storage,\n [stepName]: { ...this.storage[stepName], ...update },\n };\n if (!isEqual(newStorage, this.storage)) {\n this.storage = newStorage;\n const workflowCommand = new UpdateWorkflowStateCommand(this.constructSerializableWorkflow());\n this.commandContext.apply(workflowCommand, true);\n this.onStepSpecificStorageChange(stepName);\n this.onStorageChange();\n }\n }\n\n private constructSerializableWorkflow(): SerializableWorkflow {\n const steps: SerializableStep[] = [];\n this.allScenes.forEach((scene) => {\n scene.renderableSteps.forEach((step) => {\n const stepStructure: SerializableStep = { stepName: step.stepName };\n stepStructure.storage = this.storage[step.stepName];\n stepStructure.selectedVariants = this.stepSelections[step.stepName]?.selectedVariants?.map(\n (variant) => {\n return { id: variant.id!, priceModifier: variant.priceModifier };\n },\n );\n steps.push(stepStructure);\n });\n });\n return { steps };\n }\n\n private updateStateWithServer() {\n if (this.readOnly) return;\n const workflowState = this.serialize();\n this.workflowStatePromiseQueue.enqueue(\n new WorkflowStatePromise(async () => {\n // HACK: Immediately firing a network request can block the thread when many fire at once.\n // Using setTimeout will push this promise to the end of the event loop, allowing the calling function to exit.\n await new Promise<void>((resolve) => {\n setTimeout(() => {\n resolve();\n }, 1);\n });\n await this.updateTransaction({\n variables: {\n id: this.transaction.id,\n workflowState,\n },\n });\n }),\n );\n }\n\n private renderLayouts = () => {\n if (!this.previewService) return;\n const layouts = this.getCommandContext().getAllLayouts();\n const previewHandles = this.getLayoutPreviewService()?.getAll();\n if (!previewHandles) return;\n for (const [, previewBridge] of previewHandles) {\n previewBridge.render(layouts);\n }\n };\n\n public async updateStateWithServerImmediate() {\n if (this.readOnly) return;\n const workflowState = this.serialize();\n return new WorkflowStatePromise(async () => {\n await this.updateTransaction({\n variables: {\n id: this.transaction.id,\n workflowState,\n },\n });\n }).execute();\n }\n\n private serialize(): string {\n const fullState = this.getCommandContext().getState();\n if (!fullState) {\n throw new UnhandledBehaviorError(\"Attempted to serialize state before it was initialized.\");\n }\n const deepClone = cloneDeep(fullState.transaction);\n const dehydrated = this.dehydrateState(deepClone);\n return JSON.stringify(dehydrated);\n }\n\n /**\n * A helper to remove unwanted local cache data from the state before sending to the server.\n */\n private dehydrateState(state: LayoutsState) {\n for (const el of Object.values(state.layouts)\n .map((lay) => lay.elements)\n .flat()) {\n // FIXME:\" Can we achieve this better? Maybe non serializable fields could be removed entirely from the element.\"\n if (el.type === \"illustration\") {\n delete (el as IllustrationElement).cachedObjectURL;\n // When a src is provided for an svg let's remove the parsed data from the network request.\n if ((el as IllustrationElement).src) delete (el as IllustrationElement).svg;\n }\n if (el.type === \"frame\") {\n delete (el as FrameElement).pattern?.svg;\n }\n }\n // Ensure the __typename field used by apollo is not sent to the server.\n this.deleteFieldNameFromObjectRecursive(state, \"__typename\");\n return state;\n }\n\n private deleteFieldNameFromObjectRecursive(obj: any, fieldName: string) {\n if (typeof obj !== \"object\" || obj === null) {\n return;\n }\n for (const key in obj) {\n if (key === fieldName) {\n delete obj[key];\n } else {\n this.deleteFieldNameFromObjectRecursive(obj[key], fieldName);\n }\n }\n }\n\n async outstandingRequestsPromise() {\n return this.workflowStatePromiseQueue.finalize();\n }\n\n updateMetadata(stepName: string, update: any) {\n this.stepMetadata = {\n ...this.stepMetadata,\n [stepName]: { ...this.stepMetadata[stepName], ...update },\n };\n this.onMetadataChange();\n }\n\n private removeElements(elements: RegionElement[]) {\n const filterOutAllElementsFromSteps = (\n existingStepElements: StepElements,\n elements: RegionElement[],\n ): StepElements => {\n return Object.keys(existingStepElements).reduce<StepElements>((stepsWithoutOldElements, stepName) => {\n const newListOfStepElements = [...(existingStepElements[stepName] || [])];\n elements.forEach((regionElementToRemove) => {\n const index = newListOfStepElements.findIndex((currentRegionElement) => {\n return currentRegionElement.id === regionElementToRemove.id;\n });\n if (index > -1) {\n newListOfStepElements.splice(index, 1);\n }\n });\n stepsWithoutOldElements[stepName] = newListOfStepElements;\n return stepsWithoutOldElements;\n }, {});\n };\n this.stepElements = filterOutAllElementsFromSteps(this.stepElements, elements);\n }\n\n private getInvalidCanvasRegions(): RegionElement[] {\n return this.workflow.steps.reduce<RegionElement[]>((selectionsToRemove, step) => {\n if (!stepConditionsAreSatisfied(step, this.stepSelections)) {\n if (this.stepElements[step.stepName]) {\n this.stepElements[step.stepName].forEach((regionElement: RegionElement) =>\n selectionsToRemove.push(regionElement),\n );\n }\n }\n return selectionsToRemove;\n }, []);\n }\n\n private getInvalidModelVariants(): string[] {\n return this.workflow.steps.reduce<string[]>((invalidVariants, step) => {\n if (step.type === StepType.Model && !stepConditionsAreSatisfied(step, this.stepSelections)) {\n invalidVariants.push(step.stepName);\n }\n return invalidVariants;\n }, []);\n }\n\n private async stepElementsForIntroducedSilentSteps(\n introducedSilentSteps: Step<AnyStepData>[],\n handlingReload: boolean,\n ): Promise<{ stepElements: StepElements; commands: CanvasCommand[] }> {\n const product = this.product;\n if (!product) {\n return Promise.resolve({ stepElements: {}, commands: [] });\n }\n\n // Trigger the given silent step.\n // Steps in completely silent scenes should trigger immediately when the step becomes relevant.\n // Steps in renderable scenes should trigger when the scene becomes active the first time.\n const executeSilentStep = async (\n step: Step<AnyStepData>,\n layouts: ILayout[],\n product: Product,\n ): Promise<{ step: Step<AnyStepData>; results: SilentStepTriggerResult[] }> => {\n if (step.type === StepType.SilentIllustration) {\n const result = await new SilentStepHandler(step as Step<SilentIllustrationStepData>, layouts).trigger();\n return { step, results: result };\n } else if (step.type === StepType.ProductOverlay) {\n const result = await new SilentStepHandler(\n step as Step<ProductOverlayStepData>,\n layouts,\n product,\n ).trigger();\n return { step, results: result };\n }\n\n return Promise.reject(\"Unknown silent step. This is a bug\");\n };\n\n const uninitializedSteps: Step<AnyStepData>[] = introducedSilentSteps.filter(\n (step) => !this.stepInitialised[step.stepName],\n );\n\n const result: { stepElements: StepElements; commands: CanvasCommand[] } = {\n stepElements: {},\n commands: [],\n };\n\n const silentStepPromises: Promise<{ step: Step<AnyStepData>; results: SilentStepTriggerResult[] }>[] = [];\n\n for (const step of uninitializedSteps) {\n this.markStepsAsInitialised([step.stepName]);\n if (!handlingReload) {\n silentStepPromises.push(executeSilentStep(step, this.layouts, product));\n }\n }\n const silentStepResults = await Promise.all(silentStepPromises);\n for (const stepResult of silentStepResults) {\n result.stepElements[stepResult.step.stepName] = stepResult.results.map((r) => r.regionElement);\n result.commands = [...result.commands, ...stepResult.results.map((r) => r.command)];\n }\n\n return result;\n }\n\n getStepStorage(stepName: string): StepStorage | undefined {\n return this.storage[stepName];\n }\n\n getMetadata(stepName: string): StepMetadata | undefined {\n return this.stepMetadata[stepName];\n }\n\n getWorkflowMetadata(): WorkflowMetadata {\n return this.stepMetadata;\n }\n\n getStepTags(stepId: string): string[] {\n return this.stepTags[stepId] || [];\n }\n\n /**\n * @deprecated Simply run serializedSteps.find((step) => step.stepName === stepName) instead.\n */\n getSerializedStep(stepName: string, serializedSteps: SerializableStep[]): SerializableStep | undefined {\n return serializedSteps.find((step) => step.stepName === stepName);\n }\n\n async updateTransactionShareActions() {\n const shareActions = await this.client.getShareActionsForTransaction(this.transaction.id);\n this.transaction.transactionShareActions = shareActions;\n }\n\n async updateTransactionStakeholders() {\n const response = await graphQlManager.getShadowGraphqlClient().query<{ transactions: Transaction[] }>({\n query: getTransactionStakeholdersQuery,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n id: this.transaction.id,\n },\n });\n if (!response?.data?.transactions || response.data.transactions.length !== 1) {\n this.transaction.currentStakeholder = undefined;\n this.transaction.stakeholders = undefined;\n } else {\n this.transaction.stakeholders = response.data.transactions[0].stakeholders;\n this.transaction.currentStakeholder = response.data.transactions[0].currentStakeholder;\n }\n }\n\n async approveTransaction(note?: string): Promise<void> {\n await graphQlManager\n .getShadowGraphqlClient()\n .mutate<{ id: string }>({\n mutation: transactionApprovalQuery,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n id: this.getTransaction().id,\n note,\n },\n })\n }\n\n async rejectTransaction(note?: string): Promise<void> {\n await graphQlManager\n .getShadowGraphqlClient()\n .mutate<{ id: string }>({\n mutation: transactionRejectionQuery,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n id: this.getTransaction().id,\n note,\n },\n })\n }\n\n async reset() {\n const layouts = this.commandContext.getAllLayouts();\n layouts.forEach((layout) =>\n layout.layoutState.elements.forEach((el) => {\n this.getCommandDispatcher()(new DeleteElementCommand(el.id));\n }),\n );\n this.stepElements = {};\n this.stepInitialised = {};\n this.stepMetadata = {};\n this.stepSelections = {};\n this.storage = {};\n await this.ensureStepsAreLoaded();\n }\n\n async setSelectionsAndElements(\n stepName: string,\n variants: VariantResource[],\n elements: RegionElement[],\n callback?: () => Promise<void>,\n ) {\n const oldSelections = this.stepSelections;\n this.stepSelections = {\n ...this.stepSelections,\n [stepName]: { selectedVariants: variants },\n };\n\n // Recursively tally the cost of all selections\n this.selectionCost = Object.values(this.stepSelections).reduce((total, current) => {\n return (\n total +\n current\n .selectedVariants!.map((vs) => vs.priceModifier || 0)\n .reduce((acc, val) => {\n return acc + val;\n }, 0)\n );\n }, 0);\n\n // Unset state of steps which have become irrelevant.\n this.workflow.steps.forEach((step) => {\n if (!stepConditionsAreSatisfied(step, this.stepSelections)) {\n this.stepInitialised[step.stepName] = false;\n delete this.stepMetadata[step.stepName];\n delete this.stepSelections[step.stepName];\n delete this.storage[step.stepName];\n }\n });\n\n // Find silent steps which have become relevant, cleanup any that have become irrelevant.\n const allScenes = this.allScenes;\n const oldScenes = getActiveScenes(allScenes, oldSelections);\n const newScenes = getActiveScenes(allScenes, this.stepSelections);\n const oldSilentSteps = oldScenes.map((scene) => scene.silentSteps).flat();\n const newSilentSteps = newScenes.map((scene) => scene.silentSteps).flat();\n const introducedSilentSteps = newSilentSteps.filter(\n (newStep) => !oldSilentSteps.some((oldStep) => oldStep.stepName === newStep.stepName),\n );\n oldSilentSteps.forEach((step) => {\n if (!stepConditionsAreSatisfied(step, this.stepSelections)) {\n this.stepInitialised[step.stepName] = false;\n }\n });\n\n const invalidCanvasRegions = this.getInvalidCanvasRegions();\n\n const { stepElements: silentStepElements, commands: silentCommands } =\n await this.stepElementsForIntroducedSilentSteps(introducedSilentSteps, false);\n\n // Set the new step elements\n this.stepElements = {\n ...this.stepElements,\n ...silentStepElements,\n [stepName]: elements,\n };\n\n // Remove any elements that have become invalid.\n this.removeElements(invalidCanvasRegions);\n\n // When target step is a frame, we need to notify frame service of new elements.\n const step = this.workflow.steps.find((step) => step.stepName === stepName);\n if (step?.type === StepType.Frame) {\n const services = this.getStepSpecificServices(stepName);\n services?.frameService?.setTargetElements(elements.map((regionEl) => regionEl.id));\n }\n\n const deleteCommands = invalidCanvasRegions.map((el: RegionElement) => new DeleteElementCommand(el.id));\n const workflowCommand = new UpdateWorkflowStateCommand(this.constructSerializableWorkflow());\n const commands = [...silentCommands, ...deleteCommands, workflowCommand];\n if (commands.length > 0) {\n this.commandContext.apply(new GroupCommand(commands), true);\n }\n\n // Ensure any effects of this selection change are executed as a result.\n await this.ensureStepsAreLoaded();\n\n // Notify any listeners that the workflow has changed.\n this.onElementsChange();\n\n // When conditions change certain models may become invalid. We clean them up here.\n const invalidModelVariants = this.getInvalidModelVariants();\n const modelContainer = this.modelContainer;\n if (modelContainer) {\n const removalPromises = invalidModelVariants.map((im) =>\n modelContainer.applyModelVariant(\n im,\n {\n contextService: this.getLayoutPreviewService(),\n },\n false,\n ),\n );\n await Promise.all(removalPromises);\n }\n\n await this.onSelectionChange();\n\n if (callback) {\n await callback();\n }\n }\n\n private async ensureStepsAreLoaded() {\n const activeScenes = getActiveScenes(this.allScenes, this.stepSelections);\n const stepsPerScene = activeScenes.map((scene) => scene.renderableSteps);\n\n // We create a list of steps which are not yet initialized.\n // Iterate over all required steps and run initialization, this should occur in parallel.\n const stepPromises: Promise<any>[] = [];\n const steps = stepsPerScene.flat();\n\n for (const step of steps) {\n if (!this.stepInitialised[step.stepName]) {\n this.stepInitialised[step.stepName] = true;\n switch (step.type) {\n case StepType.DigitalContent:\n stepPromises.push(\n digitalContentStepService.init(\n step as Step<DigitalContentStepData>,\n this,\n this.reloadedState,\n ),\n );\n break;\n case StepType.Frame:\n // FIXME: Allow for setting step specific services via workflow manager interface\n // Pull this code into the frame init function for consistency.\n // Do same for module step.\n {\n const frameStepData = (step as Step<FrameStepData>).data;\n const frameService = new FrameService(\n frameStepData.forceImageCover,\n frameStepData.initialZoomLevel,\n );\n frameService.connectWorkflowManager(this, step.stepName);\n this.stepSpecificServices[step.stepName] = {\n frameService,\n };\n stepPromises.push(\n frameStepService.init(step as Step<FrameStepData>, this, this.reloadedState),\n );\n }\n break;\n case StepType.Illustration:\n stepPromises.push(\n illustrationStepService.init(step as Step<IllustrationStepData>, this, this.reloadedState),\n );\n break;\n case StepType.Material:\n stepPromises.push(\n materialStepService.init(step as Step<MaterialStepData>, this, this.reloadedState),\n );\n break;\n case StepType.Model:\n stepPromises.push(modelStepService.init(step as Step<ModelStepData>, this, this.reloadedState));\n break;\n case StepType.Module:\n this.stepSpecificServices[step.stepName] = {\n module: await moduleResolver((step as Step<ModuleStepData>).data.module),\n };\n stepPromises.push(\n moduleStepService.init(step as Step<ModuleStepData>, this, this.reloadedState),\n );\n break;\n case StepType.Picture:\n stepPromises.push(\n pictureStepService.init(step as Step<PictureStepData>, this, this.reloadedState),\n );\n break;\n case StepType.Question:\n stepPromises.push(\n questionStepService.init(step as Step<QuestionStepData>, this, this.reloadedState),\n );\n break;\n case StepType.Shape:\n stepPromises.push(shapeStepService.init(step as Step<ShapeStepData>, this, this.reloadedState));\n break;\n case StepType.Text:\n stepPromises.push(textStepService.init(step as Step<TextStepData>, this, this.reloadedState));\n break;\n default:\n break;\n }\n }\n }\n\n // Settle all parallel logic.\n const stepCwfs = (await Promise.allSettled<CommandWithFollowup | null>(stepPromises)).map((result) => {\n if (result.status === \"rejected\") {\n throw new Error(`Step initialization failed: ${result.reason}`);\n }\n return result.value;\n });\n\n // Map all non-null commands/followups to lists.\n const commands = stepCwfs.filter((cwf) => !!cwf && !!cwf.command).map((cwf) => cwf!.command!);\n const followups = stepCwfs.filter((cwf) => !!cwf && !!cwf.followup).map((cwf) => cwf!.followup!);\n\n // Execute all commands in a single batch\n if (commands && commands.length > 0) this.commandContext.apply(new GroupCommand(commands), true);\n for (const followup of followups) await followup();\n\n // Process any followup conditions\n // A step will produce followup actions when a change has occured. To ensure\n // any conditions that have become true are actioned, we run once again.\n if (followups.length > 0) {\n await this.ensureStepsAreLoaded();\n }\n\n // Notify listeners of changes.\n this.onInitChange();\n }\n\n private onConfirmChange() {\n this.confirmCallbacks.forEach((callback) => callback(this.confirmedDesign));\n }\n\n private onEditedChange() {\n this.editedCallbacks.forEach((callback) => callback(this.editedSteps));\n }\n\n private onElementsChange() {\n this.elementsCallbacks.forEach((callback) => callback(this.stepElements));\n }\n\n private onInformationResultChange() {\n this.informationResultCallbacks.forEach((callback) => callback(this.informationResults));\n }\n\n private onInitChange() {\n this.initCallbacks.forEach((callback) => callback(this.stepInitialised));\n }\n\n private onMakingAdjustmentsChange() {\n this.makingAdjustmentsCallback.forEach((callback) => {\n callback(this.currentAdjustingStepId);\n });\n }\n\n private onMandatoryChange() {\n this.mandatoryCallbacks.forEach((callback) => callback(this.mandatorySteps));\n }\n\n private onMetadataChange() {\n this.metadataCallbacks.forEach((callback) => {\n callback(this.stepMetadata);\n });\n }\n\n private async onSelectionChange() {\n const traversableScenes = await this.traversableScenes();\n for (const cb of this.selectionCallbacks) {\n cb({\n selectionCost: this.selectionCost,\n selections: this.stepSelections,\n traversableScenes,\n });\n }\n }\n\n private onStepSpecificStorageChange(stepName: string) {\n if (!Object.keys(this.stepSpecificStorageCallbacks).includes(stepName)) {\n this.stepSpecificStorageCallbacks[stepName] = [];\n }\n this.stepSpecificStorageCallbacks[stepName].forEach((callback) => callback(this.storage[stepName]));\n }\n\n private onStorageChange() {\n this.storageCallbacks.forEach((callback) => callback(this.storage));\n }\n\n private onValidationChange() {\n this.validationCallbacks.forEach((callback) => callback(this.validationErrors));\n }\n\n private traversableScenes(): Promise<WorkflowScene[]> {\n return getRenderableRelevantScenes(this.allScenes, this.stepSelections, this.singleVariantsRenderable);\n }\n}\n","import { Asset, AssetType, VariantResource } from \"../../types\";\n\n/**\n * A wrapping component that provides a simple interface for interacting with a variant.\n */\nexport class Variant {\n private readonly variantData: VariantResource;\n\n constructor(variant: VariantResource) {\n this.variantData = variant;\n }\n\n getType(): AssetType | undefined {\n return this.variantData.asset?.type;\n }\n\n /**\n * @returns The unique identifier for the variant.\n */\n getId(): string {\n return this.variantData.id!;\n }\n\n /**\n * @returns The configured name of the variant. Generally a human readable value.\n */\n getName(): string {\n return this.variantData.name;\n }\n\n /**\n * @returns The price modifier for this variant. This is the amount that will be added to the base price of the product.\n */\n getPriceFormatted(locales?: Intl.LocalesArgument, options?: Intl.NumberFormatOptions | undefined): string {\n return this.variantData.priceModifier.toLocaleString(locales ? locales : \"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n ...options,\n });\n }\n\n /**\n * @returns The price modifier for this variant. This is the amount that will be added to the base price of the product.\n * Presented in subunits of the currency of the option. For example, if the option is configured to use USD, the price modifier will be in cents.\n */\n getPrice(): number {\n return this.variantData.priceModifier;\n }\n\n /**\n * @returns The URL for the base asset resource configured on this variant\n */\n getAsset(): string | undefined {\n return this.variantData.asset?.versions?.find((v) => v.name === \"cdn\")?.link;\n }\n\n /**\n * @returns The URL for the base asset resource configured on this variant\n */\n getAssetResource(): Asset | undefined {\n return this.variantData.asset;\n }\n\n /**\n * @returns The URL for a thumbnail resource configured on this variant.\n */\n getThumbnail(): string | undefined {\n // Thumbnails are uploaded high res. We generate thumbnails internally. First we look\n // for this internally generated thumbnail. If it doesn't exist, we fall back to the original\n // thumbnail asset (Which is assumably going to be small anyway...)\n // NOTE: Certain assets such as SVG don't currently generate a thumb.\n const thumb = this.variantData.thumbnail?.versions?.find((v) => v.name === \"thumbnail\")?.link;\n const full = this.variantData.thumbnail?.fileLink;\n return thumb || full;\n }\n\n /**\n * @returns When this variant is configured to have a color, this will return the hex value for that color.\n */\n getColor(): string | undefined {\n return this.variantData.color;\n }\n\n /**\n * @returns True when the variant is the default for its containing option. False otherwise.\n */\n isDefault(): boolean {\n return !!this.variantData.default;\n }\n\n /**\n * @returns The underlying variant resource. Generally not needed but made available just incase.\n */\n getResource(): VariantResource {\n return this.variantData;\n }\n\n /**\n * @returns True when the variant is enabled. False otherwise.\n */\n isEnabled(): boolean {\n return this.variantData.enabled;\n }\n}\n","import { AnyStepData, AspectType, Step, StepType } from \"../types\";\nimport { WorkflowManager } from \"../WorkflowManager\";\nimport { Variant } from \"./resource/variant\";\n\n/**\n * Steps that support custom color variants should implement the following interface to\n * add the behavior in the way that makes sense to the step.\n */\nexport interface CustomColorSupport {\n /**\n * Allows for setting a custom color when the custom variant is selected. Will\n * throw when a non-custom variant is selected.\n */\n setCustomColor(color: string);\n /**\n * Get the custom color that is currently set on the step.\n */\n getCustomColor(): string;\n}\n\n/**\n * A StepHandle allows for managing the state of a specific step in a workflow. This class\n * abstracts away the complexities of dealing with a step directly and allows for using high level\n * concepts instead of dealing with the underlying data structures.\n */\nexport abstract class StepHandle<T extends AnyStepData> {\n /**\n * Stores whether or not the step is currently updating.\n */\n private static readonly updateState: Map<string, boolean> = new Map<string, boolean>();\n /**\n * Access to the workflow manager this step is contained by.\n */\n protected readonly manager: WorkflowManager;\n /**\n * The step metadata, useful for determining logic based on configuration.\n */\n protected readonly step: Step<T>;\n /**\n * The tags set against this step.\n */\n protected readonly tags: string[];\n\n constructor(manager: WorkflowManager, step: Step<T>, tags: string[]) {\n this.manager = manager;\n this.step = step;\n this.tags = tags;\n }\n\n /**\n * Set the current update state of this step. All step handles pointing to this step will\n * see this value.\n * @param value The new value\n */\n protected setUpdateState(value: boolean) {\n StepHandle.updateState.set(`${this.step.stepName}-${this.manager.getTransaction().id}`, value);\n }\n\n /**\n * @returns Gets the current update state of this step. All step handles for this step will see this value.\n */\n protected getUpdateState() {\n return !!StepHandle.updateState.get(`${this.step.stepName}-${this.manager.getTransaction().id}`);\n }\n\n /**\n * Gets the currently selected variant, or undefined if no variant is selected.\n */\n getCurrentVariant() {\n const selections = this.manager.getWorkflowSelections();\n const stepSelections = selections[this.step.stepName];\n const variantResource = stepSelections?.selections[0];\n if (!variantResource) return undefined;\n return new Variant(variantResource);\n }\n\n /**\n * @returns A list of valid variants for this step. Does not include disabled variants.\n */\n getAvailableVariants() {\n const variants = this.step.option?.variants?.filter((v) => v.enabled) || [];\n return variants.map((v) => new Variant(v));\n }\n\n /**\n * @returns A list of all variants for this step, including disabled ones.\n */\n getAllVariants() {\n const variants = this.step.option?.variants || [];\n return variants.map((v) => new Variant(v));\n }\n\n /**\n * Most step types have a base option type that variants can be selected for.\n * Selects a specific variant for this step. This will execute all required changes to\n * the design and update the metadata to include the new selection. Any conditions\n * that would be triggered will also be executed.\n */\n abstract selectVariant(variant: Variant): Promise<void>;\n\n /**\n * @returns A unique identifier for this step within the workflow.\n */\n getId() {\n return this.step.stepName;\n }\n\n /**\n * @returns The name of the step\n */\n getName(): string {\n return this.step.stepTitle;\n }\n\n /**\n * @returns A message that can accompany the step name in UI components. Used to describe the purpose of the step in more detail.\n */\n getHelpText() {\n return this.step.helpText;\n }\n\n /**\n * @returns The type of the step handle.\n */\n getType(): StepType {\n return this.step.type;\n }\n\n /**\n * @returns The underlying data for this step. Favor using the step handle methods instead of this.\n */\n getRaw(): Step<T> {\n return this.step;\n }\n\n /**\n * @returns Returns all of the tags that are present on this step.\n */\n getTags(): string[] {\n return this.tags;\n }\n\n /**\n * @param tag The tag to check for.\n * @returns True if the step has the specified tag, false otherwise.\n */\n hasTag(tag: string): boolean {\n return this.tags.includes(tag) || false;\n }\n\n /**\n * @returns True if the step is required to be filled by the customer. False otherwise.\n */\n getMandatory() {\n return this.step.mandatory || false;\n }\n\n /**\n * @param type The AspectType to fetch the value for.\n * @returns A boolean indicating whether this step should override Global Properties.\n * Only relevant when the Workflow Experience is associated with a Bundle that is using Global Properties,\n * and when this step is associated with one or more Global Property Aspects.\n */\n getOverrideGlobalPropertyConfiguration(type: AspectType): boolean {\n const map = this.manager.getStepStorage(this.step.stepName)?.overrideGlobalConfigurations ?? {};\n return map[type.toString()] ?? false;\n }\n\n /**\n * Sets whether or not this step should override Global Properties.\n * Only relevant when the Workflow Experience is associated with a Bundle that is using Global Properties,\n * and when this step is associated with one or more Global Property Aspects.\n * @param type The AspectType to override.\n */\n setOverrideGlobalPropertyConfiguration(type: AspectType, value: boolean) {\n const map = this.manager.getStepStorage(this.step.stepName)?.overrideGlobalConfigurations ?? {};\n this.manager.updateStorage(this.step.stepName, {\n overrideGlobalConfigurations: { ...map, [type.toString()]: value },\n });\n }\n\n /**\n * Retrieves the identifiers of all of the configured aspects for the specified Global Property Configuration.\n * @param configurationId The ID of the Global Property Configuration. You can usually find this with `bundle.getGlobalPropertyConfiguration()?.id`\n * @returns An array of strings matching the keys of all the Global Property Aspects in the Configuration that this step is configured to use.\n */\n getGlobalPropertyAspects(configurationId: string) {\n return (\n this.step.globalPropertyAspectConfigurations\n ?.filter((c) => c.globalPropertyConfigurationId === configurationId && c.aspectName)\n .map((c) => c.aspectName!) ?? []\n );\n }\n\n /**\n * Fires any configured animations on the 3D preview for this step.\n * This includes camera & model animations. If the preview is unavailable\n * this function will do nothing.\n */\n executeAnimations() {\n const preview = this.manager.getPreviewService();\n const modelContainer = this.manager.getModelContainer();\n const modelAnimation = (this.step.data as any).modelAnimation;\n const lookAtAnimation = (this.step.data as any).lookAtAnimation;\n if (preview) {\n lookAtAnimation && preview.executeCameraAnimation(lookAtAnimation);\n } else {\n console.warn(\"No preview service available, cannot execute camera animations.\");\n }\n if (modelContainer) {\n modelAnimation && modelContainer.executeAnimation(modelAnimation);\n } else {\n console.warn(\"No model container available, cannot execute model animations.\");\n }\n }\n}\n","import { StepHandle } from \"..\";\nimport { findElement } from \"../../LayoutsState\";\nimport { illustrationStepService } from \"../../services/steps/illustration\";\nimport { IllustrationElement, IllustrationStepData, Step } from \"../../types\";\nimport { WorkflowManager } from \"../../WorkflowManager\";\nimport { Variant } from \"../resource/variant\";\n\nexport class IllustrationStepHandle extends StepHandle<IllustrationStepData> {\n constructor(manager: WorkflowManager, step: Step<IllustrationStepData>, tags: string[]) {\n super(manager, step, tags);\n }\n\n /**\n * Allows for select a vector from the available vectors configured on this steps base option.\n * @param variant The new vector variant to use for this step.\n * @returns A promise that can be awaited to know when the new vector asset has been updated on the design.\n */\n async selectVariant(variant: Variant) {\n if (this.getUpdateState()) return; // Don't update this step if in the middle of updating it.\n if (this.getCurrentVariant() === variant) return;\n return illustrationStepService.selectVariant(\n this.step,\n variant.getResource(),\n this.manager.getRegionElements(this.step.stepName) || [],\n (v) => this.setUpdateState(v),\n this.manager,\n );\n }\n\n /**\n * Get colors for the illustration.\n * @returns A list of color definitions that are currently applied to the illustration.\n */\n getColors() {\n const regionEls = this.manager.getRegionElements(this.step.stepName) || [];\n if (regionEls.length === 0) return;\n try {\n const layoutElement = findElement(regionEls[0].id, this.manager.getAllLayoutData()) as IllustrationElement;\n return layoutElement.colors;\n } catch (e) {\n console.error(e);\n }\n }\n\n /**\n * Set color for the illustration.\n */\n setColor(key: string, value: string) {\n const newFillMap = new Map<string, string>();\n newFillMap.set(key, value);\n return illustrationStepService.changeColors(\n this.step,\n this.manager.getRegionElements(this.step.stepName),\n this.manager,\n () => this.manager.getCommandContext().getAllLayouts(),\n newFillMap,\n );\n }\n\n async getColorOption() {\n return this.step.data.colorOption;\n }\n\n getAvailableColors() {\n if (!this.step.data.colorPickerEnabled) {\n return Promise.resolve([]);\n }\n return illustrationStepService.availableColors(this.step, this.manager);\n }\n\n isColorPickerEnabled() {\n return this.step.data.colorPickerEnabled ?? false;\n }\n}\n","import { StepHandle } from \"..\";\nimport { materialStepService } from \"../../services/steps/material\";\nimport { MaterialStepData, Step } from \"../../types\";\nimport { WorkflowManager } from \"../../WorkflowManager\";\nimport { Variant } from \"../resource/variant\";\n\nexport class MaterialStepHandle extends StepHandle<MaterialStepData> {\n constructor(manager: WorkflowManager, step: Step<MaterialStepData>, tags: string[]) {\n super(manager, step, tags);\n }\n\n selectVariant(variant: Variant) {\n return materialStepService.selectVariant(this.step, variant.getResource(), this.manager, (val) =>\n this.setUpdateState(val),\n );\n }\n}\n","import { StepHandle } from \"..\";\nimport { modelStepService, WorkflowManager } from \"../..\";\nimport { ModelStepData, Step } from \"../../types\";\nimport { Variant } from \"../resource/variant\";\n\nexport class ModelStepHandle extends StepHandle<ModelStepData> {\n constructor(manager: WorkflowManager, step: Step<ModelStepData>, tags: string[]) {\n super(manager, step, tags);\n }\n\n selectVariant(variant: Variant) {\n return modelStepService.selectVariant(this.step, variant.getResource(), this.manager, (v) =>\n this.setUpdateState(v),\n );\n }\n}\n","import { StepHandle } from \"..\";\nimport { pictureStepService } from \"../../services/steps/picture\";\nimport { PictureStepData, Step } from \"../../types\";\nimport { WorkflowManager } from \"../../WorkflowManager\";\nimport { Variant } from \"../resource/variant\";\n\nexport class PictureStepHandle extends StepHandle<PictureStepData> {\n constructor(manager: WorkflowManager, step: Step<PictureStepData>, tags: string[]) {\n super(manager, step, tags);\n }\n /**\n * Allows the user to select an image variant from the available variants configured on this steps base option.\n * @param variant The new image variant to use.\n * @returns A promise that can be awaited to ensure the new image asset has been updated on the design.\n */\n selectVariant(variant: Variant) {\n return pictureStepService.selectVariant(this.step, variant.getResource(), this.manager, (v) =>\n this.setUpdateState(v),\n );\n }\n}\n","import { StepHandle } from \"..\";\nimport { questionStepService } from \"../../services/steps/question\";\nimport { QuestionStepData, Step } from \"../../types\";\nimport { WorkflowManager } from \"../../WorkflowManager\";\nimport { Variant } from \"../resource/variant\";\n\nexport class QuestionStepHandle extends StepHandle<QuestionStepData> {\n constructor(manager: WorkflowManager, step: Step<QuestionStepData>, tags: string[]) {\n super(manager, step, tags);\n }\n\n async selectVariant(variant: Variant) {\n if (!variant.getId()) {\n throw new Error(\"Unable to select variant with a null ID\");\n }\n await questionStepService.selectVariant(this.step, variant.getId(), this.manager);\n }\n\n /**\n * The way that this step expects to be rendered.\n */\n getDisplayType() {\n return (this.step.data as any).displayType || this.step.option?.displayType;\n }\n}\n","import { CustomColorSupport, StepHandle } from \"..\";\nimport { shapeStepService } from \"../../services/steps/shape\";\nimport { ColorOption, ShapeStepData, Step } from \"../../types\";\nimport { WorkflowManager } from \"../../WorkflowManager\";\nimport { Variant } from \"../resource/variant\";\n\nexport class ShapeStepHandle extends StepHandle<ShapeStepData> implements CustomColorSupport {\n constructor(manager: WorkflowManager, step: Step<ShapeStepData>, tags: string[]) {\n super(manager, step, tags);\n }\n\n selectVariant(variant: Variant) {\n const colorVariant = variant.getResource();\n return shapeStepService.selectVariant(\n this.step,\n {\n fill: colorVariant.color,\n stroke: colorVariant.color,\n variant: colorVariant,\n },\n this.manager.getRegionElements(this.step.stepName) || [],\n this.manager,\n );\n }\n\n /**\n * Sets the color of the shape.\n * @param color The color option to use.\n * @returns A promise resolving when the color has changed in the design.\n * @deprecated The shape step can now pass through colors returned by getColors via selectVariant. Please swap setColor for selectVariant.\n */\n setColor(color: ColorOption) {\n return shapeStepService.selectVariant(\n this.step,\n color,\n this.manager.getRegionElements(this.step.stepName) || [],\n this.manager,\n );\n }\n\n /**\n * Get available colors for the shape.\n * @returns A list of color definitions that are currently applied to the illustration.\n */\n getColors() {\n return shapeStepService.availableColours(this.step);\n }\n\n /**\n * Allows for setting a custom color when the custom variant is selected. Will\n * throw when a non-custom variant is selected.\n */\n setCustomColor(color: string) {\n if (this.getCurrentVariant()?.getColor() !== \"#custom\") {\n console.warn(`setting custom color for step ${this.step.stepName} but color is ${this.getCurrentVariant()?.getColor()}`);\n }\n return shapeStepService.setCustomColor(color, this.step, this.manager);\n }\n\n getCustomColor(): string {\n if (this.getCurrentVariant()?.getColor() !== \"#custom\") {\n console.warn(`setting custom color for step ${this.step.stepName} but color is ${this.getCurrentVariant()?.getColor()}`);\n }\n const color = this.manager.getStepStorage(this.step.stepName)?.colour;\n if (!color) throw new Error(`Color not available on step ${this.step.stepName}. Set a default on the workflow to fix this.`);\n return color;\n }\n}\n","import { CustomColorSupport, StepHandle } from \"..\";\nimport { TextErrorData, textStepService } from \"../../services/steps/text\";\nimport { ColorOption, Step, TextFillImage, TextStepData, TextStepStorage } from \"../../types\";\nimport { WorkflowManager, InformationMessageType } from \"../../WorkflowManager\";\nimport { Variant } from \"../resource/variant\";\n\nexport interface TextChangeResult {\n /**\n * The text of the input field.\n */\n input: string;\n\n /**\n * Data that can be used by the theme to decide what helper text should be.\n */\n helperData: {\n charactersRemaining?: number;\n };\n\n /**\n * Data that can be used by the theme to decide what error text should be.\n */\n errorData?: TextErrorData;\n}\n\nexport class TextStepHandle extends StepHandle<TextStepData> implements CustomColorSupport {\n constructor(manager: WorkflowManager, step: Step<TextStepData>, tags: string[]) {\n super(manager, step, tags);\n }\n\n /**\n * Allows for select a font from the available fonts configured on this steps base option.\n * @param variant The font variant to use.\n */\n async selectVariant(variant: Variant) {\n textStepService.selectVariant(\n this.step,\n variant.getResource(),\n this.manager,\n (error) => {\n if (error) {\n this.manager.setInformationResults([\n ...this.manager.getInformationResults(),\n {\n message: `An issue has occurred with text`,\n messageType: InformationMessageType.Error,\n stepID: this.step.stepName,\n },\n ]);\n } else {\n const results = this.manager.getInformationResults().filter((r) => r.stepID !== this.step.stepName);\n this.manager.setInformationResults(results);\n }\n },\n () => {\n // noop\n },\n );\n }\n\n /**\n * @returns A list of colors that can be used to fill the text.\n */\n getAvailableFillColors(): ColorOption[] {\n if (!this.step.data.colorPickerEnabled) {\n return [];\n }\n return textStepService.availableFillColors(this.step);\n }\n\n /**\n * Changes the fill of text related to this step to the new fill value.\n * @param fill A new fill value to use.\n */\n async setFillColor(fill: ColorOption) {\n const stepElements = this.manager.getRegionElements(this.step.stepName);\n await textStepService.changeFillColor(this.step, fill, stepElements, this.manager);\n }\n\n /**\n * Gets the color currently applied to the element.\n */\n getFillColor() {\n return this.manager.getStepStorage(this.step.stepName)?.color || \"#000000\";\n }\n\n getAvailableFillImages(): Promise<TextFillImage[]> {\n return textStepService.availableFillImages(this.step);\n }\n\n async setFillImage(fillImage: TextFillImage) {\n const stepElements = this.manager.getRegionElements(this.step.stepName);\n await textStepService.changeFillImage(this.step, fillImage, stepElements, this.manager);\n }\n\n getFillImage(): TextFillImage | undefined {\n return this.manager.getStepStorage(this.step.stepName)?.fillImage;\n }\n\n getAlignment(): string | undefined {\n const elements = textStepService.findLayoutElements(this.manager, this.step);\n return elements?.[0].align;\n }\n\n setAlignment(alignment: \"left\" | \"center\" | \"right\") {\n const stepElements = this.manager.getRegionElements(this.step.stepName);\n textStepService.changeAlignment(this.step, alignment, stepElements, this.manager);\n }\n\n /**\n * When true & the step has replaceable text configured the user will be\n * abled to edit the entire text string including the non-replaceable text.\n * @param shouldCustomizeAll When true the user can configure the entire text string.\n */\n setFullTextCustomization(shouldCustomizeAll: boolean): TextChangeResult {\n const inputText = this.manager.getStepStorage(this.step.stepName)?.inputText || \"\";\n\n const customiseableText =\n this.step.data.replaceableText !== undefined\n ? this.step.data.replaceableText.replace(\"{{}}\", inputText)\n : inputText;\n\n const text = shouldCustomizeAll ? customiseableText : this.step.data.defaultText;\n this.manager.updateStorage(this.step.stepName, {\n customiseAllText: shouldCustomizeAll,\n text,\n defaultCleared: false,\n });\n const result = this.setText(text);\n return result;\n }\n\n /**\n * Changes the text value of text related to this step to a new value.\n * @param userInput Input from the user.\n */\n setText(userInput: string): TextChangeResult {\n const result: TextChangeResult = {\n input: userInput,\n helperData: {},\n };\n\n // Find all related elements in the design and update them. Return immediately if none are found.\n const layoutElements = textStepService.findLayoutElements(this.manager, this.step);\n // Filter any unsupported characters from the input.\n const filteredUserInput = textStepService.filterUnsupportedCharacters(userInput, layoutElements[0]?.fontData);\n\n // Whilst the maximum length of user input is not exceeded, set the updated input value.\n const maxLengthExceeded =\n !!this.step.data && !!this.step.data.maxLength && filteredUserInput.length > this.step.data.maxLength;\n if (!maxLengthExceeded) {\n result.input = filteredUserInput;\n }\n\n // Update storage.\n const regionless = layoutElements.length <= 0;\n const newStorage = regionless\n ? { inputText: filteredUserInput, text: filteredUserInput }\n : { inputText: filteredUserInput };\n this.manager.updateStorage(this.step.stepName, newStorage);\n\n // Calculate the text that will be metadata if no errors.\n const storage = this.manager.getStepStorage(this.step.stepName) as TextStepStorage;\n const candidateMetadata = textStepService.getProcessedInput(filteredUserInput, this.step.data, !!storage.customiseAllText)\n\n if (regionless) {\n // Update metadata if new text doesn't cause errors.\n if (!maxLengthExceeded) {\n this.manager.updateMetadata(this.step.stepName, {\n text: candidateMetadata,\n });\n }\n } else {\n // Request the text step service to update the text in the design.\n const { command, errorData, helperData } = textStepService.updateInputText(\n filteredUserInput,\n layoutElements,\n this.step,\n this.manager,\n );\n command && this.manager.getCommandDispatcher()(command);\n\n result.helperData = helperData;\n result.errorData = errorData;\n\n // Update metadata if new text doesn't cause errors.\n if (!maxLengthExceeded && !errorData) {\n this.manager.updateMetadata(this.step.stepName, {\n text: candidateMetadata,\n });\n }\n }\n\n return result;\n }\n\n /**\n * Gets the text currently applied to the elements of this step.\n */\n getText() {\n const defaultText = this.step.data.defaultText;\n const storage = this.manager.getStepStorage(this.step.stepName);\n if (defaultText && storage?.defaultCleared !== undefined && !storage?.defaultCleared) {\n return defaultText;\n }\n return this.manager.getStepStorage(this.step.stepName)?.text || \"\";\n }\n\n isReplaceable() {\n return this.step.data.userCanReplaceText;\n }\n\n /**\n * @returns True if the step allows new lines in the text input.\n */\n newLinesSupported() {\n return this.step.data.allowNewlines || false;\n }\n\n /**\n * Inform the step that now is the time to\n * clear default text if it should do so.\n * Returns a text change rwsult if a clear occurred.\n */\n clearDefaultTextIfNecessary(): TextChangeResult | undefined {\n const storage = this.manager.getStepStorage(this.step.stepName);\n if (!storage?.defaultCleared && this.step.data.deleteDefaultOnFocus) {\n const result = this.setText(\"\");\n this.manager.updateStorage(this.step.stepName, { defaultCleared: true, inputText: \"\" });\n const layoutElements = textStepService.findLayoutElements(this.manager, this.step);\n textStepService.updateInputText(\"\", layoutElements, this.step, this.manager);\n return result;\n }\n }\n\n hasColorPicker() {\n return this.step.data.colorPickerEnabled;\n }\n\n getRegions() {\n return this.step.data.regions;\n }\n\n /**\n * Return the maximum characters allowed for\n * this step, or undefined if there is no limit.\n */\n getCharacterLimit(): number | undefined {\n return this.step.data.maxLength;\n }\n\n /**\n * Return the remaining amount of characters that\n * the user is allowed to add, or undefined if there is no limit.\n */\n getCharactersRemaining(): number | undefined {\n const limit = this.step.data.maxLength;\n if (limit === undefined) {\n return undefined;\n }\n const text = this.getText();\n return limit - text.length;\n }\n\n setCustomColor(_color: string) {\n throw new Error(\"Custom color support is not yet available on text. Check back soon.\");\n }\n\n getCustomColor(): string {\n throw new Error(\"Custom color support is not yet available on text. Check back soon.\");\n }\n}\n","import { StepHandle } from \"..\";\nimport { InformationStepData, Step } from \"../../types\";\nimport { WorkflowManager } from \"../../WorkflowManager\";\n\nexport class InformationStepHandle extends StepHandle<InformationStepData> {\n constructor(manager: WorkflowManager, step: Step<InformationStepData>, tags: string[]) {\n super(manager, step, tags);\n }\n\n async selectVariant() {\n // Noop\n }\n\n /**\n * The way that this step expects to be rendered.\n */\n getContent() {\n return this.step.data.content;\n }\n}\n","import { StepHandle } from \"..\";\nimport { digitalContentStepService, WorkflowManager } from \"../..\";\nimport { DigitalContentStepData, Step, Asset } from \"../../types\";\n\n/**\n * The digital content step allows for associating uploaded content with a QR code. This code\n * can be displayed on the users design such as in a gift card and people can access\n * the hosted content by scanning the QR.\n */\nexport class DigitalContentStepHandle extends StepHandle<DigitalContentStepData> {\n constructor(manager: WorkflowManager, step: Step<DigitalContentStepData>, tags: string[]) {\n super(manager, step, tags);\n }\n\n async selectVariant() {\n //noop\n }\n\n /**\n * Returns a preview URL used to show the generated QR code in your UI.\n */\n getPreviewURL(): string {\n return this.manager.getStepStorage(this.step.stepName)?.videoUrl || \"\";\n }\n\n /**\n * Turns an asset into a QR code that can be used to access the content.\n * @param asset The asset to use for the QR code.\n * @returns The final URL string for the QR code.\n */\n async selectVideo(asset: Asset): Promise<string> {\n return digitalContentStepService.regenerateQRCode(\n this.manager.getRegionElements(this.step.stepName),\n asset.key!,\n this.manager,\n this.step,\n );\n }\n}\n","import { StepHandle } from \"..\";\nimport { InformationMessageType, moduleStepService, WorkflowManager } from \"../..\";\nimport { ModuleStepData, Step } from \"../../types\";\n\nexport class ModuleStepHandle extends StepHandle<ModuleStepData> {\n constructor(manager: WorkflowManager, step: Step<ModuleStepData>, tags: string[]) {\n super(manager, step, tags);\n }\n\n async selectVariant() {\n console.info(\"Text Modules don't support variants.\");\n //noop\n }\n\n /**\n * Return the remaining amount of characters that\n * the user is allowed to add, or undefined if there is no limit.\n */\n getCharactersRemaining(): number | undefined {\n const limit = this.step.data.maxLength;\n if (limit === undefined) {\n return undefined;\n }\n const text = this.getText();\n return limit - text.length;\n }\n\n /**\n * Return the maximum characters allowed for\n * this step, or undefined if there is no limit.\n */\n getCharacterLimit(): number | undefined {\n return this.step.data.maxLength;\n }\n\n getText(): string {\n return this.manager.getStepStorage(this.step.stepName)?.text || \"\";\n }\n\n setText(value: string) {\n moduleStepService.changeText(this.step, value, this.manager, \"\", (error) => {\n if (error) {\n this.manager.setInformationResults([\n ...this.manager.getInformationResults(),\n {\n message: error,\n messageType: InformationMessageType.Error,\n stepID: this.step.stepName,\n },\n ]);\n } else {\n const results = this.manager.getInformationResults().filter((r) => r.stepID !== this.step.stepName);\n this.manager.setInformationResults(results);\n }\n });\n }\n}\n","import { FrameStepHandle } from \"..\";\nimport { UnhandledBehaviorError } from \"../util/exception\";\nimport { WorkflowManager } from \"../WorkflowManager\";\nimport { IllustrationStepHandle } from \"./steps/illustration\";\nimport { MaterialStepHandle } from \"./steps/material\";\nimport { ModelStepHandle } from \"./steps/model\";\nimport { PictureStepHandle } from \"./steps/picture\";\nimport { QuestionStepHandle } from \"./steps/question\";\nimport { ShapeStepHandle } from \"./steps/shape\";\nimport { TextStepHandle } from \"./steps/text\";\nimport { InformationStepHandle } from \"./steps/information\";\nimport { DigitalContentStepHandle } from \"./steps/digitalContent\";\nimport { ModuleStepHandle } from \"./steps/module\";\nimport { AnyStepData, DigitalContentStepData, FrameStepData, IllustrationStepData, InformationStepData, MaterialStepData, ModelStepData, ModuleStepData, PictureStepData, QuestionStepData, ShapeStepData, Step, StepType, TextStepData } from \"../types\";\n\n/**\n * A factory that generates the correct concrete StepHandle implementation\n * for a given step.\n */\nexport class StepHandleFactory {\n static get(manager: WorkflowManager, step: Step<AnyStepData>) {\n switch (step.type) {\n case StepType.DigitalContent:\n return new DigitalContentStepHandle(manager, step as Step<DigitalContentStepData>, manager.getStepTags(step.stepName));\n case StepType.Information:\n return new InformationStepHandle(manager, step as Step<InformationStepData>, manager.getStepTags(step.stepName));\n case StepType.Question:\n return new QuestionStepHandle(manager, step as Step<QuestionStepData>, manager.getStepTags(step.stepName));\n case StepType.Text:\n return new TextStepHandle(manager, step as Step<TextStepData>, manager.getStepTags(step.stepName));\n case StepType.Illustration:\n return new IllustrationStepHandle(manager, step as Step<IllustrationStepData>, manager.getStepTags(step.stepName));\n case StepType.Picture:\n return new PictureStepHandle(manager, step as Step<PictureStepData>, manager.getStepTags(step.stepName));\n case StepType.Shape:\n return new ShapeStepHandle(manager, step as Step<ShapeStepData>, manager.getStepTags(step.stepName));\n case StepType.Material:\n return new MaterialStepHandle(manager, step as Step<MaterialStepData>, manager.getStepTags(step.stepName));\n case StepType.Model:\n return new ModelStepHandle(manager, step as Step<ModelStepData>, manager.getStepTags(step.stepName));\n case StepType.Frame:\n return new FrameStepHandle(manager, step as Step<FrameStepData>, manager.getStepTags(step.stepName));\n case StepType.Module:\n return new ModuleStepHandle(manager, step as Step<ModuleStepData>, manager.getStepTags(step.stepName));\n default:\n throw new UnhandledBehaviorError(`Step type ${step.type} not yet supported in Core SDK`);\n }\n }\n}\n","import { readWorkflowStates } from \"../query\";\nimport { graphQlManager } from \"../services/server\";\nimport {\n Product,\n DesignCreationMessage,\n SelectedVariants,\n Transaction,\n DesignDetails,\n DesignWorkflowMetadata,\n ExportedData,\n FrameMetadata,\n IllustrationMetadata,\n ModuleMetadata,\n TextMetadata,\n Design,\n Workflow,\n Step,\n AnyStepData,\n FrameStepData,\n IllustrationStepData,\n ModuleStepData,\n TextStepData,\n ILayout,\n AssetType,\n} from \"../types\";\nimport {\n WorkflowManager,\n DesignCreationProgressUpdate,\n WorkflowSelections,\n WorkflowMetadata,\n} from \"../WorkflowManager\";\nimport { persistenceService } from \"./persistence\";\nimport { UnhandledBehaviorError } from \"../util/exception\";\nimport { gql } from \"@apollo/client/core\";\nimport { assetService } from \"./asset\";\nimport { CommandState } from \"../CommandContext\";\nimport { fetch } from \"../util/crossplatform\";\n\n/**\n * This file contains all the functions that contribute to the createDesign function.\n */\n\nconst createDesignTransactionFragment = gql`\n fragment CreateDesignTransaction on Transaction {\n id\n designName\n externalCartProductId\n externalCartProductVariantId\n externalDesignProductId\n externalDesignProductVariantId\n lastSyncedAt\n quantity\n previewImageLink\n priceModifierTotal\n workflowViewerLink\n workflowViewerReadOnlyLink\n integrationProduct {\n id\n additionalExternalProductId\n additionalExternalVariantId\n }\n designExternalVariants {\n id\n externalProductId\n externalProductVariantId\n }\n }\n`;\n\nconst createDesignMutation = gql`\n ${createDesignTransactionFragment}\n mutation CreateDesign(\n $name: String!\n $layouts: [LayoutInput]!\n $workflowId: String!\n $transactionId: String!\n $previewImage: String\n $useThreeDimPreview: Boolean\n $metadata: [MetadataInput]\n $selectedVariants: [SelectedVariantInput]\n ) {\n designCreate(\n name: $name\n layouts: $layouts\n workflowId: $workflowId\n transactionId: $transactionId\n previewImage: $previewImage\n useThreeDimPreview: $useThreeDimPreview\n metadata: $metadata\n selectedVariants: $selectedVariants\n ) {\n id\n sku\n transaction {\n ...CreateDesignTransaction\n }\n processExecution {\n id\n }\n }\n }\n`;\n\nconst createDesignsMutation = gql`\n ${createDesignTransactionFragment}\n mutation CreateDesigns($inputs: [DesignCreateInput]!) {\n designCreateMany(inputs: $inputs) {\n id\n sku\n transaction {\n ...CreateDesignTransaction\n }\n processExecution {\n id\n }\n }\n }\n`;\n\n// https://stackoverflow.com/a/69058154\nexport function isTokenExpired(token: string) {\n const expiry = JSON.parse(atob(token.split(\".\")[1])).exp;\n return Math.floor(new Date().getTime() / 1000) >= expiry;\n}\n\nconst createDesignGqlCall = async (designDetails: DesignDetails): Promise<undefined | Design> => {\n // Hack to get the token from editor's amplify.\n const keys = Object.entries(localStorage);\n const jwtTokenKey =\n keys.find(([k, _]) => {\n return k.startsWith(\"CognitoIdentityServiceProvider\") && k.endsWith(\"idToken\");\n })?.[0] || \"\";\n const jwtToken = localStorage.getItem(jwtTokenKey);\n const extraHeaders: { [key: string]: string } = {};\n if (jwtToken && !isTokenExpired(jwtToken)) {\n extraHeaders[\"Authorization\"] = `Bearer ${jwtToken}`;\n }\n\n const response = await graphQlManager.getShadowGraphqlClient().mutate<{ designCreate: Design }>({\n mutation: createDesignMutation,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n name: designDetails.name,\n layouts: designDetails.layouts,\n workflowId: designDetails.workflowId,\n transactionId: designDetails.transactionId,\n previewImage: designDetails.previewImage,\n useThreeDimPreview: designDetails.useThreeDimPreview,\n metadata: designDetails.metadata,\n selectedVariants: designDetails.selectedVariants,\n },\n context: {\n headers: extraHeaders,\n },\n });\n return response.data?.designCreate;\n};\n\nconst createDesignsGqlCall = async (designDetails: DesignDetails[]): Promise<undefined | Design[]> => {\n // Hack to get the token from editor's amplify.\n const keys = Object.entries(localStorage);\n const jwtTokenKey =\n keys.find(([k, _]) => {\n return k.startsWith(\"CognitoIdentityServiceProvider\") && k.endsWith(\"idToken\");\n })?.[0] || \"\";\n const jwtToken = localStorage.getItem(jwtTokenKey);\n const extraHeaders: { [key: string]: string } = {};\n if (jwtToken && !isTokenExpired(jwtToken)) {\n extraHeaders[\"Authorization\"] = `Bearer ${jwtToken}`;\n }\n\n const response = await graphQlManager.getShadowGraphqlClient().mutate<{ designCreateMany: Design[] }>({\n mutation: createDesignsMutation,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n inputs: designDetails.map((designDetail) => ({\n name: designDetail.name,\n layouts: designDetail.layouts,\n workflowId: designDetail.workflowId,\n transactionId: designDetail.transactionId,\n previewImage: designDetail.previewImage,\n useThreeDimPreview: designDetail.useThreeDimPreview,\n metadata: designDetail.metadata,\n selectedVariants: designDetail.selectedVariants,\n })),\n },\n context: {\n headers: extraHeaders,\n },\n });\n return response.data?.designCreateMany;\n};\n\nconst formatMetadata = (\n metadata: WorkflowMetadata,\n workflow: Workflow,\n forCart: boolean,\n): { [name: string]: string } => {\n const metadataObjectForStep = (step: Step<AnyStepData>) => {\n const formattedMetadata = {} as any;\n if (step.type === \"Frame\") {\n const stepMetadata = metadata[step.stepName] as FrameMetadata;\n const stepData = step.data as FrameStepData;\n if (!stepMetadata || !stepMetadata.image || (stepData.hideImageInCart && forCart)) {\n return formattedMetadata;\n }\n // TODO: Need to replace 'image' with locize key 'exportedData.image'\n formattedMetadata[`${step.stepTitle} ${\"image\"}`] = stepMetadata.image;\n }\n if (step.type === \"Illustration\") {\n const stepMetadata = metadata[step.stepName] as IllustrationMetadata;\n const stepData = step.data as IllustrationStepData;\n if (!stepMetadata || (stepData.hideColorsInCart && forCart) || !stepMetadata.colors) {\n return formattedMetadata;\n }\n if (stepMetadata.colors.length > 0) {\n const colorString = stepMetadata.colors.join(\", \").toUpperCase();\n // TODO: Need to replace 'colors' with locize key 'exportedData.colors'\n formattedMetadata[`${step.stepTitle} ${\"colors\"}`] = colorString;\n }\n }\n if (step.type === \"Module\") {\n const stepMetadata = metadata[step.stepName] as ModuleMetadata;\n const stepData = step.data as ModuleStepData;\n if (\n !stepMetadata ||\n stepMetadata.text === undefined ||\n stepMetadata.text === null ||\n (stepData.hideTextInCart && forCart)\n ) {\n return formattedMetadata;\n }\n // TODO: Need to replace 'text' with locize key 'exportedData.text'\n formattedMetadata[`${step.stepTitle} ${\"text\"}`] = stepMetadata.text;\n }\n if (step.type === \"Text\") {\n const stepMetadata = metadata[step.stepName] as TextMetadata;\n if (!stepMetadata) {\n return formattedMetadata;\n }\n const stepData = step.data as TextStepData;\n if (\n !stepData.hideTextInCart ||\n (!forCart && stepMetadata.text !== undefined && stepMetadata.text !== null)\n ) {\n // TODO: Need to replace 'text' with locize key 'exportedData.text'\n formattedMetadata[`${step.stepTitle} ${\"text\"}`] = stepMetadata.text;\n }\n if (stepMetadata.color && (!stepData.hideColorInCart || !forCart)) {\n // TODO: Need to replace 'color' with locize key 'exportedData.color'\n formattedMetadata[`${step.stepTitle} ${\"color\"}`] = stepMetadata.color;\n }\n }\n return formattedMetadata;\n };\n\n const formattedMetadata = {};\n workflow.steps.forEach((step) => {\n Object.assign(formattedMetadata, metadataObjectForStep(step));\n });\n return formattedMetadata;\n};\n\n// Combine selections and metadata into exported data.\n// Items should be grouped by step in workflow order.\nconst prepareExportedData = (\n selections: SelectedVariants,\n workflow: Workflow,\n metadata?: WorkflowMetadata,\n designWorkflowMetadata?: DesignWorkflowMetadata,\n): ExportedData => {\n const exportedData = {} as any;\n let formattedMetadata: DesignWorkflowMetadata = {};\n if (metadata) {\n formattedMetadata = formatMetadata(metadata, workflow, false);\n } else if (designWorkflowMetadata) {\n formattedMetadata = designWorkflowMetadata;\n }\n\n const stepTitles = workflow.steps.map(s => s.stepTitle);\n // https://stackoverflow.com/a/39272981\n const distinctStepTitles = stepTitles.filter((x, i, a) => a.indexOf(x) == i);\n for (const stepTitle of distinctStepTitles) {\n if (Object.keys(selections).includes(stepTitle)) {\n const selection = selections[stepTitle];\n const step = workflow.steps.find((step) => step.stepTitle === stepTitle);\n // TODO: Need to replace 'selection' with locize key 'exportedData.selection'\n exportedData[`${step?.stepTitle} ${\"selection\"}`] = {\n value: selection[0].name,\n priceModifier: selection[0].priceModifier,\n };\n }\n for (const key of Object.keys(formattedMetadata)) {\n if ([`${stepTitle} color`, `${stepTitle} colors`, `${stepTitle} text`, `${stepTitle} image`].includes(key)) {\n exportedData[key] = {\n value: formattedMetadata[key],\n priceModifier: 0,\n };\n }\n }\n }\n\n return exportedData;\n};\n\nconst createDesignMessage = (\n transaction: Transaction,\n product: Product,\n workflow: Workflow,\n selectedVariants: SelectedVariants,\n generatedSku?: string,\n metadata?: { [stepName: string]: string },\n lineItemImageLink?: string,\n processExecutionId?: string,\n): DesignCreationMessage => {\n const baseCost = product.basePrice || 0;\n const optionsCost = transaction.priceModifierTotal || 0;\n const exportedData = prepareExportedData(selectedVariants, workflow, undefined, metadata);\n\n const ownerMap = persistenceService.getMap(\"transactionOwnerIds\") || new Map();\n const ownerId = ownerMap.get(transaction.id);\n\n const msgObject: DesignCreationMessage = {\n additionalExternalProductId: transaction.integrationProduct?.additionalExternalProductId,\n additionalExternalVariantId: transaction.integrationProduct?.additionalExternalVariantId,\n baseCost,\n designExternalVariants: transaction.designExternalVariants,\n designProductId: transaction.externalDesignProductId,\n designProductVariantId: transaction.externalDesignProductVariantId,\n event: \"onComplete\",\n exportedData,\n externalCartProductId: transaction.externalCartProductId,\n externalCartProductVariantId: transaction.externalCartProductVariantId,\n lineItemImageUrl: lineItemImageLink || \"\",\n optionsCost,\n processExecutionId,\n quantity: transaction.quantity,\n transactionId: transaction.id,\n transactionOwnerId: ownerId,\n weight: product.weight,\n workflowViewerLink: transaction.workflowViewerLink || \"\",\n workflowViewerReadOnlyLink: transaction.workflowViewerReadOnlyLink || \"\",\n };\n if (metadata) {\n msgObject.metadata = metadata;\n }\n if (selectedVariants) {\n msgObject.selectedVariants = selectedVariants;\n }\n if (generatedSku) {\n msgObject.sku = generatedSku;\n }\n return msgObject;\n};\n\nexport const createDesignDetails = async (\n workflowManager: WorkflowManager,\n workflow: Workflow,\n layouts: ILayout[],\n getReducerState: () => CommandState,\n transaction: Transaction,\n workflowSelections: WorkflowSelections,\n designName: string,\n createPreviewImage: (shouldRender3D?: boolean, transactionId?: string) => Promise<string | undefined>,\n workflowMetadata?: WorkflowMetadata,\n serverState?: string | null,\n): Promise<{\n designDetails: DesignDetails;\n cartSelectionsWithPrices: SelectedVariants;\n cartMetadata: { [stepName: string]: string } | undefined;\n}> => {\n const flushAndGetServerState = async (): Promise<string | null> => {\n if (serverState !== undefined) return serverState;\n // Here we resolve any remaining state frames.\n // After doing so we make a call to the server and pull\n // the servers known state to validate synchronization.\n // FIXME: This currently only waits for any server requests to complete. If there are any debounced requests\n // that are still pending, they will not be waited on.\n await workflowManager.outstandingRequestsPromise();\n const ownerMap = persistenceService.getMap(\"transactionOwnerIds\") || new Map();\n const ownerId = ownerMap.get(transaction.id);\n const graphQlClient = graphQlManager.getShadowGraphqlClient();\n const serverWorkflowState = await graphQlClient.query<{\n transactions: Transaction[];\n }>({\n query: readWorkflowStates,\n variables: { ids: [transaction.id] },\n fetchPolicy: \"no-cache\",\n errorPolicy: \"all\",\n context: {\n transactionOwnerId: ownerId,\n },\n });\n\n const state = serverWorkflowState.data?.transactions[0].workflowState;\n if (serverWorkflowState.errors) {\n serverWorkflowState.errors.forEach((e) => {\n serverWorkflowState.errors && console.log(\"Server Error:\", e.message);\n });\n return null;\n }\n return state ?? null;\n };\n const state = await flushAndGetServerState();\n if (!state) {\n console.warn(\"State mismatch detected. Uploading known state explicitly\");\n console.warn(\"State Object:\", JSON.stringify(getReducerState()));\n await workflowManager.updateStateWithServerImmediate(getReducerState);\n console.log(\"Server state is undefined @ Workflow completion\"!);\n }\n\n const previewService = workflowManager.getPreviewService();\n const cameraOrientation = workflow?.finalizeStepConfig?.lookAtAnimation;\n const shouldUploadThreeDimPreview = previewService && workflow.showModelOnFinishStep && !!cameraOrientation;\n\n const cartMetadata = workflowMetadata && formatMetadata(workflowMetadata, workflow, true);\n const designMetadata = workflowMetadata && formatMetadata(workflowMetadata, workflow, false);\n\n const getSelections = async (forCart: boolean): Promise<[SelectedVariants, number]> => {\n const selectedVariants: SelectedVariants = {};\n let optionsCost = 0;\n if (Object.keys(workflowSelections).length > 0) {\n for (const stepId of Object.keys(workflowSelections)) {\n const stepSelections = workflowSelections[stepId];\n const step = workflow.steps.find((step) => step.stepName === stepId);\n for (let i = 0; i < stepSelections.selections.length; ++i) {\n const variant = stepSelections.selections[i];\n // Attach a selection if:\n // * these selections aren't for the cart; or\n // * the selection isn't configured to be hidden and there's\n // multiple variants for the step.\n if (\n step &&\n (!forCart ||\n (step.option &&\n (step.option.variants || []).length > 1 &&\n !(step.data as any).hideSelectionInCart &&\n !(step.data as any).hideSelectionsInCart))\n ) {\n const stepTitle = step.stepTitle;\n if (selectedVariants[stepTitle]) {\n selectedVariants[stepTitle].push({\n id: variant.id || \"\",\n name: variant.name,\n priceModifier: variant.priceModifier,\n });\n } else {\n selectedVariants[stepTitle] = [\n {\n id: variant.id || \"\",\n name: variant.name,\n priceModifier: variant.priceModifier,\n },\n ];\n }\n }\n optionsCost += variant.priceModifier;\n }\n }\n }\n return [selectedVariants, optionsCost];\n };\n const [cartSelectionsWithPrices] = await getSelections(true);\n const cartSelections: { [key: string]: string[] } = Object.fromEntries(\n Object.keys(cartSelectionsWithPrices).map((key) => [key, cartSelectionsWithPrices[key].map((item) => item.id)]),\n );\n const [designSelectionsWithPrices] = await getSelections(false);\n const designSelections: { [key: string]: string[] } = Object.fromEntries(\n Object.keys(designSelectionsWithPrices).map((key) => [\n key,\n designSelectionsWithPrices[key].map((item) => item.id),\n ]),\n );\n\n // We are required to upload some assets now, we'll store their upload promises here\n // and await them at the end so we can get through as much computation as possible without\n // holding up the main thread.\n let previewImageUrl = await createPreviewImage(shouldUploadThreeDimPreview, transaction.id);\n if (previewImageUrl) {\n const previewImageBlob = await (await fetch(previewImageUrl)).blob();\n const asset = await assetService.uploadAsset(\n { name: `${transaction.id}-preview-image.png`, blob: previewImageBlob },\n AssetType.Image,\n true,\n false,\n );\n previewImageUrl = asset.fileLink!;\n }\n\n const assembleDesignDetails = () => {\n const designDetails: DesignDetails = {\n name: designName,\n layouts: layouts.map((layout) => {\n return {\n index: layout.index,\n panelId: layout.panelId,\n };\n }),\n workflowId: workflow.id,\n transactionId: transaction.id,\n useThreeDimPreview: !!shouldUploadThreeDimPreview,\n previewImage: previewImageUrl,\n };\n if (designMetadata) {\n const metadataList: { key: string; value: string }[] = [];\n for (const [key, value] of Object.entries(designMetadata)) {\n metadataList.push({ key, value });\n }\n designDetails.metadata = metadataList;\n }\n if (cartSelections) {\n const selectionsList: { key: string; ids: string[] }[] = [];\n for (const [key, value] of Object.entries(designSelections)) {\n selectionsList.push({ key, ids: value });\n }\n designDetails.selectedVariants = selectionsList;\n }\n return designDetails;\n };\n return {\n designDetails: assembleDesignDetails(),\n cartSelectionsWithPrices,\n cartMetadata,\n };\n};\n\nexport const createDesign = async (\n workflowManager: WorkflowManager,\n workflow: Workflow,\n layouts: ILayout[],\n getReducerState: () => CommandState,\n product: Product,\n transaction: Transaction,\n workflowSelections: WorkflowSelections,\n designName: string,\n onProgressUpdate: DesignCreationProgressUpdate,\n createPreviewImage: (shouldRender3D?: boolean, transactionId?: string) => Promise<string | undefined>,\n workflowMetadata?: WorkflowMetadata,\n): Promise<DesignCreationMessage> => {\n onProgressUpdate(\"workflow.steps.finish.finalize.buildingLayouts\");\n\n // TODO: Since we have mandatory steps and field validation, should we validate here or keep relying on the theme to do this?\n\n const { designDetails, cartSelectionsWithPrices, cartMetadata } = await createDesignDetails(\n workflowManager,\n workflow,\n layouts,\n getReducerState,\n transaction,\n workflowSelections,\n designName,\n createPreviewImage,\n workflowMetadata,\n );\n\n onProgressUpdate(\"workflow.steps.finish.finalize.creatingDesign\");\n\n const createDesignResponse = await createDesignGqlCall(designDetails);\n const lineItemImageLink = createDesignResponse?.transaction?.previewImageLink;\n\n if (!createDesignResponse?.transaction) {\n throw new Error(\"Failed to create design\");\n }\n\n // The design has been created at this point. We know that the transaction will now contain\n // the external product id from shopify for this specific order if relevant.\n onProgressUpdate(\"workflow.steps.finish.finalize.updatingTransaction\");\n const upToDateTransaction = createDesignResponse.transaction;\n return createDesignMessage(\n upToDateTransaction,\n product,\n workflow,\n cartSelectionsWithPrices,\n createDesignResponse?.sku,\n cartMetadata,\n lineItemImageLink,\n createDesignResponse?.processExecution?.id,\n );\n};\n\nexport const createDesigns = async (\n options: {\n workflowManager: WorkflowManager;\n workflow: Workflow;\n layouts: ILayout[];\n getReducerState: () => CommandState;\n product: Product;\n transaction: Transaction;\n workflowSelections: WorkflowSelections;\n designName: string;\n workflowMetadata?: WorkflowMetadata;\n }[],\n onProgressUpdate: DesignCreationProgressUpdate,\n createPreviewImage?: (shouldRender3D?: boolean, transactionId?: string) => Promise<string | undefined>,\n): Promise<DesignCreationMessage[]> => {\n onProgressUpdate(\"workflow.steps.finish.finalize.buildingLayouts\");\n\n await Promise.all(\n options.map(async (option) => {\n await option.workflowManager.outstandingRequestsPromise();\n }),\n );\n\n const getWorkflowStates = async (): Promise<(string | null)[] | null> => {\n const graphQlClient = graphQlManager.getShadowGraphqlClient();\n const serverWorkflowStates = await graphQlClient.query<{\n transactions: Transaction[];\n }>({\n query: readWorkflowStates,\n variables: { ids: options.map((option) => option.transaction.id) },\n fetchPolicy: \"no-cache\",\n errorPolicy: \"all\",\n });\n\n if (serverWorkflowStates.errors) {\n serverWorkflowStates.errors.forEach((e) => {\n serverWorkflowStates.errors && console.log(\"Server Error:\", e.message);\n });\n return null;\n }\n if (!serverWorkflowStates.data?.transactions) {\n return null;\n }\n return serverWorkflowStates.data.transactions.map((transaction) => transaction.workflowState ?? null);\n };\n const states = await getWorkflowStates();\n\n const createDesignResults = await Promise.all(\n options.map(async (option, index) => {\n return await createDesignDetails(\n option.workflowManager,\n option.workflow,\n option.layouts,\n option.getReducerState,\n option.transaction,\n option.workflowSelections,\n option.designName,\n createPreviewImage ?? (() => Promise.resolve(undefined)),\n option.workflowMetadata,\n states ? states[index] : undefined,\n );\n }),\n );\n\n onProgressUpdate(\"workflow.steps.finish.finalize.creatingDesign\");\n\n const createDesignsResponse = await createDesignsGqlCall(createDesignResults.map((result) => result.designDetails));\n if (!createDesignsResponse) {\n throw new Error(\"Failed to create designs\");\n }\n onProgressUpdate(\"workflow.steps.finish.finalize.updatingTransaction\");\n return createDesignsResponse.map((design, index) => {\n const option = options[index];\n const createDesignResult = createDesignResults[index];\n const upToDateTransaction = design.transaction!;\n return createDesignMessage(\n upToDateTransaction,\n option.product,\n option.workflow,\n createDesignResult.cartSelectionsWithPrices,\n design.sku,\n createDesignResult.cartMetadata,\n //lineItemImageLink,\n undefined,\n design.processExecution?.id,\n );\n });\n};\n\nexport interface SavedDesign {\n /**\n * The user's name for this saved design.\n */\n title: string;\n /**\n * A URL pointing to an image of the design. Typically a data URL\n */\n thumbnail?: string;\n /**\n * The ID of the transaction relating to this design.\n */\n transactionId: string;\n /**\n * The product ID for this transaction.\n */\n productId: string;\n /**\n * The integration product ID related to this order.\n */\n integrationProductId: string;\n /**\n * The name of the workflow annotated at time of save (may be different from current workflow name).\n */\n workflowName: string;\n /**\n * The ID of the workflow annotated at time of save.\n */\n workflowId: string;\n /**\n * The last edit that occured on this saved design.\n */\n lastEdited: Date;\n}\n/**\n * Represents the current method of storage for saved designs.\n */\nenum StorageMethod {\n Local = \"Local\",\n Remote = \"Remote\",\n}\n\n/**\n * The design service exposes helper functionality wrapping important design management operations.\n * NOTE: In the future this interface should allow for storing/pulling designs from the server.\n */\nclass DesignService {\n public readonly localPersistenceKey = \"designTransactions\";\n private storageMethod: StorageMethod = StorageMethod.Local;\n private designSavedListeners: ((designs: SavedDesign) => void)[] = [];\n\n /**\n * @param func The function to call when a design is saved.\n */\n attachSaveListener(func: (design: SavedDesign) => void) {\n this.designSavedListeners.push(func);\n }\n\n /**\n * @param func The function to remove from the list of listeners.\n */\n detachSaveListener(func: (design: SavedDesign) => void) {\n this.designSavedListeners = this.designSavedListeners.filter((f) => f !== func);\n }\n\n /**\n * Gets the currently persisted designs.\n */\n async getSavedDesigns(): Promise<SavedDesign[]> {\n if (this.storageMethod === StorageMethod.Local) {\n const persistedString = persistenceService.get(this.localPersistenceKey);\n const savedDesigns = persistedString ? (JSON.parse(persistedString) as SavedDesign[]) : [];\n return savedDesigns;\n }\n throw new UnhandledBehaviorError(\"Unexpected storage method requested\");\n }\n\n /**\n * Search for a transaction that has been saved.\n * @param transactionId The id to search for.\n * @returns The transaction for the given id provided it has been saved. undefined if it doesn't exist.\n */\n async getSavedDesignByTransaction(transactionId: string): Promise<SavedDesign | undefined> {\n const designs = await this.getSavedDesigns();\n return designs.find((d) => d.transactionId === transactionId);\n }\n\n /**\n * Saves a design to storage.\n * @param design The design to save.\n */\n async addDesign(design: SavedDesign) {\n const designs = await this.getSavedDesigns();\n const newDesigns = designs.filter((d) => d.transactionId !== design.transactionId);\n newDesigns.unshift(design);\n await this.setDesigns(newDesigns);\n this.designSavedListeners.forEach((listener) => listener(design));\n }\n\n /**\n * Change the user's name of the given saved design.\n */\n async renameDesign(transactionId: string, title: string) {\n const designs = await this.getSavedDesigns();\n const design = designs.find((d) => d.transactionId === transactionId);\n if (!design) {\n throw new Error(`No saved design for transaction ${transactionId}.`);\n }\n design.title = title;\n await this.setDesigns(designs);\n }\n\n /**\n * Removes a given design from storage.\n * @param transactionId\n */\n async removeDesign(transactionId: string) {\n const designs = await this.getSavedDesigns();\n await this.setDesigns(designs.filter((d) => d.transactionId !== transactionId));\n }\n\n private async setDesigns(designs: SavedDesign[]) {\n if (this.storageMethod === StorageMethod.Local) {\n persistenceService.set(this.localPersistenceKey, JSON.stringify(designs));\n return;\n }\n throw new UnhandledBehaviorError(\"Unexpected storage method requested\");\n }\n}\nconst designService = new DesignService();\nexport { designService };\n","import { Pith } from \"pith\";\nimport {\n Bundle,\n CommandContext,\n LayoutsState,\n persistenceService,\n SpiffCommerceClient,\n TextStepHandle,\n} from \"../index\";\nimport { graphQlManager } from \"../services/server\";\nimport { StepHandle } from \"../stepHandles\";\nimport {\n Product,\n DesignCreationMessage,\n Transaction,\n CustomerDetailsInput,\n Workflow,\n ILayout,\n AnyStepData,\n StepType,\n LayoutRenderingPurpose,\n GlobalPropertyAspectConfiguration,\n Step,\n} from \"../types\";\nimport {\n WorkflowManager,\n DesignCreationProgressUpdate,\n InternalWorkflowManager,\n StateMutationFunc,\n} from \"../WorkflowManager\";\nimport { StepHandleFactory } from \"../stepHandles/factory\";\nimport { designService, createDesign, SavedDesign } from \"../services/design\";\nimport cloneDeep from \"lodash.clonedeep\";\nimport { ResourceGenerationError, UnhandledBehaviorError } from \"../util/exception\";\nimport debounce from \"lodash.debounce\";\nimport { RenderableScene, stepConditionsAreSatisfied } from \"../WorkflowManager/scenes\";\nimport type { ModelContainer, ThreeDPreviewService } from \"@spiffcommerce/preview\";\nimport { LayoutPreviewService } from \"../WorkflowManager/LayoutPreviewService\";\nimport { gql } from \"@apollo/client/core\";\nimport { finalizeUpdateTransactionMutation, updateTransactionQuantityQuery } from \"../query\";\nimport { createCanvas, getDomParser, loadImage } from \"../customCanvas\";\nimport { getSvgElement } from \"../CommandContext\";\nimport { renderPapyrusComponentAsString } from \"../util/crossplatform\";\n\nconst addTransactionStakeholderMutation = gql`\n mutation AddTransactionStakeholder($id: String!, $type: String!, $details: CustomerDetailsInput!) {\n transactionAddStakeholder(id: $id, details: $details, type: $type) {\n id\n stakeholders {\n id\n type\n customer {\n id\n emailAddress\n }\n }\n }\n }\n`;\n\n/**\n * A scene is a collection of steps that can be used to group steps together.\n */\nexport interface Scene {\n /**\n * The unique identifier for the scene.\n */\n id?: string;\n /**\n * The name of the scene.\n */\n name: string;\n /**\n * The steps that are part of the scene. A list of ids. See getStepById.\n */\n stepIds: string[];\n}\n\n/**\n * State related to a workflow experience.\n */\nexport interface ExperienceOptions {\n product: Product;\n transaction: Transaction;\n workflow?: Workflow;\n /**\n * @deprecated favor inject / eject functions.\n */\n previewService?: ThreeDPreviewService;\n modelContainer?: ModelContainer;\n renderableContextService?: LayoutPreviewService;\n layouts: ILayout[];\n reloadedState?: LayoutsState;\n /**\n * When true the experience is intended to be immutable.\n */\n readOnly?: boolean;\n /**\n * A function that communicates state changes to the server.\n */\n stateMutationFunc: StateMutationFunc;\n /**\n * Should be set to true when the experience is loaded from an existing transaction.\n * FIXME: Wouldn't we know this from existance of reloadedState\n */\n isReloadedTransaction?: boolean;\n /**\n * When true the system will treat steps with\n * a single variant as renderable. False\n * by default.\n */\n singleVariantsRenderable?: boolean;\n\n /**\n * When true, will delay syncing the workflow state until manually enabled.\n */\n delayWorkflowStateSync?: boolean;\n}\n\n/**\n * A Workflow experience encapsulates the workflow manager and command context. It\n * provides a simplified interface for interacting with the workflow manager. You\n * should get an instance of this class from a Client you have constructed previously.\n */\nexport interface WorkflowExperience {\n /**\n * Get the bundle this experience is part of. May be undefined.\n */\n getBundle(): Bundle | undefined;\n\n /**\n * Set the bundle this experience is part of. Can be cleared using undefined.\n */\n setBundle(bundle: Bundle | undefined);\n\n /**\n * Returns the client that was responsible for spawning this experience.\n */\n getClient(): SpiffCommerceClient;\n /**\n * State related to the design of the user.\n */\n getCommandContext(): CommandContext;\n /**\n * Returns true when the user may only view the design.\n */\n getIsReadOnly(): boolean;\n /**\n * Get the low level workflow amanager instance for this experience. Don't touch this unless you're willing to break things.\n */\n getWorkflowManager(): WorkflowManager;\n\n /**\n * Returns the step matching a given name, undefined if not found.\n * @param id The id the step must match.\n */\n getStepById(id: string): StepHandle<AnyStepData> | undefined;\n\n /**\n * Returns the step matching a given name, undefined if not found.\n * @param name The name the step must match.\n */\n getStepByName(name: string): StepHandle<AnyStepData> | undefined;\n\n /**\n * Returns all steps matching a specific type in the workflow. These steps\n * may be across multiple scenes and may or may not be active based on condition state.\n */\n getStepsByType(type: StepType): StepHandle<AnyStepData>[];\n\n /**\n * Returns all steps that are children of a given scene.\n * @param scene The scene you want the steps for.\n */\n getStepsByScene(scene: Scene): StepHandle<AnyStepData>[];\n\n /**\n * Returns all steps in the workflow. Ordered by scene and appearance within their respective scenes.\n */\n getSteps(): StepHandle<AnyStepData>[];\n\n /**\n * Returns all steps in the workflow that are conditionally active. Ordered by scene and appearance within their respective scenes.\n */\n getStepsConditionallyActive(): StepHandle<AnyStepData>[];\n\n /**\n * Returns a list of scenes that are configured in the workflow. Each scene\n * contains a list of steps. See getStepsByScene to access these.\n */\n getScenes(): Scene[];\n\n /**\n * Returns the total cost in subunits for all selections made on the design.\n * @param disablePriceBreaks Whether to exclude price breaks from the calculation.\n */\n getSelectionPriceSubunits(disablePriceBreaks?: boolean): number;\n\n /**\n * Returns the total cost in subunits for the base product.\n * @param includeAdditionalProduct When true the additional product cost will be included in the total (if configured).\n * @param disablePriceBreaks Whether to exclude price breaks from the calculation.\n */\n getBasePriceSubunits(includeAdditionalProduct?: boolean, disablePriceBreaks?: boolean): number;\n\n /**\n * If an additional product is configured, returns the base price of that product. Returns undefined otherwise.\n * @param disablePriceBreaks Whether to exclude price breaks from the calculation.\n */\n getAdditionalProductPriceSubunits(disablePriceBreaks?: boolean): number | undefined;\n\n /**\n * A convenience function returning the sum of the selection and base price values.\n * @param disablePriceBreaks Whether to exclude price breaks from the calculation.\n */\n getTotalPriceSubunits(disablePriceBreaks?: boolean): number;\n\n /**\n * The price break percentage that is expected to be applied in price calculations.\n */\n priceBreakToBeApplied(): number;\n\n /**\n * Calculates the price break and fires the \"PriceBreakChanged\" event if required.\n * This function is primarily intended for internal use.\n */\n checkForPriceBreakChanges(): void;\n\n /**\n * Takes selections made by the user in another workflow and applies them to this workflow. For\n * selections to be copied they must both have a matching global property configuration.\n * @param experience The experience to take selections from.\n * @param filter A list of steps to apply the selections to. If undefined all steps will be updated.\n */\n copySelectionsViaGlobalConfiguration(\n bundle: Bundle,\n experience: WorkflowExperience,\n filter?: StepHandle<AnyStepData>[],\n ): Promise<void>;\n\n /**\n * Attach specific details about the customer to the experience. This is useful for things like retargeting. Currently only\n * email is supported. From SpiffCommerce hosted experiences these details will be attached whenever the customer has provided & given permission.\n * @param details The new customer details. Only email is supported.\n * @deprecated Use assignCustomerDetails instead.\n */\n attachCustomerDetails(details: {\n /**\n * An email used for things like sending a design to the user.\n */\n email: string;\n }): Promise<void>;\n\n /**\n * Attach specific details about the customer to the experience. This is useful for things like retargeting.\n * From SpiffCommerce hosted experiences these details will be attached whenever the customer has provided & given permission.\n * @param details The new customer details.\n */\n assignCustomerDetails(details: CustomerDetailsInput): Promise<void>;\n\n /**\n * Attaches a listener to the scenes on a workflow experience. The scenes returned are a subset of the scenes configured in the\n * workflow and are based on the current state of the experience. This is useful for building a navigation menu.\n * @param cb The callback to be called when the scenes change. The new scenes are passed as an argument.\n */\n attachRenderableSceneListener(cb: (scenes: RenderableScene[]) => void): void;\n\n /**\n * Detaches a listener from the scenes on a workflow experience.\n */\n detachRenderableSceneListener(cb: (scenes: RenderableScene[]) => void): void;\n\n /**\n * Saves this experience to storage. This may be local or remote depending\n * on configuration.\n * @param title The title for the saved design.\n */\n save(title: string): Promise<SavedDesign>;\n\n /**\n * Returns a copy of the currently loaded design as a new, seperated workflow experience with\n * a fresh transaction.\n */\n copy(): Promise<WorkflowExperience>;\n\n /**\n * Creates a data URL preview for the current design.\n */\n createPreviewImage(isThreeD?: boolean, resolution?: number): Promise<string>;\n\n /**\n * To be called when the workflow experience is considered completed by the user.\n * @param onProgressUpdate Progress callback for finalizing the design. Optional\n * @param capturePreviewImage When true a preview image will be generated for the design. Defaults to true.\n */\n onDesignFinished(\n onProgressUpdate?: DesignCreationProgressUpdate,\n capturePreviewImage?: boolean,\n ): Promise<DesignCreationMessage>;\n\n /**\n * Returns the metadata associated with this workflow experience.\n * This is a combination of the metadata from the workflow, and the selections made by the user.\n */\n getExportedData(): Map<string, { [key: string]: string }>;\n\n /**\n * Get the quantity of this WorkflowExperience's Transaction.\n * @returns The amount that was, or will be, ordered.\n */\n getQuantity(): number;\n\n /**\n * Sets the quantity of this WorkflowExperience's Transaction.\n * @throws {Error} if the WorkflowExperience is read-only.\n * @throws {RangeError} if the value is below 1.\n * @param quantity The amount that was, or will be, ordered.\n * @returns A promise that resolves when the Transaction has been updated on the server.\n */\n setQuantity(quantity: number): Promise<void>;\n\n /**\n * Registers a callback function to be called when the specified event is raised.\n * @param type The type of event to listen for.\n * @param callback The function to call when the event occurs.\n */\n addEventListener(\n type: WorkflowExperienceEventType,\n callback: (workflowExperience: WorkflowExperience) => void,\n ): void;\n\n /**\n * Removes a previously registered callback.\n * @param type The type of event.\n * @param callback The function to remove.\n */\n removeEventListener(\n type: WorkflowExperienceEventType,\n callback: (workflowExperience: WorkflowExperience) => void,\n ): void;\n}\n\nexport enum WorkflowExperienceEventType {\n QuantityChanged = \"QuantityChanged\",\n PriceBreakChanged = \"PriceBreakChanged\",\n}\n\n/**\n * Different types of aspect of a step that can be configured to be the target of global properties\n */\nenum AspectType {\n FileUpload = \"FileUpload\",\n Option = \"Option\",\n Text = \"Text\",\n}\n\nexport class WorkflowExperienceImpl implements WorkflowExperience {\n readonly client: SpiffCommerceClient;\n readonly commandContext: CommandContext;\n readonly workflowManager: WorkflowManager;\n readonly isReadOnly: boolean;\n readonly cachedStepHandles: Map<string, StepHandle<any>> = new Map();\n\n /**\n * Bundle this experience has been added to.\n */\n private bundle?: Bundle;\n private currentPriceBreak = 1;\n\n // A list of scenes that currently available to the user. This is a subset of the scenes available in the workflow.\n // The steps contained within are also a subset.\n private renderableScenes: RenderableScene[] = [];\n private renderableSceneCallbacks: ((scenes: RenderableScene[]) => void)[] = [];\n\n private eventCallbacks: Map<WorkflowExperienceEventType, ((workflowExperience: WorkflowExperience) => void)[]> =\n new Map();\n\n constructor(client: SpiffCommerceClient, experienceOptions: ExperienceOptions) {\n if (!experienceOptions.workflow) {\n throw new Error(\"No Workflow ID provided.\");\n }\n\n this.client = client;\n\n const layouts = experienceOptions.layouts;\n\n this.commandContext = new CommandContext();\n this.commandContext.initialize(layouts, experienceOptions.reloadedState);\n\n this.isReadOnly = experienceOptions.transaction.isOrdered || !!experienceOptions.readOnly;\n\n this.workflowManager = new InternalWorkflowManager(\n this,\n client,\n experienceOptions.workflow,\n experienceOptions.product.profanities?.map((x) => x.word) || [],\n layouts,\n this.commandContext,\n (request) => {\n try {\n this.debouncedSavedDesignUpdate();\n } catch {\n console.error(\"Failed to update saved design details.\");\n }\n return experienceOptions.stateMutationFunc(request);\n },\n experienceOptions.transaction,\n experienceOptions.product,\n experienceOptions.previewService,\n experienceOptions.renderableContextService,\n experienceOptions.reloadedState,\n experienceOptions.readOnly,\n experienceOptions.modelContainer,\n experienceOptions.isReloadedTransaction,\n experienceOptions.singleVariantsRenderable,\n experienceOptions.delayWorkflowStateSync,\n );\n\n // We attach a listener to the manager and update the available scenes when they change. We store simplified information about the scenes\n // instead of the full complex structure. Internal scene state/configuration should be considered private & exposed through handles instead.\n // The user can get reference to a handle via the step ID returned here.\n this.workflowManager.addSelectionCallback((callbackOptions) => {\n const newScenes = callbackOptions.traversableScenes.map((workflowScene) => {\n const newSteps = workflowScene.renderableSteps.map((step) => step.stepName);\n return {\n id: workflowScene.name,\n title: workflowScene.title,\n renderableSteps: newSteps,\n workflowScene,\n } as RenderableScene;\n });\n this.renderableScenes = newScenes;\n this.renderableSceneCallbacks.forEach((cb) => cb(newScenes));\n });\n\n this.currentPriceBreak = this.priceBreakToBeApplied();\n }\n\n getBundle() {\n return this.bundle;\n }\n\n setBundle(bundle: Bundle) {\n this.bundle = bundle;\n }\n\n getClient() {\n return this.client;\n }\n\n getIsReadOnly() {\n return this.isReadOnly;\n }\n\n getCommandContext() {\n return this.commandContext;\n }\n\n getWorkflowManager() {\n return this.workflowManager;\n }\n\n async createPreviewImage(isThreeD?: boolean, resolution?: number): Promise<string> {\n const workflow = this.workflowManager.getWorkflow();\n const cameraOrientation = workflow?.finalizeStepConfig?.lookAtAnimation;\n if (isThreeD) {\n if (!cameraOrientation) {\n throw new Error(\"Failed to generate cart preview image!\");\n }\n const data = await this.workflowManager\n .getPreviewService()\n ?.renderSceneScreenshot(resolution ?? 512, cameraOrientation);\n return data || \"\";\n }\n\n let res = 2048;\n if (resolution && resolution <= 2048) {\n res = resolution;\n }\n\n const canvas = createCanvas(res, res);\n\n // Resolve default layout for rendering.\n const layouts = this.commandContext.getAllLayouts();\n const defaultPanelIndex = workflow.defaultPreviewPanelIndex || 0;\n const targetPanel = workflow.panels[defaultPanelIndex];\n const defaultLayout = layouts.find((l) => l.layoutState?.layout.panelId === targetPanel?.name) || layouts[0];\n const region = defaultLayout.layoutState.layout.previewRegion\n ? {\n x: defaultLayout.layoutState.layout.previewRegion.left,\n y: defaultLayout.layoutState.layout.previewRegion.top,\n width: defaultLayout.layoutState.layout.previewRegion.width,\n height: defaultLayout.layoutState.layout.previewRegion.height,\n }\n : {\n x: 0,\n y: 0,\n width: defaultLayout.layoutState.layout.width,\n height: defaultLayout.layoutState.layout.height,\n };\n\n // Render the SVG for the target layout to a data URL for return.\n const layout = this.commandContext.getLayoutById(defaultLayout.layoutState.layout.id);\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new ResourceGenerationError(\"Failed to obtain 2D context for preview image creation\");\n }\n const svgElement = getSvgElement(layout.layoutState.layout, layout.layoutState.elements, {\n renderingConfiguration: {\n purpose: LayoutRenderingPurpose.Print,\n region: { left: region.x, top: region.y, width: region.width, height: region.height },\n },\n });\n const svgString = renderPapyrusComponentAsString(svgElement);\n const pith = await Pith.from(ctx as any, svgString, {\n anonymousCrossOrigin: true,\n ignoreDimensions: false,\n createCanvas: createCanvas as any,\n createImage: loadImage as any,\n DOMParser: getDomParser(),\n fetch: fetch,\n });\n await pith.render();\n const objectUrl = await this.getCanvasObjectURLAsync(canvas as any);\n return canvas.toDataURL(objectUrl as any);\n }\n\n getStepById(id: string) {\n const stepData = this.getWorkflowManager()\n .getWorkflow()\n .steps.find((step) => step.stepName === id);\n if (!stepData || !this.stepHasHandle(stepData)) return undefined;\n const cachedHandle = this.cachedStepHandles.get(stepData.stepName);\n if (cachedHandle) {\n return cachedHandle;\n }\n const createdHandle = StepHandleFactory.get(this.getWorkflowManager(), stepData);\n this.cachedStepHandles.set(stepData.stepName, createdHandle);\n return createdHandle;\n }\n\n getSteps(): StepHandle<AnyStepData>[] {\n return this.getScenes().flatMap((scene) => this.getStepsByScene(scene));\n }\n\n getStepsConditionallyActive(): StepHandle<AnyStepData>[] {\n return this.getScenes().flatMap((scene) =>\n this.getStepsByScene(scene).filter((step) =>\n stepConditionsAreSatisfied(step.getRaw(), this.getWorkflowManager().getStepSelections()),\n ),\n );\n }\n\n getScenes(): Scene[] {\n // Internally scenes are called step groups, but we expose them to the user as 'scenes'.\n const stepGroups = this.getWorkflowManager().getWorkflow().stepGroups;\n return stepGroups.map((sg) => {\n return {\n id: sg.id,\n name: sg.name,\n stepIds: sg.stepNames,\n } as Scene;\n });\n }\n\n getSelectionPriceSubunits(disablePriceBreaks?: boolean): number {\n const selections = this.getWorkflowManager().getWorkflowSelections();\n let totalSelectionCost = 0;\n Object.values(selections).forEach((step) => {\n totalSelectionCost += step.selections.reduce((acc, variant) => acc + (variant.priceModifier || 0), 0);\n });\n return this.getPriceSubUnitsAfterPriceBreaks(totalSelectionCost, disablePriceBreaks);\n }\n\n getBasePriceSubunits(includeAdditionalProduct?: boolean, disablePriceBreaks?: boolean): number {\n const basePrice = this.getPriceSubUnitsAfterPriceBreaks(\n this.getWorkflowManager().getProduct().basePrice || 0,\n disablePriceBreaks,\n );\n if (includeAdditionalProduct) {\n const additionalPrice = this.getAdditionalProductPriceSubunits(disablePriceBreaks) || 0;\n return basePrice + additionalPrice;\n }\n return basePrice;\n }\n\n getAdditionalProductPriceSubunits(disablePriceBreaks?: boolean): number | undefined {\n const integrationProduct = this.getWorkflowManager().getTransaction().integrationProduct;\n if (integrationProduct?.additionalIntegrationProduct?.product) {\n const additionalProductPrice = integrationProduct.additionalIntegrationProduct.product.basePrice || 0;\n return this.getPriceSubUnitsAfterPriceBreaks(additionalProductPrice, disablePriceBreaks);\n }\n return undefined;\n }\n\n getTotalPriceSubunits(disablePriceBreaks?: boolean): number {\n return (\n this.getBasePriceSubunits(false, disablePriceBreaks) + this.getSelectionPriceSubunits(disablePriceBreaks)\n );\n }\n\n private getPriceSubUnitsAfterPriceBreaks(subUnits: number, disablePriceBreaks?: boolean): number {\n const percentage = disablePriceBreaks ? 1 : this.priceBreakToBeApplied();\n const finalPrice = subUnits * percentage;\n return Math.ceil(finalPrice);\n }\n\n priceBreakToBeApplied(): number {\n // Sort price breaks from largest minQty to smallest.\n const priceBreaks = (this.getWorkflowManager().getProduct().priceBreaks || []).sort(\n (a, b) => -(a.minQty - b.minQty),\n );\n const matchingExperiences = [...this.getMatchingExperiencesFromBundle(), this];\n const totalQuantity = matchingExperiences.reduce((acc, exp) => acc + exp.getQuantity(), 0);\n for (const pb of priceBreaks) {\n if (pb.minQty <= totalQuantity) {\n return pb.percentage;\n }\n }\n return 1;\n }\n\n checkForPriceBreakChanges(): void {\n const updatedPriceBreak = this.priceBreakToBeApplied();\n if (this.currentPriceBreak !== updatedPriceBreak) {\n this.updatePriceBreak(updatedPriceBreak);\n this.getMatchingExperiencesFromBundle().forEach((wfe: WorkflowExperienceImpl) =>\n wfe.updatePriceBreak(updatedPriceBreak),\n );\n }\n }\n\n private getMatchingExperiencesFromBundle(): WorkflowExperience[] {\n return (this.bundle?.getWorkflowExperiences() || []).filter(\n (exp) =>\n exp.getWorkflowManager().getTransaction().id !== this.getWorkflowManager().getTransaction().id &&\n exp.getWorkflowManager().getProduct().id === this.getWorkflowManager().getProduct().id,\n );\n }\n\n private updatePriceBreak(value: number) {\n this.currentPriceBreak = value;\n this.callEvent(WorkflowExperienceEventType.PriceBreakChanged);\n }\n\n async copySelectionsViaGlobalConfiguration(\n bundle: Bundle,\n experience: WorkflowExperience,\n filter?: StepHandle<AnyStepData>[],\n ) {\n const bundleProperties = await bundle.getGlobalProperties();\n const filterIds = filter?.map((s) => s.getId());\n const targetSteps = this.getSteps().filter((s) => filterIds === undefined || filterIds.includes(s.getId()));\n const originatingSteps = experience.getSteps();\n\n const getGlobalPropertyFromConfig = (config: GlobalPropertyAspectConfiguration) => {\n return bundleProperties.find((p) => p.getRawProperty().name === config.aspectName);\n };\n\n targetSteps.forEach((targetStep) => {\n // Grab the properties of the step, stringify them for easier comparison\n const uniqueProperties = new Set<string>();\n const propertyConfigurations = targetStep.getRaw().globalPropertyAspectConfigurations;\n if (propertyConfigurations === undefined) return;\n propertyConfigurations.forEach((p) => uniqueProperties.add(JSON.stringify(p)));\n // Go through properties of originating experience and search for matches\n originatingSteps.forEach((originatingStep) => {\n const properties = originatingStep.getRaw().globalPropertyAspectConfigurations;\n if (properties === undefined) return;\n properties.forEach((p) => {\n const actualProperty = getGlobalPropertyFromConfig(p);\n const requiredProperty = uniqueProperties.has(JSON.stringify(p));\n if (requiredProperty && actualProperty?.getType() === AspectType.Option) {\n const curVariant = originatingStep.getCurrentVariant();\n if (!curVariant) return;\n targetStep.selectVariant(curVariant);\n uniqueProperties.delete(JSON.stringify(p));\n } else if (requiredProperty && actualProperty?.getType() === AspectType.Text) {\n const text = (originatingStep as TextStepHandle).getText();\n (targetStep as TextStepHandle).setText(text);\n uniqueProperties.delete(JSON.stringify(p));\n }\n // TODO: File Upload, not required now.\n });\n });\n });\n }\n\n getStepByName(name: string) {\n const stepData = this.getWorkflowManager()\n .getWorkflow()\n .steps.find((step) => step.stepTitle === name);\n if (!stepData || !this.stepHasHandle(stepData)) return undefined;\n return StepHandleFactory.get(this.getWorkflowManager(), stepData);\n }\n\n getStepsByType(type: StepType): StepHandle<AnyStepData>[] {\n return this.getWorkflowManager()\n .getWorkflow()\n .steps.filter((step) => step.type === type)\n .map((step) => StepHandleFactory.get(this.getWorkflowManager(), step));\n }\n\n getStepsByScene(scene: Scene): StepHandle<AnyStepData>[] {\n // Enforce scene existance.\n if (\n !this.getWorkflowManager()\n .getWorkflow()\n .stepGroups.find((s) => s.name === scene.name)\n ) {\n throw new Error(\n \"Given scene is not present on workflow! Be careful when persisting scenes that you only use them with the relevant workflow.\",\n );\n }\n const steps = scene.stepIds.map(\n (id) =>\n this.getWorkflowManager()\n .getWorkflow()\n .steps.find((step) => step.stepName === id)!,\n );\n return steps\n .filter((s) => this.stepHasHandle(s))\n .map((step) => StepHandleFactory.get(this.getWorkflowManager(), step));\n }\n\n async attachCustomerDetails(details: { email: string }): Promise<void> {\n return this.assignCustomerDetails({ emailAddress: details.email });\n }\n\n async assignCustomerDetails(details: CustomerDetailsInput): Promise<void> {\n const ownerMap = persistenceService.getMap(\"transactionOwnerIds\") || new Map();\n const ownerId = ownerMap.get(this.getWorkflowManager().getTransaction().id);\n const response = await graphQlManager\n .getShadowGraphqlClient()\n .mutate<{ transactionAddStakeholder: Transaction }>({\n mutation: addTransactionStakeholderMutation,\n variables: {\n id: this.getWorkflowManager().getTransaction().id,\n details,\n type: \"Owner\",\n },\n context: {\n transactionOwnerId: ownerId,\n },\n });\n const stakeholder = response.data?.transactionAddStakeholder?.stakeholders?.find(\n (s) => s.customer?.emailAddress === details.emailAddress,\n );\n if (stakeholder?.customer) {\n this.getWorkflowManager().setTransactionCustomer(stakeholder.customer);\n // Persist the customer ID for this transaction so that we can retrieve it when authenticating on reload.\n const transactionCustomerIds = persistenceService.getMap(\"transactionCustomerIds\") || new Map();\n transactionCustomerIds.set(this.getWorkflowManager().getTransaction().id, stakeholder.customer.id);\n persistenceService.setMap(\"transactionCustomerIds\", transactionCustomerIds);\n }\n }\n\n attachRenderableSceneListener(cb: (scenes: RenderableScene[]) => void): void {\n this.renderableSceneCallbacks.push(cb);\n cb(this.renderableScenes);\n }\n\n detachRenderableSceneListener(cb: (scenes: RenderableScene[]) => void): void {\n this.renderableSceneCallbacks = this.renderableSceneCallbacks.filter((x) => x !== cb);\n }\n\n debouncedSavedDesignUpdate = debounce(async () => {\n const existingDesign = await designService.getSavedDesignByTransaction(\n this.getWorkflowManager().getTransaction().id,\n );\n if (existingDesign) this.save();\n }, 2500);\n\n async save(title?: string) {\n const state = this.getCommandContext().getState();\n if (!state) throw new UnhandledBehaviorError(\"State undefined!\");\n const getTitle = async () => {\n if (title) return title;\n const transactionId = this.getWorkflowManager().getTransaction().id;\n const ds = await designService.getSavedDesigns();\n const existingTitle = ds.find((d) => d.transactionId === transactionId)?.title;\n return existingTitle ? existingTitle : `My design`;\n };\n const saveData: SavedDesign = {\n title: await getTitle(),\n thumbnail: await this.createPreviewImage(false, 256),\n transactionId: this.getWorkflowManager().getTransaction().id,\n productId: this.getWorkflowManager().getProduct().id,\n integrationProductId: this.getWorkflowManager().getTransaction().integrationProduct!.id,\n workflowName: this.getWorkflowManager().getWorkflow().name,\n workflowId: this.getWorkflowManager().getWorkflow().id,\n lastEdited: new Date(),\n };\n await designService.addDesign(saveData);\n return saveData;\n }\n\n async copy() {\n const state = cloneDeep(this.getCommandContext().getState());\n if (!state) throw new UnhandledBehaviorError(\"Internal state is undefined! Cannot copy experience!\");\n const savedWorkflowState = JSON.stringify(state.transaction);\n const workflow = this.getWorkflowManager().getWorkflow();\n const integrationProductId = this.getWorkflowManager().getTransaction().integrationProduct?.id;\n if (!integrationProductId) throw new UnhandledBehaviorError(\"Integration product id is undefined!\");\n const experience = await this.getClient().getWorkflowExperience({\n type: \"integration\",\n integrationProductId,\n workflowId: workflow.id,\n workflowState: savedWorkflowState,\n });\n return experience;\n }\n\n async onDesignFinished(\n onProgressUpdate?: DesignCreationProgressUpdate,\n capturePreviewImage: boolean = true,\n ): Promise<DesignCreationMessage> {\n const transaction = this.workflowManager.getTransaction();\n if (transaction.completed) {\n await graphQlManager.getShadowGraphqlClient().mutate({\n mutation: finalizeUpdateTransactionMutation,\n variables: {\n transactionId: transaction.id,\n },\n });\n\n return {\n event: \"\",\n exportedData: {},\n lineItemImageUrl: \"\",\n optionsCost: 0,\n transactionId: transaction.id,\n workflowViewerLink: \"\",\n workflowViewerReadOnlyLink: \"\",\n };\n }\n return createDesign(\n this.workflowManager,\n this.workflowManager.getWorkflow(),\n this.workflowManager.getLayouts(),\n () => this.commandContext.getState()!, // Handle case where undefined (create a default state)\n this.workflowManager.getProduct(),\n transaction,\n this.workflowManager.getWorkflowSelections(),\n this.workflowManager.getWorkflow().name,\n onProgressUpdate\n ? onProgressUpdate\n : () => {\n /* Noop to avoid changing createDesign interface */\n },\n (show3D?: boolean) => {\n if (capturePreviewImage) {\n return this.createPreviewImage(show3D, 1024);\n }\n return Promise.resolve(undefined);\n },\n this.workflowManager.getWorkflowMetadata(),\n );\n }\n\n /**\n * @param step The step to test against.\n * @returns Returns true when a valid handle is implemented for a given step type. Certain steps don't support handles, such as silent illustrations.\n */\n private stepHasHandle(step: Step<AnyStepData>): boolean {\n return step.type !== StepType.SilentIllustration && step.type !== StepType.ProductOverlay;\n }\n\n private getCanvasObjectURLAsync = async (canvas: HTMLCanvasElement): Promise<string> => {\n return new Promise((resolve, reject) => {\n try {\n canvas.toBlob((blob) => {\n if (blob) {\n const objectURL = URL.createObjectURL(blob);\n resolve(objectURL);\n }\n });\n } catch (e: any) {\n reject(e);\n }\n });\n };\n\n getExportedData(): Map<string, { [key: string]: string }> {\n const exportedMetadata: Map<string, { [key: string]: string }> = new Map();\n const metadata = this.getWorkflowManager().getWorkflowMetadata();\n const variantSelections = this.getWorkflowManager().getWorkflowSelections();\n\n // Process metadata\n Object.keys(metadata).forEach((stepId) => {\n const step = this.workflowManager.getWorkflow().steps.find((step) => step.stepName === stepId);\n if (!step) return;\n if (!exportedMetadata.has(step.stepTitle)) {\n exportedMetadata.set(step.stepTitle, {});\n }\n const stepMetadata = metadata[stepId];\n Object.keys(stepMetadata).forEach((metadataType) => {\n exportedMetadata.get(step.stepTitle)![metadataType] = stepMetadata[metadataType];\n });\n });\n\n // Process variant selections\n Object.keys(variantSelections)?.forEach((stepId) => {\n const step = this.workflowManager.getWorkflow().steps.find((step) => step.stepName === stepId);\n if (!step) return;\n if (!exportedMetadata.has(step.stepTitle)) {\n exportedMetadata.set(step.stepTitle, {});\n }\n exportedMetadata.get(step.stepTitle)![\"selection\"] = variantSelections[stepId].selections[0].name;\n });\n // Return the exported data\n return exportedMetadata;\n }\n\n getQuantity(): number {\n return this.getWorkflowManager().getTransaction().quantity || 1;\n }\n\n async setQuantity(quantity: number): Promise<void> {\n if (quantity < 1) {\n throw new RangeError(\"WorkflowExperience quantity must be greater than zero.\");\n }\n if (this.isReadOnly) {\n throw new Error(\"Cannot update quantity on a read-only WorkflowExperience\");\n }\n this.getWorkflowManager().getTransaction().quantity = quantity;\n this.callEvent(WorkflowExperienceEventType.QuantityChanged);\n this.checkForPriceBreakChanges();\n\n // TODO: we should probably have a single place to auth a gql request for transaction updates.\n const ownerMap = persistenceService.getMap(\"transactionOwnerIds\") || new Map();\n const transaction = this.getWorkflowManager().getTransaction();\n const transactionOwnerId = ownerMap.get(transaction.id) || undefined;\n await graphQlManager.getShadowGraphqlClient().mutate({\n mutation: updateTransactionQuantityQuery,\n variables: {\n id: transaction.id,\n quantity,\n },\n context: {\n transactionOwnerId,\n },\n });\n }\n\n addEventListener(\n type: WorkflowExperienceEventType,\n callback: (workflowExperience: WorkflowExperience) => void,\n ): void {\n const events = this.eventCallbacks.get(type) || [];\n events.push(callback);\n this.eventCallbacks.set(type, events);\n }\n\n removeEventListener(\n type: WorkflowExperienceEventType,\n callback: (workflowExperience: WorkflowExperience) => void,\n ): void {\n const events = this.eventCallbacks.get(type) || [];\n this.eventCallbacks.set(\n type,\n events.filter((evt) => evt !== callback),\n );\n }\n\n private callEvent(type: WorkflowExperienceEventType): void {\n (this.eventCallbacks.get(type) || []).forEach((cb) => cb(this));\n }\n}\n","import { toString as urlToQrString } from \"qrcode\";\nimport {\n DesignInputStep,\n DigitalContentDesignInputStepData,\n FrameDesignInputStepData,\n IllustrationDesignInputStepData,\n ModuleDesignInputStepData,\n PictureDesignInputStepData,\n ShapeDesignInputStepData,\n TextDesignInputStepData,\n} from \"./types\";\nimport moduleResolver from \"../module/resolver\";\nimport { LayoutNotFoundError, ParseError } from \"../util/exception\";\nimport { optionService } from \"../services/option\";\nimport { AnyStepData, ColorDefinition, DigitalContentStepData, FontData, FrameElement, FrameStepData, ILayout, IllustrationElement, IllustrationStepData, ImageElement, LayoutElement, LayoutElementType, ModuleStepData, PictureStepData, Region, ShapeStepData, SilentStepData, Step, StepSelections, StepType, TextboxElement, TextStepData, VariantResource, Workflow } from \"../types\";\nimport { CanvasCommand, CreateElementCommand } from \"../command\";\nimport { domParser, fetchAsString, toBase64, xmlSerializer } from \"../util/crossplatform\";\nimport { generate } from \"../util/guid\";\nimport { calculateOffsets, generateFrameSVG, getFrameData, getPatternImageData, getVariant } from \"../util/frame\";\nimport { getDefaultVariant } from \"../util/option\";\nimport { sanitizeSvgTree, traverse } from \"../util/illustration\";\nimport { applyTextTransformations } from \"../text/shared\";\nimport { determineCorrectFontSizeAndLines } from \"../text/algorithm/autosize\";\nimport { loadFont } from \"../util/font\";\n\n// SVG tags which can take a fill.\nconst fillableTagNames = [\n \"altGlyph\",\n \"circle\",\n \"ellipse\",\n \"path\",\n \"polygon\",\n \"polyline\",\n \"rect\",\n \"text\",\n \"textPath\",\n \"tref\",\n \"tspan\",\n];\n\nconst handleDigitalContentStep = async (\n layouts: ILayout[],\n step: DesignInputStep,\n digitalContentStep: Step<DigitalContentStepData>,\n): Promise<CreateElementCommand<ImageElement>[]> => {\n const designInputStepData = step.data as DigitalContentDesignInputStepData;\n const baseUrl = digitalContentStep.data.baseUrl;\n const videoSource = designInputStepData.assetUrl.replace(\"localhost\", \"localstack\");\n const protocolPrefix = baseUrl.slice(0, 4) === \"http\" ? \"\" : \"https://\";\n const urlBuilder = new URL(protocolPrefix + baseUrl);\n urlBuilder.searchParams.append(\"video\", toBase64(JSON.stringify([{ href: videoSource }])));\n //iOS does not recognise a URL without the trailing slash on the pathname,\n urlBuilder.pathname = urlBuilder.pathname + (urlBuilder.pathname.slice(-1) === \"/\" ? \"\" : \"/\");\n const finalUrl = urlBuilder.toString();\n const base64data = toBase64(await urlToQrString(finalUrl, { type: \"svg\" }));\n const dataUri = `data:image/svg+xml;base64,${base64data}`;\n\n const createElementForRegion = (region: Region): CreateElementCommand<ImageElement> => {\n const layout = layouts.find((layout: ILayout) => layout.panelId === region.panelId);\n if (!layout) {\n throw new LayoutNotFoundError(region);\n }\n\n // Create a new image.\n const elementKey = generate();\n return new CreateElementCommand<ImageElement>(\n {\n id: elementKey,\n src: dataUri,\n type: LayoutElementType.Image,\n y: region.top,\n x: region.left,\n width: region.width,\n height: region.height,\n rotation: 0,\n },\n layout,\n );\n };\n const regions = digitalContentStep.data.regions;\n try {\n return regions.map(createElementForRegion);\n } catch (e) {\n console.error(e);\n return [];\n }\n};\n\nconst handleFrameStep = async (\n layouts: ILayout[],\n stepSelections: StepSelections,\n step: DesignInputStep,\n frameStep: Step<FrameStepData>,\n): Promise<CanvasCommand[]> => {\n const designInputStepData = step.data as FrameDesignInputStepData;\n\n const src = designInputStepData.assetUrl;\n const imageData = await getPatternImageData(src);\n\n try {\n const variant = getVariant(designInputStepData, frameStep.option);\n if (variant) {\n stepSelections[frameStep.stepName] = { selectedVariants: [variant] };\n }\n\n const createFrameAndPattern = async (region: Region): Promise<CanvasCommand[]> => {\n const frameSvg = await generateFrameSVG(region, variant?.asset?.fileLink);\n const frameData = await getFrameData(frameSvg);\n const newElementId = generate();\n const layout = layouts.find((layout: ILayout) => layout.panelId === region.panelId);\n if (!layout) {\n throw new LayoutNotFoundError(region);\n }\n const offsets = calculateOffsets(\n imageData,\n frameData,\n {\n scale: designInputStepData.scale,\n left: designInputStepData.x,\n top: designInputStepData.y,\n },\n frameStep.data.forceImageCover,\n );\n return [\n new CreateElementCommand<FrameElement>(\n {\n id: newElementId,\n path: frameData.path,\n type: LayoutElementType.Frame,\n forceImageCover: frameStep.data.forceImageCover,\n x: region.left,\n y: region.top,\n width: region.width,\n height: region.height,\n layer: region.layer,\n layerIndex: region.layerIndex,\n rotation: region.rotation,\n scaleX: region.width / frameData.width,\n scaleY: region.height / frameData.height,\n pattern: {\n id: `${newElementId}-pattern`,\n src: imageData.src,\n x: offsets.x,\n y: offsets.y,\n width: imageData.width,\n height: imageData.height,\n rotation: 0,\n scaleX: offsets.zoom,\n scaleY: offsets.zoom,\n svg: imageData.svg,\n colors: imageData.colors,\n },\n },\n layout,\n ),\n ];\n };\n return (await Promise.all(frameStep.data.regions.map((r) => createFrameAndPattern(r)))).flat();\n } catch (e) {\n console.error(e);\n return [];\n }\n};\n\nconst handleIllustrationStep = async (\n layouts: ILayout[],\n stepSelections: StepSelections,\n step: DesignInputStep,\n illustrationStep: Step<IllustrationStepData>,\n): Promise<CreateElementCommand<IllustrationElement>[]> => {\n const designInputStepData = step.data as IllustrationDesignInputStepData;\n\n const option = illustrationStep.option;\n if (!option) {\n console.error(`No option for step ${illustrationStep.stepName}.`);\n return [];\n }\n const variant =\n option.variants?.find((variant: VariantResource) => variant.id === designInputStepData.illustrationVariantId) ||\n getDefaultVariant(option);\n if (!variant) {\n console.error(`No variant with ID: ${designInputStepData.illustrationVariantId}`);\n return [];\n }\n if (!variant.asset) {\n console.error(`No asset for variant with ID: ${designInputStepData.illustrationVariantId}`);\n return [];\n }\n stepSelections[illustrationStep.stepName] = { selectedVariants: [variant] };\n\n const link = variant.asset?.fileLink;\n if (!link) {\n console.error(`No asset link for variant with ID: ${designInputStepData.illustrationVariantId}`);\n return [];\n }\n const illustrationBody = await fetchAsString(link, true);\n\n // Get the raw SVG without a doctype.\n const svgRegex = /<svg.*?<\\/svg>/s;\n const svgMatches = illustrationBody.match(svgRegex) || [];\n const svg = svgMatches?.length > 0 ? svgMatches[0] : \"\";\n\n // Parse the SVG into a tree.\n const parser = domParser();\n const parsedSvg = parser.parseFromString(svg, \"image/svg+xml\");\n const root = parsedSvg.firstElementChild;\n if (!root) {\n console.error(\"Failed to read SVG.\");\n return [];\n }\n sanitizeSvgTree(root);\n\n // Annotate elements which have fills with a new class name.\n const colors: { [key: string]: ColorDefinition } = {};\n traverse(root, (node) => {\n if (fillableTagNames.includes(node.tagName) && !node.attributes.getNamedItem(\"fill\")) {\n node.setAttribute(\"fill\", \"#000000\");\n }\n\n const fill = node.attributes.getNamedItem(\"fill\");\n if (fill && fill.value !== \"none\") {\n const fillName = fill.value;\n const alphanumericFill = fillName.replace(/\\W/g, \"\");\n const className = `spiff-fill-${alphanumericFill}`;\n node.classList.add(className);\n colors[className] = { browserValue: fillName };\n }\n\n const stroke = node.attributes.getNamedItem(\"stroke\");\n if (stroke && stroke.value !== \"none\") {\n const fillName = stroke.value;\n const alphanumericFill = fillName.replace(/\\W/g, \"\");\n const className = `spiff-stroke-${alphanumericFill}`;\n node.classList.add(className);\n colors[className] = { browserValue: fillName };\n }\n });\n\n // Serialise the traversed SVG back into a string.\n const serialiser = xmlSerializer();\n const rebuiltSvg = serialiser.serializeToString(root);\n\n const replacementColors = designInputStepData.colors;\n if (replacementColors) {\n for (const [className, colorDefinition] of Object.entries(colors)) {\n for (const k of Object.keys(replacementColors)) {\n if (colorDefinition.browserValue === k) {\n colors[className] = { browserValue: replacementColors[k] };\n break;\n }\n }\n }\n }\n\n const createElementForRegion = (region: Region): CreateElementCommand<IllustrationElement> => {\n const layout = layouts.find((layout: ILayout) => layout.panelId === region.panelId);\n if (!layout) {\n throw new LayoutNotFoundError(region);\n }\n const elementKey = generate();\n return new CreateElementCommand<IllustrationElement>(\n {\n colors,\n id: elementKey,\n svg: rebuiltSvg,\n type: LayoutElementType.Illustration,\n y: region.top,\n x: region.left,\n rotation: region.rotation,\n width: region.width,\n height: region.height,\n layer: region.layer,\n layerIndex: region.layerIndex,\n immutable: region.immutable,\n },\n layout,\n );\n };\n const regions = illustrationStep.data.regions;\n try {\n return regions.map(createElementForRegion);\n } catch (e) {\n console.error(e);\n return [];\n }\n};\n\nconst handleModuleStep = async (\n layouts: ILayout[],\n step: DesignInputStep,\n moduleStep: Step<ModuleStepData>,\n): Promise<CreateElementCommand<IllustrationElement>[]> => {\n const module = await moduleResolver(moduleStep.data.module);\n const designInputStepData = step.data as ModuleDesignInputStepData;\n const createElementForRegion = (svg: string, region: Region): CreateElementCommand<IllustrationElement> => {\n const layout = layouts.find((layout: ILayout) => layout.panelId === region.panelId);\n if (!layout) {\n throw new LayoutNotFoundError(region);\n }\n const elementKey = generate();\n return new CreateElementCommand<IllustrationElement>(\n {\n colors: {},\n id: elementKey,\n svg: svg,\n type: LayoutElementType.Illustration,\n y: region.top,\n x: region.left,\n rotation: region.rotation,\n width: region.width,\n height: region.height,\n layer: region.layer,\n layerIndex: region.layerIndex,\n },\n layout,\n );\n };\n const regions = moduleStep.data.regions;\n try {\n return regions.map((region) =>\n createElementForRegion(module.svgPrint(designInputStepData.text, region), region),\n );\n } catch (e) {\n console.error(e);\n return [];\n }\n};\n\nconst handlePictureStep = async (\n layouts: ILayout[],\n stepSelections: StepSelections,\n step: DesignInputStep,\n pictureStep: Step<PictureStepData>,\n): Promise<CreateElementCommand<ImageElement>[]> => {\n const designInputStepData = step.data as PictureDesignInputStepData;\n\n const option = pictureStep.option;\n if (!option) {\n console.error(`No option for step ${pictureStep.stepName}.`);\n return [];\n }\n const variant =\n option.variants?.find((variant: VariantResource) => variant.id === designInputStepData.pictureVariantId) ||\n getDefaultVariant(option);\n if (!variant) {\n console.error(`No variant with ID: ${designInputStepData.pictureVariantId}`);\n return [];\n }\n if (!variant.asset) {\n console.error(`No asset for variant with ID: ${designInputStepData.pictureVariantId}`);\n return [];\n }\n stepSelections[pictureStep.stepName] = { selectedVariants: [variant] };\n const link = variant.asset?.fileLink;\n if (!link) {\n console.error(`No asset link for variant with ID: ${designInputStepData.pictureVariantId}`);\n return [];\n }\n\n const createElementForRegion = (region: Region): CreateElementCommand<ImageElement> => {\n const layout = layouts.find((layout: ILayout) => layout.panelId === region.panelId);\n if (!layout) {\n throw new LayoutNotFoundError(region);\n }\n // Create a new image.\n const elementKey = generate();\n return new CreateElementCommand<ImageElement>(\n {\n id: elementKey,\n src: link,\n type: LayoutElementType.Image,\n y: region.top,\n x: region.left,\n rotation: region.rotation,\n width: region.width,\n height: region.height,\n layer: region.layer,\n layerIndex: region.layerIndex,\n immutable: region.immutable,\n preserveAspectRatio: \"none\",\n },\n layout,\n );\n };\n\n const regions = pictureStep.data.regions;\n try {\n return regions.map(createElementForRegion);\n } catch (e) {\n console.error(e);\n return [];\n }\n};\n\nconst handleShapeStep = async (\n layouts: ILayout[],\n stepSelections: StepSelections,\n step: DesignInputStep,\n shapeStep: Step<ShapeStepData>,\n): Promise<CreateElementCommand<IllustrationElement>[]> => {\n const designInputStepData = step.data as ShapeDesignInputStepData;\n const option = shapeStep.option;\n if (!option) {\n console.error(`No option for step ${shapeStep.stepName}.`);\n return [];\n }\n const variant =\n option.variants?.find((variant: VariantResource) => variant.id === designInputStepData.colorVariantId) ||\n getDefaultVariant(option);\n if (!variant) {\n console.error(`No variant with ID: ${designInputStepData.colorVariantId}`);\n return [];\n }\n stepSelections[shapeStep.stepName] = { selectedVariants: [variant] };\n\n const createElementForRegion = (region: Region): CreateElementCommand<IllustrationElement> => {\n const layout = layouts.find((layout: ILayout) => layout.panelId === region.panelId);\n if (!layout) {\n throw new LayoutNotFoundError(region);\n }\n\n const svg = `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n xmlSpace=\"preserve\"\n preserveAspectRatio=\"none\"\n version=\"1.1\"\n width=\"1\"\n height=\"1\"\n viewBox=\"0 0 1 1\"\n >\n <rect\n x=\"0\"\n y=\"0\"\n width=\"1\"\n height=\"1\"\n class=\"spiff-fill-shape\"\n fill=\"${variant?.color}\"\n />\n </svg>\n `;\n const fill: ColorDefinition = { browserValue: variant.color || \"#000000\" };\n const colors = { \"spiff-fill-shape\": fill };\n\n const elementKey = generate();\n return new CreateElementCommand<IllustrationElement>(\n {\n colors,\n id: elementKey,\n svg,\n type: LayoutElementType.Illustration,\n y: region.top,\n x: region.left,\n rotation: region.rotation,\n width: region.width,\n height: region.height,\n layer: region.layer,\n layerIndex: region.layerIndex,\n immutable: region.immutable,\n },\n layout,\n );\n };\n const regions = shapeStep.data.regions;\n try {\n return regions.map(createElementForRegion);\n } catch (e) {\n console.error(e);\n return [];\n }\n};\n\nconst handleSilentStep = async (\n layouts: ILayout[],\n silentStep: Step<SilentStepData>,\n productOverlayImageUrl?: string,\n): Promise<CreateElementCommand<LayoutElement>[]> => {\n const commands: CreateElementCommand<LayoutElement>[] = [];\n\n const getSource = (): string => {\n if (silentStep.type === StepType.ProductOverlay) {\n return productOverlayImageUrl || silentStep.data.asset?.fileLink || \"\";\n } else {\n return silentStep.data.asset?.fileLink || \"\";\n }\n };\n const assetSource = getSource();\n\n const evaluateAssetType = (): LayoutElementType => {\n // Try to determine the type by asset path.\n if (assetSource.endsWith(\".jpeg\") || assetSource.endsWith(\".jpg\") || assetSource.endsWith(\".png\")) {\n return LayoutElementType.Image;\n }\n if (assetSource.endsWith(\".svg\")) {\n return LayoutElementType.Illustration;\n }\n return LayoutElementType.Illustration;\n };\n const assetType = evaluateAssetType();\n const regions = silentStep.data.regions;\n\n if (assetType === \"image\") {\n try {\n regions.forEach((region) => {\n const layout = layouts.find((layout: ILayout) => layout.panelId === region.panelId);\n if (!layout) {\n throw new LayoutNotFoundError(region);\n }\n const newElement = {\n id: generate(),\n src: assetSource,\n type: assetType,\n y: region.top,\n x: region.left,\n width: region.width,\n height: region.height,\n layer: region.layer,\n layerIndex: region.layerIndex,\n productOverlay: silentStep.type === StepType.ProductOverlay ? true : undefined,\n scaleX: 1,\n scaleY: 1,\n rotation: region.rotation,\n excludeFromExport: silentStep.data.excludeFromPrint,\n preserveAspectRatio: \"none\",\n };\n commands.push(new CreateElementCommand<ImageElement>(newElement, layout));\n });\n } catch (e) {\n console.error(e);\n }\n } else {\n const fetchedSrc = await fetchAsString(assetSource, true);\n const sanitizeSvg = (rawSvg: string): string => {\n // Get the raw SVG without a doctype.\n const svgRegex = /<svg.*?<\\/svg>/s;\n const svgMatches = rawSvg.match(svgRegex) || [];\n const svg = svgMatches?.length > 0 ? svgMatches[0] : \"\";\n\n // Parse the SVG into a tree.\n const parser = domParser();\n const parsedSvg = parser.parseFromString(svg, \"image/svg+xml\");\n const root = parsedSvg.firstElementChild;\n if (!root) {\n throw new ParseError(\"Failed to read SVG.\");\n }\n sanitizeSvgTree(root);\n const serialiser = xmlSerializer();\n return serialiser.serializeToString(root);\n };\n regions.forEach((region) => {\n const layout = layouts.find((layout: ILayout) => layout.panelId === region.panelId);\n if (!layout) {\n throw new LayoutNotFoundError(region);\n }\n const newElement = {\n id: generate(),\n src: assetSource,\n asset_key: assetSource,\n svg: sanitizeSvg(fetchedSrc),\n colors: {},\n type: assetType,\n y: region.top,\n x: region.left,\n width: region.width,\n height: region.height,\n layer: region.layer,\n layerIndex: region.layerIndex,\n scaleX: 1,\n scaleY: 1,\n rotation: region.rotation,\n productOverlay: silentStep.type === StepType.ProductOverlay ? true : undefined,\n excludeFromExport: silentStep.data.excludeFromPrint,\n };\n commands.push(new CreateElementCommand<IllustrationElement>(newElement, layout));\n });\n }\n return commands;\n};\n\nconst handleTextStep = async (\n layouts: ILayout[],\n stepSelections: StepSelections,\n step: DesignInputStep,\n textStep: Step<TextStepData>,\n): Promise<CreateElementCommand<TextboxElement>[]> => {\n const commands: CreateElementCommand<TextboxElement>[] = [];\n\n const designInputStepData = step.data as TextDesignInputStepData;\n\n const defaultFontSize = 30;\n const textAlign = (stepData: TextStepData) => {\n if (stepData.vertical) {\n return \"center\";\n }\n return stepData.textAlign || \"center\";\n };\n\n const getFontUrl = (): string | undefined => {\n const option = textStep.option;\n if (!option) {\n return undefined;\n }\n const variant =\n option.variants?.find((variant: VariantResource) => variant.id === designInputStepData.fontVariantId) ||\n getDefaultVariant(option);\n if (!variant) {\n return undefined;\n }\n if (!variant.asset) {\n return undefined;\n }\n stepSelections[textStep.stepName] = { selectedVariants: [variant] };\n const link = variant.asset.fileLink;\n if (!link) {\n return undefined;\n }\n return link;\n };\n\n const getFontData = async () => {\n const fontUrl = getFontUrl();\n if (!fontUrl) {\n return undefined;\n }\n const font = await loadFont(fontUrl);\n const fontData: FontData = {\n assetUrl: fontUrl,\n name: font.names.fullName[\"en\"],\n };\n return fontData;\n };\n const fontData = await getFontData();\n\n const replacedText =\n (textStep.data.replaceableText\n ? textStep.data.replaceableText.replace(\"{{}}\", designInputStepData.text)\n : designInputStepData.text) || \"\";\n\n const text = applyTextTransformations(replacedText, {\n vertical: textStep.data.vertical,\n uppercase: textStep.data.uppercase,\n });\n\n const getDefaultColor = async (step: TextStepData): Promise<string | undefined> => {\n const colorOption = step.colorOption;\n if (!colorOption) return undefined;\n const defaultVariant = optionService.getDefaultVariant(colorOption);\n return defaultVariant?.color;\n };\n const defaultColor = designInputStepData.color || (await getDefaultColor(textStep.data));\n\n const regions = textStep.data.regions;\n for (const region of regions) {\n const layout = layouts.find((layout) => layout.panelId === region.panelId);\n if (!layout) {\n continue;\n }\n const newBaseElement: TextboxElement = {\n stepName: step.name,\n id: generate(),\n align: textAlign(textStep.data),\n curved: textStep.data.curved,\n fill: designInputStepData.color || defaultColor || \"#000000\",\n fontData,\n fontSize: textStep.data.size || defaultFontSize,\n height: region.height,\n layer: region.layer,\n layerIndex: region.layerIndex,\n paths: textStep.data.paths,\n rotation: region.rotation,\n text,\n type: LayoutElementType.Textbox,\n vertical: textStep.data.vertical,\n verticalAlign: textStep.data.verticalAlign || \"middle\",\n width: region.width,\n x: region.left,\n y: region.top,\n };\n if (fontData) {\n const [correctFontSize, correctLines] = determineCorrectFontSizeAndLines(\n textStep.data.size || defaultFontSize,\n fontData,\n region,\n [\n applyTextTransformations(text, {\n vertical: textStep.data.vertical,\n uppercase: textStep.data.uppercase,\n }),\n ],\n {\n size: textStep.data.size,\n minSize: textStep.data.minSize,\n maxSize: textStep.data.maxSize,\n },\n );\n commands.push(\n new CreateElementCommand(\n {\n ...newBaseElement,\n fontSize: correctFontSize,\n text: newBaseElement.curved ? newBaseElement.text : (correctLines || []).join(\"\\n\"),\n },\n layout,\n ),\n );\n } else {\n commands.push(new CreateElementCommand(newBaseElement, layout));\n }\n }\n return commands;\n};\n\n// Whether all of a step's conditions have been met.\nconst stepConditionsAreSatisfied = (step: Step<AnyStepData>, stepSelections: StepSelections): boolean => {\n if (!step.conditions) {\n return true;\n }\n return step.conditions.every((condition) => {\n const originatingStepData = stepSelections[condition.targetStepName];\n if (originatingStepData && originatingStepData.selectedVariants) {\n const selectedVariants = originatingStepData.selectedVariants;\n return condition.requiredVariantSelections.some(\n (reqVariant) => selectedVariants.find((selVariant) => selVariant.id === reqVariant) !== undefined,\n );\n }\n return false;\n });\n};\n\n// Generate a set of commands corresponding to one workflow.\nconst generateCommands = async (\n designInputSteps: DesignInputStep[],\n workflow: Workflow,\n layouts: ILayout[],\n productOverlayImageUrl?: string,\n): Promise<CanvasCommand[]> => {\n const commands: CanvasCommand[] = [];\n const stepSelections = {};\n\n // Apply steps.\n for (const step of designInputSteps) {\n const workflowStep = workflow.steps.find((s) => s.stepName === step.name);\n if (!workflowStep) {\n continue;\n }\n switch (workflowStep.type) {\n case StepType.DigitalContent:\n commands.push(\n ...(await handleDigitalContentStep(layouts, step, workflowStep as Step<DigitalContentStepData>)),\n );\n break;\n case StepType.Frame:\n case StepType.Photo:\n commands.push(\n ...(await handleFrameStep(layouts, stepSelections, step, workflowStep as Step<FrameStepData>)),\n );\n break;\n case StepType.Illustration:\n commands.push(\n ...(await handleIllustrationStep(\n layouts,\n stepSelections,\n step,\n workflowStep as Step<IllustrationStepData>,\n )),\n );\n break;\n case StepType.Module:\n commands.push(...(await handleModuleStep(layouts, step, workflowStep as Step<ModuleStepData>)));\n break;\n case StepType.Picture:\n commands.push(\n ...(await handlePictureStep(layouts, stepSelections, step, workflowStep as Step<PictureStepData>)),\n );\n break;\n case StepType.Shape:\n commands.push(\n ...(await handleShapeStep(layouts, stepSelections, step, workflowStep as Step<ShapeStepData>)),\n );\n break;\n case StepType.Text:\n commands.push(\n ...(await handleTextStep(layouts, stepSelections, step, workflowStep as Step<TextStepData>)),\n );\n break;\n }\n }\n\n // Handle silent steps.\n for (const workflowStep of workflow.steps) {\n if (workflowStep.type !== StepType.SilentIllustration && workflowStep.type !== StepType.ProductOverlay) {\n continue;\n }\n if (!stepConditionsAreSatisfied(workflowStep, stepSelections)) {\n continue;\n }\n commands.push(\n ...(await handleSilentStep(layouts, workflowStep as Step<SilentStepData>, productOverlayImageUrl)),\n );\n }\n\n return commands;\n};\n\nexport { generateCommands };\n","import cloneDeep from \"lodash.clonedeep\";\nimport { PromiseQueue, QueueablePromise } from \"../../util/PromiseQueue\";\nimport { Pith } from \"pith\";\nimport { generateCommands } from \"../../generation\";\nimport { DesignInputStep } from \"../../generation/types\";\nimport type { RenderableContext, RenderableContextService } from \"@spiffcommerce/preview\";\nimport { ILayout, LayoutRenderingPurpose, LayoutsState, StepType, Workflow } from \"../../types\";\nimport { createCanvas, getDomParser, loadImage } from \"../../customCanvas\";\nimport { getSvgElement, LayoutData } from \"../../CommandContext\";\nimport { renderPapyrusComponentAsString } from \"../../util/crossplatform\";\nimport { CreateLayoutCommand, GroupCommand } from \"../../command\";\n\nexport class LayoutPreviewService implements RenderableContextService {\n private readonly layouts: ReadonlyMap<string, LayoutPreviewBridge>;\n private handleCompleteRender: null | ((layouts: LayoutPreviewBridge[]) => void);\n\n constructor(layouts: ILayout[]) {\n this.handleCompleteRender = null;\n const map: Map<string, LayoutPreviewBridge> = new Map();\n layouts.forEach((layout) =>\n map.set(\n layout.id,\n new LayoutPreviewBridge(layout.id, layout.name, this, { width: layout.width, height: layout.height }),\n ),\n );\n this.layouts = map as ReadonlyMap<string, LayoutPreviewBridge>;\n }\n\n setCompleteRenderCallback(handleCompleteRender: (layouts: LayoutPreviewBridge[]) => void) {\n this.handleCompleteRender = handleCompleteRender;\n handleCompleteRender(Array.from(this.layouts.values()));\n }\n\n onCompleteRender() {\n this.handleCompleteRender && this.handleCompleteRender(Array.from(this.layouts.values()));\n }\n\n getAll(): ReadonlyMap<string, LayoutPreviewBridge> {\n return this.layouts;\n }\n}\n\n/**\n * Determines wether power of two textures are supported based on\n * the availability of WebGL 2 on the target platform.\n *\n * Check WebGL2 support. Older Safari does not support WebGL2 and behaves badly when non POT textures are used.\n * If we fail to resolve a WebGL2 context we disable non power of two rendering.\n *\n * NOTE: DO NOT remove this without first testing behaviour against Safari on macOS Big Sur & mobile!!!\n */\nconst calculateNonPOTSupport = (): Promise<boolean> => {\n return new Promise((resolve, _reject) => {\n try {\n const glEl = createCanvas();\n const gl = glEl.getContext(\"webgl2\");\n resolve(!!gl);\n } catch (e) {\n resolve(false);\n }\n });\n};\nexport const nonPotTexSupport: Promise<boolean> = calculateNonPOTSupport();\n\n/**\n * The panel canvas class that stores both the main rendering canvas as well as rendering context\n * for a rendering context\n */\nexport class LayoutPreviewBridge implements RenderableContext {\n hasSetStaticContext: boolean = false;\n\n private readonly id: string;\n private readonly name: string;\n private readonly panelSize: { width: number; height: number };\n\n private service: LayoutPreviewService;\n\n private interactiveDirty: boolean = false;\n\n // Texture context & associated dirty flag.\n private textureCtx?: CanvasRenderingContext2D;\n private staticCtxDirty: boolean = false;\n private lastRequestedRenderArguments: LayoutData[] | undefined = undefined;\n\n // Stores a timestamp for the last static render.\n private lastCompletedStaticRender: number | undefined = undefined;\n\n // A render queue for this layout.\n // No more than 2 renders can be queued at any time.\n // Beyond this, renders will be discarded before they can execute\n private renderQueue: PromiseQueue<RenderQueuePromise> = new PromiseQueue(2);\n\n constructor(id: string, name: string, service: LayoutPreviewService, panelSize: { width: number; height: number }) {\n this.id = id;\n this.name = name;\n this.service = service;\n this.panelSize = panelSize;\n }\n\n getID(): string {\n return this.id;\n }\n\n getName(): string {\n return this.name;\n }\n\n getPanelSize(): { width: number; height: number } {\n return this.panelSize;\n }\n\n getStaticContext(): CanvasRenderingContext2D | undefined {\n return this.textureCtx;\n }\n\n /**\n * Register canvas to be rendered to.\n */\n setStaticContext(ctx: CanvasRenderingContext2D) {\n this.textureCtx = ctx;\n if (this.lastRequestedRenderArguments) {\n this.render(this.lastRequestedRenderArguments);\n }\n }\n\n getStaticContextDirty(): boolean {\n return this.staticCtxDirty;\n }\n\n setStaticContextDirty(dirty: boolean): void {\n this.staticCtxDirty = dirty;\n }\n\n getInteractiveCanvasDirty() {\n return this.interactiveDirty;\n }\n\n setInteractiveCanvasDirty(dirty: boolean) {\n this.interactiveDirty = dirty;\n }\n\n markLastCompletedStaticRender() {\n this.lastCompletedStaticRender = Date.now();\n this.service.onCompleteRender();\n }\n\n /**\n * Returns a timestamp for the last time that this canvas rendered to its dynamic texture in the\n * form of Date.now(). If this panel has never rendered undefined will be returned.\n */\n getLastCompletedStaticRender() {\n return this.lastCompletedStaticRender;\n }\n\n /**\n * Actions to perform when a static render event is fired for this canvas.\n */\n async render(layouts: LayoutData[]) {\n const clonedLayouts = cloneDeep(layouts);\n\n // We store the parameters for this render so that we can re-render\n // if the static context is set later.\n this.lastRequestedRenderArguments = clonedLayouts;\n\n // Pull the static context and handle the case where it isn't available yet.\n const staticContext = this.getStaticContext();\n if (!staticContext) {\n this.markLastCompletedStaticRender();\n this.setStaticContextDirty(false);\n return;\n }\n\n // Queue the render.\n this.renderQueue.enqueue(\n new RenderQueuePromise(\n this.getID(),\n staticContext,\n await nonPotTexSupport,\n () => {\n this.markLastCompletedStaticRender();\n this.setStaticContextDirty(true);\n },\n clonedLayouts,\n ),\n );\n }\n}\n\n/**\n * Encapsulates the behavior required to render a layout to a canvas. The promise can\n * be generated at any point in time allowing for queue systems to process the render\n * once at a time and enforce ordering rules.\n */\nclass RenderQueuePromise extends QueueablePromise {\n private readonly layoutId: string;\n private readonly ctx: CanvasRenderingContext2D;\n private readonly nonPOTSupport: boolean;\n private readonly onRender: () => void;\n private readonly layouts: LayoutData[]; // TODO: Do we need to pass this whole array in?\n\n constructor(\n layoutId: string,\n ctx: CanvasRenderingContext2D,\n nonPOTSupport: boolean,\n onRender: () => void,\n layouts: LayoutData[],\n ) {\n super();\n this.layoutId = layoutId;\n this.ctx = ctx;\n this.nonPOTSupport = nonPOTSupport;\n this.onRender = onRender;\n this.layouts = layouts;\n }\n\n /**\n * Returns the resolution expected for generated textures.\n * FIXME: This is reimplemented from the preview package. Can we find a way to remove this duplication.\n */\n private getDynamicTextureResolution() {\n return this.getIsMobile() || !this.offscreenRenderingSupported()\n ? {\n width: 1024,\n height: 1024,\n }\n : {\n width: 2048,\n height: 2048,\n };\n }\n\n private getIsMobile() {\n return window.innerWidth <= 480;\n }\n\n /**\n * Returns true when multithreaded rendering is supported.\n */\n private offscreenRenderingSupported(): boolean {\n // Samsung browser has broken web worker custom fonts from v14. To be\n // safe, if we detect this browser we immediately disable offscreen canvas. There\n // may be a more specific feature we can detect to be more clean about this moving forwards.\n if (navigator.userAgent.includes(\"SamsungBrowser\")) {\n return false;\n }\n // Otherwise we check for relevant required functionality\n return !!window.Worker && !!(window as any).OffscreenCanvas;\n }\n\n private resizeFit(\n originalSize: { width: number; height: number },\n maxSize = 4096,\n ): { width: number; height: number } {\n const widthRatio = maxSize / originalSize.width;\n const heightRatio = maxSize / originalSize.height;\n const minAspectRatio = Math.min(widthRatio, heightRatio);\n if (minAspectRatio > 1) {\n return originalSize;\n }\n\n return { width: originalSize.width * minAspectRatio, height: originalSize.height * minAspectRatio };\n }\n\n /**\n * Render the internally stored layout to the canvas.\n * NOTE: This function is performance critical code. Please throughly test any changes to\n * ensure performance isn't lost and that rendering behavior is preserved when modifying this logic.\n * The aim is to have this code rendering in less than 16.66ms (60fps) on modern hardware. This is\n * a loose target but should be kept in mind when making changes.\n */\n public async execute() {\n // Ensure layout is available. Cancel out of render otherwise.\n const layout = this.layouts.find((layout) => layout.layoutState.layout.id === this.layoutId);\n if (!layout) {\n return;\n }\n const elements = layout.layoutState.elements || [];\n\n const layoutWidth = layout.layoutState.layout.width;\n const layoutHeight = layout.layoutState.layout.height;\n\n const renderDims =\n layoutWidth === 1 || layoutHeight === 1 ? { width: 1, height: 1 } : this.getDynamicTextureResolution();\n\n // We need to ensure that we compute the correct width and height for the final texture\n // based on whether or not we know the platform we're running on support non power of two\n const targetWidth = renderDims.width;\n const targetHeight = renderDims.height;\n let width: number;\n let height: number;\n\n if (this.nonPOTSupport) {\n const targetRatio = targetWidth / targetHeight;\n const ratio = layoutWidth / layoutHeight;\n if (ratio < targetRatio) {\n width = targetWidth;\n height = layoutHeight * (targetWidth / layoutWidth);\n } else {\n width = layoutWidth * (targetHeight / layoutHeight);\n height = targetHeight;\n }\n\n const boundedSize = this.resizeFit({ width, height });\n width = boundedSize.width;\n height = boundedSize.height;\n } else {\n width = renderDims.width;\n height = renderDims.height;\n }\n\n // Do the render with the SVG we have now generated\n const svgElement = getSvgElement(layout.layoutState.layout, elements, {\n renderingConfiguration: { purpose: LayoutRenderingPurpose.ThreeD },\n });\n const svgStr = renderPapyrusComponentAsString(svgElement);\n const cvg = await Pith.from(this.ctx, svgStr, {\n anonymousCrossOrigin: true,\n ignoreDimensions: !this.nonPOTSupport,\n ignoreAnimation: true,\n ignoreClear: true,\n ignoreMouse: true,\n enableRedraw: false,\n createCanvas: createCanvas as any,\n createImage: loadImage as any,\n DOMParser: getDomParser(),\n fetch: fetch,\n });\n cvg.resize(width, height);\n await cvg.render();\n // Callback to notify the render has completed.\n this.onRender();\n }\n}\n\ninterface StepAspectValue {\n stepName: string;\n stepAspectType: string;\n value?: string;\n}\nexport const stepAspectValuesToDesignInputSteps = (\n stepAspectValues: StepAspectValue[],\n workflow: Workflow,\n): DesignInputStep[] => {\n const designInputSteps: DesignInputStep[] = [];\n stepAspectValues.forEach((stepAspectValue) => {\n const step = workflow.steps.find((step) => step.stepName === stepAspectValue.stepName);\n if (step?.type === StepType.Text && stepAspectValue.stepAspectType === \"Text\") {\n designInputSteps.push({\n name: step.stepName,\n data: {\n text: stepAspectValue.value,\n },\n });\n }\n });\n return designInputSteps;\n};\n\nexport const generateStateFromDesignInputSteps = async (\n designInputSteps: DesignInputStep[],\n workflow: Workflow,\n layouts: ILayout[],\n productOverlayImageUrl?: string,\n): Promise<LayoutsState> => {\n let state: LayoutsState = {\n serializableWorkflow: { steps: [] },\n layouts: {},\n };\n // Build base layouts.\n const layoutGroup = new GroupCommand(layouts.map((layout) => new CreateLayoutCommand(layout)));\n state = layoutGroup.apply(state);\n // Build base commands\n const commands = await generateCommands(designInputSteps, workflow, layouts, productOverlayImageUrl);\n const commandGroup = new GroupCommand(commands);\n return commandGroup.apply(state);\n};\n","import { Bundle } from \"../Bundle\";\nimport { Variant } from \"../stepHandles/resource/variant\";\nimport { FrameStepHandle } from \"../stepHandles/steps/frame\";\nimport { assetService } from \"../services/asset\";\nimport { optionService, ShapeStepHandle, TextStepHandle, WorkflowExperience } from \"..\";\nimport {\n AddonHandle,\n AspectType,\n Asset,\n GlobalPropertyConfigurationAspect,\n GlobalPropertyState,\n GlobalPropertyStateColorOptionStorage,\n GlobalPropertyStateFileUploadStorage,\n OptionResource,\n StepType,\n} from \"../types\";\n\n/**\n * TODO: Optimize workflow experience state updates.\n */\n\nexport class GlobalPropertyHandleService {\n private readonly bundle: Bundle;\n private handleCache: { [key: string]: GlobalPropertyHandle } = {};\n\n constructor(bundle: Bundle) {\n this.bundle = bundle;\n }\n\n /**\n * Gets a handle for the given global property. Fetches from cache if available.\n * @param property The property to get a handle for.\n * @returns A promise resolving to the handle.\n */\n async getHandle(property: GlobalPropertyConfigurationAspect): Promise<GlobalPropertyHandle> {\n if (this.handleCache[property.name]) return this.handleCache[property.name];\n const handle = await this.createHandle(property);\n this.handleCache[property.name] = handle;\n return handle;\n }\n\n /**\n * Gets a list of handles for all global properties. Fetches from cache if available.\n * @returns A promise resolving to the handles.\n */\n async getHandles(): Promise<GlobalPropertyHandle[]> {\n if (!this.bundle.getProductCollection()?.getResource().globalPropertyConfiguration) return [];\n const configuration = this.bundle.getProductCollection()!.getResource().globalPropertyConfiguration!;\n return Promise.all(configuration.aspects.map((p) => this.getHandle(p)));\n }\n\n /**\n * Applies the global state to all handles, if the state is set.\n * @param handles The handles to apply the state to.\n * @param state\n * @returns\n */\n applyConditionsFromState(\n handles: GlobalPropertyHandle[],\n state: GlobalPropertyState | undefined,\n ): GlobalPropertyHandle[] {\n if (!state) return handles;\n return handles.filter((h) => {\n return this.aspectConditionsSatisfied(h.getRawProperty(), state);\n });\n }\n\n private aspectConditionsSatisfied(aspect: GlobalPropertyConfigurationAspect, state: GlobalPropertyState): boolean {\n if (!aspect.conditions || aspect.conditions.length === 0) return true;\n return aspect.conditions.some((c) => {\n const targetAspect = state.aspects.find((a) => a.name === c.targetAspectName);\n if (!targetAspect) return false;\n return c.requiredVariantSelections.some((v) => v === targetAspect.value);\n });\n }\n\n private async createHandle(property: GlobalPropertyConfigurationAspect): Promise<GlobalPropertyHandle> {\n switch (property.type) {\n case AspectType.FileUpload:\n return new FileUploadGlobalPropertyHandle(this.bundle, property);\n case AspectType.ColorOption:\n return new ColorOptionGlobalPropertyHandle(\n this.bundle,\n property,\n property.entityId ? await optionService.getOption(property.entityId!) : undefined,\n );\n case AspectType.Option: {\n const option = property.entityId ? await optionService.getOption(property.entityId!) : undefined;\n if (option?.type === \"Color\") {\n return new ColorOptionGlobalPropertyHandle(this.bundle, property, option);\n } else {\n return new OptionGlobalPropertyHandle(this.bundle, property, option);\n }\n }\n case AspectType.Text:\n return new TextGlobalPropertyHandle(this.bundle, property);\n default:\n throw new Error(\"Unhandled Global Property Aspect Type\");\n }\n }\n}\n\n/**\n * A GlobalPropertyHandle acts as an interface to global properties on our platform. Currently\n * bundles can return a handle for any global properties associated to the collection.\n */\nexport abstract class GlobalPropertyHandle {\n protected readonly bundle: Bundle;\n protected readonly property: GlobalPropertyConfigurationAspect;\n\n constructor(bundle: Bundle, property: GlobalPropertyConfigurationAspect) {\n this.bundle = bundle;\n this.property = property;\n }\n\n /**\n * @returns The name of the global property. This is the key used to store the property in the state.\n */\n getName() {\n return this.property.name;\n }\n\n /**\n * @returns A human friendly title.\n */\n getTitle() {\n return this.property.title;\n }\n\n /**\n * @returns A human friendly description.\n */\n getDescription() {\n return this.property.description;\n }\n\n /**\n * @returns The type of the global property. Use this to determine how to render the property.\n */\n getType(): AspectType {\n return this.property.type;\n }\n\n /**\n * @returns The underlying property data object.\n */\n getRawProperty(): GlobalPropertyConfigurationAspect {\n return this.property;\n }\n\n /**\n * Applies the global state to all shared steps, if the state is set.\n * @param targetExperiences Optionally filter the workflow experiences it should be applied to.\n */\n abstract applyGlobalState(targetExperiences?: WorkflowExperience[]): Promise<void>;\n\n /**\n * Returns all steps that share this property.\n * @param targetExperiences Optionally filter the steps to only those in the given experiences.\n */\n protected getSharedSteps(targetExperiences?: WorkflowExperience[]) {\n const experiences = targetExperiences ?? this.bundle.getWorkflowExperiences();\n const sharedSteps = experiences.flatMap((e) =>\n e.getStepsConditionallyActive().filter((s) => {\n if (s.getOverrideGlobalPropertyConfiguration(this.property.type)) {\n return false;\n }\n return s\n .getRaw()\n .globalPropertyAspectConfigurations?.some(\n (c) =>\n c.globalPropertyConfigurationId ===\n this.bundle.getProductCollection()?.getResource().globalPropertyConfiguration?.id &&\n c.aspectName === this.property.name,\n );\n }),\n );\n return sharedSteps;\n }\n\n protected getStateValue(): string | undefined {\n return this.bundle.getGlobalPropertyStateManager().getAspect(this.property.name);\n }\n}\n\n/**\n * A file upload global property allows for setting a frame image against all shared steps.\n */\nexport class FileUploadGlobalPropertyHandle extends GlobalPropertyHandle {\n constructor(bundle: Bundle, property: GlobalPropertyConfigurationAspect) {\n super(bundle, property);\n }\n\n /**\n * Select an image to be used for all shared steps.\n * @param asset The asset to use.\n * @returns A promise resolving when all affected steps have been updated.\n */\n async selectImage(asset: Asset) {\n const stateManager = this.bundle.getGlobalPropertyStateManager();\n await Promise.all([\n stateManager.setAspect(this.property.name, asset.key!, {\n ...(stateManager.getAspectStorage(this.property.name) || {}),\n originalAssetKey: asset.key,\n backgroundRemovedAssetKey: undefined,\n useOriginalAsset: undefined,\n }),\n this.applyImageSelection(asset),\n ]);\n }\n\n async canUseBackgroundRemover(): Promise<boolean> {\n return this.bundle.getClient().canUseAddon(AddonHandle.BackgroundRemover);\n }\n\n /**\n * Removes the background from an image, stores it in the state, and returns the new asset.\n * @param applyNewAsset Optionally applies the new asset to all shared steps. Default: `true`.\n * @returns A promise that resolves with the newly generated Asset.\n */\n async removeBackgroundFromImage(applyNewAsset = true): Promise<Asset> {\n if (!(await this.canUseBackgroundRemover())) {\n throw new Error(\n \"The current Integration does not have access to the Background Remover. Please call canUseBackgroundRemover to ensure you disable this feature when appropriate.\",\n );\n }\n const image = await this.getOriginalImage();\n if (!image) {\n throw new Error(\"You must supply an image selection before attempting to remove the background.\");\n }\n const stateManager = this.bundle.getGlobalPropertyStateManager();\n const bgRemoved = await assetService.removeBackgroundFromAsset(image);\n const existingStorage = stateManager.getAspectStorage(this.property.name);\n const updatedStorage: GlobalPropertyStateFileUploadStorage = {\n ...existingStorage,\n backgroundRemovedAssetKey: bgRemoved.key,\n useOriginalAsset: !applyNewAsset,\n };\n const updatePromise = applyNewAsset\n ? stateManager.setAspect(this.property.name, bgRemoved.key!, updatedStorage)\n : stateManager.setAspectStorage(this.property.name, updatedStorage);\n const promises = [updatePromise];\n if (applyNewAsset) {\n promises.push(this.applyImageSelection(bgRemoved, undefined, false, false));\n }\n await Promise.all(promises);\n this.updateSharedStepStorage(updatedStorage);\n return bgRemoved;\n }\n\n /**\n * Returns `true` if the state has an image assigned, otherwise `false`.\n */\n hasImage(): boolean {\n return !!this.getStateValue();\n }\n\n /**\n * Retrieves the current image selection, if one exists.\n * @returns A promise that resolves with an `Asset` object if one is assigned to the state, otherwise `undefined`.\n */\n async getImage(): Promise<Asset | undefined> {\n const stateValue = this.getStateValue();\n if (!stateValue) {\n return undefined;\n }\n return assetService.getLocalOrFromServer(stateValue);\n }\n\n /**\n * Retrieves the original, unmodified image selection, if one exists.\n * @returns A promise that resolves with an `Asset` object if one is assigned to the state, otherwise `undefined`.\n */\n async getOriginalImage(): Promise<Asset | undefined> {\n const storage = this.bundle\n .getGlobalPropertyStateManager()\n .getAspectStorage<GlobalPropertyStateFileUploadStorage>(this.property.name);\n if (!storage?.originalAssetKey) {\n return undefined;\n }\n return assetService.getLocalOrFromServer(storage.originalAssetKey);\n }\n\n /**\n * Retrieves the version of the image selection that has the background removed, if one exists.\n * @returns A promise that resolves with an `Asset` object if one is assigned to the state, otherwise `undefined`.\n */\n async getBackgroundRemovedImage(): Promise<Asset | undefined> {\n const storage = this.bundle\n .getGlobalPropertyStateManager()\n .getAspectStorage<GlobalPropertyStateFileUploadStorage>(this.property.name);\n if (!storage?.backgroundRemovedAssetKey) {\n return undefined;\n }\n return assetService.getLocalOrFromServer(storage.backgroundRemovedAssetKey);\n }\n\n getUseOriginalImage(): boolean {\n return (\n this.bundle\n .getGlobalPropertyStateManager()\n .getAspectStorage<GlobalPropertyStateFileUploadStorage>(this.property.name)?.useOriginalAsset ?? false\n );\n }\n\n async setUseOriginalImage(value: boolean): Promise<void> {\n const originalImage = await this.getOriginalImage();\n if (!originalImage) {\n throw new Error(\"You must select an image before calling setUseOriginalImage\");\n }\n const stateManager = this.bundle.getGlobalPropertyStateManager();\n const existingStorage = stateManager.getAspectStorage<GlobalPropertyStateFileUploadStorage>(this.property.name);\n if (existingStorage?.useOriginalAsset === value) {\n return;\n }\n const updatedStorage = {\n ...existingStorage,\n useOriginalAsset: value,\n };\n const targetKey = value ? existingStorage?.originalAssetKey : existingStorage?.backgroundRemovedAssetKey;\n const promises = [stateManager.setAspect(this.property.name, targetKey || \"\", updatedStorage)];\n if (value) {\n promises.push(this.applyImageSelection(originalImage, undefined, false, false));\n } else {\n const updateUsingBg = async () => {\n const bgRemovedImage = await this.getBackgroundRemovedImage();\n if (!bgRemovedImage) {\n throw new Error(\n \"You must call removeBackgroundFromImage before attempting to use that version of the image.\",\n );\n }\n this.applyImageSelection(bgRemovedImage, undefined, false, false);\n };\n promises.push(updateUsingBg());\n }\n this.updateSharedStepStorage(updatedStorage);\n }\n\n async applyGlobalState(targetExperiences?: WorkflowExperience[]) {\n const aspect = this.getStateValue();\n if (!aspect) return;\n const asset = await assetService.getLocalOrFromServer(aspect);\n if (!asset) return;\n const storage = this.bundle\n .getGlobalPropertyStateManager()\n .getAspectStorage<GlobalPropertyStateFileUploadStorage>(this.property.name);\n await this.applyImageSelection(asset, targetExperiences, false, true);\n if (storage) {\n this.updateSharedStepStorage({ ...storage });\n } else {\n this.updateSharedStepStorage({ originalAssetKey: aspect });\n await this.bundle\n .getGlobalPropertyStateManager()\n .setAspectStorage(this.property.name, { originalAssetKey: aspect });\n }\n }\n\n private async applyImageSelection(\n asset: Asset,\n targetExperiences?: WorkflowExperience[],\n useAsOriginalImage = true,\n updateFrameOffsets = true,\n ) {\n const sharedSteps = this.getSharedSteps(targetExperiences);\n const experiencesUpdates = sharedSteps.map((step) => {\n const frameStep = step as FrameStepHandle;\n if (!frameStep.getFrameService()) return;\n return frameStep.selectImage(asset, useAsOriginalImage, updateFrameOffsets);\n });\n await Promise.all(experiencesUpdates);\n }\n\n private updateSharedStepStorage(storage: GlobalPropertyStateFileUploadStorage) {\n const experiences = this.bundle.getWorkflowExperiences();\n experiences.forEach((e) =>\n e.getSteps().forEach((s) => {\n if (s.getOverrideGlobalPropertyConfiguration(this.property.type)) {\n return;\n }\n const shouldUpdateStep = s\n .getRaw()\n .globalPropertyAspectConfigurations?.some(\n (c) =>\n c.globalPropertyConfigurationId ===\n this.bundle.getProductCollection()?.getResource().globalPropertyConfiguration?.id &&\n c.aspectName === this.property.name,\n );\n if (shouldUpdateStep) {\n e.getWorkflowManager().updateStorage(s.getId(), { framePatternData: storage });\n }\n }),\n );\n }\n}\n\nexport class TextGlobalPropertyHandle extends GlobalPropertyHandle {\n constructor(bundle: Bundle, property: GlobalPropertyConfigurationAspect) {\n super(bundle, property);\n }\n\n /**\n * Gets the current text\n */\n getText(): string {\n const aspectValue = this.getStateValue();\n if (!aspectValue) return \"\";\n return aspectValue;\n }\n\n /**\n * Set the text.\n */\n async setText(text: string) {\n await Promise.all([\n this.bundle.getGlobalPropertyStateManager().setAspect(this.property.name, text),\n this.applyTextSelection(text),\n ]);\n }\n\n async applyGlobalState(targetExperiences?: WorkflowExperience[]) {\n const value = this.getStateValue();\n if (!value) return Promise.resolve();\n await this.applyTextSelection(value, targetExperiences);\n }\n\n private async applyTextSelection(text: string, targetExperiences?: WorkflowExperience[]) {\n const sharedSteps = this.getSharedSteps(targetExperiences);\n const experiencesUpdates = sharedSteps.map((step) => {\n const textStep = step as TextStepHandle;\n textStep.setText(text);\n });\n await Promise.all(experiencesUpdates);\n }\n}\n\n/**\n * An option property handle represents a property that can\n * affect the option of steps across multiple transactions.\n */\nexport class OptionGlobalPropertyHandle extends GlobalPropertyHandle {\n protected optionResource?: OptionResource;\n\n constructor(\n bundle: Bundle,\n property: GlobalPropertyConfigurationAspect,\n optionResource: OptionResource | undefined,\n ) {\n super(bundle, property);\n this.optionResource = optionResource;\n }\n\n /**\n * Gets the currently selected variant, or undefined if no variant is selected.\n */\n getCurrentVariant() {\n if (!this.optionResource) return undefined;\n const aspectValue = this.getStateValue();\n if (!aspectValue) {\n const defaultVariant = this.optionResource.variants?.find(\n (v) => v.id === this.optionResource?.defaultVariant?.id,\n );\n if (!defaultVariant) return undefined;\n return new Variant(defaultVariant);\n } else {\n const variantResource = this.optionResource.variants?.find((v) => v.id === aspectValue);\n if (!variantResource) return undefined;\n return new Variant(variantResource);\n }\n }\n\n /**\n * @returns A list of valid variants for this step. Does not include disabled variants.\n */\n getAvailableVariants() {\n const variants = this.optionResource?.variants?.filter((v) => v.enabled) || [];\n return variants.map((v) => new Variant(v));\n }\n\n /**\n * @returns A list of all variants for this step, including disabled ones.\n */\n getAllVariants() {\n const variants = this.optionResource?.variants || [];\n return variants.map((v) => new Variant(v));\n }\n\n /**\n * Select a given variant on the option for all shared steps.\n * @param variant The variant to select.\n */\n async selectVariant(variant: Variant) {\n console.log(`Selecting variant ${variant.getId()}`);\n await Promise.all([\n this.bundle.getGlobalPropertyStateManager().setAspect(this.property.name, variant.getId()),\n this.applyVariantSelection(variant),\n ]);\n }\n\n async applyGlobalState(targetExperiences?: WorkflowExperience[]) {\n const aspect = this.getStateValue();\n if (!aspect) return Promise.resolve();\n const variant = this.optionResource?.variants?.find((v) => v.id === aspect);\n if (!variant) return Promise.resolve();\n console.log(`Applying global state using variant ${variant.id} for aspect ${aspect}`)\n return this.applyVariantSelection(new Variant(variant), targetExperiences);\n }\n\n private async applyVariantSelection(variant: Variant, targetExperiences?: WorkflowExperience[]) {\n const sharedSteps = this.getSharedSteps(targetExperiences);\n const promises = sharedSteps.map((step) => {\n return step.selectVariant(variant);\n });\n await Promise.all(promises);\n }\n}\n\n/**\n * A color option property handle represents a property that can\n * affect the option of steps across multiple transactions. This class is a specialization of the OptionGlobalPropertyHandle which includes functionality for\n * setting custom color values when a custom color variant is selected.\n */\nexport class ColorOptionGlobalPropertyHandle extends OptionGlobalPropertyHandle {\n constructor(\n bundle: Bundle,\n property: GlobalPropertyConfigurationAspect,\n optionResource: OptionResource | undefined,\n ) {\n super(bundle, property, optionResource);\n }\n\n /**\n * Select a given variant on the option for all shared steps.\n * @param variant The variant to select.\n */\n override async selectVariant(variant: Variant) {\n await Promise.all([\n this.bundle.getGlobalPropertyStateManager().setAspect(this.property.name, variant.getId()),\n this.applyColorVariant(variant),\n ]);\n }\n\n override async applyGlobalState(targetExperiences?: WorkflowExperience[]) {\n const aspect = this.getStateValue();\n if (!aspect) return Promise.resolve();\n const variant = this.optionResource?.variants?.find((v) => v.id === aspect);\n if (!variant) return Promise.resolve();\n await this.applyColorVariant(new Variant(variant), targetExperiences);\n const customColor = this.bundle\n .getGlobalPropertyStateManager()\n .getAspectStorage<GlobalPropertyStateColorOptionStorage>(this.property.name)?.customColor;\n if (customColor) this.setCustomColor(customColor);\n }\n\n private async applyColorVariant(variant: Variant, targetExperiences?: WorkflowExperience[]) {\n const sharedSteps = this.getSharedSteps(targetExperiences);\n const promises = sharedSteps.map((step) => {\n switch (step.getType()) {\n case StepType.Shape:\n return step.selectVariant(variant);\n case StepType.Text:\n return (step as TextStepHandle).setFillColor({\n fill: variant.getColor(),\n stroke: variant.getColor(),\n variant: variant.getResource(),\n });\n }\n });\n await Promise.all(promises);\n }\n\n /**\n * Sets a custom color on the global state.\n */\n setCustomColor(color: string) {\n const sharedSteps = this.getSharedSteps() as ShapeStepHandle[];\n sharedSteps.forEach((step) => step.setCustomColor(color));\n this.bundle\n .getGlobalPropertyStateManager()\n .setAspectStorage<GlobalPropertyStateColorOptionStorage>(this.property.name, { customColor: color });\n }\n\n /**\n * Gets the custom color used by the global state.\n */\n getCustomColor(): string {\n return (\n this.bundle\n .getGlobalPropertyStateManager()\n .getAspectStorage<GlobalPropertyStateColorOptionStorage>(this.property.name)?.customColor ||\n this.getCurrentVariant()?.getColor() ||\n \"#ffffff\"\n );\n }\n}\n","import { graphQlManager } from \"../services/server\";\nimport {\n AspectType,\n GlobalPropertyConfiguration,\n GlobalPropertyState,\n GlobalPropertyStateAspectStorage,\n} from \"../types\";\nimport { createGlobalPropertyStateMutation, updateGlobalPropertyStateMutation } from \"./query\";\nimport cloneDeep from \"lodash.clonedeep\";\n\nexport interface GlobalPropertyStateManager {\n getInitializationPromise(): Promise<void>;\n getGlobalPropertyState(): GlobalPropertyState | undefined;\n setGlobalPropertyState(state: GlobalPropertyState): Promise<void>;\n getAspect(name: string): string | undefined;\n getAspectStorage<S extends GlobalPropertyStateAspectStorage>(name: string): S | undefined;\n /**\n * Updates the value of a named aspect in the state.\n * @param name The name (key) of the aspect. This must match the key in the associated Global Property Config\n * @param value The value, represented as a string.\n * @param storage Optional: Additional data storage for the aspect. Not specifying this parameter, or providing `undefined`, will not update the\n * storage (if it already exists). Providing `null` will clear the existing storage.\n */\n setAspect(name: string, value: string, storage?: GlobalPropertyStateAspectStorage | null): Promise<void>;\n setAspectStorage<S extends GlobalPropertyStateAspectStorage>(name: string, storage: S | null): Promise<void>;\n setBundleOptions(bundleOptions?: BundleOptions): void;\n getBundleOptions(): BundleOptions | undefined;\n setConfiguration(configuration: GlobalPropertyConfiguration | undefined): void;\n}\n\nexport interface BundleOptions {\n additionalHeaders?: { [key: string]: string };\n /**\n * If set to true, the products associated with the bundle will be eagerly fetched.\n */\n eagerFetchProducts?: boolean;\n\n bundleOwnerId?: string;\n\n /**\n * When reloading a bundle we may have an existing state to pull with it.\n */\n existingGlobalPropertyState?: GlobalPropertyState;\n}\n\nexport class GlobalPropertyStateManagerImpl implements GlobalPropertyStateManager {\n private readonly bundleId: string;\n private readonly bundleOwnerId?: string;\n private readonly initPromise: Promise<void>;\n private globalPropertyState?: GlobalPropertyState;\n private readonly onGlobalPropertyStateChange: (\n previousState: GlobalPropertyState,\n newState: GlobalPropertyState,\n ) => Promise<void>;\n private bundleOptions?: BundleOptions;\n private configuration?: GlobalPropertyConfiguration;\n\n constructor(\n bundleId: string,\n bundleOwnerId: string | undefined,\n configuration: GlobalPropertyConfiguration | undefined,\n onGlobalPropertyStateChange: (\n previousState: GlobalPropertyState,\n newState: GlobalPropertyState,\n ) => Promise<void>,\n bundleOptions?: BundleOptions,\n ) {\n this.bundleId = bundleId;\n this.bundleOwnerId = bundleOwnerId;\n this.configuration = configuration;\n this.bundleOptions = bundleOptions;\n\n const existingState = bundleOptions?.existingGlobalPropertyState;\n this.initPromise = existingState\n ? Promise.resolve(existingState).then(() => {\n this.globalPropertyState = existingState;\n return undefined;\n })\n : this.createGlobalPropertyState().then((state) => {\n this.globalPropertyState = state;\n return undefined;\n });\n\n this.onGlobalPropertyStateChange = onGlobalPropertyStateChange;\n }\n\n setBundleOptions(bundleOptions?: BundleOptions) {\n this.bundleOptions = bundleOptions;\n }\n\n getBundleOptions() {\n return this.bundleOptions;\n }\n\n setConfiguration(configuration: GlobalPropertyConfiguration) {\n this.configuration = configuration;\n }\n\n getInitializationPromise(): Promise<void> {\n return this.initPromise;\n }\n\n getGlobalPropertyState(): GlobalPropertyState | undefined {\n return this.globalPropertyState;\n }\n\n async setGlobalPropertyState(state: GlobalPropertyState): Promise<void> {\n if (!this.globalPropertyState) {\n await this.initPromise;\n }\n const previousState = cloneDeep(this.globalPropertyState!);\n this.globalPropertyState = { ...state, id: previousState.id };\n await this.updateGlobalPropertyState();\n await this.onGlobalPropertyStateChange(previousState, this.globalPropertyState!);\n }\n\n getAspect(name: string): string | undefined {\n if (!this.globalPropertyState) {\n throw new Error(\"Global property state not initialized\");\n }\n const aspect = this.globalPropertyState.aspects.find((a) => a.name === name);\n if (aspect) {\n return aspect.value;\n }\n return undefined;\n }\n\n getAspectStorage<S extends GlobalPropertyStateAspectStorage>(name: string): S | undefined {\n if (!this.globalPropertyState) {\n throw new Error(\"Global property state not initialized\");\n }\n return this.globalPropertyState.aspects.find((a) => a.name === name)?.storage as S | undefined;\n }\n\n async setAspect(name: string, value: string, storage?: GlobalPropertyStateAspectStorage | null): Promise<void> {\n if (!this.globalPropertyState) {\n throw new Error(\"Global property state not initialized\");\n }\n if (!this.configuration) {\n throw new Error(\"Global property configuration not linked to the state manager.\");\n }\n const configAspect = this.configuration.aspects.find((a) => a.name === name);\n if (!configAspect) {\n throw new Error(`Failed to find configuration aspect with name: ${name}`);\n }\n const previousState = cloneDeep(this.globalPropertyState);\n const aspect = this.globalPropertyState.aspects.find((a) => a.name === name);\n if (aspect) {\n aspect.value = value;\n aspect.type = configAspect.type;\n if (storage !== undefined) {\n aspect.storage = storage !== null ? storage : undefined;\n }\n } else {\n this.globalPropertyState.aspects.push({\n name,\n value,\n type: configAspect.type,\n storage: storage !== null ? storage : undefined,\n });\n }\n await this.updateGlobalPropertyState();\n await this.onGlobalPropertyStateChange(previousState, this.globalPropertyState);\n }\n\n async setAspectStorage(name: string, storage: GlobalPropertyStateAspectStorage | null): Promise<void> {\n if (!this.globalPropertyState) {\n throw new Error(\"Global property state not initialized\");\n }\n if (!this.configuration) {\n throw new Error(\"Global property configuration not linked to the state manager.\");\n }\n const configAspect = this.configuration.aspects.find((a) => a.name === name);\n if (!configAspect) {\n throw new Error(`Failed to find configuration aspect with name: ${name}`);\n }\n const previousState = cloneDeep(this.globalPropertyState);\n const aspect = this.globalPropertyState.aspects.find((a) => a.name === name);\n if (aspect) {\n aspect.storage = storage !== null ? storage : undefined;\n aspect.type = configAspect.type;\n } else {\n this.globalPropertyState.aspects.push({\n name,\n value: \"\",\n type: configAspect.type,\n storage: storage !== null ? storage : undefined,\n });\n }\n await this.updateGlobalPropertyState();\n await this.onGlobalPropertyStateChange(previousState, this.globalPropertyState);\n }\n\n private async updateGlobalPropertyState(): Promise<void> {\n if (!this.globalPropertyState) {\n throw new Error(\"Global property state not initialized\");\n }\n const response = await graphQlManager\n .getShadowGraphqlClient()\n .mutate<{ globalPropertyStateUpdate: GlobalPropertyState }>({\n mutation: updateGlobalPropertyStateMutation,\n variables: {\n id: this.globalPropertyState.id,\n aspects: this.globalPropertyState.aspects.map((aspect) => {\n let storageInput = !!aspect.type && !!aspect.storage ? {} : undefined;\n if (storageInput) {\n switch (aspect.type) {\n case AspectType.FileUpload: {\n storageInput[\"fileUpload\"] = aspect.storage;\n break;\n }\n case AspectType.Option: {\n storageInput[\"option\"] = aspect.storage;\n break;\n }\n case AspectType.ColorOption: {\n storageInput = aspect.storage;\n break;\n }\n }\n }\n return {\n name: aspect.name,\n value: aspect.value,\n type: aspect.type,\n storage: storageInput,\n };\n }),\n },\n context: {\n headers: {\n bundleOwnerId: this.bundleOwnerId,\n ...this.bundleOptions?.additionalHeaders,\n },\n },\n });\n if (response.data?.globalPropertyStateUpdate) {\n this.globalPropertyState = response.data.globalPropertyStateUpdate;\n } else {\n throw new Error(\"Unable to update global property state\");\n }\n }\n\n private async createGlobalPropertyState(): Promise<GlobalPropertyState> {\n const createResponse = await graphQlManager\n .getShadowGraphqlClient()\n .mutate<{ globalPropertyStateCreate: GlobalPropertyState }>({\n mutation: createGlobalPropertyStateMutation,\n variables: {\n bundleId: this.bundleId,\n },\n context: {\n headers: {\n bundleOwnerId: this.bundleOwnerId,\n ...this.bundleOptions?.additionalHeaders,\n },\n },\n });\n if (createResponse.data?.globalPropertyStateCreate && createResponse.data.globalPropertyStateCreate.id) {\n return createResponse.data.globalPropertyStateCreate;\n }\n throw new Error(`Unable to create global property state for bundle: ${this.bundleId}`);\n }\n}\n","import type { ThreeDPreviewService } from \"@spiffcommerce/preview\";\nimport { WorkflowExperience } from \"..\";\nimport { BundleStateData, BundleStateTransaction, BundleStateTransform } from \"../types\";\n\nexport class BundleStateManager {\n private state?: BundleStateData;\n\n constructor(stateData?: string) {\n this.setState(stateData);\n }\n\n setState(stateData?: string) {\n if (!stateData) {\n return;\n }\n this.state = JSON.parse(stateData);\n }\n\n applyStateToWorkflowExperience(workflowExperience: WorkflowExperience) {\n if (!this.state || !workflowExperience?.getWorkflowManager()?.getModelContainer()) {\n return;\n }\n const transaction = this.state.transactions.find(\n (t) => t.transactionId === workflowExperience.getWorkflowManager().getTransaction().id\n );\n if (!transaction) { return; }\n const transform = this.getTransformToApply(transaction);\n if (!transform) { return; }\n const flippedTransform = this.flipTransform(\n transform,\n workflowExperience.getWorkflowManager().getPreviewService()!,\n );\n const modelContainer = workflowExperience.getWorkflowManager().getModelContainer()!;\n modelContainer.position = flippedTransform.position;\n // Data is stored in degrees for consistency with the front-end UI\n modelContainer.rotation = flippedTransform.rotation;\n modelContainer.scale = flippedTransform.scale;\n }\n\n private getTransformToApply(transaction: BundleStateTransaction): BundleStateTransform | undefined {\n if (transaction.activeTransform && transaction.transforms) {\n return transaction.transforms[transaction.activeTransform];\n }\n return transaction.transform;\n }\n\n updateWorkflowExperienceTransform(workflowExperience: WorkflowExperience, transformName: string, transform: BundleStateTransform) {\n const transactionId = workflowExperience.getWorkflowManager().getTransaction().id;\n if (!this.state) {\n this.state = {\n transactions: [],\n };\n } else if (!this.state.transactions) {\n this.state.transactions = [];\n }\n const transactionState = this.state.transactions.find((t) => t.transactionId === transactionId);\n if (transactionState) {\n if (!transactionState.transforms) {\n transactionState.transforms = {};\n }\n transactionState.transforms[transformName] = transform\n } else {\n this.state.transactions.push({\n transactionId,\n activeTransform: transformName,\n transforms: { [transformName]: transform },\n });\n }\n }\n\n activateWorkflowExperienceTransform(workflowExperience: WorkflowExperience, transformName: string) {\n if (!workflowExperience?.getWorkflowManager()?.getModelContainer() || !this.state) {\n return;\n }\n const transactionId = workflowExperience.getWorkflowManager().getTransaction().id;\n const transactionState = this.state.transactions.find((t) => t.transactionId === transactionId);\n const transform = transactionState?.transforms?.[transformName];\n if (!transform) { return; }\n const flippedTransform = this.flipTransform(\n transform,\n workflowExperience.getWorkflowManager().getPreviewService()!,\n );\n const modelContainer = workflowExperience.getWorkflowManager().getModelContainer()!;\n modelContainer.position = flippedTransform.position;\n // Data is stored in degrees for consistency with the front-end UI\n modelContainer.rotation = flippedTransform.rotation;\n modelContainer.scale = flippedTransform.scale;\n transactionState.activeTransform = transformName;\n }\n\n removeStateForTransaction(transactionId: string) {\n if (!this.state || !this.state.transactions) {\n return;\n }\n const index = this.state.transactions.findIndex((t) => t.transactionId === transactionId);\n if (index !== -1) {\n this.state.transactions.splice(index, 1);\n }\n }\n\n getSerializedState() {\n if (!this.state) {\n return undefined;\n }\n return JSON.stringify(this.state);\n }\n\n private flipTransform(transform: BundleStateTransform, previewService: ThreeDPreviewService): BundleStateTransform {\n if (previewService && previewService.flipTransform) {\n const result = previewService.flipTransform(\n transform.position,\n {\n x: (transform.rotation.x * Math.PI) / 180,\n y: (transform.rotation.y * Math.PI) / 180,\n z: (transform.rotation.z * Math.PI) / 180,\n },\n transform.scale,\n );\n return result;\n } else {\n // Retain legacy behavior if preview version is old\n return {\n position: transform.position,\n rotation: {\n x: (transform.rotation.x * Math.PI) / 180,\n y: (transform.rotation.y * Math.PI) / 180,\n z: (transform.rotation.z * Math.PI) / 180,\n },\n scale: transform.scale,\n };\n }\n }\n}\n","import { getProductCollectionProductsQuery, getProductCollectionProductsFilteredQuery } from \"./Bundle/query\";\nimport { graphQlManager } from \"./services/server\";\nimport {\n IntegrationProductResource,\n IntegrationType,\n ProductCollectionResource,\n Product,\n ProductWorkflow as ProductWorkflowInterface,\n ProductCollectionProductResource,\n TransformCollection as TransformCollectionInterface,\n TransformCollectionTransform,\n BundleStateTransform,\n Asset,\n} from \"./types\";\nimport { ClientError } from \"./util/exception\";\n\ninterface ProductMetafieldFilter {\n operator: \"Equals\" | \"IsEmpty\";\n invert?: boolean;\n metafieldConfigurationId: string;\n value?: string;\n}\n\ninterface FilteredProductCollectionQueryResponse {\n productCollections: {\n id: string;\n productCollectionProducts: { id: string; product: { id: string } }[];\n }[];\n}\n\n/**\n * A collection of products that can be used to form a bundle.\n */\nexport class ProductCollection {\n private readonly collection: ProductCollectionResource;\n private fullFetched = false;\n\n constructor(collection: ProductCollectionResource) {\n this.collection = collection;\n }\n\n /**\n * The ID of the product collection.\n */\n getId(): string {\n return this.collection.id;\n }\n\n /**\n * The name of the collection.\n */\n getName(): string {\n return this.collection.name;\n }\n\n /**\n * The description of the collection.\n */\n getDescription(): string {\n return this.collection.description || \"\";\n }\n\n /**\n * The image of the collection.\n */\n getImage(): undefined | Asset {\n return this.collection.image;\n }\n\n /**\n * A list of products in this collections with useful helpers for interacting with them.\n */\n getProducts(): CollectionProduct[] {\n if (!this.collection.productCollectionProducts) {\n throw new Error(\"Failed to find products on collection. Ensure you fetch them first!\");\n }\n return this.collection.productCollectionProducts.map((pcp) => {\n return new CollectionProduct(pcp);\n });\n }\n\n /**\n * A list of products in this collections with useful helpers for interacting with them.\n */\n async fetchProducts(productIds?: string[]): Promise<CollectionProduct[]> {\n if (this.fullFetched) {\n return this.collection!.productCollectionProducts!.map((pcp) => {\n return new CollectionProduct(pcp);\n });\n }\n const response = await graphQlManager\n .getShadowGraphqlClient()\n .query<{ productCollections: ProductCollectionResource[] }>({\n query: getProductCollectionProductsQuery,\n variables: {\n id: this.getId(),\n productIds,\n },\n errorPolicy: \"all\",\n });\n if (!productIds) {\n this.fullFetched = true;\n }\n this.collection.productCollectionProducts = response.data.productCollections[0].productCollectionProducts || [];\n return this.collection.productCollectionProducts.map((pcp) => {\n return new CollectionProduct(pcp);\n });\n }\n\n /**\n * Returns a list of collections products matching the associated metafield filters.\n * @param filters A list of filters to apply.\n */\n async filterProducts(filters: ProductMetafieldFilter[]) {\n const response = await graphQlManager.getShadowGraphqlClient().query<FilteredProductCollectionQueryResponse>({\n query: getProductCollectionProductsFilteredQuery,\n errorPolicy: \"all\",\n variables: {\n id: this.getId(),\n filters: {\n link: \"And\",\n metafields: filters,\n },\n },\n });\n if (!response.data?.productCollections || response.data?.productCollections.length === 0) {\n throw new Error(\"Failed to filter product collection products.\");\n }\n const currentProducts = this.getProducts();\n const filteredResults = response.data.productCollections[0].productCollectionProducts.map(\n (it) => it.product.id,\n );\n return currentProducts.filter((it) => filteredResults.includes(it.getId()));\n }\n\n getTransformCollection(): TransformCollection | undefined {\n if (!this.collection.transformCollection) return undefined;\n return new TransformCollection(this.collection.transformCollection);\n }\n\n /**\n * The raw collection resource. This is generally not needed and should be avoided.\n */\n getResource(): ProductCollectionResource {\n return this.collection;\n }\n}\n\n/**\n * A collection product is a product within a ProductCollection. It provides a simple interface for interacting with the product.\n */\nexport class CollectionProduct {\n private readonly product: Product;\n private readonly productResource: ProductCollectionProductResource;\n\n constructor(productCollectionProduct: ProductCollectionProductResource) {\n this.product = productCollectionProduct.product;\n this.productResource = productCollectionProduct;\n }\n\n /**\n * The ID of the product in SpiffCommerce.\n * @returns\n */\n getId(): string {\n return this.product.id;\n }\n\n /**\n * The name of the product. Human readable.\n */\n getName(): string {\n return this.product.name;\n }\n\n /**\n * A helper function for getting integrations\n * @param type The type of integration you want.\n * @param externalId An external integration ID to further filter by. Otherwise we return the first encountered.\n * @returns The integration if found. Throws an error if not found as this data is typically a neccesity.\n */\n getIntegrationByType(type: IntegrationType, externalId?: string): IntegrationProductResource {\n const ips = this.product.integrationProducts || [];\n const ip = ips.find((ip) => {\n const hasType = ip.integration?.type;\n const typeMatches = ip.integration?.type === type;\n const externalIdMatches = externalId ? ip.integration?.externalIntegrationId === externalId : true;\n return hasType && typeMatches && externalIdMatches;\n });\n if (!ip) {\n throw new Error(\n \"Failed to find requested integration type on product. This is generally due to a configuration error\",\n );\n }\n return ip;\n }\n\n getCurrentIntegration(): IntegrationProductResource {\n const ips = this.product.integrationProducts || [];\n const ip = ips.find((ip) => ip.integration?.isCurrent);\n if (!ip) {\n throw new Error(\n `Product: ${this.productResource.id} is not linked to this current integration. This is generally due to a configuration error.`,\n );\n }\n return ip;\n }\n\n /**\n * A helper function for pulling the default workflow.\n */\n getDefaultWorkflow(): ProductWorkflow {\n const workflows = this.product.workflows;\n\n if (workflows === undefined) {\n throw new ClientError(\n \"Called getDefaultWorkflow() before fetching collection products. Use collection.fetchProducts() first to ensure the data is available.\",\n );\n }\n\n if (workflows.length === 0) {\n throw new ClientError(\n \"Called getDefaultWorkflow() but no workflows on requested product. Ensure at least 1 workflow is assigned to this product.\",\n );\n }\n\n // Check for a default configured on the collection\n const configuredDefault = this.productResource.workflowId;\n if (configuredDefault) {\n const found = workflows.find((w) => w.workflowName === configuredDefault);\n if (found) return new ProductWorkflow(found);\n }\n\n if (workflows.length === 1) {\n console.warn(\n \"Called getDefaultWorkflow() but no default was configured. There is only one workflow available so we will fall back to using this!\",\n );\n return new ProductWorkflow(workflows[0]);\n }\n\n throw new ClientError(\n \"Called getDefaultWorkflow() but no default workflow is configured for the requested product. Multiple workflows exist so we can't assume!\",\n );\n }\n\n /**\n * @returns All workflows associated with this Product.\n */\n getAllWorkflows(): ProductWorkflow[] {\n const workflows = this.product.workflows || [];\n\n if (workflows.length === 0) {\n throw new ClientError(\n \"No workflows on configured product. Ensure at least 1 workflow is assigned to this product.\",\n );\n }\n return this.product\n .workflows!.sort((a, b) => (a.index ?? 0) - (b.index ?? 0))\n .map((workflow) => new ProductWorkflow(workflow));\n }\n\n /**\n * A list of all integrations this product is connected to.\n */\n getIntegrations(): IntegrationProductResource[] {\n return this.product.integrationProducts || [];\n }\n\n /**\n * The raw product resource. This is generally not needed and should be avoided.\n */\n getResource(): Product {\n return this.product;\n }\n\n /**\n * Gets the base price of the product. Optionally include additional product pricing.\n * @param includeAdditionalProduct Optionally include additional product pricing. You must provide at least one of the fields on this object.\n * @returns\n */\n getBasePrice(includeAdditionalProduct?: {\n /**\n * The integration type to locate the additional product on.\n */\n integrationType?: IntegrationType;\n /**\n * The external ID of the integration to locate the additional product on.\n */\n externalId?: string;\n /**\n * The internal Spiff integration ID to locate the additional product on.\n */\n integrationId?: string;\n }): number {\n const price = this.product.basePrice || 0;\n if (!includeAdditionalProduct) return price;\n if (\n !includeAdditionalProduct.integrationType &&\n !includeAdditionalProduct.externalId &&\n !includeAdditionalProduct.integrationId\n ) {\n throw new Error(\n \"You must provide at least one of the following fields on the includeAdditionalProduct object: integrationType, externalId, integrationId\",\n );\n }\n let ip: IntegrationProductResource | undefined;\n if (includeAdditionalProduct.integrationId) {\n ip = this.product.integrationProducts?.find(\n (ip) => ip.integration?.id === includeAdditionalProduct.integrationId,\n );\n } else if (includeAdditionalProduct.externalId) {\n ip = this.product.integrationProducts?.find(\n (ip) => ip.integration?.externalIntegrationId === includeAdditionalProduct.externalId,\n );\n } else {\n ip = this.product.integrationProducts?.find(\n (ip) => ip.integration?.type === includeAdditionalProduct.integrationType,\n );\n }\n if (!ip?.additionalIntegrationProduct?.product) return price;\n return price + (ip.additionalIntegrationProduct.product.basePrice || 0);\n }\n}\n\n/**\n * Represents a the relationship between a workflow and a product.\n */\nexport class ProductWorkflow {\n private readonly workflow: ProductWorkflowInterface;\n\n constructor(workflow: ProductWorkflowInterface) {\n this.workflow = workflow;\n }\n\n /**\n * @returns The ID of this workflow, to be used when starting an experience.\n */\n getId(): string {\n return this.workflow.workflowName;\n }\n\n /**\n * @returns The name of the workflow.\n */\n getName(): string {\n return this.workflow.friendlyName;\n }\n\n /**\n * An image to be used to display this workflow in a UI to the customer.\n * @returns A resource URL.\n */\n getThumbnail(): string {\n return this.workflow.imageUrl;\n }\n}\n\n/**\n * Represents a collection of transforms that can be applied inside a product collection.\n */\nexport class TransformCollection {\n private readonly collection: TransformCollectionInterface;\n constructor(collection: TransformCollectionInterface) {\n this.collection = collection;\n }\n\n /**\n * @returns The ID of the transform collection.\n */\n getId(): string {\n return this.collection.id;\n }\n\n /**\n * @returns The name of the transform collection.\n */\n getName(): string {\n return this.collection.name;\n }\n\n /**\n * @returns The transforms in this collection.\n */\n getTransforms(): Transform[] {\n return this.collection.transforms.map((t) => new Transform(t));\n }\n}\n\n/**\n * Represents the translations, rotation & scale of a product in 3D space.\n */\nexport class Transform {\n private readonly transform: TransformCollectionTransform;\n constructor(position: TransformCollectionTransform) {\n this.transform = position;\n }\n\n /**\n * @returns The ID of the transform.\n */\n getId(): string {\n return this.transform.id;\n }\n\n /**\n * @returns The name of the transform.\n */\n getName(): string {\n return this.transform.name;\n }\n\n /**\n * @returns The transformation to be used to place the object.\n */\n get(): BundleStateTransform {\n return {\n position: this.transform.position,\n rotation: this.transform.rotation,\n scale: this.transform.scale,\n };\n }\n}\n","import { WorkflowExperience } from \"../WorkflowExperience\";\nimport { GetWorkflowGraphqlOptions, SpiffCommerceClient } from \"../client\";\nimport { graphQlManager } from \"../services/server\";\nimport {\n AspectType,\n BundleDesignCreationMessage,\n Bundle as BundleEntity,\n BundleStakeholder,\n BundleStakeholderInput,\n BundleStateTransform,\n CustomerDetailsInput,\n GlobalPropertyConfiguration,\n GlobalPropertyState,\n ProductCollectionResource,\n ShareAction,\n StakeholderType,\n Transaction,\n} from \"../types\";\nimport {\n bundleAddStakeholderMutation,\n bundleAddTransactionMutation,\n bundleAddTransactionsMutation,\n bundleApprovalQuery,\n bundleAssignProductCollectionMutation,\n bundleRejectionQuery,\n bundleRemoveStakeholderMutation,\n bundleRemoveTransactionMutation,\n bundleRemoveTransactionsMutation,\n bundleUpdateStakeholdersMutation,\n bundleUpdateTransactionOrderMutation,\n finalizeUpdateBundleMutation,\n getBundleStakeholdersQuery,\n updateBundleMutation,\n} from \"./query\";\nimport {\n GlobalPropertyHandle,\n GlobalPropertyHandleService,\n OptionGlobalPropertyHandle,\n} from \"../GlobalPropertyConfiguration\";\nimport {\n BundleOptions,\n GlobalPropertyStateManager,\n GlobalPropertyStateManagerImpl,\n} from \"../GlobalPropertyStateManager\";\nimport type { DesignCreationProgressUpdate, WorkflowManager } from \"../WorkflowManager\";\nimport { BundleStateManager } from \"./stateManager\";\nimport { persistenceService } from \"../services/persistence\";\nimport { ProductCollection } from \"../productCollection\";\nimport { createDesigns } from \"../services/design\";\nimport type { ModelContainer, ThreeDPreviewService } from \"@spiffcommerce/preview\";\n\n/**\n * A bundle serves as a container for a set of workflow experience.\n */\nexport interface Bundle {\n /**\n * @returns The client that this bundle is associated with.\n */\n getClient(): SpiffCommerceClient;\n\n /**\n * @returns The id of the bundle entity in the Spiff Commerce system.\n */\n getId(): string;\n\n /**\n * @returns The name of the bundle.\n */\n getName(): string;\n\n /**\n * Set the name of the bundle.\n * @param name The new name for the bundle.\n * @returns A promise that resolves when the name has been updated in the Spiff Commerce system.\n */\n setName(name: string): Promise<void>;\n\n /**\n * @returns Custom metadata associated with this bundle.\n */\n getMetadata(): Map<string, string>;\n\n /**\n * Set custom metadata associated with this bundle.\n * @param metadata Updated map of metadata items.\n * @returns A promise that resolves when the metadata has been updated in the Spiff Commerce system.\n */\n setMetadata(metadata: Map<string, string>): Promise<void>;\n\n /**\n * Set the name and metadata for this bundle.\n * @param name The new name for the bundle.\n * @param metadata Updated map of metadata items.\n * @returns A promise that resolves when the name and metadata have been updated in the Spiff Commerce system.\n */\n setNameAndMetadata(name: string, metadata: Map<string, string>): Promise<void>;\n\n /**\n * Returns true if this bundle is associated with a Product Collection that is linked to a Global Property Configuration\n */\n hasGlobalProperties(): boolean;\n\n /**\n * Get a handle to the global properties available within this bundle. Setting values\n * via this method will make selections on all bundles that share the property.\n */\n getGlobalProperties(): Promise<GlobalPropertyHandle[]>;\n\n /**\n * Get the low level state manager for this bundle. Don't use this unless you know what you're doing.\n */\n getGlobalPropertyStateManager(): GlobalPropertyStateManager;\n\n /**\n * Get the total in subunits for all global properties in this bundle.\n */\n getGlobalPropertyTotalSubunits(): Promise<number>;\n\n /**\n * Return the total in subunits for this bundle. This is the sum of the total for all individual transactions.\n */\n getTotalSubunits(): number;\n\n /**\n * Retrieves the product collection associated with this bundle.\n * If the bundle is not associated with a product collection, this method will return undefined.\n */\n getProductCollection(): ProductCollection | undefined;\n\n /**\n * Add another workflow experience to this bundle.\n * @param experience The workflow experience to add to this bundle.\n */\n addWorkflowExperience(experience: WorkflowExperience): Promise<void>;\n\n /**\n * Adds multiple workflow experiences to this bundle.\n * @param experiences The workflow experiences to add to this bundle.\n */\n addWorkflowExperiences(experiences: WorkflowExperience[]): Promise<void>;\n\n /**\n * Remove a workflow experience from this bundle.\n * @param experience The workflow experience to remove from this bundle.\n */\n removeWorkflowExperience(experience: WorkflowExperience): Promise<void>;\n\n /**\n * Removes multiple workflow experiences from this bundle.\n * @param experiences The workflow experiences to remove from this bundle.\n */\n removeWorkflowExperiences(experiences: WorkflowExperience[]): Promise<void>;\n\n /**\n * Remove a workflow experience from this bundle by transaction.\n * @param transaction The transaction to remove from this bundle.\n */\n removeWorkflowExperienceByTransaction(transaction: Transaction): Promise<void>;\n\n /**\n * Removes multiple workflow experiences from this bundle by their transactions.\n * @param transactions The transactions to remove from this bundle.\n */\n removeWorkflowExperiencesByTransactions(transactions: Transaction[]): Promise<void>;\n\n /**\n * Inserts the given workflow experience into the bundle at the given index.\n * NOTE: If you intend to insert a workflow experience at the end of the bundle, use `addWorkflowExperience` instead as it is more efficient.\n * @param experience The workflow experience to insert.\n * @param index The index to insert the workflow experience at.\n */\n insertWorkflowExperience(experience: WorkflowExperience, index: number): Promise<void>;\n\n /**\n * Replaces a workflow experience at the given index with the given workflow experience. This essentially removes the old one and inserts the new one.\n * @param index The index to replace the workflow experience at.\n * @param experience The workflow experience to replace the old one with.\n */\n replaceWorkflowExperience(index: number, experience: WorkflowExperience): Promise<void>;\n\n /**\n * Swaps the workflow experiences at the given indices.\n */\n swapWorkflowExperiences(a: number, b: number): Promise<void>;\n\n /**\n * Returns all workflow experiences currently added to this bundle.\n */\n getWorkflowExperiences(): WorkflowExperience[];\n\n /**\n * Sort the list of workflow experiences. The sorting is performed locally, and then the order is updated in the Spiff Commerce system.\n * @returns A promise that resolves when the re-ordering of the workflow experiences has been updated in the Spiff Commerce system.\n * The sorting will occur immediately, but the promise will not resolve until the Spiff Commerce system has been updated.\n */\n sortWorkflowExperiences(sortFunc: (expA: WorkflowExperience, expB: WorkflowExperience) => number): Promise<void>;\n\n /**\n * @returns The number of workflow experiences in this bundle.\n */\n getWorkflowExperienceCount(): number;\n\n /**\n * Add a stakeholder to this bundle. If the stakeholder already exists, it will be updated. Write access to the bundle is required.\n * @param customerDetails The details of the customer to add. The emailAddress field is required.\n * @param stakeholderType The type of stakeholder to add. Defaults to Owner.\n */\n addStakeholder(customerDetails: CustomerDetailsInput, stakeholderType?: StakeholderType): Promise<void>;\n\n /**\n * Removes a stakeholder from this bundle. Write access to the bundle is required.\n * @param emailAddress The email address of the stakeholder to remove.\n */\n removeStakeholder(emailAddress: string): Promise<void>;\n\n /**\n * Updates all stakeholders associated with this bundle. Write access to the bundle is required.\n * @param stakeholders An array of stakeholders to update. Unknown stakeholders will be added, and absent stakeholders will be removed.\n */\n updateStakeholders(stakeholders: BundleStakeholderInput[]): Promise<void>;\n\n /**\n * Retrieves all stakeholders associated with this bundle.\n */\n getAllStakeholders(): Promise<BundleStakeholder[]>;\n\n getCurrentStakeholder(): Promise<BundleStakeholder | undefined>;\n\n /**\n * Finalizes all experiences within the bundle. This will return a promise that resolves when all experiences have been finalized.\n * The promise resolves with a list of messages that indicate the status of each experience including\n * helpful details like what product to add to cart on supported e-commerce platforms.\n * @param onProgressUpdate A callback that will be called when the progress of the finalization changes.\n * @param createPreviewImage A callback that will be called when a preview image is required. This is used to generate a preview image for the design.\n * If this callback is not provided, no preview image will be generated.\n * @returns {BundleDesignCreationMessage} An object containing an array of design messages, along with the Bundle's Id and the event type.\n */\n finish(\n onProgressUpdate?: DesignCreationProgressUpdate,\n createPreviewImage?: (workflowExperience: WorkflowExperience) => Promise<string | undefined>,\n ): Promise<BundleDesignCreationMessage>;\n\n /**\n * Add an event listener to this bundle.\n * @param event The event to listen for. Currently only \"conditional-global-properties-changed\" is supported.\n * @param listener The listener to call when the event occurs.\n */\n addEventListener(event: BundleEventType, listener: (e: BundleEvent) => void): void;\n\n /**\n * Remove a previously added event listener from this bundle.\n */\n removeEventListener(event: BundleEventType, listener: (e: BundleEvent) => void): void;\n\n /**\n * Retrieves the current preview service for this bundle, if one exists.\n * If a preview service was specified when calling client.getExistingBundle, this will return that service.\n * Call `setPreviewService` to update the preview service for this bundle.\n */\n getPreviewService(): ThreeDPreviewService | undefined;\n\n /**\n * Set the preview service for this bundle. This will update the preview service for all workflow experiences in this bundle, and will\n * also automatically inject the preview service into any new workflow experiences that are added to this bundle.\n * If this method is called with no arguments or undefined, the preview service will be removed from this bundle.\n * @param previewService The preview service to use for this bundle.\n * @returns A promise that resolves when the preview service has been updated for all workflow experiences in this bundle.\n */\n setPreviewService(previewService?: ThreeDPreviewService): Promise<void>;\n\n /**\n * Returns a promise that resolves when the bundle has been initialized.\n * This will resolve immediately if the bundle has no experiences, or if the bundle has already been initialized.\n */\n getInitializationPromise(): Promise<void>;\n\n /**\n * Sets the position, rotation, and scale of a named transform for a workflow experience within this bundle.\n * @param workflowExperience The workflow experience to update.\n * @param transformName The name of the transform.\n * @param transform An object containing `position`, `rotation`, and `scale` properties. Each property is an object with `x`, `y`, and `z` properties.\n */\n updateWorkflowExperienceTransform(\n workflowExperience: WorkflowExperience,\n transformName: string,\n transform: BundleStateTransform,\n ): Promise<void>;\n\n /**\n * Sets a transform of a workflow experience within this bundle to be the active one.\n * @param workflowExperience The workflow experience to update.\n * @param transform The name of the transform to make the active transform.\n */\n activateWorkflowExperienceTransform(workflowExperience: WorkflowExperience, transformName: string): Promise<void>;\n\n /**\n * @returns The raw Global Property Configuration that is in use, otherwise `undefined`.\n */\n getGlobalPropertyConfiguration(): GlobalPropertyConfiguration | undefined;\n\n setBundleOptions(bundleOptions?: BundleOptions);\n\n /**\n * Assigns a Product Collection to the Bundle. This will only succeed if the Bundle does not already have a Product Collection assigned to it.\n * @param productCollectionId The ID of the Product Collection to assign to this Bundle.\n */\n assignProductCollection(productCollectionId: string): Promise<void>;\n\n getShareActions(): undefined | ShareAction[];\n\n getWorkflowViewerLink(): string;\n\n getWorkflowViewerAmendLink(): string;\n\n approve(note?: string): Promise<void>;\n\n reject(note?: string): Promise<void>;\n}\n\nexport type BundleEventType =\n | \"conditional-global-properties-changed\"\n | \"workflow-experience-hover-enter\"\n | \"workflow-experience-hover-exit\";\n\nexport type BundleEventData = ConditionalGlobalPropertiesChangedEventData | WorkflowExperienceHoverEventData;\nexport type BundleEvent = {\n bundle: Bundle;\n data: BundleEventData;\n event: BundleEventType;\n};\n\nexport interface ConditionalGlobalPropertiesChangedEventData {\n globalProperties: GlobalPropertyHandle[];\n}\n\nexport interface WorkflowExperienceHoverEventData {\n workflowExperience: WorkflowExperience;\n}\n\nexport class BundleImpl implements Bundle {\n readonly client: SpiffCommerceClient;\n\n private readonly id: string;\n private name: string;\n private metadata: ReadonlyMap<string, string>;\n private completed: boolean;\n private productCollection?: ProductCollectionResource;\n private readonly bundleStateManager: BundleStateManager;\n private readonly globalPropertyStateManager: GlobalPropertyStateManager;\n private readonly globalPropertyHandleService: GlobalPropertyHandleService;\n private readonly eventListeners: Map<BundleEventType, ((e: BundleEvent) => void)[]> = new Map();\n private readonly initializationPromise: Promise<any>;\n private readonly ownerId?: string;\n private readonly shareActions?: ShareAction[];\n private readonly workflowViewerLink: string;\n private readonly workflowViewerAmendLink: string;\n\n private workflowExperiences: WorkflowExperience[] = [];\n private previewService?: ThreeDPreviewService;\n\n constructor(\n client: SpiffCommerceClient,\n entity: BundleEntity,\n previewService?: ThreeDPreviewService,\n graphqlOptions?: GetWorkflowGraphqlOptions,\n ownerId?: string,\n bundleOptions?: BundleOptions,\n ) {\n this.client = client;\n this.id = entity.id!;\n this.name = entity.name || \"\";\n this.shareActions = entity.bundleShareActions;\n this.workflowViewerLink = entity.workflowViewerLink;\n this.workflowViewerAmendLink = entity.workflowViewerAmendLink;\n this.ownerId = ownerId;\n this.metadata = new Map(entity.metadata?.map((m) => [m.key, m.value]) || []);\n this.completed = entity.completed ?? false;\n this.productCollection = entity.productCollection;\n this.bundleStateManager = new BundleStateManager(entity.bundleStateData);\n this.globalPropertyStateManager = new GlobalPropertyStateManagerImpl(\n this.id,\n this.ownerId,\n this.productCollection?.globalPropertyConfiguration,\n this.checkConditionalHandlesChanged.bind(this),\n bundleOptions,\n );\n this.globalPropertyHandleService = new GlobalPropertyHandleService(this);\n this.setPreviewService(previewService);\n this.initializationPromise = Promise.all([\n this.loadExistingWorkflowExperiences(entity.transactions?.map((t) => t.id) || [], {\n ...graphqlOptions,\n bundleOwnerId: ownerId,\n }),\n this.globalPropertyStateManager.getInitializationPromise(),\n ]);\n this.initializationPromise.catch((e) => {\n console.error(`Bundle initialization failed: ${e}`);\n });\n }\n\n setBundleOptions(bundleOptions?: BundleOptions) {\n this.globalPropertyStateManager.setBundleOptions(bundleOptions);\n }\n\n getInitializationPromise(): Promise<void> {\n return this.initializationPromise;\n }\n\n addEventListener(event: BundleEventType, listener: (e: BundleEvent) => void): void {\n this.eventListeners.set(event, [...(this.eventListeners.get(event) || []), listener]);\n }\n\n removeEventListener(event: BundleEventType, listener: (e: BundleEvent) => void): void {\n const listeners = this.eventListeners.get(event) || [];\n const index = listeners.indexOf(listener);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n }\n\n getClient() {\n return this.client;\n }\n\n getId() {\n return this.id;\n }\n\n getName(): string {\n return this.name;\n }\n\n setName(name: string): Promise<void> {\n this.name = name;\n return this.updateBundle();\n }\n\n getMetadata(): Map<string, string> {\n return new Map(this.metadata);\n }\n\n setMetadata(metadata: Map<string, string>): Promise<void> {\n this.metadata = new Map(metadata);\n return this.updateBundle();\n }\n\n setNameAndMetadata(name: string, metadata: Map<string, string>): Promise<void> {\n this.name = name;\n this.metadata = new Map(metadata);\n return this.updateBundle();\n }\n\n hasGlobalProperties(): boolean {\n // For now we just check if this bundle is linked to a product collection that has global properties.\n // In the future there could be other ways of providing global properties.\n return !!this.productCollection?.globalPropertyConfiguration;\n }\n\n getGlobalPropertyConfiguration() {\n return this.productCollection?.globalPropertyConfiguration;\n }\n\n async getGlobalProperties(): Promise<GlobalPropertyHandle[]> {\n return this.globalPropertyHandleService.applyConditionsFromState(\n await this.globalPropertyHandleService.getHandles(),\n this.getGlobalPropertyStateManager().getGlobalPropertyState(),\n );\n }\n\n getGlobalPropertyStateManager(): GlobalPropertyStateManager {\n return this.globalPropertyStateManager;\n }\n\n async getGlobalPropertyTotalSubunits(): Promise<number> {\n const handles = await this.globalPropertyHandleService.getHandles();\n const options = handles.filter((h) => h.getType() === AspectType.Option) as OptionGlobalPropertyHandle[];\n return options.map((o) => o.getCurrentVariant()?.getPrice() || 0).reduce((partialSum, a) => partialSum + a, 0);\n }\n\n getTotalSubunits() {\n return this.workflowExperiences.map((we) => we.getTotalPriceSubunits()).reduce((a, b) => a + b, 0);\n }\n\n getProductCollection(): ProductCollection | undefined {\n return this.productCollection ? new ProductCollection(this.productCollection) : undefined;\n }\n\n async addWorkflowExperience(experience: WorkflowExperience) {\n // Append the experience to the bundle.\n experience.setBundle(this);\n await this.appendWorkflowExperience(experience);\n // If a preview is attached to the bundle inject it into that.\n await this.injectExperienceIntoPreviewService(experience);\n // Ensure the experience is loaded to prevent timing issues with global property application.\n await experience.getWorkflowManager().getInitializationPromise();\n // Apply global state if required.\n const globalProperties = await this.getGlobalProperties();\n for (const p of globalProperties) {\n await p.applyGlobalState([experience]);\n }\n }\n\n async addWorkflowExperiences(experiences: WorkflowExperience[]) {\n const transactionIds = experiences.map((experience) => experience.getWorkflowManager().getTransaction().id);\n const existing = transactionIds.map((transactionId) =>\n this.workflowExperiences.find((exp) => exp.getWorkflowManager().getTransaction().id === transactionId),\n );\n if (existing.some((e) => !!e))\n throw new Error(\n \"Unable to add transaction to bundle - Already Exists: \" +\n existing\n .filter((e) => !!e)\n .map((e) => e?.getWorkflowManager().getTransaction().id)\n .join(\", \"),\n );\n // Use the owner ID from the persistence service if it exists. Otherwise the client will fall back to other methods.\n const ownerMap = persistenceService.getMap(\"transactionOwnerIds\") || new Map();\n const existingOwnerIds = transactionIds.map((transactionId) => ownerMap.get(transactionId));\n await graphQlManager\n .getShadowGraphqlClient()\n .mutate({\n mutation: bundleAddTransactionsMutation,\n variables: {\n id: this.id,\n transactionIds: transactionIds,\n transactionOwnerIds: existingOwnerIds,\n },\n context: {\n bundleOwnerId: this.ownerId,\n },\n })\n .catch((e) => {\n console.error(e);\n });\n this.workflowExperiences.push(...experiences);\n\n const initializeExperience = async () => {\n for (const experience of experiences) {\n experience.setBundle(this);\n await this.injectExperienceIntoPreviewService(experience);\n }\n await Promise.all(experiences.map((exp) => exp.getWorkflowManager().getInitializationPromise()));\n const globalProperties = await this.getGlobalProperties();\n for (const p of globalProperties) {\n await p.applyGlobalState(experiences);\n }\n };\n\n await Promise.all([this.updateTransactionOrder(), initializeExperience()]);\n // Check changes after adding all (experiences rely on checking each other)\n this.workflowExperiences.forEach((experience) => experience.checkForPriceBreakChanges());\n }\n\n private async appendWorkflowExperience(experience: WorkflowExperience, updateArray = true) {\n const transactionId = experience.getWorkflowManager().getTransaction().id;\n const existing = this.workflowExperiences.find(\n (exp) => exp.getWorkflowManager().getTransaction().id === transactionId,\n );\n if (existing) throw new Error(\"Unable to add transaction to bundle - Already Exists!\");\n // Use the owner ID from the persistence service if it exists. Otherwise the client will fall back to other methods.\n const ownerMap = persistenceService.getMap(\"transactionOwnerIds\") || new Map();\n const existingOwnerId = ownerMap.get(transactionId);\n await graphQlManager.getShadowGraphqlClient().mutate({\n mutation: bundleAddTransactionMutation,\n variables: {\n id: this.id,\n transactionId: transactionId,\n },\n context: {\n bundleOwnerId: this.ownerId,\n transactionOwnerId: existingOwnerId,\n },\n });\n if (updateArray) {\n this.workflowExperiences.push(experience);\n this.workflowExperiences.forEach((experience) => experience.checkForPriceBreakChanges());\n }\n }\n\n async removeWorkflowExperience(experience: WorkflowExperience) {\n const index = this.workflowExperiences.indexOf(experience);\n await this.removeTransaction(index, this.workflowExperiences[index].getWorkflowManager().getTransaction());\n }\n\n async removeWorkflowExperiences(experiences: WorkflowExperience[]) {\n await this.removeTransactions(experiences.map((exp) => exp.getWorkflowManager().getTransaction()));\n }\n\n async removeWorkflowExperienceByTransaction(transaction: Transaction) {\n const index = this.workflowExperiences.findIndex(\n (we) => we.getWorkflowManager().getTransaction().id === transaction.id,\n );\n await this.removeTransaction(index, transaction);\n }\n\n async removeWorkflowExperiencesByTransactions(transactions: Transaction[]) {\n await this.removeTransactions(transactions);\n }\n\n private async removeTransaction(index: number, transaction: Transaction, updateArray = true) {\n if (index > -1) {\n const removed = this.workflowExperiences.find(\n (we) => we.getWorkflowManager().getTransaction().id === transaction.id,\n )!;\n removed.setBundle(undefined);\n if (this.previewService) {\n removed.getWorkflowManager().ejectFromPreviewService();\n }\n this.bundleStateManager.removeStateForTransaction(transaction.id);\n await graphQlManager.getShadowGraphqlClient().mutate({\n mutation: bundleRemoveTransactionMutation,\n variables: {\n id: this.id,\n transactionId: transaction.id,\n name: this.name,\n metadata: Array.from(this.metadata.entries()).map(([key, value]) => ({ key, value })),\n bundleStateData: this.bundleStateManager.getSerializedState(),\n },\n context: {\n bundleOwnerId: this.ownerId,\n },\n });\n if (updateArray) {\n this.workflowExperiences.splice(index, 1);\n this.workflowExperiences.forEach((experience) => experience.checkForPriceBreakChanges());\n removed.checkForPriceBreakChanges();\n await this.updateTransactionOrder();\n }\n } else {\n throw new Error(\"Unable to remove workflow experience from bundle - Not Found! - \" + transaction.id);\n }\n }\n\n private async removeTransactions(transactions: Transaction[]) {\n const indices = transactions.map((transaction) =>\n this.workflowExperiences.findIndex((we) => we.getWorkflowManager().getTransaction().id === transaction.id),\n );\n if (indices.some((index) => index === -1)) {\n throw new Error(\n \"Unable to remove workflow experience from bundle - The following aren't included in the bundle: \" +\n transactions\n .filter((_, i) => indices[i] === -1)\n .map((t) => t.id)\n .join(\", \"),\n );\n }\n const removedExperiences = transactions.map(\n (t) =>\n this.workflowExperiences.splice(\n this.workflowExperiences.findIndex((we) => we.getWorkflowManager().getTransaction().id === t.id),\n 1,\n )[0],\n );\n removedExperiences.forEach((experience) => experience.setBundle(undefined));\n [...this.workflowExperiences, ...removedExperiences].forEach((experience) =>\n experience.checkForPriceBreakChanges(),\n );\n if (this.previewService) {\n removedExperiences.forEach((experience) => experience.getWorkflowManager().ejectFromPreviewService());\n }\n transactions.forEach((transaction) => this.bundleStateManager.removeStateForTransaction(transaction.id));\n await graphQlManager.getShadowGraphqlClient().mutate({\n mutation: bundleRemoveTransactionsMutation,\n variables: {\n id: this.id,\n transactionIds: transactions.map((t) => t.id),\n name: this.name,\n metadata: Array.from(this.metadata.entries()).map(([key, value]) => ({ key, value })),\n bundleStateData: this.bundleStateManager.getSerializedState(),\n },\n context: {\n bundleOwnerId: this.ownerId,\n },\n });\n await this.updateTransactionOrder();\n }\n\n async insertWorkflowExperience(experience: WorkflowExperience, index: number): Promise<void> {\n await this.appendWorkflowExperience(experience, false);\n this.workflowExperiences.splice(index, 0, experience);\n await Promise.all([\n this.updateTransactionOrder(),\n (async () => {\n await this.injectExperienceIntoPreviewService(experience);\n const globalProperties = await this.getGlobalProperties();\n await Promise.all(globalProperties.map((p) => p.applyGlobalState([experience])));\n })(),\n ]);\n }\n\n async replaceWorkflowExperience(index: number, experience: WorkflowExperience): Promise<void> {\n if (index < 0 || index >= this.workflowExperiences.length) {\n throw new Error(\"Unable to replace workflow experience in bundle - Index out of range!\");\n }\n const oldExperience = this.workflowExperiences[index];\n if (\n oldExperience.getWorkflowManager().getTransaction().id ===\n experience.getWorkflowManager().getTransaction().id\n ) {\n throw new Error(\"Unable to replace workflow experience in bundle - Same transaction!\");\n }\n await Promise.all([\n this.removeTransaction(index, oldExperience.getWorkflowManager().getTransaction(), false),\n this.appendWorkflowExperience(experience, false),\n ]);\n this.workflowExperiences[index] = experience;\n await Promise.all([\n this.updateTransactionOrder(),\n (async () => {\n await this.injectExperienceIntoPreviewService(experience);\n const globalProperties = await this.getGlobalProperties();\n await Promise.all(globalProperties.map((p) => p.applyGlobalState([experience])));\n })(),\n ]);\n }\n\n async swapWorkflowExperiences(a: number, b: number): Promise<void> {\n if (a < 0 || a >= this.workflowExperiences.length || b < 0 || b >= this.workflowExperiences.length) {\n throw new Error(\"Unable to swap workflow experiences in bundle - Index out of range!\");\n }\n if (a === b) return;\n const temp = this.workflowExperiences[a];\n this.workflowExperiences[a] = this.workflowExperiences[b];\n this.workflowExperiences[b] = temp;\n await this.updateTransactionOrder();\n }\n\n getWorkflowExperiences() {\n return [...this.workflowExperiences];\n }\n\n async sortWorkflowExperiences(\n sortFunc: (expA: WorkflowExperience, expB: WorkflowExperience) => number,\n ): Promise<void> {\n this.workflowExperiences = this.workflowExperiences.sort(sortFunc);\n await this.updateTransactionOrder();\n }\n\n getWorkflowExperienceCount(): number {\n return this.workflowExperiences.length;\n }\n\n async addStakeholder(customerDetails: CustomerDetailsInput, stakeholderType?: StakeholderType): Promise<void> {\n const response = await graphQlManager.getShadowGraphqlClient().mutate<{ bundleAddStakeholder: BundleEntity }>({\n mutation: bundleAddStakeholderMutation,\n variables: {\n id: this.id,\n details: customerDetails,\n type: stakeholderType || StakeholderType.Owner,\n },\n context: {\n bundleOwnerId: this.ownerId,\n },\n });\n if (!response.data?.bundleAddStakeholder) throw new Error(\"Bundle not found!\");\n const stakeholders = response.data.bundleAddStakeholder.bundleStakeholders || [];\n this.storeStakeholderCustomers(stakeholders);\n }\n\n async removeStakeholder(emailAddress: string): Promise<void> {\n const response = await graphQlManager\n .getShadowGraphqlClient()\n .mutate<{ bundleRemoveStakeholder: BundleEntity }>({\n mutation: bundleRemoveStakeholderMutation,\n variables: {\n id: this.id,\n emailAddress,\n },\n context: {\n bundleOwnerId: this.ownerId,\n },\n });\n if (!response.data?.bundleRemoveStakeholder) throw new Error(\"Bundle not found!\");\n }\n\n async updateStakeholders(stakeholders: BundleStakeholderInput[]): Promise<void> {\n const response = await graphQlManager\n .getShadowGraphqlClient()\n .mutate<{ bundleUpdateStakeholders: BundleEntity }>({\n mutation: bundleUpdateStakeholdersMutation,\n variables: {\n id: this.id,\n input: stakeholders,\n },\n context: {\n bundleOwnerId: this.ownerId,\n },\n });\n if (!response.data?.bundleUpdateStakeholders) throw new Error(\"Bundle not found!\");\n const updatedStakeholders = response.data.bundleUpdateStakeholders.bundleStakeholders || [];\n this.storeStakeholderCustomers(updatedStakeholders);\n }\n\n async getAllStakeholders(): Promise<BundleStakeholder[]> {\n const response = await graphQlManager.getShadowGraphqlClient().query<{ bundles: BundleEntity[] }>({\n query: getBundleStakeholdersQuery,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n id: this.id,\n },\n context: {\n bundleOwnerId: this.ownerId,\n },\n });\n if (!response.data.bundles || response.data.bundles.length === 0) throw new Error(\"Bundle not found!\");\n const stakeholders = response.data.bundles[0].bundleStakeholders || [];\n this.storeStakeholderCustomers(stakeholders);\n return stakeholders;\n }\n\n async getCurrentStakeholder(): Promise<BundleStakeholder | undefined> {\n const response = await graphQlManager.getShadowGraphqlClient().query<{ bundles: BundleEntity[] }>({\n query: getBundleStakeholdersQuery,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n id: this.id,\n },\n context: {\n bundleOwnerId: this.ownerId,\n },\n });\n if (!response.data.bundles || response.data.bundles.length === 0) throw new Error(\"Bundle not found!\");\n const bundle = response.data.bundles[0];\n return bundle.currentBundleStakeholder;\n }\n\n private storeStakeholderCustomers(stakeholders: BundleStakeholder[]) {\n stakeholders.forEach((stakeholder) => {\n if (stakeholder.customer) {\n this.client.storeCustomer(stakeholder.customer);\n }\n });\n }\n\n async finish(\n onProgressUpdate?: DesignCreationProgressUpdate,\n createPreviewImage?: (workflowExperience: WorkflowExperience) => Promise<string | undefined>,\n ): Promise<BundleDesignCreationMessage> {\n if (this.completed) {\n await graphQlManager.getShadowGraphqlClient().mutate({\n mutation: finalizeUpdateBundleMutation,\n variables: {\n bundleId: this.id,\n },\n });\n\n return {\n bundleId: this.id,\n items: [],\n bundleOwnerId: this.ownerId,\n };\n }\n\n const results = await createDesigns(\n this.workflowExperiences.map((exp) => ({\n workflowManager: exp.getWorkflowManager(),\n workflow: exp.getWorkflowManager().getWorkflow(),\n layouts: exp.getWorkflowManager().getLayouts(),\n getReducerState: () => exp.getCommandContext().getState()!,\n product: exp.getWorkflowManager().getProduct(),\n transaction: exp.getWorkflowManager().getTransaction(),\n workflowSelections: exp.getWorkflowManager().getWorkflowSelections(),\n designName: exp.getWorkflowManager().getWorkflow().name,\n workflowMetadata: exp.getWorkflowManager().getWorkflowMetadata(),\n })),\n onProgressUpdate ?? (() => {}),\n createPreviewImage\n ? (_shouldRender3D?: boolean, transactionId?: string) => {\n const experience = this.workflowExperiences.find(\n (exp) => exp.getWorkflowManager().getTransaction().id === transactionId,\n );\n if (!experience) {\n console.warn(\n \"SpiffCommerce - Bundle create design - Unable to find experience for transaction: \" +\n transactionId,\n );\n return Promise.resolve(undefined);\n }\n return createPreviewImage(experience);\n }\n : undefined,\n );\n return {\n bundleId: this.id,\n items: results,\n bundleOwnerId: this.ownerId,\n };\n }\n\n getPreviewService() {\n return this.previewService;\n }\n\n async setPreviewService(previewService?: ThreeDPreviewService): Promise<void> {\n if (this.workflowExperiences && this.workflowExperiences.length > 0) {\n this.workflowExperiences.forEach((exp) => exp.getWorkflowManager().ejectFromPreviewService());\n if (previewService) {\n // Sequentially inject each experience into the preview service, for performance reasons.\n for (const experience of this.workflowExperiences) {\n await this.injectExperienceIntoPreviewService(experience);\n }\n }\n }\n if (previewService && previewService.registerModelLoadEventListener) {\n previewService.registerModelLoadEventListener(this.onModelLoadEvent.bind(this));\n }\n if (\n this.previewService &&\n this.previewService !== previewService &&\n this.previewService.unregisterModelLoadEventListener\n ) {\n this.previewService.unregisterModelLoadEventListener(this.onModelLoadEvent.bind(this));\n }\n this.previewService = previewService;\n }\n\n updateWorkflowExperienceTransform(\n workflowExperience: WorkflowExperience,\n transformName: string,\n transform: BundleStateTransform,\n ): Promise<void> {\n this.bundleStateManager.updateWorkflowExperienceTransform(workflowExperience, transformName, transform);\n return this.updateBundle();\n }\n\n activateWorkflowExperienceTransform(workflowExperience: WorkflowExperience, transformName: string): Promise<void> {\n this.bundleStateManager.activateWorkflowExperienceTransform(workflowExperience, transformName);\n return this.updateBundle();\n }\n\n async assignProductCollection(productCollectionId: string) {\n const response = await graphQlManager\n .getShadowGraphqlClient()\n .mutate<{ bundleAssignProductCollection: BundleEntity }>({\n mutation: bundleAssignProductCollectionMutation(\n this.globalPropertyStateManager.getBundleOptions()?.eagerFetchProducts ?? false,\n ),\n variables: {\n id: this.id,\n productCollectionId: productCollectionId ?? \"\",\n },\n context: {\n bundleOwnerId: this.ownerId,\n },\n });\n if (response.data?.bundleAssignProductCollection.productCollection) {\n this.productCollection = response.data.bundleAssignProductCollection.productCollection;\n this.globalPropertyStateManager.setConfiguration(\n response.data.bundleAssignProductCollection.productCollection.globalPropertyConfiguration,\n );\n }\n }\n\n private onModelLoadEvent(e: { eventType: \"load\" | \"unload\"; modelContainer: ModelContainer }): void {\n if (e.eventType === \"unload\" || !e.modelContainer) return;\n e.modelContainer.registerMaterialSelectedCallback(() => this.onModelSelectedEvent(e.modelContainer, true));\n e.modelContainer.registerMaterialDeselectedCallback(() => this.onModelSelectedEvent(e.modelContainer, false));\n }\n\n private onModelSelectedEvent(modelContainer: ModelContainer, selected: boolean): void {\n if (modelContainer && modelContainer.metadata && modelContainer.metadata instanceof Map) {\n if (modelContainer.metadata.has(\"workflowManager\")) {\n const workflowManager: WorkflowManager = modelContainer.metadata.get(\"workflowManager\");\n const transaction = workflowManager.getTransaction();\n const experience = this.workflowExperiences.find(\n (exp) => exp.getWorkflowManager().getTransaction().id === transaction.id,\n );\n if (experience) {\n this.fireEvent(selected ? \"workflow-experience-hover-enter\" : \"workflow-experience-hover-exit\", {\n workflowExperience: experience,\n });\n }\n }\n }\n }\n\n private async injectExperienceIntoPreviewService(experience: WorkflowExperience) {\n if (this.previewService) {\n const promise = experience.getWorkflowManager().injectIntoPreviewService(this.previewService);\n try {\n this.bundleStateManager.applyStateToWorkflowExperience(experience);\n } catch (e) {\n console.error(`Unable to apply state to workflow experience: ${e}`);\n }\n await promise;\n }\n }\n\n private async loadExistingWorkflowExperiences(\n transactionIds: string[],\n graphqlOptions?: GetWorkflowGraphqlOptions,\n ): Promise<void> {\n if (transactionIds.length === 0) return;\n const experiences = await this.client.getWorkflowExperiences(\n transactionIds.map((id) => ({\n type: \"transaction\",\n transactionId: id,\n })),\n graphqlOptions,\n );\n experiences.forEach((wfe) => wfe.setBundle(this));\n experiences.forEach((wfe) => wfe.checkForPriceBreakChanges());\n this.workflowExperiences = experiences;\n if (this.previewService) {\n for (const experience of experiences) {\n await this.injectExperienceIntoPreviewService(experience);\n }\n }\n }\n\n private async updateBundle() {\n const response = await graphQlManager.getShadowGraphqlClient().mutate<{ bundleUpdate: BundleEntity }>({\n mutation: updateBundleMutation,\n variables: {\n id: this.id,\n name: this.name,\n metadata: Array.from(this.metadata.entries()).map(([key, value]) => ({ key, value })),\n bundleStateData: this.bundleStateManager.getSerializedState(),\n },\n context: {\n bundleOwnerId: this.ownerId,\n },\n });\n if (!response.data?.bundleUpdate) throw new Error(\"Bundle not found!\");\n }\n\n private async updateTransactionOrder() {\n await graphQlManager.getShadowGraphqlClient().mutate({\n mutation: bundleUpdateTransactionOrderMutation,\n variables: {\n id: this.id,\n transactionIds: this.workflowExperiences.map((exp) => exp.getWorkflowManager().getTransaction().id),\n },\n context: {\n bundleOwnerId: this.ownerId,\n },\n });\n }\n\n private async checkConditionalHandlesChanged(previousState: GlobalPropertyState, newState: GlobalPropertyState) {\n const handles = await this.globalPropertyHandleService.getHandles();\n const previousHandles = this.globalPropertyHandleService.applyConditionsFromState(handles, previousState);\n const newHandles = this.globalPropertyHandleService.applyConditionsFromState(handles, newState);\n const checkHandlesChanged = () => {\n if (previousHandles.length !== newHandles.length) return true;\n for (let i = 0; i < previousHandles.length; i++) {\n if (previousHandles[i].getName() !== newHandles[i].getName()) return true;\n }\n return false;\n };\n if (checkHandlesChanged()) {\n this.fireEvent(\"conditional-global-properties-changed\", {\n globalProperties: newHandles,\n });\n const changedHandles = newHandles.filter((handle) => !previousHandles.includes(handle));\n await Promise.all(changedHandles.map((handle) => handle.applyGlobalState()));\n }\n }\n\n private fireEvent(event: BundleEventType, data: BundleEventData) {\n const listeners = this.eventListeners.get(event) || [];\n listeners.forEach((listener) =>\n listener({\n bundle: this,\n event,\n data,\n }),\n );\n }\n\n getShareActions(): undefined | ShareAction[] {\n return this.shareActions;\n }\n\n getWorkflowViewerLink(): string {\n return this.workflowViewerLink;\n }\n\n getWorkflowViewerAmendLink(): string {\n return this.workflowViewerAmendLink;\n }\n\n async approve(note?: string): Promise<void> {\n await graphQlManager\n .getShadowGraphqlClient()\n .mutate<{ id: string }>({\n mutation: bundleApprovalQuery,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n id: this.id,\n note,\n },\n })\n }\n\n async reject(note?: string): Promise<void> {\n await graphQlManager\n .getShadowGraphqlClient()\n .mutate<{ id: string }>({\n mutation: bundleRejectionQuery,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n id: this.id,\n note,\n },\n })\n\n }\n}\n","import { ApolloQueryResult, gql } from \"@apollo/client/core\";\nimport { graphQlManager } from \"./services/server\";\n\n/**\n * Graphql query for executing a process flow.\n */\nconst executeProcessFlow = gql`\n mutation processFlowCreate($processFlowId: String!, $inputs: [String]!) {\n processExecutionCreate(processFlowId: $processFlowId, inputs: $inputs) {\n id\n }\n }\n`;\n\n/**\n * The response from the server when executing a process flow.\n */\ninterface ExecutionResponseGraphQL {\n processExecutions: ExecutionResponse;\n}\n\n/**\n * A list of node types available in executions\n */\nexport enum NodeType {\n Split = \"Split\",\n TextJoin = \"TextJoin\",\n TextSlice = \"TextSlice\",\n TextUpper = \"TextUpper\",\n TextLower = \"TextLower\",\n ParseJson = \"ParseJson\",\n TextBuilder = \"TextBuilder\",\n Design = \"Design\",\n OverlayImage = \"OverlayImage\",\n OverlayText = \"OverlayText\",\n TableGenerator = \"TableGenerator\",\n QR = \"QR\",\n CSV = \"CSV\",\n PDF = \"PDF\",\n PNG = \"PNG\",\n Email = \"Email\",\n LocationDelivery = \"LocationDelivery\",\n TemplateEmail = \"TemplateEmail\",\n Map = \"Map\",\n Sort = \"Sort\",\n Group = \"Group\",\n InnerJoin = \"InnerJoin\",\n Contains = \"Contains\",\n Flatten = \"Flatten\",\n KeyValuePairs = \"KeyValuePairs\",\n ListConcatenate = \"ListConcatenate\",\n Repeat = \"Repeat\",\n Size = \"Size\",\n ListBuilder = \"ListBuilder\",\n MapBuilder = \"MapBuilder\",\n PairBuilder = \"PairBuilder\",\n AND = \"AND\",\n OR = \"OR\",\n NOT = \"NOT\",\n Equals = \"Equals\",\n Present = \"Present\",\n ManualOperation = \"ManualOperation\",\n Switch = \"Switch\",\n AssetMetadata = \"AssetMetadata\",\n DataSelect = \"DataSelect\",\n LayoutSelect = \"LayoutSelect\",\n TransactionMetadata = \"TransactionMetadata\",\n VariantSelection = \"VariantSelection\",\n StartTerminal = \"StartTerminal\",\n EndTerminal = \"EndTerminal\",\n MiscNote = \"MiscNote\",\n Assign = \"Assign\",\n CsvVlookup = \"CsvVlookup\",\n ProcessFlow = \"ProcessFlow\",\n TemporaryAssetUrl = \"TemporaryAssetUrl\",\n WebRequest = \"WebRequest\",\n}\n\ninterface ExecutionNodeResponse {\n id: string;\n type: NodeType;\n artifacts: string;\n}\n\ninterface ExecutionResponse {\n id: string;\n nodes: ExecutionNodeResponse[];\n completedAt?: string;\n failedAt?: string;\n}\n\n/**\n * A service containing functionality for interacting with the Spiff Commerce API to execute and inspect the result of process flows.\n */\nexport class FlowService {\n /**\n *\n * @param id\n * @param inputs\n * @param options\n * @returns\n */\n async execute(\n id: string,\n inputs: FlowExecutionInput[],\n options?: { sleepTime?: number; repeats?: number },\n ): Promise<FlowExecutionResult> {\n // Fire the execution\n const createResponse = await graphQlManager\n .getShadowGraphqlClient()\n .mutate<{ processExecutionCreate: { id: string } }>({\n mutation: executeProcessFlow,\n variables: {\n processFlowId: id,\n inputs: [...inputs.map((input) => input.getValueForTransmission())],\n },\n });\n\n const executionId = createResponse.data?.processExecutionCreate?.id;\n if (!executionId) throw new Error(\"Failed to create process execution.\");\n\n function delay(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms); // Convert seconds to milliseconds\n });\n }\n\n // Evaluate completion\n let completed: boolean = false;\n let repeats = 0;\n let response: ApolloQueryResult<ExecutionResponseGraphQL> | undefined;\n let flowResult: FlowExecutionResult | undefined = undefined;\n while (!completed) {\n response = await graphQlManager.getShadowGraphqlClient().query<ExecutionResponseGraphQL>({\n query: gql`\n query getProcessFlowExecution($ids: [String]!) {\n processExecutions(ids: $ids) {\n id\n completedAt\n failedAt\n nodes {\n id\n type\n artifacts\n }\n }\n }\n `,\n variables: {\n ids: [executionId],\n },\n });\n const responseData = response.data?.processExecutions[0];\n\n // Check valid response\n if (!response || !responseData) throw new Error(\"Failed to retrieve server response for execution.\");\n\n // If the execution failed prompt developer to access execution details in hub\n if (responseData.failedAt) {\n throw new Error(\n \"Execution has failed to complete. See Automation > FLows in Flight on partner account on SpiffCommerce Hub.\",\n );\n }\n\n // Check for completion otherwise.\n if (responseData.completedAt) {\n completed = true;\n flowResult = new FlowExecutionResult(responseData);\n break;\n }\n\n repeats += 1;\n\n const maxRepeats = options?.repeats ? options?.repeats : 5;\n if (repeats >= maxRepeats) throw new Error(\"Maximum wait time exceeded for execution result.\");\n await delay(options?.sleepTime ? Math.max(options.sleepTime, 500) : 2000);\n }\n if (!flowResult) throw new Error(\"Failed to retrieve server response for execution.\");\n return Promise.resolve(flowResult);\n }\n}\n\n/**\n * Handles preparing a flow input for transmission to the server.\n */\nexport class FlowExecutionResult {\n protected readonly execution: ExecutionResponse;\n\n constructor(execution: ExecutionResponse) {\n this.execution = execution;\n }\n\n /**\n * @returns The raw response from the server.\n */\n getRaw(): ExecutionResponse {\n return this.execution;\n }\n\n /**\n * @returns The nodes contained within the execution.\n */\n getNodes(): FlowExecutionNodeResult[] {\n return this.execution.nodes.map((n) => new FlowExecutionNodeResult(n));\n }\n\n /**\n * @param type The type of node to return.\n * @returns A list of nodes matching the requested type.\n */\n getNodesByType(type: NodeType): FlowExecutionNodeResult[] {\n return this.execution.nodes.filter((n) => n.type === type).map((n) => new FlowExecutionNodeResult(n));\n }\n\n /**\n * @returns A list of input nodes that exist in this execution.\n */\n getInputs(): FlowExecutionNodeResult[] {\n return this.execution.nodes\n .filter((n) => n.type === NodeType.StartTerminal)\n .map((n) => new FlowExecutionNodeResult(n));\n }\n\n /**\n * @returns A list of out put nodes that exist in this execution.\n */\n getOutputs(): FlowExecutionNodeResult[] {\n return this.execution.nodes\n .filter((n) => n.type === NodeType.EndTerminal)\n .map((n) => new FlowExecutionNodeResult(n));\n }\n\n /**\n * @returns A date object representing the point in time this execution completed.\n */\n getCompletedAt(): Date | undefined {\n if (!this.execution.completedAt) return undefined;\n return new Date(this.execution.completedAt);\n }\n\n /**\n * @returns A date object representing the point in time this execution failed.\n */\n getFailedAt(): Date | undefined {\n if (!this.execution.failedAt) return undefined;\n return new Date(this.execution.failedAt);\n }\n}\n\n/**\n * Handles preparing a flow input for transmission to the server.\n */\nexport class FlowExecutionNodeResult {\n protected readonly node: ExecutionNodeResponse;\n\n constructor(node: ExecutionNodeResponse) {\n this.node = node;\n }\n\n getId(): string {\n return this.node.id;\n }\n\n getType(): NodeType {\n return this.node.type;\n }\n\n getArtifacts(): Map<string, any> {\n return new Map(Object.entries(JSON.parse(this.node.artifacts).value));\n }\n\n getArtifactByName<T>(name: string): T {\n return this.getArtifacts().get(name) as T;\n }\n}\n\n/**\n * Handles preparing a flow input for transmission to the server.\n */\nabstract class FlowExecutionInput {\n protected readonly value: string;\n constructor(value: string) {\n this.value = value;\n }\n getRaw(): string {\n return this.value;\n }\n getValueForTransmission(): string {\n const v = this.value;\n if (v.startsWith(\"[\")) {\n return JSON.stringify(JSON.parse(v));\n } else {\n return v;\n }\n }\n}\n\n/**\n * Represents the type of object being referenced by the input.\n */\nexport const enum ObjectInputType {\n Transaction = \"Transaction\",\n Bundle = \"Bundle\",\n Product = \"Product\",\n Variant = \"Variant\",\n Option = \"Option\",\n LineItem = \"LineItem\",\n Asset = \"Asset\",\n}\n\nexport class TextInput extends FlowExecutionInput {\n constructor(input: string) {\n super(`\"${input}\"`);\n }\n}\n\n/**\n * Handles validation of spiffObject structure for transmission to the server.\n */\nexport class ObjectInput extends FlowExecutionInput {\n constructor(id: string, type: ObjectInputType) {\n // Assets aren't a UUID but most other assets will be UUID values.\n if (type !== ObjectInputType.Asset && !ObjectInput.validUUID(id))\n throw new Error(\"Invalid ID, must be a valid v4 UUID. https://www.uuidgenerator.net/\");\n // The server expects a specific structure for representing a reference to an object in our platform.\n super(`{\"isSpiffObject\": true, \"id\": \"${id}\", \"type\": \"${type}\"}`);\n }\n static validUUID(uuid: string) {\n return uuid.match(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i);\n }\n}\n\n/**\n * Handles validation of array input for transmission to the server.\n */\nexport class ArrayInput extends FlowExecutionInput {\n constructor(elements: FlowExecutionInput[]) {\n super(`[${elements.map((e) => e.getRaw()).join(\",\")}]`);\n }\n}\n","import { ProductWorkflow } from \"./productCollection\";\nimport { IntegrationProductResource } from \"./types\";\n\nexport class IntegrationProduct {\n private readonly integrationProduct: IntegrationProductResource;\n\n constructor(product: IntegrationProductResource) {\n this.integrationProduct = product;\n }\n\n getId(): string {\n return this.integrationProduct.id;\n }\n\n getResource(): IntegrationProductResource {\n return this.integrationProduct;\n }\n\n getBasePrice(): number {\n if (!this.integrationProduct.product) {\n throw new Error(\"IntegrationProductResource does not have a product\");\n }\n const basePrice = this.integrationProduct.product.basePrice || 0;\n const additionalIP = this.integrationProduct?.additionalIntegrationProduct;\n if (!additionalIP) return basePrice;\n if (additionalIP && !additionalIP.product) {\n throw new Error(\"An additional integration product was found, but it does not have a product\");\n }\n return basePrice + (additionalIP.product!.basePrice || 0);\n }\n\n getDefaultWorkflow(): ProductWorkflow {\n if (!this.integrationProduct.product) {\n throw new Error(\"IntegrationProductResource does not have a product\");\n }\n const workflows = this.integrationProduct.product.workflows || [];\n if (workflows.length === 0) {\n throw new Error(\n \"No workflows found on product. This is generally due to a configuration error. Please confirm at least one workflow is configured for this product.\",\n );\n }\n return new ProductWorkflow(workflows[0]);\n }\n\n getAllWorkflows(): ProductWorkflow[] {\n if (!this.integrationProduct.product) {\n throw new Error(\"IntegrationProductResource does not have a product\");\n }\n const workflows = this.integrationProduct.product.workflows || [];\n if (workflows.length === 0) {\n throw new Error(\n \"No workflows found on product. This is generally due to a configuration error. Please confirm at least one workflow is configured for this product.\",\n );\n }\n return workflows\n .sort((a, b) => (a.index ?? 0) - (b.index ?? 0))\n .map((workflow) => new ProductWorkflow(workflow));\n }\n}\n","import { gql } from \"@apollo/client/core\";\n\nexport const getCustomerQuery = gql`\n query GetCustomer($emailAddress: String!) {\n customer(emailAddress: $emailAddress) {\n id\n emailAddress\n hasBundleTemplates\n partner {\n id\n }\n }\n }\n`;\n\nexport const customerCreateMutation = gql`\n mutation CustomerCreate($details: CustomerDetailsInput!) {\n customerCreate(details: $details) {\n id\n emailAddress\n partner {\n id\n }\n }\n }\n`;\n\nexport const customerAuthenticateMutation = gql`\n mutation CustomerAuthenticate($loginToken: String!) {\n customerAuthenticate(loginToken: $loginToken) {\n id\n emailAddress\n stakeholders {\n id\n type\n transaction {\n id\n }\n }\n bundleStakeholders {\n id\n authorizationStatus\n authorizationDate\n authorizationNote\n type\n bundle {\n id\n transactions {\n id\n }\n }\n }\n partner {\n id\n }\n }\n }\n`;\n\nexport const customerGenerateVerificationCodeMutation = gql`\n mutation CustomerGenerateVerificationCode($emailAddress: String!) {\n customerGenerateVerificationCode(emailAddress: $emailAddress)\n }\n`;\n\nexport const customerVerifyCodeMutation = gql`\n mutation CustomerVerifyCode($emailAddress: String!, $verificationCode: String!) {\n customerVerifyCode(emailAddress: $emailAddress, verificationCode: $verificationCode) {\n id\n emailAddress\n loginToken\n partner {\n id\n }\n stakeholders {\n id\n type\n transaction {\n id\n }\n }\n bundleStakeholders {\n id\n authorizationStatus\n authorizationDate\n authorizationNote\n type\n bundle {\n id\n transactions {\n id\n }\n }\n }\n }\n }\n`;\n\nexport const customerMetafieldsQuery = gql`\n query CustomerMetafields($id: String!) {\n metafields(entityId: $id) {\n id\n createdAt\n updatedAt\n entityId\n value\n metafieldConfiguration {\n id\n createdAt\n updatedAt\n entityType\n metafieldType\n name\n }\n }\n }\n`;\n","import {\n readTransactionsQuery,\n updateTransactionWorkflowStateQuery,\n createManyTransactionsMutation,\n getIntegrationProductsQuery,\n getIntegrationProductFromExternalIdsQuery,\n getTransactionShareActionsQuery,\n currentIntegrationQuery,\n getWorkflowsQuery,\n getTransactionWithPartnerQuery,\n getWorkflowWithThemeQuery,\n getMarketplaceThemeInstallConfigurationQuery,\n getBundleForMarketplaceThemeQuery,\n getTransactionForMarketplaceThemeQuery,\n getTransactionQuery,\n} from \"./query\";\nimport { AssetManager, assetService } from \"./services/asset\";\nimport { persistenceService } from \"./services/persistence\";\nimport {\n getApplicationKey,\n graphQlManager,\n setApplicationKey,\n setBearerAuthenticationToken,\n setLocalCustomerToken,\n} from \"./services/server\";\nimport {\n Bundle as BundleEntity,\n BundleStakeholder,\n Customer,\n IntegrationProductResource,\n StakeholderType,\n Transaction,\n Extendable,\n Integration,\n AddonHandle,\n ShareAction,\n Metafield,\n BundlesFeed,\n BundleTemplateStatus,\n LayoutsState,\n Workflow,\n WorkflowPanel,\n ILayout,\n Theme,\n GlobalPropertyState,\n} from \"./types\";\nimport { ClientError, UnhandledBehaviorError } from \"./util/exception\";\nimport { ExperienceOptions, WorkflowExperience, WorkflowExperienceImpl } from \"./WorkflowExperience\";\nimport { StateMutationFunc } from \"./WorkflowManager\";\nimport { LayoutPreviewService } from \"./WorkflowManager/LayoutPreviewService\";\nimport { Bundle, BundleImpl } from \"./Bundle\";\nimport {\n createBundleMutation,\n customerBundlesFeedQuery,\n duplicateBundleMutation,\n getBundleQuery,\n getBundlesForCustomerQuery,\n} from \"./Bundle/query\";\nimport { FlowService } from \"./flowService\";\nimport promiseCache from \"./services/promiseCache\";\nimport type { ThreeDPreviewService } from \"@spiffcommerce/preview\";\nimport chunk from \"lodash.chunk\";\nimport { IntegrationProduct } from \"./integration\";\nimport { spiffCoreConfiguration } from \"./Configuration\";\nimport { isTokenExpired } from \"./services/design\";\nimport {\n getCustomerQuery,\n customerCreateMutation,\n customerAuthenticateMutation,\n customerGenerateVerificationCodeMutation,\n customerVerifyCodeMutation,\n customerMetafieldsQuery,\n} from \"./customer\";\nimport { generate } from \"./util/guid\";\nimport { rehydrateSerializedLayout } from \"./LayoutsState\";\nimport { ThemeInstallConfigurationGraphQl } from \"@spiffcommerce/theme-bridge\";\n\nconst getWorkflowsInternal = async (ids: string[], options?: GetWorkflowGraphqlOptions): Promise<Workflow[]> => {\n const response = await graphQlManager.getShadowGraphqlClient().query<{ workflows: Workflow[] }>({\n query: getWorkflowsQuery(options?.assets?.metadata || false),\n errorPolicy: \"all\",\n variables: {\n ids,\n },\n });\n if (response.error) {\n throw response.error;\n }\n if (response.errors) {\n response.errors.forEach((e) => console.error(e));\n throw new Error(\"Unable to read workflows. Consult GraphQL errors.\");\n }\n const workflows = response.data.workflows;\n if (workflows === undefined || workflows.length !== ids.length) {\n throw new Error(`Unable to read workflows: ${response.errors ?? \"Length mismatch in response\"}`);\n }\n workflows.forEach((workflow) => {\n workflow.steps.forEach((step) => {\n delete (step.data as any).__typename;\n if (step.option?.id) {\n // Cache assets and materials.\n step.option.defaultVariant?.asset && assetService.cacheAsset(step.option.defaultVariant.asset);\n step.option.colorProfile && assetService.cacheAsset(step.option.colorProfile);\n step.option.variants?.forEach((variant) => {\n variant.asset && assetService.cacheAsset(variant.asset);\n variant.thumbnail && assetService.cacheAsset(variant.thumbnail);\n variant.material && assetService.cacheMaterial(variant.material);\n });\n promiseCache.set({ id: step.option.id }, Promise.resolve(step.option));\n }\n });\n if (!workflow.finalizeStepConfig) {\n workflow.finalizeStepConfig = {};\n }\n workflow.finalizeStepConfig.termsMarkdown = (workflow as any).partner.termsMarkdown;\n });\n return workflows;\n};\n\nconst pickWorkflowFromPromise = async (id: string, promise: Promise<Workflow[]>): Promise<Workflow> => {\n const workflows = await promise;\n const workflow = workflows.find((workflow) => workflow.id === id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n return workflow;\n};\n\nexport const getWorkflows = async (ids: string[], options?: GetWorkflowGraphqlOptions): Promise<Workflow[]> => {\n const existingPromises = ids.map((id) => promiseCache.get({ id, options }));\n const uncachedIds = ids.filter((_id, index) => existingPromises[index] === undefined);\n if (uncachedIds.length === 0) {\n return Promise.all(existingPromises);\n }\n const getWorkflowsPromise = getWorkflowsInternal(uncachedIds, options);\n const uncachedPromises = uncachedIds.map((id) =>\n promiseCache.set({ id, options }, pickWorkflowFromPromise(id, getWorkflowsPromise)),\n );\n const filteredPromises = existingPromises.filter((promise) => promise !== undefined);\n return await Promise.all(filteredPromises.concat(uncachedPromises));\n};\n\nexport const getWorkflow = async (id: string, options?: GetWorkflowGraphqlOptions): Promise<Workflow> => {\n return (await getWorkflows([id], options))[0];\n};\n\n/**\n * Options that can be used during instantiation of the SpiffCommerce Javascript Client.\n * Please refer to the documentation for more information.\n */\ninterface ClientOptions {\n /**\n * The client will use the provided application key to\n * authenticate with the SpiffCommerce API. This key can be generated and replaced in Spiffcommerce Hub.\n */\n applicationKey?: string;\n}\n\nconst createLayoutsFromPanels = (panels: WorkflowPanel[]): ILayout[] => {\n return panels\n .sort((a, b) => a.index - b.index)\n .map((panel: WorkflowPanel): ILayout => {\n return {\n id: generate(),\n panelId: panel.name,\n name: panel.name,\n index: panel.index,\n createdAt: new Date(),\n updatedAt: new Date(),\n transparentBackground: panel.transparentBackground,\n height: panel.height,\n width: panel.width,\n previewRegion: panel.previewRegion,\n useEditableArea: panel.useEditableArea,\n editableArea: panel.editableArea,\n };\n });\n};\n\nconst getInitialLayouts = (transaction: Transaction, workflow: Workflow) => {\n const serializedState = transaction.workflowState;\n const initialReducerState = serializedState ? (JSON.parse(serializedState) as LayoutsState) : undefined;\n if (initialReducerState) {\n return Object.values(initialReducerState.layouts).map((state) => state.layout);\n }\n return createLayoutsFromPanels(workflow.panels);\n};\n\nexport interface GetBundleGraphqlAssetsOptions {\n metadata?: boolean;\n}\n\nexport interface GetBundleGraphqlProductCollectionOptions {\n eagerFetchProducts?: boolean;\n}\n\nexport interface GetBundleGraphqlOptions {\n productCollection?: GetBundleGraphqlProductCollectionOptions;\n assets?: GetBundleGraphqlAssetsOptions;\n additionalHeaders?: { [key: string]: string };\n}\n\nexport interface GetBundleOptions {\n /**\n * Configuration for the graphQL request made for bundles. Allows for retrieval\n * of additional data.\n */\n graphql?: GetBundleGraphqlOptions;\n}\n\nexport interface GetWorkflowGraphqlAssetsOptions {\n metadata?: boolean;\n}\n\nexport interface GetWorkflowGraphqlOptions {\n assets?: GetWorkflowGraphqlAssetsOptions;\n bundleOwnerId?: string;\n}\n\nexport interface GetWorkflowOptionsBase {\n /**\n * An existing preview service to use, instead of creating a new one.\n */\n previewService?: ThreeDPreviewService;\n\n /**\n * Configuration related to the\n * workflow and how the system interprets it.\n */\n workflowConfiguration?: {\n /**\n * False by default, when true the system will treat\n * steps with a single variant\n * as being renderable.\n */\n singleVariantsRenderable?: boolean;\n };\n\n /**\n * Configuration for the graphQL request made for workflows. Allows for retrieval\n * of additional data.\n */\n graphql?: GetWorkflowGraphqlOptions;\n}\n\nexport interface GetWorkflowFromTransactionOptions extends GetWorkflowOptionsBase {\n /** The existing Transaction to use. */\n transactionId: string;\n /** If set to true, the workflow will display in a read-only mode. */\n readOnly?: boolean;\n /** An existing workflow state, if available. */\n workflowState?: string;\n type: \"transaction\";\n}\n\nexport interface GetNewWorkflowOptionsBase extends GetWorkflowOptionsBase {\n /** A name for the new transaction. */\n designName?: string;\n /** The workflow to load. */\n workflowId: string;\n /** An existing workflow state, if available. */\n workflowState?: string;\n}\n\nexport interface GetWorkflowFromIntegrationProductOptions extends GetNewWorkflowOptionsBase {\n integrationProductId: string;\n type: \"integration\";\n}\n\nexport interface GetWorkflowFromExternalProductOptions extends GetNewWorkflowOptionsBase {\n /** The external ID associated with an integration. */\n externalIntegrationId: string;\n /** The ID of the product from the external system. */\n externalProductId: string;\n type: \"external\";\n}\n\nexport type GetNewWorkflowOptions = GetWorkflowFromIntegrationProductOptions | GetWorkflowFromExternalProductOptions;\n\nexport type GetWorkflowOptions = GetWorkflowFromTransactionOptions | GetNewWorkflowOptions;\n\ninterface ClientConfiguration {\n hubUrl: string;\n serverUrl: string;\n servicesApiUrl: string;\n marketplaceThemeInstallId?: string;\n marketplaceThemeInstallConfigurationId?: string;\n bearerAuthenticationToken?: string;\n}\n\n/**\n * The Spiff Commerce Javascript Client. Required for\n * creating workflow experiences.\n */\nexport class SpiffCommerceClient {\n private options: ClientOptions;\n private currencyCode?: string;\n private customer?: Customer;\n private activeIntegration?: Promise<Integration> = undefined;\n private marketplaceThemeInstallId?: string;\n private marketplaceThemeInstallConfigurationId?: string;\n\n constructor(options: ClientOptions) {\n this.options = options;\n\n this.options.applicationKey && setApplicationKey(this.options.applicationKey);\n\n console.debug(\"------------------------\");\n console.debug(\"Spiff Commerce Core SDK\");\n console.debug(`Version: ${__SPIFF_CORE_VERSION__}`);\n console.debug(`Application Key Provided: ${!!this.options.applicationKey}`);\n console.debug(\"------------------------\");\n }\n\n configure(configuration: ClientConfiguration) {\n spiffCoreConfiguration.setHubUrl(configuration.hubUrl);\n spiffCoreConfiguration.setServerUrl(configuration.serverUrl);\n spiffCoreConfiguration.setServicesApiUrl(configuration.servicesApiUrl);\n this.marketplaceThemeInstallId = configuration.marketplaceThemeInstallId;\n this.marketplaceThemeInstallConfigurationId = configuration.marketplaceThemeInstallConfigurationId;\n if (configuration.bearerAuthenticationToken) {\n setBearerAuthenticationToken(configuration.bearerAuthenticationToken);\n }\n if (this.options.applicationKey) {\n this.getIntegration();\n }\n }\n\n /**\n * @returns The asset manager allows for common operations related to assets\n * and the Spiff Commerce platform.\n */\n getAssetManager(): AssetManager {\n return assetService;\n }\n\n getCurrencyCode(): string {\n if (this.currencyCode === undefined) {\n throw new Error(\"No currency code set.\");\n }\n return this.currencyCode;\n }\n\n getFlowService(): FlowService {\n const appKey = getApplicationKey();\n if (!appKey) throw new Error(\"Application key required to use Flow Service.\");\n return new FlowService();\n }\n\n async getIntegration(): Promise<Integration> {\n if (this.activeIntegration) {\n return this.activeIntegration;\n }\n if (!this.options.applicationKey) {\n throw new Error(\"Cannot get current Integration without specifying an Application Key.\");\n }\n this.activeIntegration = getIntegration(this.options.applicationKey);\n return this.activeIntegration;\n }\n\n async canUseAddon(addonHandle: AddonHandle): Promise<boolean> {\n try {\n const integration = await this.getIntegration();\n return integration.partner.activeAddons?.includes(addonHandle) ?? false;\n } catch (e) {\n console.error(e);\n return false;\n }\n }\n\n // TODO: Authentication functions should probably be moved to a separate class.\n /**\n * Attempts to load persisted authentication information from local storage, and authenticate with the Spiff Commerce API.\n * @param bundleId The ID of the bundle you intend to load.\n * @returns An object containing the success status of the authentication attempt, and the type of stakeholder when successful.\n */\n async authenticateBundleFromLocalStorage(bundleId: string): Promise<{\n stakeholderType?: StakeholderType;\n success: boolean;\n }> {\n const bundleOwners = persistenceService.getMap(\"bundleOwnerIds\");\n if (bundleOwners?.has(bundleId)) {\n return Promise.resolve({ success: true, stakeholderType: StakeholderType.Owner });\n }\n const bundlePartnerMap = persistenceService.getMap(\"bundlePartnerIds\") || new Map();\n if (bundlePartnerMap.has(bundleId)) {\n const partnerId = bundlePartnerMap.get(bundleId);\n const partnerCustomerMap = persistenceService.getMap(\"partnerCustomerIds\") || new Map();\n const customerId = partnerCustomerMap.get(partnerId);\n if (customerId) {\n const success = await this.authenticateCustomerId(customerId);\n if (success) {\n const stakeholder = this.customer?.bundleStakeholders?.find(\n (stakeholder) => stakeholder.bundle?.id === bundleId,\n );\n if (stakeholder) {\n return Promise.resolve({\n success: true,\n stakeholderType: stakeholder.type,\n });\n }\n }\n }\n }\n return Promise.resolve({ success: false });\n }\n\n /**\n * Attempts to load persisted authentication information from local storage, and authenticate with the Spiff Commerce API.\n * @param transactionId The ID of the transaction that the user is attempting to load.\n * @returns An object containing the following:\n * - `customLogoLink`: A link to a custom logo to display in the header.\n * - `transactionReadOnly`: Whether or not the transaction is read-only. Shadow will not accept any changes to the transaction if this is set to true.\n * - `stakeholderType`: The type of stakeholder that the user is authenticated as.\n * - `success`: Whether or not the authentication was successful.\n * @throws An error if the transaction is not found.\n */\n async authenticateTransactionFromLocalStorage(transactionId: string): Promise<{\n customLogoLink?: string;\n transactionReadOnly?: boolean;\n stakeholderType?: StakeholderType;\n success: boolean;\n theme?: Theme;\n }> {\n const graphqlClient = graphQlManager.getShadowGraphqlClient();\n // Fetch the transaction to retrieve the associated partner ID.\n const transactionResponse = await graphqlClient.query<{ transactions: Transaction[] }>({\n query: getTransactionWithPartnerQuery,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n id: transactionId,\n },\n });\n if (!transactionResponse.data.transactions || transactionResponse.data.transactions.length === 0) {\n throw new Error(`Transaction not found: ${transactionId}`);\n }\n const transaction = transactionResponse.data.transactions[0];\n const partnerId = transaction.product?.partner?.id;\n if (!partnerId) {\n throw new Error(`Unable to read transaction: ${transactionId}`);\n }\n\n if (transaction.isOrdered) {\n return Promise.resolve({ success: false, transactionReadOnly: true });\n }\n\n // Try finding the transaction owner ID in local storage.\n const storedTransactionOwners = persistenceService.getMap(\"transactionOwnerIds\");\n if (storedTransactionOwners?.has(transactionId)) {\n return Promise.resolve({ success: true, stakeholderType: StakeholderType.Owner });\n }\n\n // Try finding the customer associated with the transaction in local storage.\n const transactionCustomers = persistenceService.getMap(\"transactionCustomerIds\");\n if (transactionCustomers?.has(transactionId)) {\n const customerId = transactionCustomers.get(transactionId) as string;\n if (customerId) {\n const success = await this.authenticateCustomerId(customerId);\n if (success) {\n const stakeholder =\n this.customer?.bundleStakeholders?.find((stakeholder) =>\n stakeholder.bundle?.transactions?.some((t) => t.id === transactionId),\n ) ||\n this.customer?.stakeholders?.find(\n (stakeholder) => stakeholder.transaction?.id === transactionId,\n );\n if (stakeholder) {\n return Promise.resolve({\n success: true,\n stakeholderType: stakeholder.type,\n });\n }\n }\n }\n }\n\n // Cannot find the transaction owner or customer in local storage.\n const workflowResponse = await graphqlClient.query<{ workflow: Workflow }>({\n query: getWorkflowWithThemeQuery,\n errorPolicy: \"all\",\n variables: {\n id: transaction.workflowId!,\n },\n });\n const workflow = workflowResponse.data.workflow;\n if (!workflow) {\n throw new Error(`Unable to read workflow: ${transaction.workflowId}`);\n }\n return Promise.resolve({\n success: false,\n theme: workflow.overrideTheme,\n customLogoLink: transaction.customLogoLink,\n });\n }\n\n clearCustomer() {\n this.customer = undefined;\n }\n\n clearCustomerForTransaction(transactionId: string) {\n const transactionCustomers = persistenceService.getMap(\"transactionCustomerIds\");\n if (transactionCustomers?.has(transactionId)) {\n transactionCustomers.delete(transactionId);\n persistenceService.setMap(\"transactionCustomerIds\", transactionCustomers);\n }\n }\n\n async customerHasBundleTemplates(emailAddress: string): Promise<boolean> {\n const graphqlClient = graphQlManager.getShadowGraphqlClient();\n const customerResponse = await graphqlClient.query<{ customer: Customer }>({\n query: getCustomerQuery,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n emailAddress,\n },\n });\n const customer = customerResponse.data.customer;\n if (!customer.id) {\n return false;\n }\n return customer.hasBundleTemplates ?? false;\n }\n\n getStakeholderTypeForTransaction(transactionId: string): StakeholderType | undefined {\n const transactionStakeholder = this.customer?.stakeholders?.find(\n (stakeholder) => stakeholder.transaction?.id === transactionId,\n );\n if (!transactionStakeholder) {\n return undefined;\n }\n return transactionStakeholder.type;\n }\n\n async getOrCreateCustomer(emailAddress: string): Promise<{\n customer: Customer;\n isAuthenticated: boolean;\n }> {\n this.customer = undefined;\n const graphqlClient = graphQlManager.getShadowGraphqlClient();\n // Grabs the customer from the API, using the application key to resolve the partner.\n const customerResponse = await graphqlClient.query<{ customer: Customer }>({\n query: getCustomerQuery,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n emailAddress,\n },\n });\n const customer = customerResponse.data.customer;\n if (!customer.id) {\n const customerCreateResponse = await graphqlClient.mutate<{ customerCreate: Customer }>({\n mutation: customerCreateMutation,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n details: {\n emailAddress,\n },\n },\n });\n const createdCustomer = customerCreateResponse.data?.customerCreate;\n if (!createdCustomer) {\n throw new Error(\"Unable to create customer.\");\n }\n this.storeCustomer(createdCustomer);\n this.customer = createdCustomer;\n return {\n customer: createdCustomer,\n isAuthenticated: false,\n };\n }\n this.storeCustomer(customer);\n const authResult = await this.authenticateCustomerId(customer.id);\n return {\n customer: this.customer || customer,\n isAuthenticated: authResult,\n };\n }\n\n getCustomer() {\n return this.customer;\n }\n\n private async authenticateCustomerId(customerId: string): Promise<boolean> {\n const graphqlClient = graphQlManager.getShadowGraphqlClient();\n const storedCustomerTokens = persistenceService.getMap(\"customerTokens\");\n if (!storedCustomerTokens?.has(customerId)) {\n return false; // Customer not found in local storage.\n }\n const storedCustomerToken = storedCustomerTokens.get(customerId) as string;\n if (!storedCustomerToken) {\n return false; // Customer not found in local storage.\n }\n const authResponse = await graphqlClient.mutate<{ customerAuthenticate: Customer }>({\n mutation: customerAuthenticateMutation,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n loginToken: storedCustomerToken,\n },\n });\n const authenticatedCustomer = authResponse.data?.customerAuthenticate;\n if (!authenticatedCustomer) {\n return false;\n }\n this.storeCustomer(authenticatedCustomer);\n setLocalCustomerToken(storedCustomerToken);\n this.customer = authenticatedCustomer;\n return true;\n }\n\n /**\n * Generates a verification code for the given email address.\n * @param emailAddress The email address to generate a verification code for. The user will be sent an email with the verification code.\n */\n async generateVerificationCode(emailAddress: string): Promise<void> {\n await graphQlManager.getShadowGraphqlClient().mutate({\n mutation: customerGenerateVerificationCodeMutation,\n variables: {\n emailAddress,\n },\n });\n }\n\n /**\n * Verifies the given email address with the given verification code.\n * @param emailAddress The email address to verify.\n * @param verificationCode The verification code to verify the email address with.\n * @returns True if the verification was successful, false otherwise.\n */\n async verifyCode(emailAddress: string, verificationCode: string): Promise<boolean> {\n const response = await graphQlManager.getShadowGraphqlClient().mutate<{ customerVerifyCode: Customer }>({\n mutation: customerVerifyCodeMutation,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n emailAddress,\n verificationCode,\n },\n });\n const customer = response.data?.customerVerifyCode;\n if (customer?.loginToken) {\n if (!customer.partner?.id) {\n throw new Error(`Unable to find customer: ${emailAddress}`);\n }\n const storedCustomerTokens = persistenceService.getMap(\"customerTokens\") || new Map();\n storedCustomerTokens.set(customer.id, customer.loginToken);\n persistenceService.setMap(\"customerTokens\", storedCustomerTokens);\n this.storeCustomer(customer);\n setLocalCustomerToken(customer.loginToken);\n this.customer = {\n ...customer,\n loginToken: undefined,\n };\n return true;\n }\n return false;\n }\n\n async getCustomerMetafields(): Promise<Metafield[]> {\n if (!this.customer?.id) {\n throw new Error(\"Customer must be logged in before calling this function.\");\n }\n const response = await graphQlManager.getShadowGraphqlClient().query<{ metafields: Metafield[] }>({\n query: customerMetafieldsQuery,\n variables: {\n id: this.customer.id,\n },\n });\n return response.data.metafields;\n }\n\n /**\n * @param collectionId Optional: The id of the product collection that the bundle can use.\n * @returns A bundle to be used for grouping and operating on large amounts of workflow experiences.\n */\n async getNewBundle(\n collectionId?: string,\n initialMetadata?: { [key: string]: string },\n options?: GetBundleOptions,\n ): Promise<Bundle> {\n const response = await graphQlManager.getShadowGraphqlClient().mutate<{ bundleCreate: BundleEntity }>({\n mutation: createBundleMutation(options?.graphql?.productCollection?.eagerFetchProducts || false),\n variables: {\n collectionId,\n initialMetadata: initialMetadata\n ? Object.entries(initialMetadata).map((k, _idx) => {\n return { key: k[0], value: k[1] };\n })\n : undefined,\n marketplaceThemeInstallId: this.marketplaceThemeInstallId,\n marketplaceThemeInstallConfigurationId: this.marketplaceThemeInstallConfigurationId,\n },\n fetchPolicy: \"no-cache\",\n });\n const bundleEntity = response.data?.bundleCreate;\n if (!bundleEntity?.id) {\n throw new Error(`Unable to create bundle`);\n }\n\n const bundlePartnerMap = persistenceService.getMap(\"bundlePartnerIds\") || new Map();\n bundlePartnerMap.set(bundleEntity.id!, bundleEntity.partner!.id);\n persistenceService.setMap(\"bundlePartnerIds\", bundlePartnerMap);\n\n // Store the bundle owner id in local storage.\n const ownerMap = persistenceService.getMap(\"bundleOwnerIds\") || new Map();\n ownerMap.set(bundleEntity.id!, bundleEntity.bundleOwnerId!);\n persistenceService.setMap(\"bundleOwnerIds\", ownerMap);\n // Return a new bundle instance for this bundle entity.\n const newBundle = new BundleImpl(this, bundleEntity, undefined, undefined, bundleEntity.bundleOwnerId, {\n eagerFetchProducts: options?.graphql?.productCollection?.eagerFetchProducts,\n });\n await newBundle.getInitializationPromise();\n return newBundle;\n }\n\n /**\n * Retrieves an existing bundle from the API, by id.\n * @param bundleId The id of the bundle to retrieve.\n * @param previewService Optional: A reference to an existing preview service to use. This can be assigned manually later.\n * @param graphqlOptions Optional: Options to configure loading the workflow.\n * @returns A bundle to be used for grouping and operating on large amounts of workflow experiences.\n */\n async getExistingBundle(\n bundleId: string,\n previewService?: ThreeDPreviewService,\n /**\n * @deprecated use GetBundleOptions instead. This attribute will be removed in the future.\n */\n graphqlOptions?: GetBundleGraphqlOptions,\n options?: GetBundleOptions,\n ): Promise<Bundle> {\n const ownerMap = persistenceService.getMap(\"bundleOwnerIds\");\n const bundleOwnerId = ownerMap?.get(bundleId);\n\n // Hack to get the token from editor's amplify.\n const keys = Object.entries(localStorage);\n const jwtTokenKey =\n keys.find(([k, _]) => {\n return k.startsWith(\"CognitoIdentityServiceProvider\") && k.endsWith(\"idToken\");\n })?.[0] || \"\";\n const jwtToken = localStorage.getItem(jwtTokenKey);\n const extraHeaders: { [key: string]: string } = {};\n if (jwtToken && !isTokenExpired(jwtToken)) {\n extraHeaders[\"Authorization\"] = `Bearer ${jwtToken}`;\n }\n\n // TODO: Update customer auth to store bundle stakeholders as well.\n const contextHeaders = {\n bundleOwnerId,\n ...extraHeaders,\n ...options?.graphql?.additionalHeaders,\n };\n const response = await graphQlManager.getShadowGraphqlClient().query<{\n globalPropertyState: GlobalPropertyState;\n bundles: BundleEntity[];\n }>({\n query: getBundleQuery(options?.graphql?.productCollection?.eagerFetchProducts || false),\n variables: {\n id: bundleId,\n },\n fetchPolicy: \"no-cache\",\n context: {\n headers: contextHeaders,\n },\n });\n if (!response.data?.bundles || response.data?.bundles.length === 0 || !response.data?.bundles[0]) {\n throw new Error(`Unable to find bundle: ${bundleId}`);\n }\n const bundleEntity = response.data?.bundles[0];\n\n const bundlePartnerMap = persistenceService.getMap(\"bundlePartnerIds\") || new Map();\n bundlePartnerMap.set(bundleEntity.id!, bundleEntity.partner!.id);\n persistenceService.setMap(\"bundlePartnerIds\", bundlePartnerMap);\n\n const bundleWrapper = new BundleImpl(this, bundleEntity, previewService, graphqlOptions, bundleOwnerId, {\n additionalHeaders: options?.graphql?.additionalHeaders,\n eagerFetchProducts: options?.graphql?.productCollection?.eagerFetchProducts,\n existingGlobalPropertyState: response.data.globalPropertyState,\n });\n await bundleWrapper.getInitializationPromise();\n return bundleWrapper;\n }\n\n /**\n * @param bundleId The id of the bundle to copy. The current context must have write access to the this bundle in order to duplicate it.\n * @param template Optional: Whether to mark the new bundle as a template. Default is false.\n * @param duplicateTransactions Optional: Whether to also duplicate the original bundle's transactions. Default is true.\n * @returns A bundle to be used for grouping and operating on large amounts of workflow experiences.\n */\n async duplicateBundle(\n bundleId: string,\n template?: boolean,\n duplicateTransactions?: boolean,\n options?: GetBundleOptions,\n ): Promise<Bundle> {\n const bundleOwnerId = persistenceService.getMap(\"bundleOwnerIds\")?.get(bundleId);\n\n // Hack to get the token from editor's amplify.\n const keys = Object.entries(localStorage);\n const jwtTokenKey =\n keys.find(([k, _]) => {\n return k.startsWith(\"CognitoIdentityServiceProvider\") && k.endsWith(\"idToken\");\n })?.[0] || \"\";\n const jwtToken = localStorage.getItem(jwtTokenKey);\n const extraHeaders: { [key: string]: string } = {};\n if (jwtToken && !isTokenExpired(jwtToken)) {\n extraHeaders[\"Authorization\"] = `Bearer ${jwtToken}`;\n }\n\n const contextHeaders = {\n bundleOwnerId,\n ...extraHeaders,\n ...options?.graphql?.additionalHeaders,\n };\n\n const response = await graphQlManager.getShadowGraphqlClient().mutate<{ bundleDuplicate: BundleEntity }>({\n mutation: duplicateBundleMutation(options?.graphql?.productCollection?.eagerFetchProducts || false),\n variables: {\n id: bundleId,\n template: template,\n marketplaceThemeInstallId: this.marketplaceThemeInstallId,\n marketplaceThemeInstallConfigurationId: this.marketplaceThemeInstallConfigurationId,\n duplicateTransactions: duplicateTransactions,\n },\n context: {\n headers: contextHeaders,\n },\n fetchPolicy: \"no-cache\",\n });\n const bundleEntity = response.data?.bundleDuplicate;\n if (!bundleEntity?.id) {\n throw new Error(`Unable to duplicate bundle`);\n }\n\n const bundlePartnerMap = persistenceService.getMap(\"bundlePartnerIds\") || new Map();\n bundlePartnerMap.set(bundleEntity.id!, bundleEntity.partner!.id);\n persistenceService.setMap(\"bundlePartnerIds\", bundlePartnerMap);\n\n // Store the bundle owner id in local storage.\n const bundleOwnerMap = persistenceService.getMap(\"bundleOwnerIds\") || new Map();\n bundleOwnerMap.set(bundleEntity.id!, bundleEntity.bundleOwnerId!);\n persistenceService.setMap(\"bundleOwnerIds\", bundleOwnerMap);\n // Return a new bundle instance for this bundle entity.\n const newBundle = new BundleImpl(this, bundleEntity, undefined, undefined, bundleEntity.bundleOwnerId, {\n eagerFetchProducts: options?.graphql?.productCollection?.eagerFetchProducts,\n });\n await newBundle.getInitializationPromise();\n return newBundle;\n }\n\n /**\n * Fetches information about the currently authenticated customer's bundles.\n * NOTE: This does not initialize a bundle for active use.\n * You must call either `getExistingBundle` or `duplicateBundle` to actually interact with a bundle.\n * @param options Options to configure the request.\n * @returns A promise that resolves with an object containing:\n * `items` - The bundles that matched the request.\n * `total` - The total number of bundles on the server that match this query.\n */\n async getBundlesForCustomer(options: {\n /** Whether to include each bundle's metadata in the response. */\n includeMetadata?: boolean;\n /** The maximum amount of bundles to return in the response. */\n limit: number;\n /** The amount of items to skip over in the server query. */\n offset: number;\n /** Undefined: Any bundle, template or not. True: The bundle must be a template. False: The bundle must not be a template */\n template?: boolean;\n /** The status of the bundle template; \"Active\" or \"Draft\". */\n templateStatus?: BundleTemplateStatus;\n }): Promise<BundlesFeed> {\n if (!this.customer?.id) {\n throw new Error(\"Customer not authenticated.\");\n }\n const { includeMetadata, ...variables } = options;\n const result = await graphQlManager.getShadowGraphqlClient().query<{ customerBundlesFeed: BundlesFeed }>({\n query: customerBundlesFeedQuery(includeMetadata ?? false),\n variables: {\n ...variables,\n id: this.customer.id!,\n },\n fetchPolicy: \"no-cache\",\n });\n return result.data.customerBundlesFeed;\n }\n\n /**\n * Retrieves all existing bundle stakeholders from the API, for the currently authenticated customer.\n * @returns An array of bundle stakeholders.\n */\n async getBundleStakeholders(): Promise<BundleStakeholder[]> {\n if (!this.customer) {\n throw new Error(\"Customer not authenticated.\");\n }\n const response = await graphQlManager.getShadowGraphqlClient().query<{ customers: Customer[] }>({\n query: getBundlesForCustomerQuery,\n variables: {\n id: this.customer.id,\n },\n fetchPolicy: \"no-cache\",\n });\n if (!response.data?.customers || response.data.customers.length === 0) {\n throw new Error(\"Unable to find customer.\");\n }\n const customer = response.data.customers[0];\n const stakeholders = customer.bundleStakeholders || [];\n const bundlePartnerMap = persistenceService.getMap(\"bundlePartnerIds\") || new Map();\n stakeholders.forEach((stakeholder) => {\n if (stakeholder.bundle?.id && stakeholder.bundle.partner?.id) {\n bundlePartnerMap.set(stakeholder.bundle.id, stakeholder.bundle.partner.id);\n }\n });\n persistenceService.setMap(\"bundlePartnerIds\", bundlePartnerMap);\n return stakeholders;\n }\n\n /**\n * Creates a new instance of WorkflowExperience. A high level wrapper for workflows.\n * @param options Options to configure loading the transaction and workflow.\n * @param previewServiceConstructor A function called during initialization. Takes a class implementing ThreeDPreviewService in return.\n * @returns A workflow experience configured as requested.\n */\n async getWorkflowExperience(\n options: GetWorkflowOptions,\n previewServiceConstructor?: (workflow: Workflow) => ThreeDPreviewService,\n ): Promise<WorkflowExperience> {\n if (!options)\n throw new Error(\"getWorkflowExperience has been called without an options object! This is not supported.\");\n const result = await this.getWorkflowExperiences([options], options.graphql);\n const exp = result[0];\n if (previewServiceConstructor) {\n await exp\n .getWorkflowManager()\n .injectIntoPreviewService(previewServiceConstructor(exp.getWorkflowManager().getWorkflow()));\n }\n return result[0];\n }\n\n /**\n * Gets multiple workflow experiences at once.\n * @param optionsArray An array of options to configure loading the transactions and workflows.\n * NOTE: The `previewService` field on the option is currently unsupported in this function, as loading multiple models at once will likely cause performance issues.\n * @param graphqlOptions Options to configure loading the workflows.\n * @returns An array of workflow experiences configured as requested.\n */\n async getWorkflowExperiences(\n optionsArray: GetWorkflowOptions[],\n graphqlOptions?: GetWorkflowGraphqlOptions,\n ): Promise<WorkflowExperience[]> {\n if (optionsArray.length === 0) {\n throw new ClientError(\"No options provided!\");\n }\n const graphQlClient = graphQlManager.getShadowGraphqlClient();\n const readTransactions = async (\n batch: {\n option: GetWorkflowFromTransactionOptions;\n index: number;\n }[],\n ) => {\n if (batch.length === 0) {\n return [];\n }\n const transactionIds = batch.map((x) => x.option.transactionId);\n const response = await graphQlClient.query<{ transactions: Transaction[] }>({\n query: readTransactionsQuery,\n variables: {\n ids: transactionIds,\n },\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n });\n const transactions = response.data.transactions;\n if (transactions.length !== batch.length) {\n const reason = response.errors?.[0]?.message || \"Unknown error\";\n throw new ClientError(`Not all transactions were found: ${reason}`);\n }\n if (!this.activeIntegration && transactions[0].integrationProduct?.integration) {\n this.activeIntegration = Promise.resolve(transactions[0].integrationProduct.integration);\n }\n return transactions.map((transaction, idx) => ({\n transaction,\n workflowId: transaction.workflowId!,\n readOnly: batch.find((x) => x.option.transactionId === transaction.id)?.option.readOnly ?? false,\n index: batch[idx].index,\n }));\n };\n const createTransactions = async (\n batch: {\n option: GetWorkflowFromIntegrationProductOptions | GetWorkflowFromExternalProductOptions;\n index: number;\n }[],\n ) => {\n if (batch.length === 0) {\n return [];\n }\n\n const response = await graphQlClient.mutate<{ transactionCreateMany: Transaction[] }>({\n mutation: createManyTransactionsMutation,\n variables: {\n inputs: batch.map((x) => ({\n integrationProductId:\n x.option.type === \"integration\" ? x.option.integrationProductId : undefined,\n externalIntegrationId:\n x.option.type === \"external\" ? x.option.externalIntegrationId : undefined,\n externalProductId: x.option.type === \"external\" ? x.option.externalProductId : undefined,\n workflowId: x.option.workflowId,\n designName: x.option.designName,\n claim: true,\n })),\n marketplaceThemeInstallId: this.marketplaceThemeInstallId,\n marketplaceThemeInstallConfigurationId: this.marketplaceThemeInstallConfigurationId,\n },\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n });\n const transactions = response.data?.transactionCreateMany;\n if (!transactions || transactions.length === 0) {\n const reason = response.errors?.[0]?.message || \"Unknown error\";\n throw new ClientError(`Failed to create transactions: ${reason}`);\n }\n return transactions.map((transaction, idx) => ({\n transaction,\n workflowId: transaction.workflowId!,\n readOnly: false,\n index: batch[idx].index,\n }));\n };\n\n const indexedOptions = optionsArray.map((x, i) => ({ option: x, index: i }));\n const transactionOptions = indexedOptions.filter((x) => x.option.type === \"transaction\") as {\n option: GetWorkflowFromTransactionOptions;\n index: number;\n }[];\n const createOptions = indexedOptions.filter(\n (x) => x.option.type === \"integration\" || x.option.type === \"external\",\n ) as {\n option: GetWorkflowFromIntegrationProductOptions | GetWorkflowFromExternalProductOptions;\n index: number;\n }[];\n\n // Split into batches of 10\n const batchedReadTransactions = chunk(transactionOptions, 10);\n const batchedCreateOptions = chunk(createOptions, 10);\n\n // Fetch all transactions\n const transactionResults = (\n await Promise.all([\n ...batchedReadTransactions.map(readTransactions),\n ...batchedCreateOptions.map(createTransactions),\n ])\n ).flat();\n const workflowIds = [...new Set(transactionResults.map((x) => x.workflowId))];\n const workflows = await getWorkflows(workflowIds, graphqlOptions);\n const workflowMap = new Map(workflows.map((x) => [x.id, x]));\n\n const ownerMap = persistenceService.getMap(\"transactionOwnerIds\") || new Map();\n const experienceOptionsPromises = transactionResults.map(async (transactionResult) => {\n const { transaction, workflowId, readOnly, index } = transactionResult;\n const workflow = workflowMap.get(workflowId)!;\n const options = optionsArray[index];\n\n // Persist the owner ID for use when updating (only when creating a new transaction)\n if (!ownerMap.get(transaction.id) && transaction.transactionOwnerId) {\n ownerMap.set(transaction.id, transaction.transactionOwnerId);\n }\n const transactionOwnerId = ownerMap.get(transaction.id) || undefined;\n const workflowExperienceOptions: ExperienceOptions = {\n product: transaction.product!,\n transaction,\n layouts: [],\n singleVariantsRenderable: options?.workflowConfiguration?.singleVariantsRenderable,\n stateMutationFunc: !readOnly\n ? async (options) => {\n return this.updateTransactionState({\n ...options,\n context: { transactionOwnerId, bundleOwnerId: graphqlOptions?.bundleOwnerId },\n });\n }\n : async () => {\n throw new UnhandledBehaviorError(\"State mutation is forbidden in read only mode!\");\n },\n readOnly,\n workflow,\n isReloadedTransaction: options.type === \"transaction\",\n };\n // We either reload initial state or we create a new one.\n if (options.type === \"transaction\" && transaction.workflowState) {\n const reloadedState: LayoutsState = JSON.parse(transaction.workflowState);\n workflowExperienceOptions.layouts = Object.values(reloadedState.layouts || {}).map((x) => x.layout);\n await rehydrateSerializedLayout(reloadedState);\n workflowExperienceOptions.reloadedState = reloadedState;\n } else if (!readOnly && options.workflowState) {\n const reloadedState: LayoutsState = JSON.parse(options.workflowState);\n workflowExperienceOptions.layouts = Object.values(reloadedState.layouts || {}).map((x) => x.layout);\n await rehydrateSerializedLayout(reloadedState);\n workflowExperienceOptions.reloadedState = reloadedState;\n } else {\n workflowExperienceOptions.layouts = getInitialLayouts(\n workflowExperienceOptions.transaction,\n workflowExperienceOptions.workflow!,\n );\n }\n\n workflowExperienceOptions.renderableContextService = new LayoutPreviewService(\n workflowExperienceOptions.layouts,\n );\n workflowExperienceOptions.delayWorkflowStateSync = true;\n\n return { experienceOptions: workflowExperienceOptions, index, options };\n });\n\n const experienceOptions = await Promise.all(experienceOptionsPromises);\n persistenceService.setMap(\"transactionOwnerIds\", ownerMap);\n const sortedExperienceOptions = experienceOptions.sort((a, b) => a.index - b.index);\n const experiencePromises = sortedExperienceOptions.map(async (x) => {\n const { experienceOptions, options } = x;\n const we = new WorkflowExperienceImpl(this, experienceOptions);\n await we.getWorkflowManager().getInitializationPromise();\n if (options.type !== \"transaction\" && this.customer) {\n await we.attachCustomerDetails({ email: this.customer.emailAddress });\n }\n return we;\n });\n const experiences = await Promise.all(experiencePromises);\n experiences.forEach((experience) => experience.getWorkflowManager().setWorkflowStateSyncEnabled(true));\n return experiences;\n }\n\n /**\n * A function used to synchronize transaction state with the server.\n * @param options New state details. To be spread into the query.\n * @returns\n */\n private updateTransactionState: StateMutationFunc = async (options) => {\n try {\n return graphQlManager.getShadowGraphqlClient().mutate({\n ...options,\n mutation: updateTransactionWorkflowStateQuery,\n });\n } catch (error) {\n console.error(error);\n throw new ClientError(\"Critical - Unable to synchronize workflow state with server.\");\n }\n };\n\n storeCustomer(customer: Customer) {\n const partnerCustomerMap = persistenceService.getMap(\"partnerCustomerIds\") || new Map();\n partnerCustomerMap.set(customer.partner!.id, customer.id);\n persistenceService.setMap(\"partnerCustomerIds\", partnerCustomerMap);\n }\n\n async getIntegrationProductById(integrationProductId: string): Promise<IntegrationProduct> {\n const graphQlClient = graphQlManager.getShadowGraphqlClient();\n const response = await graphQlClient.query<{ integrationProducts: IntegrationProductResource[] }>({\n query: getIntegrationProductsQuery,\n variables: {\n ids: [integrationProductId!],\n },\n fetchPolicy: \"no-cache\",\n errorPolicy: \"all\",\n });\n const integrationProducts = response.data?.integrationProducts;\n if (!integrationProducts || integrationProducts.length === 0 || !integrationProducts[0]?.id) {\n throw new Error(\"Integration product not found.\");\n }\n return new IntegrationProduct(integrationProducts[0]);\n }\n\n async getIntegrationProductFromExternalIds(\n externalIntegrationId: string,\n externalProductId: string,\n ): Promise<IntegrationProduct> {\n const graphQlClient = graphQlManager.getShadowGraphqlClient();\n const response = await graphQlClient.query<{ integrationProductFromExternalIds: IntegrationProductResource }>({\n query: getIntegrationProductFromExternalIdsQuery,\n variables: {\n externalProductId: externalProductId!,\n externalIntegrationId: externalIntegrationId!,\n },\n fetchPolicy: \"no-cache\",\n errorPolicy: \"all\",\n });\n const integrationProduct = response.data?.integrationProductFromExternalIds;\n if (!integrationProduct?.id) {\n throw new Error(\"Integration product not found.\");\n }\n return new IntegrationProduct(integrationProduct);\n }\n\n async getIntegrationProduct(\n options:\n | Extendable<{\n type: \"integration\";\n integrationProductId: string;\n }>\n | Extendable<{\n type: \"external\";\n externalIntegrationId: string;\n externalProductId: string;\n }>,\n ): Promise<IntegrationProduct> {\n if (options.type === \"integration\") {\n return this.getIntegrationProductById(options.integrationProductId);\n }\n return this.getIntegrationProductFromExternalIds(options.externalIntegrationId, options.externalProductId);\n }\n\n async getShareActionsForTransaction(transactionId: string): Promise<ShareAction[] | undefined> {\n const ownerMap = persistenceService.getMap(\"transactionOwnerIds\") || new Map();\n const transactionOwnerId = ownerMap.get(transactionId) || undefined;\n const response = await graphQlManager.getShadowGraphqlClient().query<{ transactions: Transaction[] }>({\n query: getTransactionShareActionsQuery,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n id: transactionId,\n },\n context: {\n transactionOwnerId,\n },\n });\n if (!response.data.transactions || response.data.transactions.length !== 1) {\n throw new Error(`Failed to fetch share actions for transaction: ${transactionId}`);\n }\n return response.data.transactions[0].transactionShareActions;\n }\n}\n\nexport const getIntegration = async (applicationKey: string): Promise<Integration> => {\n const graphqlClient = graphQlManager.getShadowGraphqlClient();\n const integrationResponse = await graphqlClient.query<{ currentIntegration: Integration }>({\n query: currentIntegrationQuery,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n context: {\n headers: {\n \"x-application-key\": applicationKey,\n },\n },\n });\n return integrationResponse.data.currentIntegration;\n};\n\nexport const getTransaction = async (transactionId: string): Promise<Transaction | undefined> => {\n const graphqlClient = graphQlManager.getShadowGraphqlClient();\n const result = await graphqlClient.query<{ transactions: Transaction[] }>({\n query: getTransactionQuery,\n errorPolicy: \"all\",\n fetchPolicy: \"network-only\",\n variables: {\n id: transactionId,\n },\n });\n if (result.data.transactions.length === 0) return undefined;\n return result.data.transactions[0];\n};\n\nexport const getOverrideThemeConfiguration = async (\n overrideThemeConfigurationId: string,\n overrideThemeInstallId: string,\n): Promise<ThemeInstallConfigurationGraphQl | undefined> => {\n const response = await graphQlManager.getShadowGraphqlClient().query<{\n marketplaceThemeInstallConfiguration: ThemeInstallConfigurationGraphQl;\n }>({\n query: getMarketplaceThemeInstallConfigurationQuery,\n errorPolicy: \"all\",\n variables: {\n themeConfigurationId: overrideThemeConfigurationId,\n themeInstallId: overrideThemeInstallId,\n },\n });\n return response.data?.marketplaceThemeInstallConfiguration;\n};\n\nexport const getBundleThemeConfiguration = async (\n bundleId: string,\n): Promise<ThemeInstallConfigurationGraphQl | undefined> => {\n const response = await graphQlManager.getShadowGraphqlClient().query<{\n bundles: { marketplaceThemeInstallConfiguration?: ThemeInstallConfigurationGraphQl }[];\n }>({\n query: getBundleForMarketplaceThemeQuery,\n errorPolicy: \"all\",\n variables: {\n id: bundleId,\n },\n });\n return response.data?.bundles?.[0]?.marketplaceThemeInstallConfiguration;\n};\n\nexport const getTransactionThemeConfiguration = async (\n transactionId: string,\n): Promise<ThemeInstallConfigurationGraphQl | undefined> => {\n const response = await graphQlManager.getShadowGraphqlClient().query<{\n transactions: Transaction[];\n }>({\n query: getTransactionForMarketplaceThemeQuery,\n errorPolicy: \"all\",\n variables: {\n id: transactionId,\n },\n });\n return response.data?.transactions?.[0]?.marketplaceThemeInstallConfiguration;\n};\n","import {\n ConfirmCallback,\n EditedCallback,\n ElementsCallback,\n InformationResultCallback,\n InitCallback,\n MakingAdjustmentsCallback,\n MandatoryCallback,\n MetadataCallback,\n SelectionCallback,\n StepMetadata,\n StepSpecificStorageCallback,\n StorageCallback,\n ValidationCallback,\n WorkflowMetadata,\n} from \".\";\nimport { WorkflowManager, InformationResult, RegionElement, SpiffCommerceClient, WorkflowExperience } from \"..\";\nimport { CanvasCommand } from \"../command\";\nimport { CommandContext, CommandState } from \"../CommandContext\";\nimport { LayoutState, Product, SerializableStep, StepStorage, VariantResource } from \"../types\";\nimport { Poller } from \"../util/Poller\";\n\nexport class MockWorkflowManager implements WorkflowManager {\n approveTransaction(_note?: string): Promise<void> {\n throw new Error(\"Method not implemented.\");\n }\n rejectTransaction(_note?: string): Promise<void> {\n throw new Error(\"Method not implemented.\");\n }\n private client: SpiffCommerceClient | undefined;\n getClient(): SpiffCommerceClient {\n return this.client ?? ({} as any);\n }\n getWorkflowExperience(): WorkflowExperience {\n return {} as any;\n }\n setClient(client: SpiffCommerceClient) {\n this.client = client;\n }\n getInitializationPromise() {\n return Promise.resolve();\n }\n getProduct: () => Product;\n isInitialized(): boolean {\n return true;\n }\n getCommandContext: () => CommandContext;\n getAllLayoutData: () => LayoutState[];\n getMetadata: (stepName: string) => StepMetadata | undefined;\n getWorkflowMetadata: () => WorkflowMetadata;\n getStepStorage: (stepName: string) => StepStorage | undefined;\n getInformationResults(): InformationResult[] {\n return [];\n }\n async reset() {}\n updateStateWithServer(_getReducerState: () => CommandState) {}\n async outstandingRequestsPromise() {}\n async updateStateWithServerImmediate(_getReducerState: () => CommandState) {}\n addPoller(_poller: Poller) {}\n addConfirmCallback(_callback: ConfirmCallback) {}\n addEditedCallback(_callback: EditedCallback) {}\n addElementsCallback(_callback: ElementsCallback) {}\n addInformationResultCallback(_callback: InformationResultCallback) {}\n addInitCallback(_callback: InitCallback) {}\n addMakingAdjustmentsCallback(_callback: MakingAdjustmentsCallback) {}\n addMandatoryCallback(_callback: MandatoryCallback) {}\n addMetadataCallback(_callback: MetadataCallback) {}\n addSelectionCallback(_callback: SelectionCallback) {}\n addStepSpecificStorageCallback(_callback: StepSpecificStorageCallback, _stepName: string) {}\n addStorageCallback(_callback: StorageCallback) {}\n getCommandDispatcher() {\n return (_command: CanvasCommand) => {};\n }\n getLayouts() {\n return [];\n }\n getLayoutPreviewService() {\n return {\n getAll: () => {\n return new Map();\n },\n } as any;\n }\n getPreviewService() {\n return undefined;\n }\n setModelContainer: (container: any) => void;\n getModelContainer() {\n return undefined;\n }\n getProfanities() {\n return [];\n }\n getRegionElements(_stepName: string) {\n return [];\n }\n getSerializedStep(_stepName: string, _serializedSteps: SerializableStep[]) {\n return undefined;\n }\n getStepSpecificServices(_stepName: string) {\n return undefined;\n }\n getTransaction() {\n return {\n id: \"\",\n };\n }\n getTransactionCustomer() {\n return undefined;\n }\n setTransactionCustomer() {\n return;\n }\n setTransactionCustomerDetails() {\n return;\n }\n getWorkflow() {\n return {\n id: \"\",\n name: \"\",\n panels: [],\n steps: [],\n showModelOnFinishStep: false,\n allowProofDownload: false,\n introduction: \"\",\n stepGroups: [],\n };\n }\n markStepsAsInitialised(_stepNames: string[]) {}\n getUpdatesPending: () => boolean;\n markUpdateCompleted(_update: string) {}\n markUpdatePending() {\n return \"123\";\n }\n getWorkflowSelections() {\n return {};\n }\n getStepSelections() {\n return {};\n }\n setCurrentAdjustingStepId(_stepId: string) {}\n setEditedStatus(_stepName: string, _status: boolean) {}\n setInformationResults(_results: InformationResult[]) {}\n setMandatoryFulfilled(_stepName: string, _status: boolean) {}\n async setSelectionsAndElements(_stepName: string, _variants: VariantResource[], _elements: RegionElement[]) {}\n toggleDesignConfirmed() {}\n updateMetadata(_stepName: string, _update: any) {}\n async updateStorage(_stepName: string, _update: StepStorage) {}\n injectIntoPreviewService(_previewService: any): Promise<void> {\n return Promise.resolve();\n }\n ejectFromPreviewService(): void {}\n setWorkflowStateSyncEnabled(_enabled: boolean) {}\n async updateTransactionShareActions() {}\n addValidationCallback(_callback: ValidationCallback) {}\n setStepError(_stepName: string, _field: string, _error: string | undefined) {}\n getStepErrors(_stepName: string) {\n return undefined;\n }\n getValidationErrors() {\n return { steps: new Map() };\n }\n async updateTransactionStakeholders() {}\n getStepTags(_stepId: string): string[] {\n return [];\n }\n}\n","import { StepHandle } from \"..\";\nimport { WorkflowManager, frameStepService, FrameService, assetService } from \"../..\";\nimport { Variant } from \"../resource/variant\";\nimport { AddonHandle, Asset, ColorDefinition, ColorOption, FrameData, FrameStepData, FrameStepStorage, PatternImageData, Step, VariantResource } from \"../../types\";\nimport { generateSVGWithUnknownColors } from \"../../util/illustration\";\n\nexport enum FrameStep {\n SelectFrame = \"SelectFrame\",\n SelectImage = \"SelectImage\",\n Position = \"Position\",\n}\nexport class FrameStepHandle extends StepHandle<FrameStepData> {\n constructor(manager: WorkflowManager, step: Step<FrameStepData>, tags: string[]) {\n super(manager, step, tags);\n }\n\n private frameService = this.manager.getStepSpecificServices(this.getId())?.frameService;\n\n selectVariant(variant: Variant) {\n const stepElements = this.manager.getRegionElements(this.step.stepName);\n return frameStepService.selectVariant(this.step, variant.getResource(), stepElements, this.manager, (v) =>\n this.setUpdateState(v),\n );\n }\n\n onFrameDataChanged(callback: (frameData: FrameData[]) => void) {\n if (!this.frameService) return;\n\n this.frameService.onFrameDataChanged((frameData) => {\n if (!frameData) return;\n callback(frameData);\n });\n }\n\n /**\n * Updates the image selection inside the frame.\n * @param asset The asset to use.\n * @param storeAsOriginal Optional: Store this asset as the original, unmodified version of the image. Default: `true`.\n * @param [recalculateOffsets=true] Optional: Recalculates the offsets of the image inside the frame. Default: `true`.\n */\n async selectImage(asset: Asset, storeAsOriginal = true, recalculateOffsets = true): Promise<void> {\n await frameStepService.selectImage(this.step, asset, this.manager, recalculateOffsets);\n if (storeAsOriginal) {\n const existingStorage = this.manager.getStepStorage(this.step.stepName)?.framePatternData || {};\n this.manager.updateStorage(this.step.stepName, {\n framePatternData: {\n ...existingStorage,\n originalAssetKey: asset.key,\n backgroundRemovedAssetKey: undefined,\n useOriginalAsset: undefined,\n },\n });\n }\n }\n\n /**\n * Returns `true` if the Background Remover is available for the current session.\n */\n async canUseBackgroundRemover(): Promise<boolean> {\n return this.manager.getClient().canUseAddon(AddonHandle.BackgroundRemover);\n }\n\n /**\n * Returns `true` if the Background Remover is available for the current session and if the associated frame has a user-supplied raster image.\n */\n async canRemoveBackground(): Promise<boolean> {\n return (\n (await this.canUseBackgroundRemover()) &&\n this.hasOriginalImageSelection() &&\n !!this.frameService?.getImageData()?.src &&\n !this.frameService?.getImageData()?.svg\n );\n }\n\n /**\n * Removes the background from an image, stores it in the state, and returns the new asset.\n * @param applyNewAsset Optionally applies the new asset as the current image selection. Default: `true`.\n * @returns A promise that resolves with the newly generated Asset.\n */\n async removeBackgroundFromImageSelection(applyNewAsset = true): Promise<Asset> {\n if (!(await this.canUseBackgroundRemover())) {\n throw new Error(\n \"The current Integration does not have access to the Background Remover. Please call canUseBackgroundRemover to ensure you disable this feature when appropriate.\",\n );\n }\n const image = await this.getOriginalImageSelection();\n if (!image) {\n throw new Error(\"You must supply an image selection before attempting to remove the background.\");\n }\n const bgRemoved = await assetService.removeBackgroundFromAsset(image);\n if (applyNewAsset) {\n await frameStepService.selectImage(this.step, bgRemoved, this.manager, false);\n }\n const existingStorage = this.manager.getStepStorage(this.step.stepName)?.framePatternData || {};\n this.manager.updateStorage(this.step.stepName, {\n framePatternData: {\n ...existingStorage,\n backgroundRemovedAssetKey: bgRemoved.key,\n useOriginalAsset: !applyNewAsset,\n },\n });\n return bgRemoved;\n }\n\n changeColors(newFills: Map<string, ColorDefinition>) {\n frameStepService.changeColors(this.step, this.manager, newFills);\n }\n\n getImageData(): PatternImageData | undefined {\n if (!this.frameService) return undefined;\n return this.frameService.getImageData();\n }\n\n async getColorOption() {\n return this.step.data.colorOption;\n }\n\n getAvailableColors(): Promise<ColorOption[]> {\n if (!this.step.data.colorPickerEnabled) {\n return Promise.resolve([]);\n }\n return frameStepService.availableColors(this.step, this.manager);\n }\n\n isColorPickerEnabled() {\n return this.step.data.colorPickerEnabled ?? false;\n }\n\n async getOriginalImageColors(): Promise<\n | {\n [key: string]: ColorDefinition;\n }\n | undefined\n > {\n const imageData = this.getImageData();\n if (!imageData?.svg) {\n return undefined;\n }\n const svgData = await generateSVGWithUnknownColors(imageData.svg);\n return svgData.colors;\n }\n\n getMaxAllowedColors(): number | undefined {\n return this.step.data.maxColors;\n }\n\n getUniqueColorCount(): number {\n return frameStepService.getUniqueColorCount(this.step, this.manager);\n }\n\n getCurrentFrameStep(\n frameData: FrameData,\n uploading?: any,\n imageUploadComplete?: any,\n variants?: VariantResource[],\n ): FrameStep {\n if (variants && variants.length > 1 && frameData === undefined) {\n return FrameStep.SelectFrame;\n }\n\n if (uploading || imageUploadComplete || this.getImageData()) {\n return FrameStep.Position;\n }\n return FrameStep.SelectImage;\n }\n\n getFrameService(): FrameService | undefined {\n return this.frameService;\n }\n\n hasOverlayImageKey() {\n return this.step.data.overlayImageKey;\n }\n\n hasOverlayImageUrl() {\n return (this.step.data as any).overlayImageUrl;\n }\n\n getWhitelistedExtensions() {\n return [\n ...this.step.data.whitelistedExtensions,\n ...(this.step.data.whitelistedExtensions.includes(\".jpg\") ? [\".jpeg\"] : []),\n ];\n }\n\n async getOriginalImageSelection(): Promise<Asset | undefined> {\n const key = this.manager.getStepStorage(this.step.stepName)?.framePatternData?.originalAssetKey;\n if (!key) {\n return undefined;\n }\n return assetService.getLocalOrFromServer(key);\n }\n\n async getBackgroundRemovedImageSelection(): Promise<Asset | undefined> {\n const key = this.manager.getStepStorage(this.step.stepName)?.framePatternData?.backgroundRemovedAssetKey;\n if (!key) {\n return undefined;\n }\n return assetService.getLocalOrFromServer(key);\n }\n\n hasOriginalImageSelection(): boolean {\n return !!this.manager.getStepStorage(this.step.stepName)?.framePatternData?.originalAssetKey;\n }\n\n hasBackgroundRemovedImageSelection(): boolean {\n return !!this.getFrameStepStorage()?.framePatternData?.backgroundRemovedAssetKey;\n }\n\n getUseOriginalImageSelection(): boolean {\n return this.getFrameStepStorage()?.framePatternData?.useOriginalAsset ?? false;\n }\n\n async setUseOriginalImageSelection(value: boolean): Promise<void> {\n const existingStorage = this.getFrameStepStorage()?.framePatternData || {};\n if (existingStorage.useOriginalAsset === value) {\n return;\n }\n const originalImage = await this.getOriginalImageSelection();\n if (!originalImage) {\n throw new Error(\"You must provide an image selection before calling setUseOriginalImageSelection\");\n }\n if (!value) {\n const bgRemoved = await this.getBackgroundRemovedImageSelection();\n if (!bgRemoved) {\n throw new Error(\n \"You must call removeBackgroundFromImageSelection before attempting to apply the image.\",\n );\n }\n await this.selectImage(bgRemoved, false, false);\n } else {\n await this.selectImage(originalImage, false, false);\n }\n this.manager.updateStorage(this.step.stepName, {\n framePatternData: { ...existingStorage, useOriginalAsset: value },\n });\n }\n\n private getFrameStepStorage() {\n return this.manager.getStepStorage(this.step.stepName) as FrameStepStorage | undefined;\n }\n}\n","import { gql } from \"@apollo/client/core\";\n\nexport const getCurrentUserDetailsQuery = gql`\n query GetLoggedInCustomer($email: String!) {\n customer(emailAddress: $email) {\n id\n }\n }\n`;\n\nexport const getCustomerTransactionsQuery = gql`\n query GetCustomerTransactions(\n $id: String!\n $limit: Int!\n $offset: Int!\n $startDate: String\n $endDate: String\n $filters: TransactionFiltersInput\n $quicksearch: String\n ) {\n customerTransactionsFeed(\n id: $id\n limit: $limit\n offset: $offset\n startDate: $startDate\n endDate: $endDate\n filters: $filters\n quicksearch: $quicksearch\n ) {\n items {\n id\n createdAt\n designName\n integrationType\n status\n workflowState\n workflowViewerLink\n workflowViewerReadOnlyLink\n product {\n id\n name\n }\n }\n total\n }\n }\n`;\n\nexport const setTransactionDesignName = gql`\n mutation SetTransactionDesignName($id: String!, $name: String!) {\n transactionUpdate(id: $id, designName: $name) {\n id\n designName\n }\n }\n`;\n\nexport const duplicateTransactionMutation = gql`\n mutation DuplicateTransaction($id: String!, $template: Boolean!) {\n transactionDuplicate(id: $id, template: $template) {\n id\n workflowViewerLink\n }\n }\n`;\n\nexport const getCustomerBundlesQuery = gql`\n query GetCustomerBundles($id: String!, $limit: Int!, $offset: Int!) {\n customerBundlesFeed(id: $id, limit: $limit, offset: $offset) {\n items {\n id\n workflowViewerLink\n createdAt\n name\n ordered\n }\n total\n }\n }\n`;\n\nexport const getTransactionsForBundleQuery = gql`\n query GetTransactionsForBundle($id: String!) {\n bundles(ids: [$id]) {\n id\n transactions {\n id\n createdAt\n designName\n integrationType\n status\n workflowState\n workflowViewerLink\n workflowViewerReadOnlyLink\n product {\n id\n name\n }\n }\n }\n }\n`;\n\nexport const setBundleName = gql`\n mutation SetBundleName($id: String!, $name: String!) {\n bundleUpdate(id: $id, name: $name) {\n id\n name\n }\n }\n`;\n\nexport const duplicateBundleMutation = gql`\n mutation DuplicateBundle($id: String!, $template: Boolean!) {\n bundleDuplicate(id: $id, template: $template) {\n id\n workflowViewerLink\n }\n }\n`;\n\nexport const getTemplateBundlesQuery = gql`\n query GetBundleTemplates($id: String!, $limit: Int!, $offset: Int!) {\n customerBundlesFeed(id: $id, limit: $limit, offset: $offset, template: true) {\n items {\n id\n workflowViewerLink\n createdAt\n name\n ordered\n }\n total\n }\n }\n`;\n","import { graphQlManager } from \"../services/server\";\nimport { Bundle, BundlesFeed, Transaction } from \"../types\";\nimport { duplicateBundleMutation, duplicateTransactionMutation, getCurrentUserDetailsQuery, getCustomerBundlesQuery, getCustomerTransactionsQuery, getTemplateBundlesQuery, getTransactionsForBundleQuery, setBundleName, setTransactionDesignName } from \"./queries\";\n\nexport const nameBundle = async (id: string, name: string, context: any) => {\n return await graphQlManager.getShadowGraphqlClient().mutate<object>({\n mutation: setBundleName,\n errorPolicy: \"all\",\n variables: {\n id,\n name,\n },\n context,\n });\n};\n\nexport const nameTransaction = async (id: string, name: string) => {\n return await graphQlManager.getShadowGraphqlClient().mutate<object>({\n mutation: setTransactionDesignName,\n errorPolicy: \"all\",\n variables: {\n id,\n name,\n },\n });\n};\n\nexport const duplicateBundle = async (id: string, template: boolean) => {\n const dupe = await graphQlManager.getShadowGraphqlClient().mutate<{ bundleDuplicate: Bundle }>({\n mutation: duplicateBundleMutation,\n errorPolicy: \"all\",\n variables: {\n id,\n template,\n },\n });\n return dupe;\n};\n\nexport const duplicateTransaction = async (id: string, template: boolean) => {\n const dupe = await graphQlManager\n .getShadowGraphqlClient()\n .mutate<{ transactionDuplicate: Transaction }>({\n mutation: duplicateTransactionMutation,\n errorPolicy: \"all\",\n variables: {\n id,\n template,\n },\n });\n return dupe;\n};\n\nexport const getCustomer = async (email: string) => {\n const queryResponse = await graphQlManager.getShadowGraphqlClient().query<{ customer: { id: string } }>({\n query: getCurrentUserDetailsQuery,\n errorPolicy: \"all\",\n variables: {\n email,\n },\n });\n return queryResponse.data.customer;\n};\n\nexport const getCustomerBundles = async (customerId: string, limit: number, offset: number) => {\n const rows = await graphQlManager.getShadowGraphqlClient().query<{\n customerBundlesFeed: BundlesFeed;\n }>({\n query: getCustomerBundlesQuery,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n id: customerId,\n offset,\n limit,\n },\n });\n return rows;\n};\n\nexport const getTransactionsForBundle = async (id: string, context: any) => {\n return await graphQlManager.getShadowGraphqlClient().query<{\n bundles: { id: string; transactions: Transaction[] }[];\n }>({\n query: getTransactionsForBundleQuery,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n id,\n },\n context,\n });\n};\n\ninterface TransactionsFeed {\n items: Transaction[];\n total: number;\n}\n\nexport const getUnorderedTransactions = async (customerId: string, limit: number, offset: number) => {\n const response = await graphQlManager.getShadowGraphqlClient().query<{\n customerTransactionsFeed: TransactionsFeed;\n }>({\n query: getCustomerTransactionsQuery,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n id: customerId,\n quicksearch: \"\",\n filters: {\n link: \"and\",\n status: {\n operator: \"isAnyOf\",\n values: [\"Created\", \"DesignCompleted\", \"ExternallyOrdered\"],\n },\n template: {\n value: \"false\",\n },\n },\n offset,\n limit,\n },\n });\n return response?.data.customerTransactionsFeed?.items || [];\n};\n\nexport const getOrderedTransactions = async (customerId: string, limit: number, offset: number) => {\n const response = await graphQlManager.getShadowGraphqlClient().query<{\n customerTransactionsFeed: TransactionsFeed;\n }>({\n query: getCustomerTransactionsQuery,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n id: customerId,\n quicksearch: \"\",\n filters: {\n link: \"and\",\n status: {\n operator: \"equals\",\n value: \"Ordered\",\n },\n template: {\n value: \"false\",\n },\n },\n offset,\n limit,\n },\n });\n return response?.data.customerTransactionsFeed?.items || [];\n};\n\nexport const getTemplateTransactions = async (customerId: string, limit: number, offset: number) => {\n const response = await graphQlManager.getShadowGraphqlClient().query<{\n customerTransactionsFeed: TransactionsFeed;\n }>({\n query: getCustomerTransactionsQuery,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n id: customerId,\n quicksearch: \"\",\n filters: {\n link: \"and\",\n template: {\n value: \"true\",\n },\n },\n offset,\n limit,\n },\n });\n return response?.data.customerTransactionsFeed?.items || [];\n};\n\nexport const getTemplateBundles = async (customerId: string, limit: number, offset: number) => {\n const rows = await graphQlManager.getShadowGraphqlClient().query<{\n customerBundlesFeed: BundlesFeed;\n }>({\n query: getTemplateBundlesQuery,\n errorPolicy: \"all\",\n fetchPolicy: \"no-cache\",\n variables: {\n id: customerId,\n offset,\n limit,\n },\n });\n return rows?.data.customerBundlesFeed?.items || [];\n};\n"],"names":["AssetType","AspectType","StepType","StepAspectType","LayoutRenderingPurpose","LayoutElementType","ShareActionType","IntegrationType","AddonHandle","ProductCameraRig","ProductCameraRig2","ConversionLocation","ConversionDataType","StakeholderType","TextAlgorithm","ScaleAxis","ScaleAxis2","UnitOfMeasurement","CustomError","message","ConfigurationError","OptionNotFoundError","step","LayoutNotFoundError","region","AssetNotFoundError","variant","ResourceNotFoundError","asset","MisconfigurationError","ImplementationError","UnhandledBehaviorError","ParseError","ClientError","ResourceGenerationError","LocalStorageService","key","val","serialisedMap","mapSerialised","InMemoryStorageService","buildPersistentStorage","persistenceService","Configuration","serverUrl","callback","servicesApiUrl","hubUrl","spiffCoreConfiguration","domImpl","fetchImpl","registerWindowImplementation","impl","registerFetchImplementation","constructWindow","fetch","input","init","arrayBufferMimeTypeCache","arrayBufferFileCache","textFileCache","getFromArrayBufferCache","url","cachedPromise","ab","resp","_a","getFromTextCache","hasCapabilities","capabilities","cap","createElement","tag","createElementNS","namespace","elem","domParser","dom","fetchAsArrayBuffer","externalUrl","allowCache","resolve","reject","response","err","fetchAsString","renderPapyrusComponentAsString","component","renderToStaticMarkup","fontFaceCache","loadFontFaceSet","font","familyName","fontFace","promise","xmlSerializer","toBase64","getMimeTypeOfArrayBuffer","arrayBuffer","getMimeTypeFromArrayBuffer","uint8arr","len","signatureArr","i","signature","mimeTypeData","dataUrlFromExternalUrl","blob","type","webBlobToDataUrl","uint8ArrayToString","array","binary","arrayBufferToDataUrl","mimeType","uint8Array","binaryString","b64","svgToDataUrl","svgString","dataUrlToArrayBuffer","dataUrl","uri","firstComma","meta","base64","data","c","a","e","target","localCustomerToken","setLocalCustomerToken","customerToken","applicationKey","setApplicationKey","getApplicationKey","bearerAuthenticationToken","setBearerAuthenticationToken","token","getHubAuthentication","onAuthenticationReceived","event","getServerAuth","localAuthObj","GraphQlManager","httpLink","createHttpLink","authLink","setContext","_request","operationContext","headers","newHeaders","auth","bearer","partnerId","activeIntegration","transactionOwnerId","bundleOwnerId","hub","traceHeaders","value","errorLink","onError","operation","graphQLErrors","networkError","errors","removeTypenameLink","removeTypenameFromVariables","ApolloClient","from","InMemoryCache","graphQlManager","createCanvasInternal","loadImageInternal","createCanvas","width","height","module","documentCanvasModule","setCanvasModule","loadImage","src","allowCrossOrigin","throwOnError","_type","canvas","image","getDomParser","supportsAutoOrientation","getExifOrientation","exifr","orientation","requiresCanvasOrientation","img","canvasDims","aspectRatio","getScaledAndOrientedCanvas","canvasWidth","canvasHeight","orientedWidth","orientedHeight","ctx","getAttributesFromArrayBuffer","assetMetadataFragment","gql","assetFragment","includeMetadata","getAssetsQuery","materialFragment","getMaterialsQuery","createAssetMutation","removeBackgroundFromAssetMutation","getAssets","assetKeys","getMaterials","ids","createAsset","name","anonymous","temporary","AssetService","file","attributes","dataUrlToBlob","assetKey","resolver","material","id","assetType","onProgress","creationResponse","req","responseData","AssetStorage","isRaster","fileInfo","originalKey","BGRMStorage","removeResponse","_b","assetResponse","ext","extension","ASSET_PERSISTENCE_KEY","_AssetStorage","newPersistentAssetsMap","oldPersistentAssets","uploadedAssetsMap","entryToRemove","m","cb","BGRM_ASSET_PERSISTENCE_KEY","bgRemovedKey","cache","map","assetService","PromiseCache","keyString","promiseCache","optionFragment","getOptionsQuery","getOptionsInternal","option","findOptionFromPromise","getOptions","existingPromises","uncachedIds","_id","index","getOptionsPromise","uncachedPromises","filteredPromises","OptionService","selectedVariantIds","thumbnail","thumbThumb","v","thumbCdn","assetThumb","assetCdn","variants","optionService","activeIntegrationFragment","additionalProductFragment","createManyTransactionsMutation","stakeholderFragment","transactionShareActionFragment","readTransactionsQuery","updateTransactionWorkflowStateQuery","updateTransactionQuantityQuery","getTransactionQuery","getTransactionShareActionsQuery","readWorkflowStates","IntegrationProductFragment","getIntegrationProductsQuery","getIntegrationProductFromExternalIdsQuery","getTransactionStakeholdersQuery","finalizeUpdateTransactionMutation","regionFragment","lookAtAnimationFragment","renderingPipelineConfigurationFragment","modelAnimationFragment","getWorkflowsQuery","includeAssetMetadata","getTransactionWithPartnerQuery","getWorkflowWithThemeQuery","marketplaceThemeInstallConfigurationFragment","getMarketplaceThemeInstallConfigurationQuery","currentIntegrationQuery","getTransactionForMarketplaceThemeQuery","getBundleForMarketplaceThemeQuery","silentStepTypes","getAllScenes","workflow","scenes","group","findGroupForStep","existingScene","scene","finishSceneTitle","stepName","stepGroups","stepConditionsAreSatisfied","stepSelections","condition","originatingStepData","selectedVariants","reqVariant","selVariant","filterSceneByConditions","filteredScene","getActiveScenes","allScenes","getRenderableRelevantScenes","singleVariantsRenderable","activeScenes","stepsWithRenderableConfiguration","renderableScenes","renderableScene","QueueablePromise","PromiseQueue","queueMaxSize","enabled","queueLength","item","getDefaultVariant","patternImageDataCache","frameDataCache","frameDataPromiseCache","generateFrameSVG","generateDefaultRectangleFrameSvg","getVariant","designInputStepData","getFrameData","frameSvg","frameDataPromise","frameDocument","svg","viewBox","viewBoxElems","viewBoxHeight","viewBoxWidth","elementById","elementByClass","path","calculateOffsets","imageData","frameData","nondefaults","forceImageCover","frameAspectRatio","imageAspectRatio","scaleFactor","frameCenterHorizontal","frameCenterVertical","defaultLeft","left","defaultTop","top","getPatternImageData","parsed","dataUriToBuffer","svgStringDimensions","svgData","GetSVGDimensions","isJpgExtension","svgText","lengthToPixels","length","svgElement","viewBoxValues","str","pmsValues","hexValues","rgbValues","h","pmsToRgb","color","idx","rgbToPms","matchHexToPms","hex","maxDistance","pmsColors","distances","match","r","g","b","r1","g1","b1","dist","it","pmsHexData","pms","fuse","Fuse","findPmsColors","limit","colorContext","browserColorToHex","sanitizeHexCode","sanitized","hexCode","colorDefinitionPrintValue","colorDefinition","spot","spotColorDefinitionString","spotColorDefinition","profileNameStrWithoutSpaces","amountToSlice","svgColorValueToDefinition","parts","matchedFunctionArgs","params","fillableTagNames","replaceableStyleNames","traverse","node","f","child","matchingSelector","selector","sanitizeSvgTree","root","preserveAspectRatio","rules","parse","rule","nodeStyle","_c","styles","style","trimmed","field","fieldDowncased","decl","svgStringToElement","setSvgDimensions","svgRoot","setSvgColors","colors","includeSpotColors","fill","className","stroke","svgElementToString","modifySVGWithElementProperties","modifySVGColors","parseSvg","svgBody","svgRegex","svgMatches","generateSVGWithUnknownColors","fillValue","alphanumericFill","strokeValue","rebuiltSvg","generate","s4","SVGLayout","backgroundColor","outlineColor","borderRadius","configuration","elements","maxHeight","maxWidth","outlineArea","position","rx","strokeScale","calculatedViewbox","viewboxString","maskId","defs","jsx","colorProfileElements","elementsWithConfiguration","el","sortedElements","sortElementsByLayersWithIndex","jsxs","elementFactory","getAxisAlignedBoundingBox","x","y","rotation","rotationRadians","degreesToRadians","halfX","halfY","midX","midY","sin","cos","c1x","c2x","c1y","c2y","transformedC1X","transformedC2X","transformC1Y","transformedC2Y","extentX","extentY","findAngle","bc","ac","degrees","isCloseToValue","allowableDistance","getTrueCoordinates","point","pointOfRotation","s","getPointOfRotation","nwPoint","sePoint","getNWPoint","bounds","element","scaleX","scaleY","getNEPoint","getSEPoint","turnRightClockwise","dir","currentDirection","originalDirection","getElementVertices","canvasBounds","scale","radians","unrotatedTopLeft","unrotatedTopRight","unrotatedBottomRight","unrotatedBottomLeft","rotateAroundPoint","p","angleRadians","mmPerPixel","cmPerPixel","Image","props","angleInRadians","rotC","rotS","Group","clipPathId","Fragment","Frame","patternLinkId","thresholdFilterId","getFrameContentSrc","modifiedSvg","thresholdTableValues","renderDefinitions","getFrameContent","patternX","patternY","patternWidth","patternHeight","_d","patternScaleX","_e","patternScaleY","_f","patternRotation","_g","_h","_i","_j","metricCache","FontMetrics","text","oldGlyphs","newGlyphs","glyphs","ascent","descent","glyph","metrics","valuesForFirst","valueForSecond","chars","isDataURL","loadFontCache","loadFont","getFontMetrics","opentype","cacheFontMetrics","buffer","_loadFontExternalDataURL","assetUrl","oldCache","newCache","clampWidth","lines","currentWidth","fontScale","charWidth","getLines","fontSize","lineHeight","lh","defaultLineHeightFactor","processedLines","line","splitLineUntilFit","calculatedLines","li","allChars","regionWidth","initialWidth","textWidth","middle","splitA","splitB","allWords","firstWordIndex","firstWord","split","tempWords","lastWordIndex","fits","nextWord","wordsWidth","calcFontSize","desiredWidth","lineWidth","desiredHeight","fontSizeW","fontSizeH","refitTextbox","updatedText","updatedElement","previousElement","fallbackLines","oneAxisChange","recalculateTextboxRegion","currentRegion","fontData","textLines","align","candidateRegion","requiredWidth","zip","lineA","lineB","fontSizeStep","kerningValue","transformationDefaults","applyTextTransformations","options","result","xs","ys","getTextAlignment","isVertical","getAnchor","recomputeTextOnElement","newText","oldEl","calculatedText","Textbox","curvedPathId","textFillId","xTranslation","yTranslation","getFill","TextPath","TextSpan","getLineHeight","fallbackLineheight","getX","getY","halfBoxHeight","reverseIdx","middleLineIdx","targetId","Illustration","transform","CommandContext","command","leaveOffUndoStack","mostRecentCommand","undoneState","mostImminentCommand","sequenceId","initialState","layoutId","transactionState","layout","els","layoutNamesWithDupes","getSvgElement","layouts","reloadedState","newState","CreateLayoutCommand","state","renderingConfiguration","filteredElements","items","aLayer","bLayer","aLayerIndex","bLayerIndex","nextIndexForLayer","layer","maxIndex","getIllustrationBody","svgPromiseCache","svgObjectURL","getCanvasObjectURLAsync","pith","Pith","widthString","heightString","cachedIllustrationQuality","aspect","centralRegion","link","opts","coords","lesserDim","size","oldHeight","calculatedTextWidth","LayoutElementFactory","fontSrc","designInputStep","inputText","replacedText","recomputedElement","fittedRegion","elementKey","objectURL","ElementNotFoundError","findElement","findLayoutForElement","layoutForElement","layoutState","updatedLayoutForElement","updatedElements","layeredElements","rehydrateSerializedLayout","layoutNames","layoutName","illustration","illustrationBody","frame","layoutKey","illustrations","fonts","CanvasCommand","UpdateWorkflowStateCommand","serializableWorkflow","MoveCommand","updatedLayout","RotateCommand","angle","ResizeCommand","textbox","GroupCommand","commands","accumulatedState","curCommand","CreateElementCommand","currentElementsInLayout","newElements","finalElement","productOverlay","updatedLayoutsForElement","newIndex","elementArray","lastIndexOfLayer","DeleteElementCommand","elementFound","filteredLayouts","finalLayouts","FontColorCommand","textFillSpotColor","FontImageFillCommand","imageFill","FontSizeCommand","FontSourceCommand","FontAlignmentCommand","UpdateFramePattern","offsets","targetLayout","existingPattern","newLayout","UpdateFrameThresholdSettingsCommand","useThreshold","invertThreshold","threshold","thresholdSaturation","UpdateImageSourceCommand","TextChangeCommand","IllustrationColorCommand","newColors","oldColor","IllustrationCacheCommand","BringToFrontCommand","l","fromIndex","BringToBackCommand","BringForwardCommand","toIndex","SendBackwardsCommand","getBoundedOffsets","newOffsets","mustCover","newWidth","newHeight","covering","zoomMinimumBound","boundedWidth","boundedHeight","boundToRange","bounded","min","max","FrameService","initialZoom","debounce","workflowManager","storage","frameStorage","changed","frameSource","newFrameData","existingFrameData","isEqual","frameDataChangeListener","targetElements","paths","zoom","cX","cY","onComplete","calculatedOffsets","xoff","yoff","dX","dY","zoomChangeListener","recalculateOffsets","forceUpdate","patternData","offset","settings","newListener","thresholdSettings","commandDispatcher","elementID","minimumScale","SilentStepHandler","config","product","assetFromProduct","newElement","promises","shortenUrl","longUrl","shortenerUrl","Poller","predicate","onSuccess","onFailure","interval","maxAttempts","DigitalContentStepService","stepData","reducerState","serializedStep","regionElements","shortUrl","getMpegLink","videoLink","linkData","protocolPrefix","urlBuilder","builtUrl","createElementForRegion","dataUri","urlToString","regionElement","digitalContentStepService","FrameStepService","initialPatternOverride","bundle","stateManager","uploadAspect","defaultVariant","frameSvgs","finish","storageColors","patternSrc","frameService","variantId","_workflowManager","colorOption","assetSrc","existingSrc","svgVersion","setFrameIsUpdating","colorSafeSvg","originalSvg","matches","svgAndColors","newFills","colorData","unique","newFill","maxColors","loadedPattern","initZoom","createdData","existingImage","removeExistingCommands","pattern","newElementId","createCommands","d","cdnLink","updateId","frameStepService","IllustrationStepService","regionEls","elementsForStep","illustrationWidth","illustrationHeight","getAllLayouts","layoutElement","spotColor","colorsForCommand","setIsUpdating","deletionCommands","elementsWithCommands","commandList","availableColors","colorEntries","entry","illustrationStepService","MaterialStepService","modelContainer","variantPromises","matName","setApplying","materialStepService","ModelStepService","highlightedRef","modelRef","modelStepService","ModuleStepService","error","setError","profanityFilter","createElementFromRegion","existingKey","results","maxLength","words","word","profanity","moduleStepService","PictureStepService","pictureStepService","QuestionStepService","questionStepService","ShapeStepService","manager","stepElement","colourOption","existingColor","getColor","updateCommand","newColor","shapeStepService","Toast","errorMessage","errorType","toast","linesThatFit","linesToBreak","amountLines","widthsPerLine","couldStillFit","textboxWidth","idxWidestLine","iMax","arr","widestLine","foundGoodSpacing","idxOfSpace","splitLine","splitWidths","determineCorrectFontSizeAndLines","curFontSize","sizeRange","nonUserMin","calculatedFontSize","defaultFontSize","FontLoadError","allowableGlyphs","RegionLayoutMissingError","TextStepService","filteredText","badCharacterCodes","opentypeFont","searchableGlyphs","char","errorData","defaultImageFillVariant","imageFillLink","imageFillDataRaw","imageFillData","cached","alignment","imageFillOption","imageFillUrls","fillImage","customiseAllText","injectedText","processedText","correctFontSizes","correctLineLists","newFontSize","newLines","setHelperText","colorProfileAsset","finalFilteredName","fontSourceCommands","groupCommand","textStepService","fontAsset","fontUrl","imageFillCommands","sizingCommand","newlyCreatedData","currentText","transformedText","addFontToRegion","elementId","defaultColor","startingFill","sizingCommands","newCommand","newElementData","InformationMessageType","correctFontSize","textChangeCommand","fontSizeCommand","curFontData","setFlashRedError","existingRegionEls","newHelperText","ModuleProduct","fontWoffDataUrl","backgroundSvg","svgElem","svgRect","svgUse","initSvgFromBackground","bgWidth","bgHeight","addDef","defText","addBackground","backgroundImg","uuid","dropShadow","dx","dy","blur","shadow","feOffset","feGaussianBlur","feBlend","fixCase","transformTextEnclosure","textEnclosure","textBbox","boundsHeight","boundsWidth","heightPaddingFactor","widthPaddingFactor","heightPadFactor","widthPadFactor","textRect","boundsScaleFactor","shiftLeft","shiftTop","textRectHeight","textRectWidth","heightRatio","widthRatio","segmentSchemas","Warp","pathElements","pathElement","pathString","pathData","transformer","prevType","segment","output","outputType","first","schema","property","outputValue","segmentExpr","numberExpr","segmentMatch","numbers","relative","segmentData","j","pointGroups","oldPoints","newPoints","newPath","Favourites","parsedtext","basePath","pathSvg","box","pathWidth","textSvg","gdefs","layer0","layer1","layer2","layer3","boundsLeft","boundsTop","boundsRect","svgPathBbox","fontTtfDataUrl","Maltesers","backgroundShortSvg","useShort","backgroundToUse","pathHeight","warp","Vegemite","thick","rootElement","textGroup","moduleResolver","moduleName","bg","bgShort","backgrounds","globalPropertyStateAspectFragment","createGlobalPropertyStateMutation","updateGlobalPropertyStateMutation","productFields","productCollectionProductFieldsFragment","productCollectionFieldsFragment","eagerFetchProducts","getBundleQuery","getBundleStakeholdersQuery","getBundlesForCustomerQuery","getProductCollectionProductsQuery","getProductCollectionProductsFilteredQuery","createBundleMutation","duplicateBundleMutation","updateBundleMutation","bundleAddTransactionMutation","bundleAddTransactionsMutation","bundleRemoveTransactionMutation","bundleRemoveTransactionsMutation","bundleAddStakeholderMutation","bundleRemoveStakeholderMutation","bundleUpdateStakeholdersMutation","bundleUpdateTransactionOrderMutation","bundleAssignProductCollectionMutation","customerBundlesFeedQuery","finalizeUpdateBundleMutation","bundleApprovalQuery","bundleRejectionQuery","transactionApprovalQuery","transactionRejectionQuery","STATE_DEBOUNCE_TIME","WorkflowStatePromise","update","InternalWorkflowManager","experience","client","commandContext","updateTransaction","transaction","previewService","renderableContextService","readOnly","isReloadedTransaction","delayWorkflowStateSync","previewHandles","previewBridge","fireReloadAnimation","finalConfig","lookAt","modelAnim","introducedSilentSteps","silentStepElements","silentCommands","poller","customer","details","container","selections","stepStorage","stepNames","stepInitialised","up","status","stepId","stepErrors","refocusCamera","newStorage","workflowCommand","steps","stepStructure","workflowState","fullState","deepClone","cloneDeep","dehydrated","lay","obj","fieldName","filterOutAllElementsFromSteps","existingStepElements","stepsWithoutOldElements","newListOfStepElements","regionElementToRemove","currentRegionElement","selectionsToRemove","invalidVariants","handlingReload","executeSilentStep","uninitializedSteps","silentStepPromises","silentStepResults","stepResult","serializedSteps","shareActions","note","oldSelections","total","current","vs","acc","oldScenes","newScenes","oldSilentSteps","newStep","oldStep","invalidCanvasRegions","services","regionEl","deleteCommands","invalidModelVariants","removalPromises","im","stepsPerScene","stepPromises","frameStepData","stepCwfs","cwf","followups","followup","traversableScenes","Variant","locales","thumb","full","_StepHandle","tags","variantResource","configurationId","preview","modelAnimation","lookAtAnimation","StepHandle","IllustrationStepHandle","newFillMap","MaterialStepHandle","ModelStepHandle","PictureStepHandle","QuestionStepHandle","ShapeStepHandle","colorVariant","TextStepHandle","stepElements","shouldCustomizeAll","customiseableText","userInput","layoutElements","filteredUserInput","maxLengthExceeded","regionless","candidateMetadata","helperData","defaultText","_color","InformationStepHandle","DigitalContentStepHandle","ModuleStepHandle","StepHandleFactory","FrameStepHandle","createDesignTransactionFragment","createDesignMutation","createDesignsMutation","isTokenExpired","expiry","createDesignGqlCall","designDetails","jwtTokenKey","k","_","jwtToken","extraHeaders","createDesignsGqlCall","designDetail","formatMetadata","metadata","forCart","metadataObjectForStep","formattedMetadata","stepMetadata","colorString","prepareExportedData","designWorkflowMetadata","exportedData","distinctStepTitles","stepTitle","selection","createDesignMessage","generatedSku","lineItemImageLink","processExecutionId","baseCost","optionsCost","ownerId","msgObject","createDesignDetails","getReducerState","workflowSelections","designName","createPreviewImage","workflowMetadata","serverState","serverWorkflowState","cameraOrientation","shouldUploadThreeDimPreview","cartMetadata","designMetadata","getSelections","cartSelectionsWithPrices","cartSelections","designSelectionsWithPrices","designSelections","previewImageUrl","previewImageBlob","metadataList","selectionsList","createDesign","onProgressUpdate","createDesignResponse","upToDateTransaction","createDesigns","states","serverWorkflowStates","createDesignResults","createDesignsResponse","design","createDesignResult","DesignService","func","persistedString","transactionId","newDesigns","listener","title","designs","designService","addTransactionStakeholderMutation","WorkflowExperienceEventType","WorkflowExperienceImpl","experienceOptions","request","callbackOptions","workflowScene","newSteps","isThreeD","resolution","res","defaultPanelIndex","targetPanel","defaultLayout","objectUrl","cachedHandle","createdHandle","sg","disablePriceBreaks","totalSelectionCost","includeAdditionalProduct","basePrice","additionalPrice","integrationProduct","additionalProductPrice","subUnits","percentage","finalPrice","priceBreaks","totalQuantity","exp","pb","updatedPriceBreak","wfe","filter","bundleProperties","filterIds","targetSteps","originatingSteps","getGlobalPropertyFromConfig","targetStep","uniqueProperties","propertyConfigurations","originatingStep","properties","actualProperty","requiredProperty","curVariant","stakeholder","transactionCustomerIds","saveData","existingTitle","savedWorkflowState","integrationProductId","capturePreviewImage","show3D","exportedMetadata","variantSelections","metadataType","quantity","ownerMap","events","evt","handleDigitalContentStep","digitalContentStep","baseUrl","videoSource","finalUrl","urlToQrString","regions","handleFrameStep","frameStep","createFrameAndPattern","handleIllustrationStep","illustrationStep","fillName","replacementColors","handleModuleStep","moduleStep","handlePictureStep","pictureStep","handleShapeStep","shapeStep","handleSilentStep","silentStep","productOverlayImageUrl","assetSource","fetchedSrc","sanitizeSvg","rawSvg","handleTextStep","textStep","textAlign","getFontUrl","getDefaultColor","newBaseElement","correctLines","generateCommands","designInputSteps","workflowStep","LayoutPreviewService","LayoutPreviewBridge","handleCompleteRender","calculateNonPOTSupport","_reject","gl","nonPotTexSupport","service","panelSize","dirty","clonedLayouts","staticContext","RenderQueuePromise","nonPOTSupport","onRender","originalSize","maxSize","minAspectRatio","layoutWidth","layoutHeight","renderDims","targetWidth","targetHeight","targetRatio","boundedSize","svgStr","cvg","stepAspectValuesToDesignInputSteps","stepAspectValues","stepAspectValue","generateStateFromDesignInputSteps","GlobalPropertyHandleService","handle","handles","targetAspect","FileUploadGlobalPropertyHandle","ColorOptionGlobalPropertyHandle","OptionGlobalPropertyHandle","TextGlobalPropertyHandle","GlobalPropertyHandle","targetExperiences","applyNewAsset","bgRemoved","updatedStorage","stateValue","originalImage","existingStorage","targetKey","updateUsingBg","bgRemovedImage","useAsOriginalImage","updateFrameOffsets","experiencesUpdates","aspectValue","optionResource","customColor","GlobalPropertyStateManagerImpl","bundleId","onGlobalPropertyStateChange","bundleOptions","existingState","previousState","configAspect","storageInput","createResponse","BundleStateManager","stateData","workflowExperience","t","flippedTransform","transformName","ProductCollection","collection","pcp","CollectionProduct","productIds","filters","currentProducts","filteredResults","TransformCollection","productCollectionProduct","externalId","ip","hasType","typeMatches","externalIdMatches","workflows","configuredDefault","found","w","ProductWorkflow","price","Transform","BundleImpl","entity","graphqlOptions","listeners","o","partialSum","we","globalProperties","experiences","transactionIds","existing","existingOwnerIds","initializeExperience","updateArray","existingOwnerId","transactions","removed","indices","removedExperiences","oldExperience","temp","sortFunc","customerDetails","stakeholderType","stakeholders","emailAddress","updatedStakeholders","_shouldRender3D","productCollectionId","selected","previousHandles","newHandles","changedHandles","executeProcessFlow","FlowService","inputs","executionId","delay","ms","completed","repeats","flowResult","FlowExecutionResult","maxRepeats","execution","n","FlowExecutionNodeResult","FlowExecutionInput","ObjectInputType","TextInput","ObjectInput","ArrayInput","IntegrationProduct","additionalIP","getCustomerQuery","customerCreateMutation","customerAuthenticateMutation","customerGenerateVerificationCodeMutation","customerVerifyCodeMutation","customerMetafieldsQuery","getWorkflowsInternal","pickWorkflowFromPromise","getWorkflows","getWorkflowsPromise","getWorkflow","createLayoutsFromPanels","panels","panel","getInitialLayouts","serializedState","initialReducerState","SpiffCommerceClient","getIntegration","addonHandle","bundleOwners","bundlePartnerMap","customerId","graphqlClient","transactionResponse","storedTransactionOwners","transactionCustomers","transactionStakeholder","createdCustomer","authResult","storedCustomerTokens","storedCustomerToken","authenticatedCustomer","verificationCode","collectionId","initialMetadata","bundleEntity","_idx","newBundle","contextHeaders","bundleWrapper","_k","template","duplicateTransactions","bundleOwnerMap","variables","previewServiceConstructor","optionsArray","graphQlClient","readTransactions","batch","reason","createTransactions","indexedOptions","transactionOptions","createOptions","batchedReadTransactions","chunk","batchedCreateOptions","transactionResults","workflowIds","workflowMap","experienceOptionsPromises","transactionResult","workflowId","workflowExperienceOptions","experiencePromises","partnerCustomerMap","integrationProducts","externalIntegrationId","externalProductId","getTransaction","getOverrideThemeConfiguration","overrideThemeConfigurationId","overrideThemeInstallId","getBundleThemeConfiguration","getTransactionThemeConfiguration","MockWorkflowManager","_note","_getReducerState","_poller","_callback","_stepName","_command","_serializedSteps","_stepNames","_update","_stepId","_status","_results","_variants","_elements","_previewService","_enabled","_field","_error","FrameStep","storeAsOriginal","uploading","imageUploadComplete","getCurrentUserDetailsQuery","getCustomerTransactionsQuery","setTransactionDesignName","duplicateTransactionMutation","getCustomerBundlesQuery","getTransactionsForBundleQuery","setBundleName","getTemplateBundlesQuery","nameBundle","context","nameTransaction","duplicateBundle","duplicateTransaction","getCustomer","email","getCustomerBundles","getTransactionsForBundle","getUnorderedTransactions","getOrderedTransactions","getTemplateTransactions","getTemplateBundles","rows"],"mappings":"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A;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAEMC,KAAY;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AA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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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"}