{"version":3,"file":"477.chunk.js","mappings":"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","sources":["../node_modules/@luxottica/frame-advisor-capture/src/helpers/AuthHelper.ts","../node_modules/@luxottica/frame-advisor-capture/src/helpers/ConfigHelper.ts","../node_modules/@luxottica/frame-advisor-capture/src/constants/Styling.ts","../node_modules/@luxottica/frame-advisor-capture/src/constants/DOMEvents.ts","../node_modules/@luxottica/frame-advisor-capture/src/helpers/CallbackHelper.ts","../node_modules/@luxottica/frame-advisor-capture/src/components/LoadingSpinner.tsx","../node_modules/@luxottica/frame-advisor-capture/src/constants/LocalizationDefaults.ts","../node_modules/@luxottica/frame-advisor-capture/src/errors/errors.ts","../node_modules/@luxottica/frame-advisor-capture/src/helpers/LocalizationHelper.ts","../node_modules/@luxottica/frame-advisor-capture/src/components/fa-capture/tips/icons/CrosshairIcon.tsx","../node_modules/@luxottica/frame-advisor-capture/src/components/fa-capture/tips/icons/DeviceIcon.tsx","../node_modules/@luxottica/frame-advisor-capture/src/components/fa-capture/tips/icons/EyeglassIcon.tsx","../node_modules/@luxottica/frame-advisor-capture/src/components/fa-capture/tips/icons/FaceIcon.tsx","../node_modules/@luxottica/frame-advisor-capture/src/components/fa-capture/tips/icons/HairIcon.tsx","../node_modules/@luxottica/frame-advisor-capture/src/components/fa-capture/tips/icons/SunIcon.tsx","../node_modules/@luxottica/frame-advisor-capture/src/components/fa-capture/tips/icons/RotateIcon.tsx","../node_modules/@luxottica/frame-advisor-capture/src/components/fa-capture/tips/FrameAdvisorCaptureTips.tsx","../node_modules/@luxottica/frame-advisor-capture/src/components/fa-capture/FrameAdvisorErrorOverlay.tsx","../node_modules/@luxottica/frame-advisor-capture/src/interfaces/CaptureStatus.ts","../node_modules/@luxottica/frame-advisor-capture/src/components/fa-capture/FrameAdvisorContainer.tsx","../node_modules/@luxottica/frame-advisor-capture/src/components/fa-capture/FrameAdvisorLoader.tsx","../node_modules/@luxottica/frame-advisor-capture/src/helpers/RecordingHelper.ts","../node_modules/@luxottica/frame-advisor-capture/src/helpers/RequestHelper.ts","../node_modules/@luxottica/frame-advisor-capture/src/components/upload-image/UploadImageData.tsx","../node_modules/@luxottica/frame-advisor-capture/src/components/upload-image/UploadStatus.ts","../node_modules/@luxottica/frame-advisor-capture/src/components/upload-image/UploadImage.tsx","../node_modules/@luxottica/frame-advisor-capture/src/components/upload-image/UploadImageContainer.tsx","../node_modules/@luxottica/frame-advisor-capture/src/components/upload-image/UploadImageLoader.tsx","../node_modules/@luxottica/frame-advisor-capture/src/components/vto-capture/VtoCaptureErrorOverlay.tsx","../node_modules/@luxottica/frame-advisor-capture/src/components/vto-capture/VtoCaptureLoader.tsx","../node_modules/@luxottica/frame-advisor-capture/src/components/vto-capture/VtoCaptureContainer.tsx","../node_modules/@luxottica/frame-advisor-capture/src/constants/DefaultTrackingOptions.ts","../node_modules/@luxottica/frame-advisor-capture/src/constants/DefaultCaptureOptions.ts","../node_modules/@luxottica/frame-advisor-capture/src/constants/DefaultInitializeOptions.ts","../node_modules/@luxottica/frame-advisor-capture/src/constants/DefaultTrackingOptionsPortrait.ts","../node_modules/@luxottica/frame-advisor-capture/src/constants/DefaultTrackingOptionsLandscape.ts","../node_modules/@luxottica/frame-advisor-capture/src/constants/DefaultUploadOptions.ts","../node_modules/@luxottica/frame-advisor-capture/src/constants/DefaultVtoCaptureOptions.ts","../node_modules/@luxottica/frame-advisor-capture/src/helpers/ParameterHelper.ts","../node_modules/@luxottica/frame-advisor-capture/src/helpers/SupportedFeaturesHelper.ts","../node_modules/@luxottica/frame-advisor-capture/src/FrameAdvisorCapture.ts","../node_modules/@luxottica/frame-advisor-capture/node_modules/@luxottica/vto-microservices/src/config/Config.ts","../node_modules/@luxottica/frame-advisor-capture/node_modules/@luxottica/vto-microservices/src/error/errors.ts","../node_modules/@luxottica/frame-advisor-capture/node_modules/@luxottica/vto-microservices/src/helpers/RequestHelper.ts","../node_modules/@luxottica/frame-advisor-capture/node_modules/@luxottica/vto-microservices/src/request/RefreshRequest.ts","../node_modules/@luxottica/frame-advisor-capture/node_modules/@luxottica/vto-microservices/src/request/ProfileRequest.ts","../node_modules/@luxottica/frame-advisor-capture/node_modules/@luxottica/vto-microservices/src/request/ImageRequest.ts","../node_modules/@luxottica/frame-advisor-capture/node_modules/@luxottica/vto-microservices/src/request/LoginRequest.ts","../node_modules/@luxottica/frame-advisor-capture/node_modules/@luxottica/vto-microservices/src/request/SessionRequest.ts","../node_modules/@luxottica/frame-advisor-capture/node_modules/@luxottica/vto-microservices/src/request/MeasurementRequest.ts","../node_modules/@luxottica/frame-advisor-capture/node_modules/@luxottica/vto-microservices/src/request/VideoRequest.ts","../node_modules/@luxottica/vm-posetracker-faceweb/src/interfaces/GuidanceCommand.ts","../node_modules/@luxottica/vm-posetracker-faceweb/src/constants/envToConfigUrl.ts","../node_modules/@luxottica/vm-posetracker-faceweb/src/interfaces/TrackResult.ts","../node_modules/@luxottica/vm-posetracker-faceweb/src/PoseTracker.ts","../node_modules/@luxottica/vm-posetracker-faceweb/src/Helper.ts"],"sourcesContent":["import { RemoteLogConfig } from '@luxottica/vm-remotelog';\nimport { name, version } from '../../package.json';\nimport { AuthenticationOptions } from '../interfaces/InitializeParameters';\n\nlet access_token: string;\nlet refresh_token: string;\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, 'RequestHelper');\n\nconst getAuthData = (): AuthenticationOptions => {\n return {\n accessToken: access_token,\n refreshToken: refresh_token,\n };\n};\n\nconst setAuthData = (authData: Partial<AuthenticationOptions>) => {\n if (!!authData?.accessToken && !! authData?.refreshToken) {\n access_token = authData.accessToken;\n refresh_token = authData.refreshToken;\n logger.debug('authentication data has been updated');\n }\n};\n\nconst resetAuthData = () => {\n access_token = undefined;\n refresh_token = undefined;\n logger.debug('authentication data has been DELETED');\n};\n\nexport {\n getAuthData,\n setAuthData,\n resetAuthData,\n};\n","import { BipaPrivacyOptions } from '@luxottica/bipa-manager';\nimport { MicroserviceEnvironment } from '@luxottica/vto-microservices';\nimport { FrameAdvisorConfiguration } from '../interfaces/Config';\nimport { FrameAdvisorRegion } from '../interfaces/InitializeParameters';\n\nlet CONFIG: FrameAdvisorConfiguration;\n\nconst setConfig = (\n env: MicroserviceEnvironment,\n region: FrameAdvisorRegion,\n source: string,\n locale: string,\n privacy: BipaPrivacyOptions,\n tokenVersion: 1 | 2,\n showCaptureTips: boolean,\n) => {\n CONFIG = {\n environment: env,\n region,\n source,\n locale,\n privacy,\n tokenVersion,\n showCaptureTips\n };\n};\n\nexport {\n CONFIG,\n setConfig\n};\n","const ROOT_STYLE_NAME = 'frame-advisor-root-style';\n\nexport {\n ROOT_STYLE_NAME\n};\n","// called when the component begin to send informations to retreive machine learning results\nexport const onFACaptureLoading = 'onFACaptureLoading';\n\n// called when the mlresults are available and the component finished its job\nexport const onFACaptureComplete = 'onFACaptureComplete';\n\nexport const onPosetrackerLoaded = 'onPosetrackerLoaded';\n\nexport const onCaptureError = 'onCaptureError';\n\nexport const onDisplayPrivacyPage = 'onDisplayPrivacyPage';\n\nexport const onPrivacyDisplay = 'onPrivacyDisplay';\n\nexport const onCaptureProcess = 'onFACaptureProcess';\n\nexport const DOMDefaultTarget = () => document.querySelector('body');\n","import { BipaPage } from '@luxottica/bipa-manager';\nimport { DOMDefaultTarget, onCaptureError, onCaptureProcess, onDisplayPrivacyPage, onFACaptureComplete, onPosetrackerLoaded, onFACaptureLoading, onPrivacyDisplay } from '../constants/DOMEvents';\nimport { AuthenticationOptions, FrameAdvisorCallbacks } from '../interfaces/InitializeParameters';\nimport { setAuthData } from './AuthHelper';\n\nconst onLoadingEvent = () => {\n DOMDefaultTarget().dispatchEvent(new Event(onFACaptureLoading)); \n};\n\nconst onAvisorResultEvent = () => {\n DOMDefaultTarget().dispatchEvent(new Event(onFACaptureComplete)); \n};\n\nconst onCaptureErrorEvent = () => {\n DOMDefaultTarget().dispatchEvent(new Event(onCaptureError)); \n};\n\nconst onDisplayPrivacyPageEvent = () => {\n DOMDefaultTarget().dispatchEvent(new Event(onDisplayPrivacyPage));\n};\n\nconst onPrivacyDisplayEvent = () => {\n DOMDefaultTarget().dispatchEvent(new Event(onPrivacyDisplay));\n};\n\nconst onCaptureProcessEvent = () => {\n DOMDefaultTarget().dispatchEvent(new Event(onCaptureProcess));\n};\n\nconst onPosetrackerLoadedEvent = () => {\n DOMDefaultTarget().dispatchEvent(new Event(onPosetrackerLoaded));\n};\n\nconst CallbackHelper: FrameAdvisorCallbacks = {\n // default events, we want to call DOM events in any case\n onDisplayPrivacyPage: () => { onDisplayPrivacyPageEvent(); },\n onPrivacyDisplay: () => { onPrivacyDisplayEvent(); },\n onPrivacyFail: () => { return; },\n onPrivacyReject: () => { return; },\n onVtoCaptureStep: () => { return; },\n onCountdown: () => { return; },\n onNudging: () => { return; },\n onImageConfirm: undefined,\n onLoading: () => { onLoadingEvent(); },\n onAdvisorResult: () => { onAvisorResultEvent(); },\n onCaptureProcess: () => { onCaptureProcessEvent(); },\n onCaptureError: () => { onCaptureErrorEvent(); },\n onAuthUpdated: () => { return; },\n onPosetrackerLoaded: () => { onPosetrackerLoadedEvent(); }\n};\n\nconst setCallbacks = (callbacks: Partial<FrameAdvisorCallbacks>) => {\n\n CallbackHelper.onAuthUpdated = (authData: AuthenticationOptions) => {\n setAuthData(authData);\n callbacks?.onAuthUpdated?.(authData);\n };\n \n if (callbacks) {\n if (!!callbacks.onPrivacyFail) { CallbackHelper.onPrivacyFail = callbacks.onPrivacyFail; }\n if (!!callbacks.onPrivacyReject) { CallbackHelper.onPrivacyReject = callbacks.onPrivacyReject; }\n \n if (!!callbacks.onVtoCaptureStep) { CallbackHelper.onVtoCaptureStep = callbacks.onVtoCaptureStep; }\n if (!!callbacks.onCountdown) { CallbackHelper.onCountdown = callbacks.onCountdown; }\n if (!!callbacks.onNudging) { CallbackHelper.onNudging = callbacks.onNudging; }\n\n CallbackHelper.onImageConfirm = (!!callbacks.onImageConfirm) ? callbacks.onImageConfirm : undefined;\n\n // we want to call DOM events in any case for loading and result\n if (!!callbacks.onLoading) {\n CallbackHelper.onLoading = () => {\n onLoadingEvent();\n callbacks.onLoading();\n };\n }\n if (!!callbacks.onAdvisorResult) {\n CallbackHelper.onAdvisorResult = (result) => {\n onAvisorResultEvent();\n callbacks.onAdvisorResult(result);\n };\n }\n if (!!callbacks.onCaptureError) {\n CallbackHelper.onCaptureError = (result) => {\n onCaptureErrorEvent();\n callbacks.onCaptureError(result);\n };\n }\n if (!!callbacks.onDisplayPrivacyPage) {\n CallbackHelper.onDisplayPrivacyPage = (page: BipaPage) => {\n onDisplayPrivacyPageEvent();\n callbacks.onDisplayPrivacyPage(page);\n };\n }\n if (!!callbacks.onPrivacyDisplay) {\n CallbackHelper.onPrivacyDisplay = () => {\n onPrivacyDisplayEvent();\n callbacks.onPrivacyDisplay();\n };\n }\n if (!!callbacks.onCaptureProcess) {\n CallbackHelper.onCaptureProcess = () => {\n onCaptureProcessEvent();\n callbacks.onCaptureProcess();\n };\n }\n }\n};\n\nexport {\n CallbackHelper,\n setCallbacks\n};\n","import * as React from 'react';\nimport './LoadingSpinner.scss';\n\ninterface LoadingSpinnerProps {\n width: number;\n height: number;\n background: boolean;\n text?: string;\n}\n\nexport const LoadingSpinner = (props: LoadingSpinnerProps) => {\n\n const size = Math.min(props.width, props.height);\n\n return (\n <div className={'loading-bg'}>\n <div className='loading-spinner-container' style={{ height: size, width: size }}>\n <div className='loading-spinner'/>\n </div>\n </div>\n );\n};","import { FrameAdvisorLocalization } from '../interfaces/Localization';\n\nconst defaultLocale = 'en-US';\nconst defaultLanguage = 'en';\n\nconst localeMap = {\n\tde: 'de-DE',\n\ten: 'en-US',\n\tes: 'es-ES',\n\tfr: 'fr-FR',\n\tit: 'it-IT',\n\tja: 'ja-JP',\n\tko: 'ko-KR',\n\tnl: 'nl-NL',\n\tpl: 'pl-PL',\n\tpt: 'pt-PT',\n\tsv: 'sv-SE',\n\ttr: 'tr-TR',\n\tzh: 'zh-CN',\n};\n\nconst defaultTranslations: FrameAdvisorLocalization = {\n\tpermission_error: {\n\t\terror: 'You must allow access to your camera to use Frame Advisor.',\n\t\tsubtext: 'Click on your browser Share or Allow button to enable your webcam.'\n\t},\n\twebcam_error: {\n\t\terror: 'We could not detect your webcam.',\n\t\tsubtext: 'Enable webcam access in your browser and refresh the page to continue.'\n\t},\n\tgeneric_error: {\n\t\terror: 'An error occured',\n\t\tsubtext: 'Please check your camera permissions and try to reload the page.'\n\t},\n\tmanual_start: {\n\t\tbutton: 'Start the experience',\n\t\ttext: 'You are probably in Low Power Mode. The experience may be degraded.'\n\t},\n\tguidance: {\n\t\tunknown: 'Is anyone there?',\n\t\tdefault: 'Place your head in the oval',\n\t\tmove_closer: 'Move closer to the oval',\n\t\tmove_farther: 'Move farther from the screen',\n\t\tlook_up: 'Look up',\n\t\tlook_right: 'Look to your right',\n\t\tlook_down: 'Look down',\n\t\tlook_left: 'Look to your left',\n\t\ttilt_left: 'Tilt to your left',\n\t\ttilt_right: 'Tilt to your right',\n\t\tglasses: 'Please remove your glasses',\n\t\tstay_still: 'Good, stay still, get ready for the picture!',\n\t\tbright_light_conditions: 'It seems the overall light is too bright.',\n\t\teye_aspect_ratio_too_small: 'Please ensure that your eyes are open for the capture.',\n\t\tlow_light_conditions: 'It seems the overall light is too dim.',\n\t\tstay_still_video: 'Please remain still and get ready for video recording.',\n\t\ttoo_bright_left: 'It seems the overall light is too bright on your left side.',\n\t\ttoo_bright_right: 'It seems the overall light is too bright on your right side.'\n\t},\n\tvto_record: {\n\t\tget_ready: 'Get ready for a video',\n\t\tstep_1: 'Prepare to move your head from side to side',\n\t\tstep_2: 'Turn your head to the left.',\n\t\tstep_3: 'Turn your head to the center.',\n\t\tstep_4: 'Turn your head to the right.',\n\t\tstep_5: 'Turn your head back to center.',\n\t\tvideo_doesnt_fulfill_requirements: 'Your video doesn’t fulfill the requirements. Please take a new one'\n\t},\n\trecord_picture: {\n\t\tget_ready: 'Get ready'\n\t},\n\tserver_processing: {\n\t\tloading: 'Please wait...',\n\t\timage_upload: 'Loading the image',\n\t\timage_processing: 'We\\'re processing your information',\n\t\tdone: 'Image processing finished'\n\t},\n\tcapture_error: {\n\t\terror: 'An error occured',\n\t\tsubtext: 'Please try to shoot a picture again.',\n\t\tbutton: 'Continue'\n\t},\n\tupload: {\n\t\tclick_or_drop: 'Click to select a file or drop your picture here',\n\t\tdrop_here: 'Drop your selfie here',\n\t\ttap_to_upload: 'Tap to upload your picture',\n\t\taccept: 'Accept',\n\t\tdecline: 'Decline'\n\t}\n};\n\nconst defaultSmartShopperTranslations: any = {\n\t'drawer': {\n\t\t'add-prescription-lenses': 'Add prescription lenses',\n\t\t'add-to-bag-cta': 'Add to bag',\n\t\t'color-palette-label': 'Color palette:',\n\t\t'frame-shape-label': 'Frame shape:',\n\t\t'frame-thickness-label': 'Frame thickness:',\n\t\t'go-to-pdp-cta': 'Go to product page',\n\t\t'its-a-match': 'It\\'s a match!',\n\t\t'product-sentence': 'Based on your face scan and personal preferences, {{productName}} is a great match for you!',\n\t\t'size-label': 'Size:',\n\t\t'size-sentence': 'Your recommended size is calculated by the measurements and shape of your face',\n\t\t'style-label': 'Style:'\n\t},\n\t'error-message': {\n\t\t'error-message-1': 'Sorry, we\\'re not able to share a frame selection for children. Not a child? Let\\'s try again.',\n\t\t'error-message-1-cta': 'Try again',\n\t\t'error-message-2': 'Sorry, something went wrong.',\n\t\t'error-message-2-cta': 'Go back'\n\t},\n\t'general': {\n\t\t'best-match-badge': 'Best match',\n\t\t'eyeglasses': 'Eyeglasses',\n\t\t'fit-me-better': 'Fit me better',\n\t\t'frame-genius': 'Find your frame',\n\t\t'get-started': 'Get started',\n\t\t'hide-button': 'Hide button',\n\t\t'live-try-on': 'Live try-on',\n\t\t'load-more': 'Load more',\n\t\t'loading': 'Loading',\n\t\t'my-favorites': 'My Favorites',\n\t\t'my-matches': 'My Matches',\n\t\t'my-profile': 'My Profile',\n\t\t'picture-mode': 'Picture mode',\n\t\t'share': 'Share',\n\t\t'sunglasses': 'Sunglasses',\n\t\t'try-on': 'Try-On',\n\t\t'upload-picture': 'Upload a picture',\n\t\t'video-mode': 'Video mode'\n\t},\n\t'landing': {\n\t\t'confirm-cta': 'Confirm',\n\t\t'description-part-1': 'We\\'ve curated a selection of styles based on your personal data',\n\t\t'description-part-2': 'Complete your profile',\n\t\t'description-part-3': 'for the perfect match!',\n\t\t'what-are-you-looking-for': 'What are you looking for?'\n\t},\n\t'loader': {\n\t\t'loader-step-1': 'Analyzing your face scan',\n\t\t'loader-step-2': 'Reviewing your profile details',\n\t\t'loader-step-3': 'Gathering your ideal styles',\n\t\t'loader-step-4': 'Your assessment is complete!'\n\t},\n\t'profile': {\n\t\t'add-skin-undertone-cta-part-1': 'Skin undertone',\n\t\t'add-skin-undertone-cta-part-2': 'Add',\n\t\t'face-length': 'Face Length',\n\t\t'face-length-confirm-cta': 'Confirm',\n\t\t'face-length-description': 'If your face is longer than it is wide, you have a longer profile. If you have a round or square shaped face, you have a short profile.',\n\t\t'face-length-value-long': 'Longer profile',\n\t\t'face-length-value-short': 'Short',\n\t\t'face-shape': 'Face Shape',\n\t\t'face-shape-confirm-cta': 'Confirm',\n\t\t'face-shape-description': 'Based on your scan, your face shape is {{userFaceShapeAttribute}}. If you think this is incorrect, choose the correct face shape below.',\n\t\t'face-shape-value-oval_angled': 'Oval angled',\n\t\t'face-shape-value-oval_angled-description': 'Slightly wider cheekbones and gentle narrowing at the forehead and jaw',\n\t\t'face-shape-value-oval_round': 'Oval with rounded jawline',\n\t\t'face-shape-value-oval_round-description': 'Slightly wider cheekbones and gentle narrowing at the forehead and jaw',\n\t\t'face-shape-value-round': 'Round',\n\t\t'face-shape-value-round-description': 'Soft angle with slighter wider cheekbones and equally wide forehead and jaw',\n\t\t'face-shape-value-square': 'Square',\n\t\t'face-shape-value-square-description': 'More angular lines with equally wide cheekbones, forehead and jaw',\n\t\t'face-shape-value-triangle': 'Triangle',\n\t\t'face-shape-value-triangle-description': 'Widest at the forehead and gradually narrows through to the jaw',\n\t\t'frame-color': 'Frame Color',\n\t\t'frame-color-acetates': 'Acetates',\n\t\t'frame-color-add-skin-undertone-cta': 'For a more precise result, please add your skin undertone.',\n\t\t'frame-color-description': 'According to your features, the following palette will look good on you:',\n\t\t'frame-color-metals': 'Metals',\n\t\t'frame-color-plastics': 'Plastics',\n\t\t'frame-color-update-skin-eye-hair-cta': 'Update your skin, eye and hair color',\n\t\t'frame-color-value-autumn': 'Autumn',\n\t\t'frame-color-value-autumn-description': 'We recommend an autumn-like color palette as it complements your warmer undertone and hair color and will help bring out your features.',\n\t\t'frame-color-value-spring': 'Spring',\n\t\t'frame-color-value-spring-description': 'We recommend a spring-like color palette as it complements your warmer undertone and hair color and will help bring out your features.',\n\t\t'frame-color-value-summer': 'Summer',\n\t\t'frame-color-value-summer-description': 'We recommend a summer-like color palette as it complements your cooler undertone and hair color and will help bring out your features.',\n\t\t'frame-color-value-winter': 'Winter',\n\t\t'frame-color-value-winter-description': 'We recommend a winter-like color palette as it complements your cooler undertone and hair color and will help bring out your features.',\n\t\t'frame-color-wrong-colors': 'Wrong colors?',\n\t\t'frame-shape': 'Frame Shape',\n\t\t'frame-shape-contrast': 'Contrast',\n\t\t'frame-shape-contrast-description': 'These styles provide balance and a sense of proportion by contrasting your face shape.',\n\t\t'frame-shape-description': 'Different styles suit different face shapes! Based on your scan, your face shape is {{userFaceShapeAttribute}}.',\n\t\t'frame-shape-harmony': 'Harmony',\n\t\t'frame-shape-harmony-description': 'These styles work with your face shape to soften contours to accentuate your best features.',\n\t\t'frame-shape-something-not-right': 'Something not right?',\n\t\t'frame-shape-update-face-shape-cta': 'Update your face shape',\n\t\t'frame-shape-value-butterfly': 'Butterfly',\n\t\t'frame-shape-value-cat_eye': 'Cat Eye',\n\t\t'frame-shape-value-irregular': 'Irregular',\n\t\t'frame-shape-value-oval': 'Oval',\n\t\t'frame-shape-value-phantos': 'Phantos',\n\t\t'frame-shape-value-pillow': 'Pillow',\n\t\t'frame-shape-value-pilot': 'Pilot',\n\t\t'frame-shape-value-rectangle': 'Rectangle',\n\t\t'frame-shape-value-round': 'Round',\n\t\t'frame-shape-value-squared': 'Squared',\n\t\t'frame-size': 'Frame Size',\n\t\t'frame-size-consult-size-guide-cta': 'Consult our size guide',\n\t\t'frame-size-how-is-calculated-description': 'Your ideal size is calculated based on face width mm. Each frame has different features that affect the size. Your selection shows you the styles that will fit best.',\n\t\t'frame-size-how-is-calculated-title': 'How is size calculated?',\n\t\t'profile': 'For more accurate style matches, use the information below to select your face length.',\n\t\t'profile-saved-in-your-account': 'Profile saved in your account',\n\t\t'reset-confirm-keep-cta': 'Keep my profile',\n\t\t'reset-confirm-message': 'If you choose to reset, all data will be deleted and you will be taken back to the start.',\n\t\t'reset-confirm-reset-cta': 'Reset my profile',\n\t\t'reset-profile-cta': 'Reset your profile and start again',\n\t\t'save-to-my-account-cta': 'Save to My Account',\n\t\t'skinunder-confirm-cta': 'Confirm',\n\t\t'skinunder-description': 'Warm skin tones tend to have a yellow/golden hue, whereas cool tones appear more pink/blue.',\n\t\t'skinunder-eye-hair-color-confirm-cta': 'Confirm',\n\t\t'skinunder-eye-hair-color-description': 'Select the skin undertone, eye and hair color that resembles you most.',\n\t\t'skinunder-eye-hair-color-eyecolor-label': 'Eye color',\n\t\t'skinunder-eye-hair-color-eyecolor-value-blue': 'Blue',\n\t\t'skinunder-eye-hair-color-eyecolor-value-brown': 'Brown',\n\t\t'skinunder-eye-hair-color-eyecolor-value-green': 'Green',\n\t\t'skinunder-eye-hair-color-eyecolor-value-other': 'Other',\n\t\t'skinunder-eye-hair-color-haircolor-label': 'Hair color',\n\t\t'skinunder-eye-hair-color-haircolor-value-bald': 'Bald',\n\t\t'skinunder-eye-hair-color-haircolor-value-black': 'Black',\n\t\t'skinunder-eye-hair-color-haircolor-value-blonde': 'Blonde',\n\t\t'skinunder-eye-hair-color-haircolor-value-brown': 'Brown',\n\t\t'skinunder-eye-hair-color-haircolor-value-gray': 'Gray',\n\t\t'skinunder-eye-hair-color-haircolor-value-other': 'Other',\n\t\t'skinunder-eye-hair-color-haircolor-value-red': 'Red',\n\t\t'skinunder-eye-hair-color-skinunder-label': 'Skin undertone',\n\t\t'skinunder-eye-hair-color-title': 'Skin Undertone, Eye and Hair Color',\n\t\t'skinunder-value-cool': 'Cool',\n\t\t'skinunder-value-warm': 'Warm',\n\t\t'skinundertone-description': 'According to your skin tone, select one of the following shades.',\n\t\t'skinundertone-title': 'Skin Undertone',\n\t\t'style-playlist': 'Style Playlist',\n\t\t'style-playlist-confirm-cta': 'Confirm',\n\t\t'style-playlist-description': 'Choose the style that describes you best for a selection that matches your tastes.',\n\t\t'style-preference': 'Style Preference',\n\t\t'style-preference-confirm-cta': 'Confirm',\n\t\t'style-preference-description': 'Feminine styles tend to be more rounded with thinner frames, whereas masculine styles are more squared and have thicker frames.',\n\t\t'style-preference-subtitle': 'Tell us more about your style for the best results!',\n\t\t'style-preference-value-female': 'Feminine',\n\t\t'style-preference-value-male': 'Masculine',\n\t\t'temple-thickness': 'Temple Thickness',\n\t\t'temple-thickness-description-value-thick': 'According to your face length and nose profile, thick frames will suit you best. Choose between Acetate or Metal frames, to match your personality.',\n\t\t'temple-thickness-description-value-thin': 'According to your face length and nose profile, thin frames will suit you best. Choose between Acetate or Metal frames, to match your personality.',\n\t\t'temple-thickness-explanation': 'Temple thickness refers to how wide or narrow the arms of the glasses are.',\n\t\t'temple-thickness-update-face-length-cta': 'Update your face length',\n\t\t'temple-thickness-value-thick': 'Thick',\n\t\t'temple-thickness-value-thin': 'Thin'\n\t},\n\t'scanning': {\n\t\t'scan-complete': 'Your scan is complete! Sit tight while we create your selection.',\n\t\t'scan-step-1': 'If you have eyeglasses please remove them.<br/>Stand still in a well-lit area for best results.',\n\t\t'scan-step-2': 'Place your face in the center of the frame and look straight into the camera.',\n\t\t'scan-step-3': 'Hold still for a few seconds to get an accurate scan.'\n\t},\n\t'share': {\n\t\t'copy-link': 'Copy link',\n\t\t'save-image': 'Save image',\n\t\t'share': 'Share'\n\t},\n\t'take-tips': {\n\t\t'chin': 'Raise your chin during the face framing',\n\t\t'dont-rotate-too-much': 'Do not rotate the head too much, follow the arrows.',\n\t\t'free-face': 'The face should not be covered by anything, including eyewear or hair',\n\t\t'hold-with-both-hands': 'Hold your device with both hands',\n\t\t'light': 'Be positioned in a well-lit spot',\n\t\t'look-straight-1': 'Look straight to the camera and<br/>get ready to turn your face',\n\t\t'look-straight-2': 'Look straight to the camera',\n\t\t'move-your-hair': 'Move your hair away from your face',\n\t\t'next-cta': 'Get started',\n\t\t'relaxed-face': 'Keep a relaxed face and do not smile',\n\t\t'take-eyeglasses-off': 'Take eyeglasses off if wearing any',\n\t\t'title': 'Some short tips before we start'\n\t},\n\t'tryon-picture': {\n\t\t'picture-scan-step-1': 'If you have eyeglasses please remove them and get ready for the picture.',\n\t\t'picture-scan-step-2': 'Hold still for a few seconds to get an accurate picture.',\n\t\t'picture-scan-step-3': 'Your picture is ready!
Please wait while we load the frames.'\n\t},\n\t'tryon-video': {\n\t\t'scan-complete': 'Scan complete!',\n\t\t'video-scan-step-1': 'If you have eyeglasses please remove them. Stand still in a well-lit area for best results.',\n\t\t'video-scan-step-2': 'Slowly turn your head to the left and then back to center.'\n\t},\n\t'turn-screen': {\n\t\t'turn-your-device': 'Turn your device in order to continue the experience'\n\t}\n};\n\nconst LocalizationDefaults = {\n\tlocale: defaultLocale,\n\tlanguage: defaultLanguage,\n\tlocaleMap,\n\ttranslations: defaultTranslations,\n\tssTranslations: defaultSmartShopperTranslations\n};\n\nexport {\n\tLocalizationDefaults,\n};\n","import { InitializeParameters, InitializeOptions } from '../interfaces/InitializeParameters';\n\nclass FrameAdvisorError extends Error {\n public type: string;\n\n constructor(type: string, message: string, error?: Error) {\n super(message);\n this.type = type;\n this.name = type;\n this.message = message;\n this.stack = error?.stack;\n\n Object.setPrototypeOf(this, FrameAdvisorError.prototype);\n }\n}\n\nclass InitializationError extends FrameAdvisorError {\n public static type = 'InitializationError';\n\n constructor(input: InitializeParameters, message: string, error?: Error) {\n super(InitializationError.type, `failed to initialize component with input=${JSON.stringify(input)}, message=${(!!message) ? message : error?.message}`, error);\n Object.setPrototypeOf(this, InitializationError.prototype);\n }\n}\n\nclass NotInitializedError extends FrameAdvisorError {\n public static type = 'NotInitializedError';\n\n constructor() {\n super(NotInitializedError.type, 'component must first be initialized');\n Object.setPrototypeOf(this, NotInitializedError.prototype);\n }\n}\n\nclass LocalizationError extends FrameAdvisorError {\n public static type = 'LocalizationError';\n\n constructor(message: string, error?: Error) {\n super(LocalizationError.type, message, error);\n Object.setPrototypeOf(this, LocalizationError.prototype);\n }\n}\n\nclass MountError extends FrameAdvisorError {\n public static type = 'MountError';\n\n constructor(divId: string, error?: Error) {\n super(MountError.type, `failed to mount div in id ${divId}`, error);\n Object.setPrototypeOf(this, MountError.prototype);\n }\n}\n\nclass RequestError extends FrameAdvisorError {\n public static type = 'RequestError';\n\n constructor(message: string, error?: Error) {\n super(RequestError.type, message, error);\n Object.setPrototypeOf(this, RequestError.prototype);\n }\n}\n\nclass ServerError extends FrameAdvisorError {\n public static type = 'ServerError';\n\n constructor(message: string, error?: Error) {\n super(ServerError.type, message, error);\n Object.setPrototypeOf(this, ServerError.prototype);\n }\n}\n\nclass PrivacyError extends FrameAdvisorError {\n public static type = 'PrivacyError';\n\n constructor(message: string) {\n super(PrivacyError.type, message);\n Object.setPrototypeOf(this, PrivacyError.prototype);\n }\n}\n\nclass TimeoutError extends FrameAdvisorError {\n public static type = 'TimeoutError';\n\n constructor(duration: number) {\n super(TimeoutError.type, `request has timed out after ${duration}ms`);\n Object.setPrototypeOf(this, TimeoutError.prototype);\n }\n}\n\nclass InitializationParamsError extends FrameAdvisorError {\n public static type = 'InitializationParamsError';\n\n constructor(params: Partial<InitializeOptions>) {\n super(InitializationParamsError.type, `Failed to initialize capture component, check your parameters ${JSON.stringify(params)}`);\n Object.setPrototypeOf(this, InitializationParamsError.prototype);\n }\n}\n\nclass RecordingError extends FrameAdvisorError {\n public static type = 'RecordingError';\n\n constructor(message: string) {\n super(RecordingError.type, message);\n Object.setPrototypeOf(this, RecordingError.prototype);\n }\n}\n\nexport {\n FrameAdvisorError,\n InitializationError,\n NotInitializedError,\n LocalizationError,\n MountError,\n RequestError,\n ServerError,\n PrivacyError,\n TimeoutError,\n InitializationParamsError,\n RecordingError,\n};\n","import { RemoteLogConfig } from '@luxottica/vm-remotelog';\nimport { name, version } from '../../package.json';\nimport { LocalizationDefaults } from '../constants/LocalizationDefaults';\nimport { LocalizationError } from '../errors/errors';\nimport { FrameAdvisorLocalization } from '../interfaces/Localization';\nimport { MicroserviceEnvironment } from '@luxottica/vto-microservices';\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, 'LocalizationHelper');\n\nlet localizedFaTranslations: FrameAdvisorLocalization;\nlet localizedSmartShopperTranslations: Record<string, Record<string, string>>;\n\nconst localizationBaseUrl = 'https://d5nhc6q3o19l2.cloudfront.net';\n// const translationType = 'MIRROR';\n\nconst translateEnv = (env: MicroserviceEnvironment) : string => {\n if (env === 'STAGING'){\n return 'dev';\n }\n\n if (env === 'ACCEPTANCE'){\n return 'test';\n }\n\n return 'prod';\n};\n\nconst fetchFrameAdvisorJson = (locale: string, env: MicroserviceEnvironment): Promise<FrameAdvisorLocalization> => {\n\n const translateEnvLabel = translateEnv(env);\n const localizationFileUrl = `${localizationBaseUrl}/capture/v1/${translateEnvLabel}/ui/application_${locale}.json`;\n\n return fetch(localizationFileUrl).then((response) => {\n if (response.ok) {\n return response.json();\n } else {\n throw Error(`failed to find frame advisor localization for locale: ${locale}`);\n }\n }).then((json) => {\n console.log({json});\n return json;\n });\n};\n\nconst fetchSmartShopperJson = (locale: string, source: string): Promise<void> => {\n const fileUrl = `${localizationBaseUrl}/frame-advisor/v2/prod/${source}/application_${locale}.json`;\n\n return fetch(fileUrl).then((response) => {\n if (response.ok) {\n return response.json();\n } else {\n throw Error(`failed to find frame advisor localization for locale: ${locale}`);\n }\n }).then((json) => {\n localizedSmartShopperTranslations = json;\n });\n};\n\nconst fetchFrameAdvisorTranslations = (\n locale: string,\n source: string,\n downloadSsLocalization: boolean,\n env: MicroserviceEnvironment\n): Promise<FrameAdvisorLocalization> => {\n return Promise.all([\n fetchFrameAdvisorJson(locale, env),\n (downloadSsLocalization) ? fetchSmartShopperJson(locale,source).catch(() => {\n logger.error(`failed to find smart shopper localization for locale: ${locale}, source: ${source}`);\n localizedSmartShopperTranslations = LocalizationDefaults.ssTranslations;\n }) : Promise.resolve()\n ]).then((json) => {\n return json[0];\n });\n};\n\nconst fetchFrameAdvisorLocalization = (\n backupLanguage: string,\n locale: string,\n source: string,\n downloadSsLocalization: boolean,\n env: MicroserviceEnvironment\n): Promise<void> => {\n return new Promise((resolve) => {\n\n let translationFound = false;\n const backupLocale = LocalizationDefaults.localeMap[backupLanguage];\n const defaultLocale = LocalizationDefaults.locale;\n\n fetchFrameAdvisorTranslations(locale, source, downloadSsLocalization, env).then((translation) => {\n translationFound = true;\n console.log({translation});\n localizedFaTranslations = translation;\n }).catch(() => {\n if (!translationFound) {\n logger.warn(`failed to find frame-advisor localization for locale: '${locale}', trying with backup locale '${backupLocale}'`);\n }\n }).then(() => {\n if (!translationFound) {\n return fetchFrameAdvisorTranslations(backupLocale, source, downloadSsLocalization, env);\n } else {\n throw Error('break');\n }\n }).then((backupLanguageTranslation) => {\n translationFound = true;\n localizedFaTranslations = backupLanguageTranslation;\n }).catch(() => {\n if (!translationFound) {\n logger.warn(`failed to find frame-advisor localization for locale: '${backupLocale}', trying with default locale '${defaultLocale}'`);\n }\n }).then(() => {\n if (!translationFound) {\n return fetchFrameAdvisorTranslations(defaultLocale, source, downloadSsLocalization, env);\n } else {\n throw Error('break');\n }\n }).then((defaultLanguageTranslation) => {\n translationFound = true;\n localizedFaTranslations = defaultLanguageTranslation;\n }).catch(() => {\n if (!translationFound) {\n logger.warn(`failed to find frame-advisor localization for locale: ${defaultLocale}, using local translations`);\n }\n }).then(() => {\n if (!translationFound) {\n translationFound = true;\n localizedFaTranslations = LocalizationDefaults.translations;\n }\n resolve();\n });\n });\n};\n\nconst LocalizationHelper = {\n getString(page: string, key: string): string {\n try {\n return localizedFaTranslations[page][key];\n } catch (e) {\n logger.warn(`local translation not found for [${page}][${key}] using default`);\n try {\n return LocalizationDefaults.translations[page][key];\n } catch (e) {\n logger.warn(`default translation not found for [${page}][${key}]`);\n return '';\n }\n }\n },\n\n getSmartShopperString(page: string, key: string): string {\n try {\n return localizedSmartShopperTranslations[page][key];\n } catch (e) {\n logger.warn(`smart shopper translation not found for [${page}][${key}] using default`);\n return '';\n }\n },\n\n setLocalizationText(\n locale: string,\n source: string,\n downloadSsLocalization: boolean,\n env: MicroserviceEnvironment\n ): Promise<void> {\n let backupLanguage : string;\n return new Promise((resolve, reject) => {\n try {\n backupLanguage = locale.split('-')[0];\n if (!LocalizationDefaults.localeMap[backupLanguage]) {\n backupLanguage = 'en';\n }\n resolve(backupLanguage);\n } catch (e) {\n const error = new LocalizationError(`invalid locale '${locale}'`, e);\n logger.error(error);\n reject(error);\n }\n }).then(() => {\n return fetchFrameAdvisorLocalization(backupLanguage, locale, source, downloadSsLocalization, env);\n });\n }\n};\n\nexport {\n LocalizationHelper\n};","import React from 'react';\n\nexport const CrosshairIcon = () => (\n <div className='svg-container'>\n <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 99 99' fill='none'>\n <circle cx='49.152' cy='49.4557' r='48.128' stroke='#333333' strokeWidth='2.048' />\n <path d='M73.7281 48.4319H68.5558C68.0367 38.5226 60.0853 30.5713 50.1761 30.0521V24.8799H48.1281V30.0521C38.2188 30.5713 30.2674 38.5226 29.7483 48.4319H24.576V50.4799H29.7483C30.2674 60.3891 38.2188 68.3405 48.1281 68.8597V74.0319H50.1761V68.8597C60.0853 68.3405 68.0367 60.3891 68.5558 50.4799H73.7281V48.4319ZM50.1761 66.8117V61.7439H48.1281V66.8117C39.3473 66.2976 32.3103 59.2607 31.7963 50.4799H36.864V48.4319H31.7963C32.3103 39.6511 39.3473 32.6142 48.1281 32.1001V37.1679H50.1761V32.1001C58.9569 32.6142 65.9938 39.6511 66.5078 48.4319H61.4401V50.4799H66.5078C65.9938 59.2607 58.9569 66.2976 50.1761 66.8117Z' fill='#333333' />\n </svg>\n </div>\n);","import React from 'react';\n\nexport const DeviceIcon = () => (\n <div className='svg-container'>\n <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 98 99' fill='none'>\n <circle cx='49' cy='49.5195' r='48' stroke='#222222' strokeWidth='2' />\n <g clipPath='url(#clip0_1611_160729)'>\n <path d='M69.1564 47.1604L63.2917 41.8296V30.1237C63.2917 27.3093 61.0019 25.0195 58.1875 25.0195H39.8125C36.9981 25.0195 34.7083 27.3093 34.7083 30.1237V41.8296L28.8436 47.1614C26.0833 49.6706 24.5 53.2497 24.5 56.9808V74.0195H26.5417V56.9808C26.5417 53.8244 27.881 50.7956 30.2177 48.6712L34.7083 44.5889V58.3518L32.7106 60.1587L34.1561 61.6042L42.1431 54.3777C42.8791 53.7111 43.6692 53.9254 44.1643 54.3491C44.6594 54.7727 44.9943 55.52 44.4512 56.3509L38.7478 65.074C38.2425 65.8467 37.8913 66.7594 37.6739 67.8639C37.2063 70.2486 35.1003 71.9779 32.6667 71.9779V72.9987V74.0195C35.4923 74.0195 37.9811 72.3403 39.1296 69.8668C39.3552 69.8974 39.5787 69.9362 39.8125 69.9362H58.1875C58.4213 69.9362 58.6448 69.8974 58.8704 69.8668C60.0189 72.3403 62.5077 74.0195 65.3333 74.0195V72.9987V71.9779C62.8997 71.9779 60.7937 70.2486 60.3251 67.8649C60.1077 66.7594 59.7565 65.8467 59.2512 65.075L53.5478 56.352C53.0047 55.521 53.3396 54.7727 53.8347 54.3501C54.3298 53.9275 55.1189 53.7121 55.8559 54.3787L63.8429 61.6052L65.2884 60.1597L63.2917 58.3508V44.5889L67.7823 48.6712C70.119 50.7956 71.4583 53.8234 71.4583 56.9808V74.0195H73.5V56.9808C73.5 53.2497 71.9167 49.6706 69.1564 47.1604ZM57.2269 52.8638C55.8559 51.6224 53.9143 51.5949 52.5086 52.7974C51.1019 54 50.8273 55.9212 51.8389 57.4698L57.5423 66.1928C57.8455 66.6573 58.0711 67.2198 58.2345 67.8904C58.2191 67.8904 58.2038 67.8945 58.1875 67.8945H39.8125C39.7962 67.8945 39.7809 67.8904 39.7645 67.8894C39.9279 67.2187 40.1535 66.6563 40.4566 66.1918L46.16 57.4688C47.1727 55.9202 46.8971 53.9989 45.4904 52.7964C44.0837 51.5949 42.1441 51.6224 40.7721 52.8628L36.75 56.5041V30.1237C36.75 28.4352 38.124 27.0612 39.8125 27.0612H58.1875C59.876 27.0612 61.25 28.4352 61.25 30.1237V56.5041L57.2269 52.8638Z' fill='#222222' />\n <path d='M53.0833 31.1445H44.9166V33.1862H53.0833V31.1445Z' fill='#222222' />\n <path d='M49 63.8109C50.1276 63.8109 51.0417 62.8968 51.0417 61.7692C51.0417 60.6416 50.1276 59.7275 49 59.7275C47.8725 59.7275 46.9584 60.6416 46.9584 61.7692C46.9584 62.8968 47.8725 63.8109 49 63.8109Z' fill='#222222' />\n </g>\n <defs>\n <clipPath id='clip0_1611_160729'>\n <rect width='49' height='49' fill='white' transform='translate(24.5 25.0195)' />\n </clipPath>\n </defs>\n </svg>\n </div>\n);","import React from 'react';\n\nexport const EyeglassIcon = () => (\n <div className='svg-container'>\n <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 99 100' fill='none'>\n <circle cx='49.152' cy='50.0641' r='48.128' stroke='#333333' strokeWidth='2.048' />\n <g clipPath='url(#clip0_48_52722)'>\n <path d='M54.8905 62.3522C54.4072 62.3522 53.9956 62.0225 53.8901 61.5504L52.2947 54.365L53.4918 52.5679C53.6822 52.2822 54.0007 52.1122 54.3437 52.1122H69.6321V58.0084L71.6801 55.9604V52.1122H73.7281V50.0642H71.6073L63.271 31.1929C62.5972 29.6702 61.4073 28.4219 59.9204 27.6785L55.7548 25.5957L54.8383 27.4276L59.004 29.5105C60.0669 30.0419 60.9168 30.9328 61.397 32.0203L69.3679 50.0642H54.3437C53.3146 50.0642 52.3592 50.5752 51.7878 51.4322L51.111 52.4481C49.8463 52.0344 48.4578 52.0344 47.1921 52.4481L46.5152 51.4322C45.9449 50.5752 44.9895 50.0642 43.9604 50.0642H28.9362L36.9071 32.0213C37.3883 30.9338 38.2383 30.0419 39.3012 29.5115L43.4668 27.4287L42.5503 25.5967L38.3847 27.6795C36.8968 28.423 35.7069 29.6702 35.0331 31.1939L26.6968 50.0642H24.576V52.1122H26.624V61.3282C26.624 63.0219 28.0024 64.4002 29.6961 64.4002H43.4136C44.8646 64.4002 46.0975 63.411 46.4129 61.9938L48.1045 54.3814C48.1096 54.3599 48.1025 54.3394 48.1055 54.3179C48.7916 54.1418 49.5145 54.1418 50.1996 54.3179C50.2027 54.3394 50.1965 54.3599 50.2006 54.3814L51.8923 61.9938C52.2077 63.411 53.4406 64.4002 54.8916 64.4002H58.4612L56.4132 62.3522H54.8905ZM44.413 61.5504C44.3085 62.0225 43.8969 62.3522 43.4136 62.3522H29.6961C29.1318 62.3522 28.672 61.8934 28.672 61.3282V52.1122H43.9604C44.3034 52.1122 44.6219 52.2822 44.8123 52.5679L46.0094 54.365L44.413 61.5504Z' fill='#222222' />\n <path d='M66.643 66.7892L72.746 60.6872L71.297 59.2393L65.195 65.3413L59.092 59.2393L57.644 60.6872L63.7471 66.7892L57.644 72.8923L59.092 74.3402L65.195 68.2382L71.297 74.3402L72.746 72.8923L66.643 66.7892Z' fill='#222222' />\n </g>\n <defs>\n <clipPath id='clip0_48_52722'>\n <rect width='49.152' height='49.152' fill='white' transform='translate(24.576 25.4883)' />\n </clipPath>\n </defs>\n </svg>\n </div>\n);","import React from 'react';\n\nexport const FaceIcon = () => (\n <div className='svg-container'>\n <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 99 99' fill='none'>\n <circle cx='49.152' cy='49.7604' r='48.128' stroke='#333333' strokeWidth='2.048' />\n <g clipPath='url(#clip0_48_52728)'>\n <path d='M70.9764 41.5556C70.7798 33.3718 63.6876 27.7961 57.1811 26.0789C51.0801 24.4671 45.6324 25.9591 42.6853 29.967C39.4423 28.2835 35.9792 28.3583 33.0526 30.2087C28.5552 33.0523 26.1713 39.397 26.9741 46.309C26.9905 46.6244 27.4288 54.0545 31.4398 57.5198C31.6292 57.6826 31.833 57.8085 32.0316 57.9488C33.4867 66.0865 40.6005 72.2889 49.1519 72.2889C58.073 72.2889 65.4386 65.5408 66.436 56.8818C68.3294 55.2373 71.2088 51.1484 70.9764 41.5556ZM29.0139 46.136C28.2961 39.9367 30.3113 34.364 34.1472 31.9392C36.6826 30.3377 39.6348 30.4288 42.4652 32.1973L43.8855 31.8563C46.6236 27.2923 52.2782 26.9022 56.6578 28.0593C62.4475 29.5881 68.7574 34.4798 68.9294 41.6058C69.081 47.9167 67.8225 51.5283 66.5599 53.5538V44.6409L65.6956 43.6292C47.4899 40.7548 46.0789 34.2995 46.0696 34.2555L44.0319 34.4009C44.0319 38.0259 39.1945 43.6169 32.7679 43.6169L31.7439 44.6409V54.8307C29.3467 51.599 29.0221 46.2527 29.0139 46.136ZM49.1519 70.2409C40.6824 70.2409 33.7919 63.3504 33.7919 54.8809V45.627C39.6758 45.1959 43.9479 41.0958 45.4706 37.2773C47.5258 39.8117 52.5065 43.4828 64.5119 45.5113V54.8809C64.5119 63.3504 57.6214 70.2409 49.1519 70.2409Z' fill='black' />\n <path d='M51.2131 62.0488H47.0895V64.0968H51.2131V62.0488Z' fill='black' />\n <path d='M49.5962 56.9286H47.0895V58.9766H51.6442V48.7949H49.5962V56.9286Z' fill='black' />\n </g>\n <defs>\n <clipPath id='clip0_48_52728'>\n <rect width='49.152' height='49.152' fill='white' transform='translate(24.576 25.1846)' />\n </clipPath>\n </defs>\n </svg>\n </div>\n);","import React from 'react';\n\nexport const HairIcon = () => (\n <div className='svg-container'>\n <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 99 99' fill='none'>\n <circle cx='49.152' cy='49.3678' r='48.128' stroke='#222222' strokeWidth='2.048' />\n <path d='M73.428 61.956C71.4097 59.9377 70.6571 51.2798 70.6561 46.296C70.6561 34.4391 61.01 24.792 49.1521 24.792C37.2941 24.792 27.648 34.4391 27.648 46.296C27.647 51.2798 26.8944 59.9377 24.8761 61.956L24.576 62.2561V62.68C24.576 68.8906 29.6295 73.944 35.8401 73.944C39.2602 73.944 42.324 72.4059 44.3915 69.9924C45.693 71.2089 47.3908 71.896 49.1521 71.896C50.9133 71.896 52.6111 71.2099 53.9126 69.9914C55.9801 72.4059 59.0439 73.944 62.4641 73.944C68.6746 73.944 73.7281 68.8906 73.7281 62.68V62.2561L73.428 61.956ZM49.1521 69.848C47.74 69.848 46.3801 69.2162 45.4196 68.1144L39.891 61.7645C38.3847 60.036 37.4406 57.8877 37.161 55.5345L35.8401 45.87V45.0774C40.3794 45.0293 43.1657 42.3935 43.861 37.5766C45.7032 39.1751 49.2155 41.1053 55.4241 41.1053C58.6517 41.1053 62.4169 42.3608 62.4641 45.8915L61.141 55.553C60.8635 57.8877 59.9204 60.036 58.4131 61.7656L52.8856 68.1133C51.924 69.2162 50.5641 69.848 49.1521 69.848ZM35.0905 55.5038C33.7951 55.4587 33.1582 54.1675 32.2427 52.0714L31.997 51.5122C31.7891 51.0453 31.5096 50.1565 31.9693 49.4499C32.3247 48.9021 33.0773 48.5457 34.1279 48.4085L35.0905 55.5038ZM64.1854 48.4116C65.2196 48.5519 65.96 48.9072 66.3122 49.4489C66.771 50.1555 66.4914 51.0453 66.2846 51.5122L66.0388 52.0703C65.1285 54.1531 64.4926 55.4403 63.2136 55.5007L64.1854 48.4116ZM62.4641 71.896C59.5713 71.896 56.9877 70.5535 55.2971 68.4615L59.9573 63.1101C61.352 61.5085 62.3299 59.6059 62.846 57.5446C62.9382 57.5498 63.0303 57.56 63.1245 57.56C65.876 57.56 66.9594 55.0788 67.9158 52.8895L68.1565 52.3437C68.7965 50.903 68.7504 49.4417 68.0295 48.3327C67.5267 47.5596 66.4966 46.6708 64.4619 46.3922L64.5018 46.0973L64.5121 45.9581C64.5121 41.8303 60.8605 39.0573 55.4241 39.0573C46.4108 39.0573 44.0146 34.7442 43.9215 34.5691L41.9841 35.032C41.9841 43.0305 37.2634 43.0305 35.7121 43.0305H34.8161L33.7921 44.0545V45.9407L33.8525 46.3871C31.7942 46.6605 30.7569 47.5555 30.2511 48.3338C29.5312 49.4417 29.4851 50.904 30.1251 52.3437L30.3657 52.8906C31.3222 55.0799 32.4066 57.56 35.157 57.56C35.2584 57.56 35.3577 57.5498 35.4581 57.5436C35.9762 59.61 36.9531 61.5106 38.3458 63.109L43.006 68.4615C41.3164 70.5535 38.7329 71.896 35.8401 71.896C30.8849 71.896 26.8309 67.9659 26.6312 63.0589C29.608 59.3356 29.6961 47.6569 29.6961 46.296C29.6961 35.5675 38.4236 26.84 49.1521 26.84C59.8805 26.84 68.6081 35.5675 68.6081 46.296C68.6081 47.6569 68.6961 59.3356 71.6729 63.0589C71.4732 67.9659 67.4192 71.896 62.4641 71.896Z' fill='#222222' />\n <path d='M51.6445 48.4014H49.5965V56.535H47.0897V58.583H51.6445V48.4014Z' fill='#222222' />\n <path d='M52.5435 62.6066L49.152 61.6133L45.7605 62.6066L46.9801 63.8282C47.5597 64.4088 48.3307 64.7283 49.152 64.7283C49.9732 64.7283 50.7443 64.4088 51.3249 63.8282L52.5435 62.6066Z' fill='#222222' />\n </svg>\n </div>\n);","import React from 'react';\n\nexport const SunIcon = () => (\n <div className='svg-container'>\n <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 99 99' fill='none'>\n <circle cx='49.152' cy='49.152' r='48.128' stroke='#333333' strokeWidth='2.048' />\n <path d='M49.1507 33.6201C40.5866 33.6201 33.62 40.5867 33.62 49.1508C33.62 57.7148 40.5866 64.6814 49.1507 64.6814C57.7147 64.6814 64.6813 57.7148 64.6813 49.1508C64.6813 40.5867 57.7147 33.6201 49.1507 33.6201ZM49.1507 62.4628C41.8102 62.4628 35.8387 56.4912 35.8387 49.1508C35.8387 41.8103 41.8102 35.8388 49.1507 35.8388C56.4911 35.8388 62.4627 41.8103 62.4627 49.1508C62.4627 56.4912 56.4911 62.4628 49.1507 62.4628Z' fill='#333333' />\n <path d='M50.2626 22.5283H48.0439V29.1843H50.2626V22.5283Z' fill='#333333' />\n <path d='M67.1924 29.5416L62.486 34.248L64.0548 35.8169L68.7612 31.1104L67.1924 29.5416Z' fill='#333333' />\n <path d='M75.776 48.0449H69.12V50.2636H75.776V48.0449Z' fill='#333333' />\n <path d='M64.0548 62.4888L62.486 64.0576L67.1924 68.7641L68.7612 67.1953L64.0548 62.4888Z' fill='#333333' />\n <path d='M50.2626 69.1201H48.0439V75.7761H50.2626V69.1201Z' fill='#333333' />\n <path d='M34.2465 62.4859L29.54 67.1924L31.1089 68.7612L35.8153 64.0547L34.2465 62.4859Z' fill='#333333' />\n <path d='M29.184 48.0449H22.528V50.2636H29.184V48.0449Z' fill='#333333' />\n <path d='M31.1098 29.5425L29.541 31.1113L34.2475 35.8178L35.8163 34.249L31.1098 29.5425Z' fill='#333333' />\n </svg>\n </div>\n);","import React from 'react';\n\nexport const RotateIcon = () => (\n <div className='svg-container'>\n <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 80 80' fill='none'>\n <path d='M58.3333 76.6663H8.33333C5.57667 76.6663 3.33333 74.423 3.33333 71.6663V46.6663C3.33333 43.9097 5.57667 41.6663 8.33333 41.6663H33.3333V38.333H8.33333C3.73833 38.333 0 42.0713 0 46.6663V71.6663C0 76.2613 3.73833 79.9997 8.33333 79.9997H58.3333C62.9283 79.9997 66.6667 76.2613 66.6667 71.6663H63.3333C63.3333 74.423 61.09 76.6663 58.3333 76.6663Z' fill='#333333' />\n <path d='M13.3333 52.5H10V65.8333H13.3333V52.5Z' fill='#333333' />\n <path d='M71.6668 0H46.6668C42.0718 0 38.3335 3.73833 38.3335 8.33333V35V58.3333C38.3335 62.9283 42.0718 66.6667 46.6668 66.6667H71.6668C76.2618 66.6667 80.0002 62.9283 80.0002 58.3333V8.33333C80.0002 3.73833 76.2618 0 71.6668 0ZM76.6668 58.3333C76.6668 61.09 74.4235 63.3333 71.6668 63.3333H46.6668C43.9102 63.3333 41.6668 61.09 41.6668 58.3333V8.33333C41.6668 5.57667 43.9102 3.33333 46.6668 3.33333H71.6668C74.4235 3.33333 76.6668 5.57667 76.6668 8.33333V58.3333Z' fill='#333333' />\n <path d='M65.8333 10H52.5V13.3333H65.8333V10Z' fill='#333333' />\n <path d='M23.3332 16.6667H26.3815L22.1548 20.8933L24.5115 23.25L32.7615 15L24.5115 6.75L22.1548 9.10667L26.3815 13.3333H23.3332C14.1432 13.3333 6.6665 20.81 6.6665 30H9.99984C9.99984 22.6483 15.9815 16.6667 23.3332 16.6667Z' fill='#333333' />\n <path d='M59.1668 56.6667C61.0078 56.6667 62.5002 55.1743 62.5002 53.3333C62.5002 51.4924 61.0078 50 59.1668 50C57.3259 50 55.8335 51.4924 55.8335 53.3333C55.8335 55.1743 57.3259 56.6667 59.1668 56.6667Z' fill='#333333' />\n </svg>\n </div>\n);","import React, { useEffect, useState } from 'react';\nimport { LocalizationHelper } from '../../../helpers/LocalizationHelper';\nimport device from 'current-device';\n\nimport './FrameAdvisorCaptureTips.scss';\nimport { CrosshairIcon } from './icons/CrosshairIcon';\nimport { DeviceIcon } from './icons/DeviceIcon';\nimport { EyeglassIcon } from './icons/EyeglassIcon';\nimport { FaceIcon } from './icons/FaceIcon';\nimport { HairIcon } from './icons/HairIcon';\nimport { SunIcon } from './icons/SunIcon';\nimport { RotateIcon } from './icons/RotateIcon';\n\nconst FrameAdvisorCaptureTips = (props: {\n onComplete: () => void,\n landscape?: boolean,\n}) => {\n\n const [landscapeMode, setLandscapeMode] = useState<boolean>(device.landscape());\n // if the device is already in landscape mode, show the tips\n const [currentPage, setCurrentPage] = useState<'TIPS' | 'ROTATE'>(props.landscape ? 'ROTATE' : 'TIPS');\n\n const setOrientation = () => {\n setLandscapeMode(device.landscape());\n };\n\n const onClickContinue = () => {\n if (landscapeMode) {\n setCurrentPage('ROTATE');\n } else {\n props.onComplete();\n }\n };\n\n useEffect(() => {\n window.addEventListener('resize', setOrientation);\n return () => {\n window.removeEventListener('resize', setOrientation);\n };\n }, []);\n\n useEffect(() => {\n if (currentPage === 'ROTATE' && !landscapeMode) {\n props.onComplete();\n }\n }, [currentPage, landscapeMode]);\n\n if (currentPage === 'TIPS') {\n return (\n <div className='frame-advisor-capture-tips'>\n {(landscapeMode) ? \n <div className='frame-advisor-capture-tips-container landscape'>\n \n <div className='header'>{LocalizationHelper.getSmartShopperString('take-tips', 'title')}</div>\n \n <div className='rows'>\n \n <div className='row top'>\n <div className='tip'>\n <SunIcon/>\n <span>{LocalizationHelper.getSmartShopperString('take-tips', 'light')}</span>\n </div>\n <div className='tip'>\n <CrosshairIcon/>\n <span>{LocalizationHelper.getSmartShopperString('take-tips', 'look-straight-2')}</span>\n </div>\n <div className='tip'>\n <FaceIcon/>\n <span>{LocalizationHelper.getSmartShopperString('take-tips', 'relaxed-face')}</span>\n </div>\n </div>\n \n <div className='row bottom'>\n <div className='tip'>\n <EyeglassIcon/>\n <span>{LocalizationHelper.getSmartShopperString('take-tips', 'take-eyeglasses-off')}</span>\n </div>\n <div className='tip'>\n <HairIcon/>\n <span>{LocalizationHelper.getSmartShopperString('take-tips', 'move-your-hair')}</span>\n </div>\n <div className='tip'>\n <DeviceIcon/>\n <span>{LocalizationHelper.getSmartShopperString('take-tips', 'hold-with-both-hands')}</span>\n </div>\n </div>\n \n </div>\n \n <button className='frame-advisor-capture-tips-container-button' onClick={onClickContinue}>\n {LocalizationHelper.getSmartShopperString('take-tips', 'next-cta')}\n </button>\n \n </div>\n :\n <div className='frame-advisor-capture-tips-container portrait'>\n \n <div className='header'>{LocalizationHelper.getSmartShopperString('take-tips', 'title')}</div>\n \n <div className='rows'>\n <div className='row'>\n <SunIcon/>\n <span>{LocalizationHelper.getSmartShopperString('take-tips', 'light')}</span>\n </div>\n <div className='row'>\n <CrosshairIcon/>\n <span>{LocalizationHelper.getSmartShopperString('take-tips', 'look-straight-2')}</span>\n </div>\n <div className='row'>\n <FaceIcon/>\n <span>{LocalizationHelper.getSmartShopperString('take-tips', 'relaxed-face')}</span>\n </div>\n <div className='row'>\n <EyeglassIcon/>\n <span>{LocalizationHelper.getSmartShopperString('take-tips', 'take-eyeglasses-off')}</span>\n </div>\n <div className='row'>\n <HairIcon/>\n <span>{LocalizationHelper.getSmartShopperString('take-tips', 'move-your-hair')}</span>\n </div>\n <div className='row'>\n <DeviceIcon/>\n <span>{LocalizationHelper.getSmartShopperString('take-tips', 'hold-with-both-hands')}</span>\n </div>\n </div>\n \n <button className='frame-advisor-capture-tips-container-button' onClick={onClickContinue}>\n {LocalizationHelper.getSmartShopperString('take-tips', 'next-cta')}\n </button>\n \n </div>\n }\n </div>\n );\n } else if (currentPage === 'ROTATE') {\n return (\n <div className='frame-advisor-capture-rotate'>\n <RotateIcon/>\n <span>{LocalizationHelper.getSmartShopperString('turn-screen', 'turn-your-device')}</span>\n </div>\n );\n\n } else {\n return <></>;\n }\n\n};\n\nexport {\n FrameAdvisorCaptureTips\n};\n","import React from 'react';\nimport { LocalizationHelper } from '../../helpers/LocalizationHelper';\nimport './FrameAdvisorErrorOverlay.scss';\n\nconst FrameAdvisorErrorOverlay = (props: {\n enabled: boolean,\n onClickOk: () => void\n}) => {\n\n return (\n <div className={`frame-advisor-error-overlay${props.enabled ? ' active' : ''}`}>\n {props.enabled &&\n <div className='frame-advisor-error-overlay-modal'>\n <div className='frame-advisor-error-overlay-modal-header'>{LocalizationHelper.getString('capture_error', 'error')}</div>\n <div className='frame-advisor-error-overlay-modal-text'>{LocalizationHelper.getString('capture_error', 'subtext')}</div>\n <button className='frame-advisor-error-overlay-modal-button' onClick={props.onClickOk}>\n {LocalizationHelper.getString('capture_error', 'button')}\n </button>\n </div>\n }\n </div>\n );\n};\n\nexport {\n FrameAdvisorErrorOverlay\n};\n","enum CaptureStatus {\n LOADING = 'LOADING',\n INITIAL = 'INITIAL',\n SAVING = 'SAVING',\n UPLOADING = 'UPLOADING',\n PROCESSING = 'PROCESSING',\n COMPLETE = 'COMPLETE',\n ERROR = 'ERROR'\n}\n\nexport {\n CaptureStatus,\n};\n","import { AgreementType, BipaManager, BipaOverlay, BipaPage } from '@luxottica/bipa-manager';\nimport React, { lazy, Suspense, useEffect, useState } from 'react';\nimport { getAuthData } from '../../helpers/AuthHelper';\nimport { CallbackHelper } from '../../helpers/CallbackHelper';\nimport { CONFIG } from '../../helpers/ConfigHelper';\nimport { CaptureOptions } from '../../interfaces/CaptureParameters';\nimport { LoadingSpinner } from '../LoadingSpinner';\nimport { FrameAdvisorCaptureTips } from './tips/FrameAdvisorCaptureTips';\nimport './FrameAdvisorContainer.scss';\nimport { FrameAdvisorErrorOverlay } from './FrameAdvisorErrorOverlay';\nimport device from 'current-device';\nimport { CaptureStatus } from '../../interfaces/CaptureStatus';\n\ntype agreementStatus = 'INITIAL' | 'APPROVED' | 'REJECTED' | 'ERROR';\n\n// this is used to prevent an application reset in case the device is rotated after the capture\nlet captureComplete = false;\n\nconst FrameAdvisorContainer = (props: {\n options: CaptureOptions\n}) => {\n\n // begin to download the capture chunk while the user is checking the privacy\n // in case the privacy is already accepted the user will see a loading spinner\n const lazyFrameAdvisorPromise = import(/* webpackChunkName: \"FrameAdvisorVideo\" */ './FrameAdvisorVideo')\n .then(({ FrameAdvisorVideo }) => ({ default: FrameAdvisorVideo }));\n\n // REACT.lazy wrapper used to display a spinner while loading\n const LazyFrameAdvisorVideo = lazy(() => lazyFrameAdvisorPromise);\n\n const [agreementStatus, setAgreementStatus] = useState<agreementStatus>(\n BipaManager.biometricCookieExists(AgreementType.BIOMETRIC) ? 'APPROVED' : 'INITIAL'\n );\n\n const [showCaptureTips, setShowCaptureTips] = useState<boolean>(CONFIG.showCaptureTips);\n\n const [landscape, setLandscape] = useState<boolean>(false);\n\n useEffect(() => {\n // react to device orientation only if the capture tips are used\n if (CONFIG.showCaptureTips) {\n device.onChangeOrientation((orientation) => {\n setLandscape(orientation === 'landscape' && !captureComplete);\n });\n }\n }, []);\n\n let content;\n\n switch (agreementStatus) {\n case 'INITIAL':\n CallbackHelper.onPrivacyDisplay();\n content = (\n <BipaOverlay\n type={AgreementType.BIOMETRIC}\n tokenVersion={CONFIG.tokenVersion}\n accessToken={getAuthData().accessToken}\n refreshToken={getAuthData().refreshToken}\n environment={CONFIG.environment}\n locale={CONFIG.locale}\n source={CONFIG.source}\n region={CONFIG.region}\n callbacks={{\n onTermsAndConditionsClick: CONFIG.privacy.onTermsAndConditionsClick,\n onDisplayPage: (page: BipaPage) => {\n CallbackHelper.onDisplayPrivacyPage(page);\n },\n onSubmit: () => {\n // close the Privacy agreement and start the experience\n setAgreementStatus('APPROVED');\n },\n onUserReject: () => {\n // close the Privacy agreement and BLOCK the experience\n setAgreementStatus('REJECTED');\n CallbackHelper.onPrivacyReject();\n },\n onError: (error) => {\n setAgreementStatus('ERROR');\n CallbackHelper.onPrivacyFail(error);\n },\n onAuthUpdated: CallbackHelper.onAuthUpdated\n }} privacy={{\n termsAndConditions: CONFIG.privacy.termsAndConditions,\n localizationText: CONFIG.privacy?.localizationText\n }}/>\n );\n break;\n case 'APPROVED':\n if (showCaptureTips || landscape) {\n content = <FrameAdvisorCaptureTips onComplete={() => { setShowCaptureTips(false); }} landscape={landscape}/>;\n } else {\n CallbackHelper.onCaptureProcess();\n content = (\n <Suspense fallback={<LoadingSpinner background={true} width={300} height={300}/>}>\n <LazyFrameAdvisorVideo options={props.options} environment={CONFIG.environment}\n onStatusChange={(status) => {\n captureComplete = \n status === CaptureStatus.COMPLETE ||\n status === CaptureStatus.PROCESSING ||\n status === CaptureStatus.UPLOADING ||\n status === CaptureStatus.SAVING ||\n status === CaptureStatus.ERROR\n ;\n }}/>\n </Suspense>\n );\n }\n break;\n case 'ERROR':\n content = <FrameAdvisorErrorOverlay enabled onClickOk={() => { setAgreementStatus('INITIAL'); }} />;\n break;\n case 'REJECTED':\n default:\n content = <></>;\n break;\n }\n\n return (\n <div className='frame-advisor-container'>\n {content}\n </div>\n );\n};\n\nexport {\n FrameAdvisorContainer\n};\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { ROOT_STYLE_NAME } from '../../constants/Styling';\nimport { CaptureOptions } from '../../interfaces/CaptureParameters';\nimport { FrameAdvisorContainer } from './FrameAdvisorContainer';\n\nlet currentContainer;\n\nconst loadFrameAdvisor = (\n container: HTMLElement,\n options: CaptureOptions,\n onMount: () => void\n) => {\n currentContainer = container;\n currentContainer.classList.add(ROOT_STYLE_NAME);\n ReactDOM.render(\n <FrameAdvisorContainer options={options}/>,\n container,\n onMount\n );\n};\n\nconst closeFrameAdvisorComponent = () => {\n if (!!currentContainer) {\n ReactDOM.unmountComponentAtNode(currentContainer);\n }\n};\n\nexport {\n loadFrameAdvisor,\n closeFrameAdvisorComponent\n};\n","import { RemoteLogConfig } from '@luxottica/vm-remotelog';\nimport { name, version } from '../../package.json';\nimport { RecordingError } from '../errors/errors';\n\nlet mediaRecorder: MediaRecorder;\nlet chunks: Blob[] = [];\n\nconst defaultMimeType = 'video/webm;codecs=vp9';\nconst iosMimeType = 'video/mp4';\nconst ffMimeType = 'video/webm';\nlet currentFileType: 'mp4' | 'webm';\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, 'RecordingHelper');\n\nconst RecordingHelper = {\n initialize: (\n mediaStream: MediaStream,\n onComplete: (videoData: Blob[]) => void\n ) => {\n RecordingHelper.reset();\n\n let mimeType;\n if (MediaRecorder.isTypeSupported(defaultMimeType)) {\n mimeType = defaultMimeType;\n currentFileType = 'webm';\n } else if (MediaRecorder.isTypeSupported(iosMimeType)) {\n mimeType = iosMimeType;\n currentFileType = 'mp4';\n } else if (MediaRecorder.isTypeSupported(ffMimeType)) {\n mimeType = ffMimeType;\n currentFileType = 'webm';\n } else {\n throw new RecordingError('recording video mime type unsupported');\n }\n\n mediaRecorder = new MediaRecorder(mediaStream, { mimeType: mimeType });\n\n mediaRecorder.onstart = () => { \n logger.debug('media recorder started');\n };\n\n mediaRecorder.ondataavailable = (blobEvent: BlobEvent) => {\n logger.debug('media recorder data available: size={} mimeType={}', blobEvent.data.size, mediaRecorder.mimeType);\n chunks.push(blobEvent.data);\n onComplete(chunks);\n };\n },\n\n startRecording: () => {\n if (!!mediaRecorder && mediaRecorder.state !== 'recording') {\n mediaRecorder.start(100000000000);\n }\n },\n\n stopRecording: () => {\n if (!!mediaRecorder && mediaRecorder.state === 'recording') {\n mediaRecorder.stop();\n }\n },\n\n getFileType: (): 'webm' | 'mp4' => {\n return (!!currentFileType) ? currentFileType : undefined;\n },\n\n reset: () => {\n mediaRecorder = undefined;\n chunks = [];\n }\n};\n\nexport {\n RecordingHelper\n};\n","import {\n loginRequest, LoginReturn,\n processImageRequest, uploadImageDataRequest, uploadImageRequest,\n processVideoRequest, uploadVideoRequest,\n ProfileReturn,\n sessionRequest, SessionReturn,\n uploadMeasurementRequest, MeasurementRequestData } from '@luxottica/vto-microservices';\nimport { getAuthData } from './AuthHelper';\nimport { CallbackHelper } from './CallbackHelper';\nimport { CONFIG } from './ConfigHelper';\nimport { RecordingHelper } from './RecordingHelper';\n\nlet videoId: string;\nlet uploadPath: string;\n\nconst RequestHelper = {\n login: (tokenVersion: 1 | 2): Promise<LoginReturn> => {\n return loginRequest({\n environment: CONFIG.environment,\n accessToken: getAuthData().accessToken,\n refreshToken: getAuthData().refreshToken,\n version: tokenVersion,\n onAuthUpdated: CallbackHelper.onAuthUpdated,\n });\n },\n\n startSession: (): Promise<SessionReturn> => {\n return sessionRequest({\n environment: CONFIG.environment,\n accessToken: getAuthData().accessToken,\n refreshToken: getAuthData().refreshToken,\n onAuthUpdated: CallbackHelper.onAuthUpdated,\n region: CONFIG.region,\n source: CONFIG.source\n }).then((result) => {\n videoId = result.videoId;\n uploadPath = result.uploadPath;\n return result;\n });\n },\n\n uploadImage: (\n img: Blob\n ): Promise<void> => {\n return uploadImageRequest({\n environment: CONFIG.environment,\n accessToken: getAuthData().accessToken,\n refreshToken: getAuthData().refreshToken,\n onAuthUpdated: CallbackHelper.onAuthUpdated,\n img: img,\n uploadPath: uploadPath\n });\n },\n\n uploadImageData: (\n imgData: ImageData\n ): Promise<void> => {\n return uploadImageDataRequest({\n environment: CONFIG.environment,\n accessToken: getAuthData().accessToken,\n refreshToken: getAuthData().refreshToken,\n onAuthUpdated: CallbackHelper.onAuthUpdated,\n imgData: imgData,\n uploadPath: uploadPath\n });\n },\n\n processImage: (\n enableMachineLearning: boolean,\n enableVto: boolean,\n shouldCancel: () => boolean\n ): Promise<ProfileReturn> => {\n return processImageRequest({\n environment: CONFIG.environment,\n accessToken: getAuthData().accessToken,\n refreshToken: getAuthData().refreshToken,\n onAuthUpdated: CallbackHelper.onAuthUpdated,\n videoId: videoId,\n enableMachineLearning: enableMachineLearning,\n enableVto: enableVto,\n shouldCancel: shouldCancel\n });\n },\n\n uploadVideo: (\n video: Blob[]\n ): Promise<void> => {\n return uploadVideoRequest({\n environment: CONFIG.environment,\n accessToken: getAuthData().accessToken,\n refreshToken: getAuthData().refreshToken,\n onAuthUpdated: CallbackHelper.onAuthUpdated,\n videoId: videoId,\n video: video,\n fileType: RecordingHelper.getFileType(),\n uploadPath: uploadPath,\n });\n },\n\n processVideo: (\n enableMachineLearning: boolean,\n enableVto: boolean,\n shouldCancel: () => boolean\n ): Promise<ProfileReturn> => {\n return processVideoRequest({\n environment: CONFIG.environment,\n accessToken: getAuthData().accessToken,\n refreshToken: getAuthData().refreshToken,\n onAuthUpdated: CallbackHelper.onAuthUpdated,\n videoId: videoId,\n enableMachineLearning: enableMachineLearning,\n enableVto: enableVto,\n shouldCancel: shouldCancel\n });\n },\n\n uploadMeasurement: (\n finalComputedPD: number,\n finalFaceBreadth: number\n ): Promise<void> => {\n return uploadMeasurementRequest({\n environment: CONFIG.environment,\n accessToken: getAuthData().accessToken,\n refreshToken: getAuthData().refreshToken,\n finalComputedPD,\n finalFaceBreadth,\n videoId: videoId,\n });\n }\n};\n\nexport {\n RequestHelper,\n};\n","import { RemoteLogConfig } from '@luxottica/vm-remotelog';\nimport { name, version } from '../../../package.json';\nimport { CallbackHelper } from '../../helpers/CallbackHelper';\nimport { RequestHelper } from '../../helpers/RequestHelper';\nimport { UploadOptions } from '../../interfaces/CaptureParameters';\nimport './UploadImage.scss';\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, 'UploadImageData');\n\nconst uploadImageData = (\n imageData: ImageData,\n options: UploadOptions\n): Promise<void> => {\n if (!!imageData) {\n logger.debug('imageData received');\n\n return RequestHelper.startSession().then(() => {\n RequestHelper.uploadImageData(imageData).then(() => {\n return RequestHelper.processImage(\n options.enableMachineLearning,\n options.enableVto,\n () => { return false; }\n );\n }).then((result) => {\n logger.debug('upload imageData complete');\n CallbackHelper.onAdvisorResult({\n ...(options.enableMachineLearning && { properties: result.properties }),\n videoId: result.videoId\n });\n }).catch((error) => {\n CallbackHelper.onCaptureError(error);\n });\n });\n } else {\n logger.warn('invalid imageData, aborting upload process');\n }\n};\n\nexport {\n uploadImageData,\n};\n","enum UploadStatus {\n INITIAL = 'INITIAL',\n ACCEPT = 'ACCEPT',\n ACCEPT_THIRD_PARTY = 'ACCEPT_THIRD_PARTY',\n UPLOADING = 'UPLOADING',\n PROCESSING = 'PROCESSING',\n ERROR = 'ERROR'\n}\n\nexport {\n UploadStatus,\n};\n","import { RemoteLogConfig } from '@luxottica/vm-remotelog';\nimport { DeviceType } from 'current-device';\nimport React, { Component, createRef, RefObject } from 'react';\nimport { name, version } from '../../../package.json';\nimport { CallbackHelper } from '../../helpers/CallbackHelper';\nimport { LocalizationHelper } from '../../helpers/LocalizationHelper';\nimport { RequestHelper } from '../../helpers/RequestHelper';\nimport { UploadOptions } from '../../interfaces/CaptureParameters';\nimport { FrameAdvisorErrorOverlay } from '../fa-capture/FrameAdvisorErrorOverlay';\nimport { LoadingSpinner } from '../LoadingSpinner';\n\nimport './UploadImage.scss';\nimport { UploadStatus } from './UploadStatus';\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, 'UploadImage');\n\ninterface UploadImageProps {\n options: UploadOptions;\n deviceType: DeviceType;\n}\n\ninterface UploadImageState {\n uploadStatus: UploadStatus;\n dragOver: boolean;\n}\n\nclass UploadImage extends Component<\n UploadImageProps,\n UploadImageState\n> {\n\n private mounted: boolean;\n private imageInput: RefObject<HTMLInputElement>;\n private currentFile: File;\n private currentImage = new Image();\n\n constructor(props: UploadImageProps) {\n super(props);\n this.imageInput = createRef();\n this.state = {\n uploadStatus: UploadStatus.INITIAL,\n dragOver: false\n };\n }\n\n componentDidMount() {\n this.mounted = true;\n document.body.addEventListener('mouseenter', this.mouseEnterHandler);\n document.body.addEventListener('dragover', this.dragOverHandler);\n document.body.addEventListener('dragenter', this.dragEnterHandler);\n document.body.addEventListener('dragleave', this.dragLeaveHandler);\n document.body.addEventListener('drop', this.windowDropHandler);\n }\n\n componentWillUnmount() {\n this.mounted = false;\n document.body.removeEventListener('mouseenter', this.mouseEnterHandler);\n document.body.removeEventListener('dragover', this.dragOverHandler);\n document.body.removeEventListener('dragenter', this.dragEnterHandler);\n document.body.removeEventListener('dragleave', this.dragLeaveHandler);\n document.body.removeEventListener('drop', this.windowDropHandler);\n }\n\n imageInputHandler = (e: React.FormEvent<HTMLInputElement>) => {\n if (!!this.imageInput.current?.files?.[0]) {\n this.generateImagePreview(this.imageInput.current?.files?.[0]);\n }\n e.currentTarget.value = '';\n }\n\n dropHandler = (e) => {\n e.stopPropagation();\n e.preventDefault();\n this.setState({ dragOver: false });\n\n let file: File;\n if (e.dataTransfer.items && e.dataTransfer.items?.[0].kind === 'file') {\n file = e.dataTransfer.items[0].getAsFile();\n } else if (e.dataTransfer?.files.length > 0) {\n file = e.dataTransfer.files[0];\n }\n\n if (!!file) {\n this.generateImagePreview(file);\n }\n };\n\n generateImagePreview = (file: File) => {\n this.currentFile = file;\n const reader = new FileReader();\n reader.readAsDataURL(this.currentFile);\n\t\treader.onload = (e) => {\n this.currentImage.src = e.target.result.toString();\n this.currentImage.onload = () => {\n\n if (!!CallbackHelper.onImageConfirm) {\n this.setState({ uploadStatus: UploadStatus.ACCEPT_THIRD_PARTY });\n CallbackHelper.onImageConfirm(this.currentImage.src).then((imageAccepted) => {\n if (imageAccepted) {\n this.sendUploadImageRequest(this.currentFile);\n } else {\n this.setState({ uploadStatus: UploadStatus.INITIAL });\n }\n });\n\n } else {\n this.setState({ uploadStatus: UploadStatus.ACCEPT });\n }\n };\n };\n }\n\n windowDropHandler = (e) => {\n e.preventDefault();\n this.setState({ dragOver: false });\n };\n\n mouseEnterHandler = () => {\n if (this.state.dragOver === true) {\n this.setState({ dragOver: false });\n }\n };\n\n dragOverHandler = (e) => {\n e.stopPropagation();\n e.preventDefault();\n };\n\n dragEnterHandler = (e) => {\n e.stopPropagation();\n e.preventDefault();\n this.setState({ dragOver: true });\n };\n\n dragLeaveHandler = (e) => {\n e.preventDefault();\n };\n\n onAcceptFile = () => {\n this.sendUploadImageRequest(this.currentFile);\n }\n\n onDeclineFile = () => {\n this.setState({\n uploadStatus: UploadStatus.INITIAL\n });\n }\n\n sendUploadImageRequest = (file: File): void => {\n if (!!file) {\n logger.debug(`file received: ${file.name}`);\n logger.debug(file);\n\n this.setState({ uploadStatus: UploadStatus.UPLOADING });\n\n RequestHelper.startSession().then(() => {\n RequestHelper.uploadImage(file).then(() => {\n if (this.mounted) {\n this.setState({ uploadStatus: UploadStatus.PROCESSING });\n return RequestHelper.processImage(\n this.props.options.enableMachineLearning,\n this.props.options.enableVto,\n () => { return !this.mounted; });\n }\n }).then((result) => {\n if (this.mounted) {\n logger.debug('upload image complete');\n this.resetComponent();\n CallbackHelper.onAdvisorResult({\n ...(this.props.options.enableMachineLearning && { properties: result.properties }),\n videoId: result.videoId\n });\n }\n }).catch((error) => {\n if (this.mounted) {\n this.setState({ uploadStatus: UploadStatus.ERROR });\n CallbackHelper.onCaptureError(error);\n }\n });\n });\n } else {\n logger.warn('invalid file, aborting upload process');\n }\n }\n\n resetComponent = () => {\n this.currentFile = undefined;\n this.currentImage = new Image();\n this.setState({ uploadStatus: UploadStatus.INITIAL });\n }\n\n render() {\n let displayText = '';\n if (this.props.deviceType === 'mobile') {\n displayText = LocalizationHelper.getString('upload', 'tap_to_upload');\n } else {\n displayText = (this.state.dragOver) ? LocalizationHelper.getString('upload', 'drop_here') : LocalizationHelper.getString('upload', 'click_or_drop');\n }\n\n const showLoading = (this.state.uploadStatus === UploadStatus.UPLOADING || this.state.uploadStatus === UploadStatus.PROCESSING);\n const showImgPreview = showLoading || this.state.uploadStatus === UploadStatus.ACCEPT || this.state.uploadStatus === UploadStatus.ERROR;\n\n return (\n <div className={`upload-image ${this.props.deviceType}`}>\n {this.state.uploadStatus === UploadStatus.INITIAL &&\n <label id='upload-image-drop-zone' className={(this.state.dragOver ? 'drag-over' : undefined)} onDrop={this.dropHandler} htmlFor='upload-image-file'>\n <p className='upload-image-drop-zone-text'>{displayText}</p>\n <input type='file' accept='image/*' id='upload-image-file' name='upload-image-file' ref={this.imageInput} onChange={this.imageInputHandler}/>\n </label>\n }\n\n {showImgPreview &&\n <div className='upload-image-display'>\n <div className='upload-image-display-image-container'>\n <img src={this.currentImage.src}/>\n </div>\n </div>\n }\n\n {(this.state.uploadStatus === UploadStatus.ACCEPT) &&\n <div className='upload-image-display-controls'>\n <button className='upload-image-display-accept' onClick={this.onAcceptFile}>{LocalizationHelper.getString('upload', 'accept')}</button>\n <button className='upload-image-display-decline' onClick={this.onDeclineFile}>{LocalizationHelper.getString('upload', 'decline')}</button>\n </div>\n }\n\n <div className={`upload-image-loading${showLoading ? ' active' : ''}`}>\n <LoadingSpinner width={300} height={300} background={true}/>\n <div className='upload-image-loading-text'>\n {(this.state.uploadStatus === UploadStatus.UPLOADING) ?\n LocalizationHelper.getString('server_processing', 'image_upload') : LocalizationHelper.getString('server_processing', 'image_processing')}\n </div>\n </div>\n\n <FrameAdvisorErrorOverlay\n enabled={this.state.uploadStatus === 'ERROR'}\n onClickOk={this.resetComponent}/>\n </div>\n );\n }\n}\n\nexport {\n UploadImage,\n};\n","import { AgreementType, BipaManager, BipaOverlay } from '@luxottica/bipa-manager';\nimport { DeviceType } from 'current-device';\nimport React, { useState } from 'react';\nimport { getAuthData } from '../../helpers/AuthHelper';\nimport { CallbackHelper } from '../../helpers/CallbackHelper';\nimport { CONFIG } from '../../helpers/ConfigHelper';\nimport { UploadOptions } from '../../interfaces/CaptureParameters';\nimport { FrameAdvisorErrorOverlay } from '../fa-capture/FrameAdvisorErrorOverlay';\nimport { UploadImage } from './UploadImage';\nimport './UploadImageContainer.scss';\n\ntype agreementStatus = 'INITIAL' | 'APPROVED' | 'REJECTED' | 'ERROR';\n\nconst UploadImageContainer = (props: {\n options: UploadOptions,\n deviceType: DeviceType\n}) => {\n\n const [agreementStatus, setAgreementStatus] = useState<agreementStatus>(\n BipaManager.biometricCookieExists(AgreementType.BIOMETRIC) ? 'APPROVED' : 'INITIAL'\n );\n\n let content;\n\n switch (agreementStatus) {\n case 'INITIAL':\n CallbackHelper.onPrivacyDisplay();\n content = (\n <BipaOverlay\n type={AgreementType.BIOMETRIC}\n tokenVersion={CONFIG.tokenVersion}\n accessToken={getAuthData().accessToken}\n refreshToken={getAuthData().refreshToken}\n environment={CONFIG.environment}\n locale={CONFIG.locale}\n source={CONFIG.source}\n region={CONFIG.region}\n callbacks={{\n onTermsAndConditionsClick: CONFIG.privacy.onTermsAndConditionsClick,\n onSubmit: () => {\n // close the Privacy agreement and start the experience\n setAgreementStatus('APPROVED');\n },\n onUserReject: () => {\n // close the Privacy agreement and BLOCK the experience\n setAgreementStatus('REJECTED');\n CallbackHelper.onPrivacyReject();\n },\n onError: (error) => {\n setAgreementStatus('ERROR');\n CallbackHelper.onPrivacyFail(error);\n },\n onAuthUpdated: CallbackHelper.onAuthUpdated\n }} privacy={{\n termsAndConditions: CONFIG.privacy.termsAndConditions,\n localizationText: CONFIG.privacy?.localizationText\n }}/>\n );\n break;\n case 'APPROVED':\n CallbackHelper.onCaptureProcess();\n content = <UploadImage options={props.options} deviceType={props.deviceType}/>;\n break;\n case 'ERROR':\n content = <FrameAdvisorErrorOverlay enabled onClickOk={() => { setAgreementStatus('INITIAL'); }} />;\n break;\n case 'REJECTED':\n default:\n content = <></>;\n break;\n }\n\n return (\n <div className='upload-image-container'>\n {content}\n </div>\n );\n};\n\nexport {\n UploadImageContainer\n};\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { UploadImageContainer } from './UploadImageContainer';\nimport device, { DeviceType } from 'current-device';\nimport { ROOT_STYLE_NAME } from '../../constants/Styling';\nimport { UploadOptions } from '../../interfaces/CaptureParameters';\n\nlet currentContainer;\n\nconst loadUploadImage = (\n container: HTMLElement,\n options: UploadOptions,\n onMount: () => void\n) => {\n\n currentContainer = container;\n currentContainer.classList.add(ROOT_STYLE_NAME);\n const deviceType: DeviceType = (device.mobile()) ? 'mobile' : 'desktop';\n\n ReactDOM.render(\n <UploadImageContainer options={options} deviceType={deviceType}/>,\n container,\n onMount\n );\n};\n\nconst closeUploadImageComponent = () => {\n if (!!currentContainer) {\n ReactDOM.unmountComponentAtNode(currentContainer);\n }\n};\n\nexport {\n loadUploadImage,\n closeUploadImageComponent\n};\n","import React from 'react';\nimport { LocalizationHelper } from '../../helpers/LocalizationHelper';\nimport './VtoCaptureErrorOverlay.scss';\n\nconst VtoCaptureErrorOverlay = (props: {\n enabled: boolean,\n onClickOk: () => void\n}) => {\n\n return (\n <div className={`vto-capture-error-overlay${props.enabled ? ' active' : ''}`}>\n {props.enabled &&\n <div className='vto-capture-error-overlay-modal'>\n <div className='vto-capture-error-overlay-modal-header'>{LocalizationHelper.getString('vto_record', 'video_doesnt_fulfill_requirements')}</div>\n <div className='vto-capture-error-overlay-modal-text'>{LocalizationHelper.getString('capture_error', 'subtext')}</div>\n <button className='vto-capture-error-overlay-modal-button' onClick={props.onClickOk}>\n {LocalizationHelper.getString('capture_error', 'button')}\n </button>\n </div>\n }\n </div>\n );\n};\n\nexport {\n VtoCaptureErrorOverlay\n};\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { ROOT_STYLE_NAME } from '../../constants/Styling';\nimport { VtoCaptureOptions } from '../../interfaces/CaptureParameters';\nimport { VtoCaptureContainer } from './VtoCaptureContainer';\n\nlet currentContainer;\n\nconst loadVtoCapture = (\n container: HTMLElement,\n options: VtoCaptureOptions,\n onMount: () => void\n) => {\n currentContainer = container;\n currentContainer.classList.add(ROOT_STYLE_NAME);\n ReactDOM.render(\n <VtoCaptureContainer options={options}/>,\n container,\n onMount\n );\n};\n\nconst closeVtoCaptureComponent = () => {\n if (!!currentContainer) {\n ReactDOM.unmountComponentAtNode(currentContainer);\n }\n};\n\nexport {\n loadVtoCapture,\n closeVtoCaptureComponent\n};\n","import { AgreementType, BipaManager, BipaOverlay, BipaPage } from '@luxottica/bipa-manager';\nimport React, { lazy, Suspense, useState } from 'react';\nimport { getAuthData } from '../../helpers/AuthHelper';\nimport { CallbackHelper } from '../../helpers/CallbackHelper';\nimport { CONFIG } from '../../helpers/ConfigHelper';\nimport { VtoCaptureOptions } from '../../interfaces/CaptureParameters';\nimport { LoadingSpinner } from '../LoadingSpinner';\nimport './VtoCaptureContainer.scss';\nimport { VtoCaptureErrorOverlay } from './VtoCaptureErrorOverlay';\n\n\ntype agreementStatus = 'INITIAL' | 'APPROVED' | 'REJECTED' | 'ERROR';\n\nconst VtoCaptureContainer = (props: {\n options: VtoCaptureOptions\n}) => {\n\n // begin to download the capture chunk while the user is checking the privacy\n // in case the privacy is already accepted the user will see a loading spinner\n const lazyVtoCapturePromise = import(/* webpackChunkName: \"VtoCaptureVideo\" */ './VtoCaptureVideo')\n .then(({ VtoCaptureVideo }) => ({ default: VtoCaptureVideo }));\n\n // REACT.lazy wrapper used to display a spinner while loading\n const LazyVtoCaptureVideo = lazy(() => lazyVtoCapturePromise);\n\n const [agreementStatus, setAgreementStatus] = useState<agreementStatus>(\n BipaManager.biometricCookieExists(AgreementType.BIOMETRIC) ? 'APPROVED' : 'INITIAL'\n );\n\n let content;\n\n switch (agreementStatus) {\n case 'INITIAL':\n CallbackHelper.onPrivacyDisplay();\n content = (\n <BipaOverlay\n type={AgreementType.BIOMETRIC}\n tokenVersion={CONFIG.tokenVersion}\n accessToken={getAuthData().accessToken}\n refreshToken={getAuthData().refreshToken}\n environment={CONFIG.environment}\n locale={CONFIG.locale}\n source={CONFIG.source}\n region={CONFIG.region}\n callbacks={{\n onTermsAndConditionsClick: CONFIG.privacy.onTermsAndConditionsClick,\n onDisplayPage: (page: BipaPage) => {\n CallbackHelper.onDisplayPrivacyPage(page);\n },\n onSubmit: () => {\n // close the Privacy agreement and start the experience\n setAgreementStatus('APPROVED');\n },\n onUserReject: () => {\n // close the Privacy agreement and BLOCK the experience\n setAgreementStatus('REJECTED');\n CallbackHelper.onPrivacyReject();\n },\n onError: (error) => {\n setAgreementStatus('ERROR');\n CallbackHelper.onPrivacyFail(error);\n },\n onAuthUpdated: CallbackHelper.onAuthUpdated\n }} privacy={{\n termsAndConditions: CONFIG.privacy.termsAndConditions,\n localizationText: CONFIG.privacy?.localizationText\n }}/>\n );\n break;\n case 'APPROVED':\n CallbackHelper.onCaptureProcess();\n content = (\n <Suspense fallback={<LoadingSpinner background={true} width={300} height={300}/>}>\n <LazyVtoCaptureVideo options={props.options} environment={CONFIG.environment}/>\n </Suspense>\n );\n break;\n case 'ERROR':\n content = <VtoCaptureErrorOverlay enabled onClickOk={() => { setAgreementStatus('INITIAL'); }} />;\n break;\n case 'REJECTED':\n default:\n content = <></>;\n break;\n }\n\n return (\n <div className='vto-capture-container'>\n {content}\n </div>\n );\n};\n\nexport {\n VtoCaptureContainer\n};\n","import { TrackingOptions } from '@luxottica/vm-posetracker-faceweb';\n\nconst DefaultTrackingOptions: TrackingOptions = {\n debug: false,\n inspect: false,\n recoveryLimit: 1,\n areaSize: 1,\n areaOffset: [0, 0],\n depthRange: [100, 2000],\n axisRange: [7, 50, 7],\n fittedPointsRatio: 0.25,\n fov: 52.0,\n minimumFaceSizeRatio: 0.3,\n edgeDetectionPercentage: [0.15, 0.1, 0.1, 0.1], // top, right, bottom, left\n onPoseTrack: () => { return; },\n};\n\nexport { DefaultTrackingOptions };\n","import { CaptureOptions } from '../interfaces/CaptureParameters';\nimport { DefaultTrackingOptions } from './DefaultTrackingOptions';\n\nconst DefaultCaptureOptions: CaptureOptions = {\n enableCountdown: true,\n countdownDuration: 3000,\n countdownDelay: 1000,\n tracking: DefaultTrackingOptions,\n showLoading: true,\n enableMachineLearning: false,\n enableVto: true,\n};\n\nexport { DefaultCaptureOptions };\n","import { InitializeOptions } from '../interfaces/InitializeParameters';\n\nconst DefaultInitializeOptions: InitializeOptions = {\n locale: '',\n region: 'US',\n source: 'WEB',\n tokenVersion: 2,\n showCaptureTips: false,\n environment: 'PRODUCTION'\n};\n\nexport { DefaultInitializeOptions };\n","import { TrackingOptions } from '@luxottica/vm-posetracker-faceweb';\n\nconst DefaultTrackingOptionsPortrait: TrackingOptions = {\n debug: false,\n inspect: false,\n recoveryLimit: 1,\n areaSize: 1,\n areaOffset: [0, 0],\n depthRange: [100, 2000],\n axisRange: [7, 50, 7],\n fittedPointsRatio: 0.25,\n fov: 52.0,\n minimumFaceSizeRatio: 0.3,\n edgeDetectionPercentage: [0.15, 0.1, 0.1, 0.1], // top, right, bottom, left\n onPoseTrack: () => { return; },\n};\n\nexport { DefaultTrackingOptionsPortrait };\n","import { TrackingOptions } from '@luxottica/vm-posetracker-faceweb';\n\nconst DefaultTrackingOptionsLandscape: TrackingOptions = {\n debug: false,\n inspect: false,\n recoveryLimit: 1,\n areaSize: 1,\n areaOffset: [0, 0],\n depthRange: [100, 2000],\n axisRange: [7, 50, 7],\n fittedPointsRatio: 0.25,\n fov: 52.0,\n minimumFaceSizeRatio: 0.3,\n edgeDetectionPercentage: [0.15, 0.1, 0.1, 0.1], // top, right, bottom, left\n onPoseTrack: () => { return; },\n};\n\nexport { DefaultTrackingOptionsLandscape };\n","import { UploadOptions } from '../interfaces/CaptureParameters';\n\nconst DefaultUploadOptions: UploadOptions = {\n showLoading: true,\n enableMachineLearning: false,\n enableVto: true,\n};\n\nexport { DefaultUploadOptions };\n","import { VtoCaptureOptions } from '../interfaces/CaptureParameters';\nimport { DefaultTrackingOptions } from './DefaultTrackingOptions';\n\nconst DefaultCaptureDuration = 10000;\n\nconst DefaultVtoCaptureOptions: VtoCaptureOptions = {\n tracking: DefaultTrackingOptions,\n showLoading: true,\n enableMachineLearning: false,\n enableVto: true\n};\n\nexport { DefaultCaptureDuration, DefaultVtoCaptureOptions };\n","import { DefaultCaptureOptions } from '../constants/DefaultCaptureOptions';\nimport { DefaultInitializeOptions } from '../constants/DefaultInitializeOptions';\nimport { DefaultTrackingOptions } from '../constants/DefaultTrackingOptions';\nimport { DefaultTrackingOptionsPortrait } from '../constants/DefaultTrackingOptionsPortrait';\nimport { DefaultTrackingOptionsLandscape } from '../constants/DefaultTrackingOptionsLandscape';\nimport { CaptureOptions, UploadOptions, VtoCaptureOptions } from '../interfaces/CaptureParameters';\nimport { InitializeOptions, PrivacyOptions } from '../interfaces/InitializeParameters';\nimport { InitializationParamsError } from '../errors/errors';\nimport { DefaultUploadOptions } from '../constants/DefaultUploadOptions';\nimport { DefaultVtoCaptureOptions } from '../constants/DefaultVtoCaptureOptions';\nimport device, { DeviceType } from 'current-device';\nimport { FrameAdvisorConfiguration } from '../interfaces/Config';\n\nconst setDefaultInitializeOptions = (\n inputParams: Partial<InitializeOptions> = {}\n): InitializeOptions => {\n // region and source are mandatory\n if (!inputParams.region || !inputParams.source) {\n throw new InitializationParamsError(inputParams);\n }\n return {\n ...DefaultInitializeOptions,\n ...inputParams\n };\n};\n\nconst setDefaultCaptureOptions = (\n inputParams: Partial<CaptureOptions> = {}\n): CaptureOptions => {\n const deviceType: DeviceType = device.tablet() || device.mobile() ? 'mobile' : 'desktop';\n\n return {\n ...DefaultCaptureOptions,\n ...inputParams,\n tracking: {\n ...DefaultTrackingOptions,\n ...inputParams.tracking,\n standstill: {\n ...(deviceType === 'mobile' ? DefaultTrackingOptionsPortrait.standstill : DefaultTrackingOptionsLandscape.standstill),\n ...inputParams.tracking?.standstill,\n },\n },\n showLoading: (inputParams.showLoading === undefined || inputParams.showLoading === null) ? DefaultCaptureOptions.showLoading : inputParams.showLoading,\n };\n};\n\nconst setDefaultVtoCaptureOptions = (\n inputParams: Partial<VtoCaptureOptions> = {}\n): CaptureOptions => {\n return {\n ...DefaultVtoCaptureOptions,\n ...inputParams,\n tracking: {\n ...DefaultTrackingOptions,\n ...inputParams.tracking,\n standstill: {\n ...DefaultTrackingOptions.standstill,\n ...inputParams.tracking?.standstill,\n },\n }\n };\n};\n\nconst setDefaultUploadImageOptions = (\n inputParams: Partial<UploadOptions> = {}\n): UploadOptions => {\n return {\n ...DefaultUploadOptions,\n ...inputParams,\n showLoading: (inputParams.showLoading === undefined || inputParams.showLoading === null) ? DefaultCaptureOptions.showLoading : inputParams.showLoading,\n };\n};\n\nconst validatePrivacyOptions = (\n privacy: PrivacyOptions\n): FrameAdvisorConfiguration['privacy'] => {\n // this throws an error if the URL is not valid\n return {\n termsAndConditions: new URL(privacy.termsAndConditions as string ),\n localizationText: privacy.localizationText,\n onTermsAndConditionsClick: privacy.onTermsAndConditionsClick,\n };\n};\n\nexport {\n setDefaultInitializeOptions,\n setDefaultCaptureOptions,\n setDefaultVtoCaptureOptions,\n setDefaultUploadImageOptions,\n validatePrivacyOptions,\n};\n","import { DeviceDetection } from '@luxottica/vm-devicedetection';\nimport { SupportedFeatures } from '../interfaces/InitializeResult';\n\nconst SupportedFeaturesHelper = {\n getSupportedFeatures() {\n return new Promise<SupportedFeatures>((resolve, reject) => {\n const devicedetection = new DeviceDetection();\n return devicedetection.isVideoInputDeviceAvailable().then((available) => {\n resolve({\n wasmSupport: devicedetection.isWebAssemblySupported(),\n webcamAccess: devicedetection.isUserMediaSupported(),\n webcamAvailable: available\n });\n }).catch((error) => {\n reject(error);\n });\n });\n }\n};\n\nexport { \n SupportedFeaturesHelper\n};\n","import { AgreementType, BipaManager, BipaPage, PrivacyLocalization } from '@luxottica/bipa-manager';\nimport { GuidanceCommand, PoseTracker } from '@luxottica/vm-posetracker-faceweb';\nimport { RemoteLog, RemoteLogConfig } from '@luxottica/vm-remotelog';\nimport { name, version } from '../package.json';\nimport { closeFrameAdvisorComponent, loadFrameAdvisor } from './components/fa-capture/FrameAdvisorLoader';\nimport { uploadImageData } from './components/upload-image/UploadImageData';\nimport { closeUploadImageComponent, loadUploadImage } from './components/upload-image/UploadImageLoader';\nimport { closeVtoCaptureComponent, loadVtoCapture } from './components/vto-capture/VtoCaptureLoader';\nimport { FrameAdvisorError, InitializationError, MountError, NotInitializedError } from './errors/errors';\nimport { resetAuthData, setAuthData } from './helpers/AuthHelper';\nimport { setCallbacks } from './helpers/CallbackHelper';\nimport { setConfig, CONFIG } from './helpers/ConfigHelper';\nimport { LocalizationHelper } from './helpers/LocalizationHelper';\nimport { setDefaultCaptureOptions, setDefaultInitializeOptions, setDefaultUploadImageOptions, setDefaultVtoCaptureOptions, validatePrivacyOptions } from './helpers/ParameterHelper';\nimport { RequestHelper } from './helpers/RequestHelper';\nimport { SupportedFeaturesHelper } from './helpers/SupportedFeaturesHelper';\nimport { CaptureParameters, FrameAdvisorProperty, FrameAdvisorResult, UploadImageDataParameters, UploadImageParameters, VtoCaptureParameters } from './interfaces/CaptureParameters';\nimport { AuthenticationOptions, FrameAdvisorCallbacks, FrameAdvisorRegion, InitializeParameters, PrivacyOptions } from './interfaces/InitializeParameters';\nimport { InitializeResult } from './interfaces/InitializeResult';\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, 'FrameAdvisorCapture');\nconst remoteLog: RemoteLog = new RemoteLog();\nlet initialized = false;\n\nconst onError = (e) => {\n remoteLog.sendAppViewSession({\n statusCode: '99-error',\n statusText: e.message\n });\n};\n\nconst FrameAdvisorCapture = {\n\n version(): string {\n return 'v' + version;\n },\n\n initialize(\n initParams: InitializeParameters\n ): Promise<InitializeResult> {\n\n window.addEventListener('error', onError);\n logger.debug('initializing');\n initialized = false;\n\n // in this world promise is a valid alternative to try/catch block\n return Promise.resolve().then(() => {\n const validatedParams = setDefaultInitializeOptions(initParams.options);\n const validatedPrivacyOptions = validatePrivacyOptions(initParams.privacy);\n\n // set a CONFIG variable to be shared with capture() method\n setConfig(\n validatedParams.environment,\n validatedParams.region,\n validatedParams.source,\n validatedParams.locale,\n validatedPrivacyOptions, // validate privacy URLs\n validatedParams.tokenVersion,\n validatedParams.showCaptureTips\n );\n setCallbacks(initParams.callbacks);\n setAuthData(initParams.auth as AuthenticationOptions);\n\n return Promise.all([\n SupportedFeaturesHelper.getSupportedFeatures().then((features) => {\n return {\n locale: validatedParams.locale,\n isSupported: features.webcamAvailable && features.webcamAccess && features.wasmSupport,\n supportedFeatures: features\n };\n }),\n RequestHelper.login(validatedParams.tokenVersion)\n ]);\n }).then((responseData) => {\n // this downloads all the heavy stuff for the tracker engine\n PoseTracker.warmUp({environment: CONFIG.environment == 'PRODUCTION' ? 'PRODUCTION' : 'TEST'});\n return LocalizationHelper.setLocalizationText(responseData[0].locale, CONFIG.source, CONFIG.showCaptureTips, CONFIG.environment).then(() => {\n initialized = true;\n return {\n locale: responseData[0].locale,\n isSupported: responseData[0].isSupported,\n supportedFeatures: responseData[0].supportedFeatures,\n };\n });\n }).catch((e) => {\n if (e instanceof FrameAdvisorError) {\n throw e;\n } else {\n const error = new InitializationError(initParams, undefined, e);\n logger.error(error);\n throw error;\n }\n });\n },\n\n resetBipaState(): void {\n document.cookie = `${BipaManager.getCookieName(AgreementType.BIOMETRIC)}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/`;\n },\n\n resetAuthToken(): void {\n resetAuthData();\n },\n\n capture(\n captureParams: CaptureParameters\n ): Promise<void> {\n if (!initialized) {\n return Promise.reject(new NotInitializedError());\n }\n\n const validatedOptions = setDefaultCaptureOptions(captureParams.options);\n return RequestHelper.startSession().then(() => {\n return new Promise((resolve, reject) => {\n const container = document.getElementById(captureParams.target);\n if (!!container) {\n loadFrameAdvisor(container, validatedOptions, () => { resolve(undefined); });\n } else {\n reject(new MountError(captureParams.target));\n }\n });\n });\n },\n\n close(): void {\n closeFrameAdvisorComponent();\n window.removeEventListener('error', onError);\n },\n\n vtoCapture(\n vtoCaptureParams: VtoCaptureParameters\n ): Promise<void> {\n if (!initialized) {\n return Promise.reject(new NotInitializedError());\n }\n\n const validatedOptions = setDefaultVtoCaptureOptions(vtoCaptureParams.options);\n return RequestHelper.startSession().then(() => {\n return new Promise((resolve, reject) => {\n const container = document.getElementById(vtoCaptureParams.target);\n if (!!container) {\n loadVtoCapture(container, validatedOptions, () => { resolve(undefined); });\n } else {\n reject(new MountError(vtoCaptureParams.target));\n }\n });\n });\n },\n\n closeVtoCapture(): void {\n closeVtoCaptureComponent();\n window.removeEventListener('error', onError);\n },\n\n uploadImage(\n uploadParams: UploadImageParameters\n ): Promise<void> {\n if (!initialized) {\n return Promise.reject(new NotInitializedError());\n }\n\n const validatedOptions = setDefaultUploadImageOptions(uploadParams.options);\n return new Promise((resolve, reject) => {\n const container = document.getElementById(uploadParams.target);\n if (!!container) {\n loadUploadImage(container, validatedOptions, () => { resolve(undefined); });\n } else {\n reject(new MountError(uploadParams.target));\n }\n });\n },\n\n uploadImageData(\n uploadParams: UploadImageDataParameters\n ): Promise<void> {\n if (!initialized) {\n return Promise.reject(new NotInitializedError());\n }\n\n const validatedOptions = setDefaultUploadImageOptions(uploadParams.options);\n return uploadImageData(uploadParams.imageData, validatedOptions);\n },\n\n closeUploadImage(): void {\n closeUploadImageComponent();\n window.removeEventListener('error', onError);\n },\n};\n\nexport {\n FrameAdvisorCapture,\n GuidanceCommand,\n InitializeParameters,\n FrameAdvisorCallbacks,\n FrameAdvisorRegion,\n CaptureParameters,\n FrameAdvisorResult,\n FrameAdvisorProperty,\n BipaPage,\n PrivacyOptions,\n PrivacyLocalization,\n};\n","import { MicroserviceEnvironment } from '../constants/MicroserviceEnvironment';\nimport { ApiConfig } from '../interfaces/ApiConfig';\n\nconst envHost: Record<MicroserviceEnvironment, string> = {\n STAGING: 'https://test-gateway-vtoprofile.luxdeepblue.com',\n ACCEPTANCE: 'https://acceptance-gateway-vtoprofile.luxdeepblue.com',\n PRODUCTION: 'https://gateway-vtoprofile.luxdeepblue.com'\n};\n\nconst envMap: Record<MicroserviceEnvironment, ApiConfig> = {\n STAGING: {\n loginFaUrl: `${envHost.STAGING}/auth/fradv/token`,\n loginVmUrl: `${envHost.STAGING}/auth/vm/token`,\n refreshUrl: `${envHost.STAGING}/auth/refresh`,\n bipaTextUrl: `${envHost.STAGING}/services/vtobipams/public/v2/bipa/version`,\n bipaSubmitFormUrl: `${envHost.STAGING}/services/vtobipams/public/v1/bipa-consent`,\n videoSessionUrl: `${envHost.STAGING}/services/vtovideoprofilems/public/v3/video`,\n enrichUrl: `${envHost.STAGING}/services/vtovideoprofilems/public/v1/ml-enrich`,\n vtoUrl: `${envHost.STAGING}/services/vtovideoprofilems/public/v1/basel-mesh`,\n additionalInfoUrl: `${envHost.STAGING}/services/vtovideoprofilems/public/v1/additional-info`,\n poseExtractionUrl: `${envHost.STAGING}/services/vtovideoprofilems/public/v1/poses-extraction`,\n statusUrl: `${envHost.STAGING}/services/vtovideoprofilems/public/v2/status`,\n pdStatusUrl: `${envHost.STAGING}/services/vtomedicalinfoms/public/v1/pupillary-distance/status`,\n profileUrl: `${envHost.STAGING}/services/vtovideoprofilems/public/v3/get-video-profile`,\n measurementUrl: `${envHost.STAGING}/services/vtomedicalinfoms/public/v2/pupillary-distance`,\n },\n ACCEPTANCE: {\n loginFaUrl: `${envHost.ACCEPTANCE}/auth/fradv/token`,\n loginVmUrl: `${envHost.ACCEPTANCE}/auth/vm/token`,\n refreshUrl: `${envHost.ACCEPTANCE}/auth/refresh`,\n bipaTextUrl: `${envHost.ACCEPTANCE}/services/vtobipams/public/v2/bipa/version`,\n bipaSubmitFormUrl: `${envHost.ACCEPTANCE}/services/vtobipams/public/v1/bipa-consent`,\n videoSessionUrl: `${envHost.ACCEPTANCE}/services/vtovideoprofilems/public/v3/video`,\n enrichUrl: `${envHost.ACCEPTANCE}/services/vtovideoprofilems/public/v1/ml-enrich`,\n vtoUrl: `${envHost.ACCEPTANCE}/services/vtovideoprofilems/public/v1/basel-mesh`,\n additionalInfoUrl: `${envHost.ACCEPTANCE}/services/vtovideoprofilems/public/v1/additional-info`,\n poseExtractionUrl: `${envHost.ACCEPTANCE}/services/vtovideoprofilems/public/v1/poses-extraction`,\n statusUrl: `${envHost.ACCEPTANCE}/services/vtovideoprofilems/public/v2/status`,\n pdStatusUrl: `${envHost.ACCEPTANCE}/services/vtomedicalinfoms/public/v1/pupillary-distance/status`,\n profileUrl: `${envHost.ACCEPTANCE}/services/vtovideoprofilems/public/v3/get-video-profile`,\n measurementUrl: `${envHost.ACCEPTANCE}/services/vtomedicalinfoms/public/v2/pupillary-distance`,\n },\n PRODUCTION: {\n loginFaUrl: `${envHost.PRODUCTION}/auth/fradv/token`,\n loginVmUrl: `${envHost.PRODUCTION}/auth/vm/token`,\n refreshUrl: `${envHost.PRODUCTION}/auth/refresh`,\n bipaTextUrl: `${envHost.PRODUCTION}/services/vtobipams/public/v2/bipa/version`,\n bipaSubmitFormUrl: `${envHost.PRODUCTION}/services/vtobipams/public/v1/bipa-consent`,\n videoSessionUrl: `${envHost.PRODUCTION}/services/vtovideoprofilems/public/v3/video`,\n enrichUrl: `${envHost.PRODUCTION}/services/vtovideoprofilems/public/v1/ml-enrich`,\n vtoUrl: `${envHost.PRODUCTION}/services/vtovideoprofilems/public/v1/basel-mesh`,\n additionalInfoUrl: `${envHost.PRODUCTION}/services/vtovideoprofilems/public/v1/additional-info`,\n poseExtractionUrl: `${envHost.PRODUCTION}/services/vtovideoprofilems/public/v1/poses-extraction`,\n statusUrl: `${envHost.PRODUCTION}/services/vtovideoprofilems/public/v2/status`,\n pdStatusUrl: `${envHost.PRODUCTION}/services/vtomedicalinfoms/public/v1/pupillary-distance/status`,\n profileUrl: `${envHost.PRODUCTION}/services/vtovideoprofilems/public/v3/get-video-profile`,\n measurementUrl: `${envHost.PRODUCTION}/services/vtomedicalinfoms/public/v2/pupillary-distance`,\n }\n};\n\nconst getConfig = (env: MicroserviceEnvironment, param: keyof ApiConfig): string => {\n return envMap[env][param];\n};\n\nexport {\n getConfig\n};\n","class MicroserviceError extends Error {\n public type: string;\n\n constructor(type: string, message: string, error?: Error) {\n super(message);\n this.type = type;\n this.name = type;\n this.message = message;\n this.stack = error?.stack;\n\n Object.setPrototypeOf(this, MicroserviceError.prototype);\n }\n}\n\nclass EnvironmentError extends MicroserviceError {\n public static type = 'EnvironmentError';\n\n constructor(readonly env: string) {\n super(EnvironmentError.type, `microservice environment ${env} is not valid`);\n Object.setPrototypeOf(this, EnvironmentError.prototype);\n }\n}\n\nclass InvalidInputError extends MicroserviceError {\n public static type = 'InputError';\n\n constructor(message: string, error?: Error) {\n super(InvalidInputError.type, message, error);\n Object.setPrototypeOf(this, InvalidInputError.prototype);\n }\n}\n\nclass LocaleError extends MicroserviceError {\n public static type = 'LocaleError';\n\n constructor(readonly locale: string) {\n super(LocaleError.type, `bipa agreement text cannot be found for locale ${locale}`);\n Object.setPrototypeOf(this, LocaleError.prototype);\n }\n}\n\nclass RequestError extends MicroserviceError {\n public static type = 'RequestError';\n\n constructor(message: string, error?: Error) {\n super(RequestError.type, message, error);\n Object.setPrototypeOf(this, RequestError.prototype);\n }\n}\n\nclass TimeoutError extends MicroserviceError {\n public static type = 'TimeoutError';\n\n constructor(duration: number) {\n super(TimeoutError.type, `request has timed out after ${duration}ms`);\n Object.setPrototypeOf(this, TimeoutError.prototype);\n }\n}\n\nexport {\n InvalidInputError,\n EnvironmentError,\n LocaleError,\n RequestError,\n TimeoutError\n};\n","import { RemoteLogConfig } from '@luxottica/vm-remotelog';\nimport { name, version } from '../../package.json';\nimport { TimeoutError } from '../error/errors';\nimport { VtoRequest } from '../interfaces/Request';\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, 'RequestHelper');\n\nfunction delay(ms: number) {\n return new Promise(\n resolve => setTimeout(resolve, ms)\n );\n}\n\nconst pollPromise = <T>(\n interval: number,\n timeout: number,\n promise: () => Promise<T>,\n shouldCancel: () => boolean\n): Promise<T> => {\n let completed = false;\n const startTime = Date.now();\n return new Promise(async (resolve, reject) => {\n\n while (true) {\n if (completed) { return; }\n if (shouldCancel()) { return; }\n if (Date.now() - startTime > timeout) { reject(new TimeoutError(timeout)); return; }\n\n await promise().then((result) => {\n completed = true;\n resolve(result);\n }).catch(() => {\n logger.debug('continue poll');\n });\n\n await delay(interval);\n }\n });\n};\n\nconst pollProcessingStatus = (\n request: VtoRequest,\n url: string,\n entryTypes: string[]\n): Promise<boolean> => {\n \n return fetch(url, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${request.accessToken}`,\n 'accept': '*/*',\n },\n }).then(response => {\n if (response.ok) {\n return response.json();\n } else {\n throw new Error('FAILED POLL');\n }\n }).then((json: PollingResponse) => {\n logger.debug(json);\n const pollingEntry = json.filter((entry) => { return entryTypes.includes(entry.type); });\n if (pollingEntry.length > 0) {\n // complete when all entries have a result or any entry is KO\n const complete = pollingEntry.every(entry => ['OK', 'KO'].includes(entry.progress))\n || pollingEntry.some(entry => entry.progress === 'KO');\n const success = pollingEntry.every(entry => entry.progress === 'OK');\n if (complete) {\n return success;\n } else {\n throw new Error('processing incomplete');\n }\n } else {\n throw new Error('processing incomplete');\n }\n }).catch(err => {\n logger.debug(err);\n throw(err);\n });\n};\n\nconst parseJsonResponse = (\n response: Response\n): Promise<any> => {\n if (response.ok) {\n return response.json();\n } else {\n return response.json().catch(() => {\n throw new Error(`${response.status}: ${response.statusText}`);\n }).then((json) => {\n throw new Error(JSON.stringify(json));\n });\n }\n};\n\nexport {\n pollPromise,\n pollProcessingStatus,\n parseJsonResponse\n};\n","import { getConfig } from '../config/Config';\nimport { RefreshResponse, RefreshReturn } from '../interfaces/Refresh';\nimport { VtoRequest } from '../interfaces/Request';\n\nconst refreshRequest = (\n request: VtoRequest\n): Promise<RefreshReturn> => {\n\n const url = getConfig(request.environment, 'refreshUrl');\n return fetch(url, {\n method: 'POST',\n headers: {\n 'Accept': '*/*',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n refresh_token: request.refreshToken\n })\n\n }).then(response => {\n if (response.ok) {\n return response.json();\n } else {\n return response.json().catch(() => {\n throw new Error(`${response.status}: ${response.statusText}`);\n }).then((json) => {\n throw new Error(JSON.stringify(json));\n });\n }\n\n }).then((json: RefreshResponse) => {\n // logger.debug(json);\n const refreshReturn = {\n accessToken: json.access_token,\n refreshToken: json.refresh_token\n };\n if (!!request.onAuthUpdated) { request.onAuthUpdated(refreshReturn); }\n return refreshReturn;\n\n }).catch(err => {\n // logger.error(err);\n throw(err);\n\n });\n};\n\nexport {\n refreshRequest\n};\n","import { getConfig } from '../config/Config';\nimport { ProfileRequestData, ProfileResponse, ProfileReturn } from '../interfaces/Profile';\nimport { refreshRequest } from './RefreshRequest';\n\nconst profileFetch = (\n request: ProfileRequestData\n): Promise<Response> => {\n const url = getConfig(request.environment, 'profileUrl');\n\n return fetch(`${url}/${request.videoId}`, {\n method: 'GET',\n headers: {\n 'Accept': '*/*',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${request.accessToken}`\n }\n });\n};\n\nconst profileRequest = (\n request: ProfileRequestData\n): Promise<ProfileReturn> => {\n\n return profileFetch(request).then((profileResponse) => {\n if (profileResponse.status === 401) {\n return refreshRequest(request).then((refreshResponse) => {\n return profileFetch({\n ...request,\n accessToken: refreshResponse.accessToken,\n refreshToken: refreshResponse.refreshToken\n });\n });\n } else {\n return profileResponse;\n }\n\n }).then((response) => {\n if (response.ok) {\n return response.json();\n } else {\n return response.json().catch(() => {\n throw new Error(`${response.status}: ${response.statusText}`);\n }).then((json) => {\n throw new Error(JSON.stringify(json));\n });\n }\n\n }).then((json: ProfileResponse) => {\n const result: ProfileReturn = {};\n result['properties'] = json.mlInformations;\n result['videoId'] = json.uuid;\n return result;\n\n });\n};\n\nexport {\n profileRequest\n};","import { getConfig } from '../config/Config';\nimport { InvalidInputError, RequestError } from '../error/errors';\nimport { pollProcessingStatus, pollPromise } from '../helpers/RequestHelper';\nimport { ProcessImageRequestData, UploadImageDataRequestData, UploadImageRequestData, UploadImageResponse, UploadImageReturn } from '../interfaces/Image';\nimport { ProfileReturn } from '../interfaces/Profile';\nimport { profileRequest } from './ProfileRequest';\nimport { refreshRequest } from './RefreshRequest';\n\nconst uploadImageFetch = (\n request: UploadImageRequestData\n): Promise<Response> => {\n\n const form = new FormData();\n form.append('file', new File([request.img], 'take0.jpg', { type: 'image/jpeg' }));\n\n return fetch(`${request.uploadPath}/take0.jpg`, {\n method: 'POST',\n headers: {\n 'Accept': '*/*',\n Authorization: `Bearer ${request.accessToken}`\n },\n body: form\n });\n};\n\nconst processImageFetch = (\n request: ProcessImageRequestData\n): Promise<Array<Response | undefined>> => {\n const mlUrl = getConfig(request.environment, 'enrichUrl');\n const vtoUrl = getConfig(request.environment, 'vtoUrl');\n\n return Promise.all([\n (request.enableMachineLearning) ? fetch(mlUrl, {\n method: 'POST',\n headers: {\n 'Accept': '*/*',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${request.accessToken}`\n },\n 'body': `{ \"uuid\": \"${request.videoId}\" }`\n }): undefined,\n (request.enableVto) ? fetch(vtoUrl, {\n method: 'POST',\n headers: {\n 'Accept': '*/*',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${request.accessToken}`\n },\n 'body': `{ \"uuid\": \"${request.videoId}\" }`\n }) : undefined\n ]);\n};\n\nconst uploadImageRequest = (\n request: UploadImageRequestData\n): Promise<void> => {\n\n return uploadImageFetch(request).then((uploadImageResponse) => {\n if (uploadImageResponse.status === 401) {\n return refreshRequest(request).then((refreshResponse) => {\n return uploadImageFetch({\n ...request,\n accessToken: refreshResponse.accessToken,\n refreshToken: refreshResponse.refreshToken\n });\n });\n } else {\n return uploadImageResponse;\n }\n }).then((response) => {\n if (response.ok) {\n return;\n } else {\n return response.json().catch(() => {\n throw new Error(`${response.status}: ${response.statusText}`);\n }).then((json) => {\n throw new Error(JSON.stringify(json));\n });\n }\n });\n};\n\nconst uploadImageDataRequest = (\n request: UploadImageDataRequestData\n): Promise<void> => {\n\n return new Promise<Blob>((resolve, reject) => {\n const w = request.imgData.width;\n const h = request.imgData.height;\n \n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n \n const ctx = canvas.getContext('2d');\n if (!!ctx) {\n ctx.putImageData(request.imgData, 0, 0);\n canvas.toBlob((blob) => {\n if (!!blob) {\n resolve(blob);\n } else {\n reject(new RequestError('failed to extract image from canvas'));\n }\n }, 'image/jpeg', 0.95);\n \n } else {\n reject(new RequestError('failed to extract image from canvas'));\n }\n }).then((imgBlob) => {\n return uploadImageRequest({\n ...request,\n img: imgBlob\n });\n });\n};\n\nconst processImageRequest = (\n request: ProcessImageRequestData\n): Promise<ProfileReturn> => {\n\n if (!request.enableMachineLearning && !request.enableVto) {\n return Promise.reject(new InvalidInputError('enableMachineLearning and enableVto cannot both be set to false'));\n }\n\n return processImageFetch(request).then((processImageResponse) => {\n if ((!!processImageResponse[0] && processImageResponse[0].ok && processImageResponse[0].status === 401)\n || (!!processImageResponse[1] && processImageResponse[1].ok && processImageResponse[1].status === 401)) {\n return refreshRequest(request).then((refreshResponse) => {\n return processImageFetch({\n ...request,\n accessToken: refreshResponse.accessToken,\n refreshToken: refreshResponse.refreshToken\n });\n });\n } else {\n return processImageResponse;\n }\n\n }).then((response) => {\n if ((response[0] === undefined || response[0].ok)\n && (response[1] === undefined || response[1].ok)) {\n\n const promises: Promise<boolean>[] = [];\n const entries: string[] = [];\n\n if (request.enableVto) {\n entries.push('BASEL_MESH');\n }\n\n if (request.enableMachineLearning) {\n entries.push('ML_INFORMATION');\n\n const pdStatusUrl = `${getConfig(request.environment, 'pdStatusUrl')}/${request.videoId}` ;\n promises.push(pollPromise(\n 1000,\n 30000,\n () => pollProcessingStatus(request, pdStatusUrl, ['PD']),\n request.shouldCancel\n ));\n }\n\n const statusUrl = `${getConfig(request.environment, 'statusUrl')}/${request.videoId}` ;\n promises.push(pollPromise(\n 1000,\n 30000,\n () => pollProcessingStatus(request, statusUrl, entries),\n request.shouldCancel\n ));\n\n return Promise.all(promises).then(results => results.every(result => !!result));\n\n } else {\n throw new RequestError(`failed to poll status with sessionId=${request.videoId}`);\n }\n\n }).then((success) => {\n if (success) {\n return profileRequest(request);\n } else {\n throw new RequestError(`failed to poll status with sessionId=${request.videoId}`);\n }\n });\n};\n\nexport {\n uploadImageRequest,\n uploadImageDataRequest,\n processImageRequest\n};","import { getConfig } from '../config/Config';\nimport { LoginRequestData, LoginResponse, LoginReturn } from '../interfaces/Login';\n\nconst loginRequest = (\n request: LoginRequestData\n): Promise<LoginReturn> => {\n\n if (!!request.accessToken && !!request.refreshToken) {\n return Promise.resolve({\n accessToken: request.accessToken,\n refreshToken: request.refreshToken\n });\n\n } else {\n const loginType = (request.version === 1) ? 'loginVmUrl' : 'loginFaUrl';\n const url = getConfig(request.environment, loginType);\n return fetch(url, {\n method: 'POST',\n headers: {\n 'Accept': '*/*',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ rememberMe: true })\n }).then((response) => {\n if (response.ok) {\n return response.json();\n } else {\n return response.json().catch(() => {\n throw new Error(`${response.status}: ${response.statusText}`);\n }).then((json) => {\n throw new Error(JSON.stringify(json));\n });\n }\n }).then((json: LoginResponse) => {\n const authData = {\n accessToken: json.access_token,\n refreshToken: json.refresh_token\n };\n request.onAuthUpdated?.(authData);\n return authData;\n });\n }\n};\n\nexport {\n loginRequest\n};","import { getConfig } from '../config/Config';\nimport { SessionRequestData, SessionResponse, SessionReturn } from '../interfaces/Session';\nimport { refreshRequest } from './RefreshRequest';\n\nconst sessionFetch = (\n request: SessionRequestData\n): Promise<Response> => {\n\n const url = getConfig(request.environment, 'videoSessionUrl');\n return fetch(url, {\n method: 'POST',\n headers: {\n 'Accept': '*/*',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${request.accessToken}`,\n },\n body: `{ \"region\": \"${request.region}\", \"source\": \"${request.source}\"}`\n });\n};\n\nconst sessionRequest = (\n request: SessionRequestData\n): Promise<SessionReturn> => {\n\n return sessionFetch(request).then((sessionResponse) => {\n if (sessionResponse.status === 401) {\n return refreshRequest(request).then((refreshResponse) => {\n return sessionFetch({\n ...request,\n accessToken: refreshResponse.accessToken,\n refreshToken: refreshResponse.refreshToken\n });\n });\n } else {\n return sessionResponse;\n }\n }).then((response) => {\n if (response.ok) {\n return response.json();\n } else {\n return response.json().catch(() => {\n throw new Error(`${response.status}: ${response.statusText}`);\n }).then((json) => {\n throw new Error(JSON.stringify(json));\n });\n }\n }).then((json: SessionResponse) => {\n return {\n videoId: json.uuid,\n uploadPath: json.uploadBasePath,\n };\n });\n};\n\nexport {\n sessionRequest\n};","import { getConfig } from '../config/Config';\nimport { MeasurementRequestData } from '../interfaces/Measurement';\n\nconst uploadMeasurementRequest = (\n request: MeasurementRequestData\n): Promise<void> => {\n\n const url = getConfig(request.environment, 'measurementUrl') + '/' + request.videoId;\n return fetch(url, {\n method: 'PUT',\n headers: {\n 'Accept': '*/*',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${request.accessToken}`\n },\n body: JSON.stringify({\n finalComputedPD: request.finalComputedPD,\n finalFaceBreadth: request.finalFaceBreadth,\n irisFaceBreadth: 0,\n irisRawPD: 0\n })\n })\n .then((response) => {\n if (response.ok) {\n return;\n } else {\n throw new Error(`${response.status}: ${response.statusText}`);\n }\n });\n};\n\nexport {\n uploadMeasurementRequest\n};","import { getConfig } from '../config/Config';\nimport { InvalidInputError, RequestError } from '../error/errors';\nimport { pollProcessingStatus, pollPromise } from '../helpers/RequestHelper';\nimport { ProfileReturn } from '../interfaces/Profile';\nimport { ProcessVideoRequestData, UploadVideoRequestData } from '../interfaces/Video';\nimport { profileRequest } from './ProfileRequest';\nimport { refreshRequest } from './RefreshRequest';\n\nconst uploadVideoFetch = (\n request: UploadVideoRequestData\n): Promise<Response> => {\n\n const form = new FormData();\n const mimeType = `video/${request.fileType}`;\n form.append('file', new File(request.video, `videoTake.${request.fileType}`, { type: mimeType }));\n\n return fetch(`${request.uploadPath}/videoTake.${request.fileType}`, {\n method: 'POST',\n headers: {\n 'Accept': '*/*',\n Authorization: `Bearer ${request.accessToken}`,\n },\n body: form\n }).then(response => {\n const url = getConfig(request.environment, 'additionalInfoUrl');\n\n if (response.ok) {\n return fetch(`${url}/${request.videoId}`, {\n method: 'PUT',\n headers: {\n 'Accept': '*/*',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${request.accessToken}`,\n },\n 'body': `{ \"mimeType\": \"${mimeType}\" }`\n });\n } else {\n const e = new Error('failed to upload');\n throw e;\n }\n });\n};\n\nconst processVideoFetch = (\n request: ProcessVideoRequestData\n): Promise<Array<Response | undefined>> => {\n const mlUrl = getConfig(request.environment, 'enrichUrl');\n const vtoUrl = getConfig(request.environment, 'poseExtractionUrl');\n\n return Promise.all([\n (request.enableMachineLearning) ? fetch(mlUrl, {\n method: 'POST',\n headers: {\n 'Accept': '*/*',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${request.accessToken}`\n },\n 'body': `{ \"uuid\": \"${request.videoId}\" }`\n }): undefined,\n (request.enableVto) ? fetch(vtoUrl, {\n method: 'POST',\n headers: {\n 'Accept': '*/*',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${request.accessToken}`\n },\n 'body': `{ \"uuid\": \"${request.videoId}\" }`\n }) : undefined\n ]);\n};\n\nconst uploadVideoRequest = (\n request: UploadVideoRequestData\n): Promise<void> => {\n\n return uploadVideoFetch(request).then((uploadVideoResponse) => {\n if (uploadVideoResponse.status === 401) {\n return refreshRequest(request).then((refreshResponse) => {\n return uploadVideoFetch({\n ...request,\n accessToken: refreshResponse.accessToken,\n refreshToken: refreshResponse.refreshToken\n });\n });\n } else {\n return uploadVideoResponse;\n }\n }).then((response) => {\n if (response.ok) {\n return;\n } else {\n return response.json().catch(() => {\n throw new Error(`${response.status}: ${response.statusText}`);\n }).then((json) => {\n throw new Error(JSON.stringify(json));\n });\n }\n });\n};\n\nconst processVideoRequest = (\n request: ProcessVideoRequestData\n): Promise<ProfileReturn> => {\n\n if (!request.enableMachineLearning && !request.enableVto) {\n return Promise.reject(new InvalidInputError('enableMachineLearning and enableVto cannot both be set to false'));\n }\n\n return processVideoFetch(request).then((processVideoResponse) => {\n if ((!!processVideoResponse[0] && processVideoResponse[0].ok && processVideoResponse[0].status === 401)\n || (!!processVideoResponse[1] && processVideoResponse[1].ok && processVideoResponse[1].status === 401)) {\n return refreshRequest(request).then((refreshResponse) => {\n return processVideoFetch({\n ...request,\n accessToken: refreshResponse.accessToken,\n refreshToken: refreshResponse.refreshToken\n });\n });\n } else {\n return processVideoResponse;\n }\n\n }).then((response) => {\n if ((response[0] === undefined || response[0].ok)\n && (response[1] === undefined || response[1].ok)) {\n\n const promises: Promise<boolean>[] = [];\n const entries: string[] = ['POSES_EXTRACTION'];\n\n if (request.enableVto) {\n entries.push('BASEL_MESH');\n }\n\n if (request.enableMachineLearning) {\n entries.push('ML_INFORMATION');\n\n const pdStatusUrl = `${getConfig(request.environment, 'pdStatusUrl')}/${request.videoId}` ;\n promises.push(pollPromise(\n 1000,\n 30000,\n () => pollProcessingStatus(request, pdStatusUrl, ['PD']),\n request.shouldCancel\n ));\n }\n\n const statusUrl = `${getConfig(request.environment, 'statusUrl')}/${request.videoId}` ;\n promises.push(pollPromise(\n 1000,\n 30000,\n () => pollProcessingStatus(request, statusUrl, entries),\n request.shouldCancel\n ));\n\n return Promise.all(promises).then(results => results.every(result => !!result));\n\n } else {\n throw new RequestError(`failed to poll status with sessionId=${request.videoId}`);\n }\n\n }).then((success) => {\n if (success) {\n return profileRequest(request);\n } else {\n throw new RequestError(`failed to poll status with sessionId=${request.videoId}`);\n }\n });\n};\n\nexport {\n uploadVideoRequest,\n processVideoRequest\n};\n","export enum GuidanceCommand {\n NONE = 7,\n UNKNOWN = 8,\n MOVE_CENTER = 9,\n MOVE_CLOSER = 10,\n MOVE_FARTHER = 11,\n MOVE_UP = 12,\n MOVE_RIGHT = 13,\n MOVE_DOWN = 14,\n MOVE_LEFT = 15,\n LOOK_UP = 16,\n LOOK_RIGHT = 17,\n LOOK_DOWN = 18,\n LOOK_LEFT = 19,\n TILT_LEFT = 20,\n TILT_RIGHT = 21,\n STAY_STILL = 22\n}\n","export const envToConfigUrl = new Map([\n ['TEST', 'https://vmcore-test.luxottica.com/headtracker/mp-tf/0.0.0/'],\n ['PRODUCTION', 'https://vmcore.luxottica.com/headtracker/mp-tf/0.0.0/']\n]);\n","//import { IFaceMetrics } from \"@luxottica/face-web/faceRegions\";\nexport enum TrackResult {\n OK = 0,\n LostWillTryRecovery = -3,\n LostWillReset = -4,\n FaceFittingTooNarrow = -5,\n AnglesOutOfRange = -6,\n NoFaceFound = -10,\n FaceTooSmallDetected = -11,\n FaceDetectedWaitForMoreSamples = -12,\n TrackerStopped = -20\n}\n","import {\n Defect,\n FaceWebResult,\n IFaceMetrics,\n InputMap\n} from '@luxottica/face-web';\nimport type { FaceWeb, RulerStatus, DefectType } from '@luxottica/face-web';\nimport { GuidanceCommand } from './interfaces/GuidanceCommand';\n\nimport { envToConfigUrl } from './constants/envToConfigUrl';\nimport { formatPose, FormattedPose } from './Helper';\nimport { PoseResponse } from './interfaces/PoseResponse';\nimport { FilterOptions, TrackingOptions } from './interfaces/TrackingOptions';\nimport { TrackResult } from './interfaces/TrackResult';\nimport { WasmCapabilities } from './interfaces/WasmCapabilities';\nimport { FacewebEnvironment } from './interfaces/FaceWebEnvironment';\n\nclass PoseTracker {\n\n private static faceWeb: FaceWeb;\n private static initializationPromise: Promise<void>;\n private ready = false;\n private metricsSubscribers = new Array<(IFaceMetrics)=>void>();\n private container: HTMLDivElement;\n private pupillaryDistance: number;\n private faceBreadth: number;\n private faceBreadth2: number;\n private inspector: boolean;\n\n constructor(\n processingVerticalFoVDeg: number,\n filter: FilterOptions,\n environment: FacewebEnvironment,\n onWasmLoaded: () => void,\n onFail?: () => void,\n debugFeatures?: boolean\n ) {\n\n PoseTracker.warmUp({\n verticalFovDeg: processingVerticalFoVDeg,\n environment: environment\n }).then(() => {\n PoseTracker.initializationPromise.then(()=>{\n this.ready = true;\n onWasmLoaded();\n });\n }).catch(()=>{\n onFail();\n });\n\n if(debugFeatures){\n (window as any).VMPTFaceMeasurementInspector = (value = true) => {\n this.updateInspector(value);\n };\n }\n\n if (filter) {\n this.setFilters(filter);\n }\n }\n\n private updateInspector(show: boolean){\n this.inspector = show;\n if(this.container)\n this.container.remove();\n \n if(show === false){\n return;\n }\n\n this.container = document.createElement('div');\n const p = document.createElement('p');\n p.style.position = 'fixed';\n p.style.bottom = '50vh';\n p.style.left = '1vw';\n p.style.background = 'rgba(255,255,255,.5)';\n\n p.appendChild(document.createElement('br'));\n p.appendChild(document.createElement('br'));\n p.innerHTML = `\npupillary distance: ${this.pupillaryDistance}\n<br>\nface breadth: ${this.faceBreadth}\n<br>\nface breadth2: ${this.faceBreadth2}\n `;\n this.container.appendChild(p);\n document.body.appendChild(this.container);\n }\n\n public setFps(fps: number){\n PoseTracker.faceWeb.fps = fps;\n }\n\n public setFilters(filter: FilterOptions): void {\n if (filter?.rotationFilter) {\n PoseTracker.faceWeb.rotationFilter = filter.rotationFilter;\n }\n if (filter?.translationFilter) {\n PoseTracker.faceWeb.translationFilter = filter.translationFilter;\n }\n }\n\n public reset(): void{\n PoseTracker.faceWeb.reset();\n }\n\n public formatPose = (pose: Float32Array) => {\n return formatPose(pose);\n };\n\n public set enableProminentSubjectSegmenter(value: boolean) {\n PoseTracker.faceWeb.enableProminentSubjectSegmenter = value;\n }\n\n public static warmUp(options: {verticalFovDeg?: number, environment: FacewebEnvironment}): Promise<void> {\n return import('@luxottica/face-web')\n .then(({FaceWeb}) => {\n if (PoseTracker.faceWeb === undefined) {\n PoseTracker.faceWeb = new FaceWeb({\n verticalFovDeg: options.verticalFovDeg ?? 52,\n assetsDir: envToConfigUrl.get(options.environment ?? 'TEST')\n });\n PoseTracker.faceWeb.usePoseSmoothing = true;\n PoseTracker.faceWeb.enableProminentSubjectSegmenter = false;\n PoseTracker.faceWeb.useLandmarksSmoothing = true;\n PoseTracker.faceWeb.velocityFilter = {\n windowSize: 15,\n velocityScale: 0.25,\n };\n PoseTracker.faceWeb.translationFilter.velocityFilter = {\n windowSize: 5,\n velocityScale: 0.3,\n };\n PoseTracker.faceWeb.rotationFilter.velocityFilter = {\n windowSize: 5,\n velocityScale: 0.6,\n };\n \n PoseTracker.initializationPromise = PoseTracker.faceWeb.initialize();\n \n } else {\n PoseTracker.faceWeb.verticalFovDeg = options.verticalFovDeg;\n }\n });\n }\n\n public isReady(): boolean {\n return this.ready;\n }\n\n public usePoseSmoothing(smoothing: boolean){\n PoseTracker.faceWeb.usePoseSmoothing = smoothing;\n }\n\n public useLandmarksSmoothing(smoothing: boolean){\n PoseTracker.faceWeb.useLandmarksSmoothing = smoothing;\n }\n\n public initMetrics(irisDiameterMM, historySize): Promise<void>{\n const config = {\n yawLimitDeg: 15,\n pitchLimitDeg: 15,\n pupilMinPx: 10,\n yawMaxDeg: 15,\n pitchMaxDeg: 15\n };\n //if(irisDiameterMM !== undefined && historySize !== undefined)\n PoseTracker.faceWeb.startRuler({irisDiameterMM: 12.2, outlierDetectorConfig: config});\n //else\n //PoseTracker.faceWeb.startRuler();\n return Promise.resolve();\n }\n\n public getMetrics(): Promise<IFaceMetrics> {\n return new Promise((resolve, reject)=>{\n this.metricsSubscribers.push(resolve);\n });\n }\n\n checkDefectsVM(pose){\n const rotationBound = 0.2;\n const xyBound = 30;\n const loopData = [\n {lBound: -rotationBound, hBound: rotationBound, value: pose[0], lCommand: GuidanceCommand.LOOK_DOWN, hCommand: GuidanceCommand.LOOK_UP},\n {lBound: -rotationBound, hBound: rotationBound, value: pose[1], lCommand: GuidanceCommand.LOOK_RIGHT, hCommand: GuidanceCommand.LOOK_LEFT},\n {lBound: -rotationBound, hBound: rotationBound, value: pose[2], lCommand: GuidanceCommand.TILT_LEFT, hCommand: GuidanceCommand.TILT_RIGHT},\n {lBound: -xyBound, hBound: xyBound, value: pose[3], lCommand: GuidanceCommand.MOVE_LEFT, hCommand: GuidanceCommand.MOVE_RIGHT},\n {lBound: -xyBound, hBound: xyBound, value: pose[4], lCommand: GuidanceCommand.MOVE_UP, hCommand: GuidanceCommand.MOVE_DOWN},\n {lBound: 300, hBound: 500, value: pose[5], lCommand: GuidanceCommand.MOVE_FARTHER, hCommand: GuidanceCommand.MOVE_CLOSER},\n ];\n\n /*const loopData = [\n {lBound: -xyBound, hBound: xyBound, value: pose[3], lCommand: GuidanceCommand.MOVE_LEFT, hCommand: GuidanceCommand.MOVE_RIGHT},\n {lBound: -xyBound, hBound: xyBound, value: pose[4], lCommand: GuidanceCommand.MOVE_UP, hCommand: GuidanceCommand.MOVE_DOWN},\n ]*/\n\n for(const g of loopData){\n if(g.value < g.lBound) return g.lCommand;\n if(g.value > g.hBound) return g.hCommand;\n }\n\n return GuidanceCommand.STAY_STILL;\n }\n\n checkDefectsFW(defects: Defect[]){\n if(!defects)\n return GuidanceCommand.STAY_STILL;\n for(const d of defects){\n if(d.presence){\n switch(d.type as DefectType){\n case 'PITCH_TOO_HIGH' as DefectType: return GuidanceCommand.LOOK_UP;\n case 'PITCH_TOO_LOW' as DefectType: return GuidanceCommand.LOOK_DOWN;\n case 'YAW_TOO_HIGH' as DefectType: return GuidanceCommand.LOOK_RIGHT;\n case 'YAW_TOO_LOW' as DefectType: return GuidanceCommand.LOOK_LEFT;\n case 'TX_TOO_LEFT' as DefectType: return GuidanceCommand.MOVE_RIGHT;\n case 'TX_TOO_RIGHT' as DefectType: return GuidanceCommand.MOVE_LEFT;\n case 'TY_TOO_TOP' as DefectType: return GuidanceCommand.MOVE_DOWN;\n case 'TY_TOO_BOTTOM' as DefectType: return GuidanceCommand.MOVE_UP;\n case 'TZ_TOO_FAR' as DefectType: return GuidanceCommand.MOVE_CLOSER;\n case 'TZ_TOO_NEAR' as DefectType: return GuidanceCommand.MOVE_FARTHER;\n case 'PUPIL_TOO_SMALL' as DefectType: return GuidanceCommand.MOVE_CLOSER;\n case 'PUPIL_TOO_BIG' as DefectType: return GuidanceCommand.MOVE_FARTHER;\n }\n }\n }\n return GuidanceCommand.STAY_STILL;\n }\n\n public getPose(imageData: InputMap): Promise<PoseResponse> {\n return PoseTracker.faceWeb.sendAndReturnResults(imageData).then((results: FaceWebResult)=>{\n // TODO the has face should be returned\n const pose = results.hasFace ? new Float32Array(results.vtoPoseArray) : undefined;\n \n if(results.metrics && results.metrics.rulerStatus == 'COMPLETED' as RulerStatus){\n if(this.inspector){\n this.pupillaryDistance = results.metrics.finalPDmm;\n this.faceBreadth = results.metrics.finalFBmm;\n this.faceBreadth2 = results.metrics.finalFBmm2;\n this.updateInspector(true);\n }\n for(const f of this.metricsSubscribers)\n f(results.metrics);\n }\n\n // computing guidance command\n let guidance = GuidanceCommand.UNKNOWN;\n if(results.hasFace){\n guidance = GuidanceCommand.STAY_STILL;\n const guidanceFW = this.checkDefectsFW(results.outlier?.defects);\n const guidanceVM = this.checkDefectsVM(pose);\n if(guidanceVM != GuidanceCommand.STAY_STILL){\n guidance = guidanceVM;\n }\n \n if(guidanceFW != GuidanceCommand.STAY_STILL){\n guidance = guidanceFW;\n }\n }\n return {\n result: results,\n pose: pose,\n renderDelay: false,\n guidanceCommand: guidance,\n wasmStatus: results.hasFace ? TrackResult.OK : TrackResult.NoFaceFound,\n wearsGlasses: false,\n };\n });\n }\n}\n\nexport {GuidanceCommand, PoseResponse, FormattedPose, TrackingOptions, PoseTracker, TrackResult, WasmCapabilities, IFaceMetrics};\nexport type { InputMap };","import { vec3 } from 'gl-matrix';\n\nconst radToDegK = (180 / Math.PI);\n\nconst radToDeg = (value: number, trailingDigits = 2): string => {\n return (value * radToDegK).toFixed(trailingDigits);\n};\n\nexport interface FormattedPose {\n position: {\n x: string,\n y: string,\n z: string,\n };\n rotation: {\n p: string,\n y: string,\n r: string\n };\n}\n\nconst axisAngleToEuler = (axisAngle: Float32Array) => {\n const axis = vec3.fromValues(axisAngle[0], axisAngle[1], axisAngle[2]);\n const angle = vec3.length(axis);\n if (angle < 1e-6) {\n return [0.0, 0.0, 0.0];\n }\n axis[0] /= angle;\n axis[1] /= angle;\n axis[2] /= angle;\n\n const q = new Float32Array(4);\n const sine = Math.sin(angle);\n q[0] = Math.sqrt(2 + 2 * Math.cos(angle)) / 2;\n q[1] = sine * axis[0] / (2 * q[0]);\n q[2] = sine * axis[1] / (2 * q[0]);\n q[3] = sine * axis[2] / (2 * q[0]);\n const pitch = Math.atan2(2 * (q[0] * q[1] - q[2] * q[3]),\n q[0] * q[0] - q[1] * q[1] - q[2] * q[2] + q[3] * q[3]);\n const yaw = Math.asin(2 * (q[0] * q[2] + q[1] * q[3]));\n const roll = Math.atan2(2 * (q[0] * q[3] - q[1] * q[2]),\n q[0] * q[0] + q[1] * q[1] - q[2] * q[2] - q[3] * q[3]);\n return [pitch, yaw, roll];\n };\n\nexport const formatPose = (pose: Float32Array): FormattedPose => {\n return {\n position: {\n x: pose[3].toFixed(2),\n y: pose[4].toFixed(2),\n z: pose[5].toFixed(2),\n },\n rotation: {\n p: pose[0].toFixed(2),\n y: pose[1].toFixed(2),\n r: pose[2].toFixed(2),\n },\n };\n\n if (!pose || !pose[3] || !pose[4] || !pose[5]) {\n return undefined;\n }\n const eulerAngles: number[] = axisAngleToEuler(pose);\n return {\n position: {\n x: pose[3].toFixed(2),\n y: pose[4].toFixed(2),\n z: pose[5].toFixed(2),\n },\n rotation: {\n p: radToDeg(eulerAngles[0], 2),\n y: radToDeg(eulerAngles[1], 2),\n r: radToDeg(eulerAngles[2], 2),\n },\n };\n};"],"names":["access_token","refresh_token","CONFIG","ROOT_STYLE_NAME","logger","RemoteLogConfig","getLoggerInfo","name","version","getAuthData","accessToken","refreshToken","setAuthData","authData","debug","DOMDefaultTarget","document","querySelector","onLoadingEvent","dispatchEvent","Event","onAvisorResultEvent","onCaptureErrorEvent","onDisplayPrivacyPageEvent","onPrivacyDisplayEvent","onCaptureProcessEvent","onPosetrackerLoadedEvent","CallbackHelper","onDisplayPrivacyPage","onPrivacyDisplay","onPrivacyFail","onPrivacyReject","onVtoCaptureStep","onCountdown","onNudging","onImageConfirm","undefined","onLoading","onAdvisorResult","onCaptureProcess","onCaptureError","onAuthUpdated","onPosetrackerLoaded","LoadingSpinner","props","size","Math","min","width","height","React","className","style","LocalizationDefaults","locale","language","localeMap","de","en","es","fr","it","ja","ko","nl","pl","pt","sv","tr","zh","translations","permission_error","error","subtext","webcam_error","generic_error","manual_start","button","text","guidance","unknown","default","move_closer","move_farther","look_up","look_right","look_down","look_left","tilt_left","tilt_right","glasses","stay_still","bright_light_conditions","eye_aspect_ratio_too_small","low_light_conditions","stay_still_video","too_bright_left","too_bright_right","vto_record","get_ready","step_1","step_2","step_3","step_4","step_5","video_doesnt_fulfill_requirements","record_picture","server_processing","loading","image_upload","image_processing","done","capture_error","upload","click_or_drop","drop_here","tap_to_upload","accept","decline","ssTranslations","FrameAdvisorError","constructor","type","message","stack","Object","setPrototypeOf","prototype","Error","InitializationError","input","JSON","stringify","NotInitializedError","LocalizationError","MountError","divId","RequestError","ServerError","PrivacyError","TimeoutError","duration","InitializationParamsError","params","RecordingError","localizedFaTranslations","localizedSmartShopperTranslations","localizationBaseUrl","fetchFrameAdvisorJson","env","translateEnvLabel","translateEnv","localizationFileUrl","fetch","then","response","ok","json","console","log","fetchSmartShopperJson","source","fileUrl","fetchFrameAdvisorTranslations","downloadSsLocalization","Promise","all","catch","resolve","LocalizationHelper","getString","page","key","e","warn","getSmartShopperString","setLocalizationText","backupLanguage","reject","split","fetchFrameAdvisorLocalization","translationFound","backupLocale","defaultLocale","translation","backupLanguageTranslation","defaultLanguageTranslation","CrosshairIcon","xmlns","viewBox","fill","cx","cy","r","stroke","strokeWidth","d","DeviceIcon","clipPath","id","transform","EyeglassIcon","FaceIcon","HairIcon","SunIcon","RotateIcon","FrameAdvisorCaptureTips","useState","device","landscapeMode","setLandscapeMode","landscape","currentPage","setCurrentPage","setOrientation","onClickContinue","onComplete","useEffect","window","addEventListener","removeEventListener","onClick","FrameAdvisorErrorOverlay","CaptureStatus","enabled","onClickOk","currentContainer","mediaRecorder","captureComplete","FrameAdvisorContainer","content","lazyFrameAdvisorPromise","FrameAdvisorVideo","LazyFrameAdvisorVideo","lazy","BipaManager","agreementStatus","setAgreementStatus","showCaptureTips","setShowCaptureTips","setLandscape","orientation","BipaOverlay","tokenVersion","environment","region","callbacks","onTermsAndConditionsClick","privacy","onDisplayPage","onSubmit","onUserReject","onError","termsAndConditions","localizationText","_CONFIG$privacy","Suspense","fallback","background","options","onStatusChange","status","COMPLETE","PROCESSING","UPLOADING","SAVING","ERROR","currentFileType","videoId","uploadPath","chunks","defaultMimeType","iosMimeType","ffMimeType","RecordingHelper","initialize","mediaStream","mimeType","reset","MediaRecorder","isTypeSupported","onstart","ondataavailable","blobEvent","data","push","startRecording","state","start","stopRecording","stop","getFileType","RequestHelper","login","loginRequest","startSession","sessionRequest","result","uploadImage","img","uploadImageRequest","uploadImageData","imgData","uploadImageDataRequest","processImage","enableMachineLearning","enableVto","shouldCancel","processImageRequest","uploadVideo","video","uploadVideoRequest","fileType","processVideo","processVideoRequest","uploadMeasurement","finalComputedPD","finalFaceBreadth","uploadMeasurementRequest","UploadStatus","UploadImage","currentImage","Image","imageInputHandler","imageInput","current","_this$imageInput$curr","_this$imageInput$curr2","files","generateImagePreview","_this$imageInput$curr3","_this$imageInput$curr4","currentTarget","value","dropHandler","file","stopPropagation","preventDefault","setState","dragOver","dataTransfer","items","_e$dataTransfer$items","kind","getAsFile","_e$dataTransfer","length","currentFile","reader","FileReader","readAsDataURL","onload","src","target","toString","uploadStatus","ACCEPT_THIRD_PARTY","imageAccepted","sendUploadImageRequest","INITIAL","ACCEPT","windowDropHandler","mouseEnterHandler","dragOverHandler","dragEnterHandler","dragLeaveHandler","onAcceptFile","onDeclineFile","mounted","resetComponent","_objectSpread","properties","createRef","componentDidMount","this","body","componentWillUnmount","render","displayText","deviceType","showLoading","showImgPreview","onDrop","htmlFor","ref","onChange","Component","UploadImageContainer","VtoCaptureErrorOverlay","VtoCaptureContainer","lazyVtoCapturePromise","VtoCaptureVideo","LazyVtoCaptureVideo","DefaultTrackingOptions","inspect","recoveryLimit","areaSize","areaOffset","depthRange","axisRange","fittedPointsRatio","fov","minimumFaceSizeRatio","edgeDetectionPercentage","onPoseTrack","DefaultCaptureOptions","enableCountdown","countdownDuration","countdownDelay","tracking","DefaultInitializeOptions","DefaultTrackingOptionsPortrait","DefaultTrackingOptionsLandscape","DefaultUploadOptions","DefaultCaptureDuration","DefaultVtoCaptureOptions","setDefaultUploadImageOptions","inputParams","SupportedFeaturesHelper","devicedetection","DeviceDetection","isVideoInputDeviceAvailable","available","wasmSupport","isWebAssemblySupported","webcamAccess","isUserMediaSupported","webcamAvailable","remoteLog","RemoteLog","initialized","sendAppViewSession","statusCode","statusText","FrameAdvisorCapture","initParams","validatedParams","setDefaultInitializeOptions","validatedPrivacyOptions","URL","setConfig","_callbacks$onAuthUpda","auth","features","isSupported","supportedFeatures","responseData","PoseTracker","resetBipaState","cookie","resetAuthToken","capture","captureParams","validatedOptions","setDefaultCaptureOptions","standstill","_inputParams$tracking","container","getElementById","loadFrameAdvisor","onMount","classList","add","ReactDOM","close","vtoCapture","vtoCaptureParams","setDefaultVtoCaptureOptions","_inputParams$tracking2","loadVtoCapture","closeVtoCapture","uploadParams","loadUploadImage","imageData","closeUploadImage","envHost","envMap","STAGING","loginFaUrl","loginVmUrl","refreshUrl","bipaTextUrl","bipaSubmitFormUrl","videoSessionUrl","enrichUrl","vtoUrl","additionalInfoUrl","poseExtractionUrl","statusUrl","pdStatusUrl","profileUrl","measurementUrl","ACCEPTANCE","PRODUCTION","getConfig","param","MicroserviceError","EnvironmentError","InvalidInputError","LocaleError","delay","ms","setTimeout","pollPromise","interval","timeout","promise","completed","startTime","Date","now","pollProcessingStatus","request","url","entryTypes","method","headers","Authorization","pollingEntry","filter","entry","includes","complete","every","progress","some","success","err","refreshRequest","refreshReturn","profileFetch","profileRequest","profileResponse","refreshResponse","mlInformations","uuid","uploadImageFetch","form","FormData","append","File","processImageFetch","mlUrl","uploadImageResponse","w","h","canvas","createElement","ctx","getContext","putImageData","toBlob","blob","imgBlob","processImageResponse","promises","entries","results","loginType","rememberMe","sessionFetch","sessionResponse","uploadBasePath","irisFaceBreadth","irisRawPD","uploadVideoFetch","processVideoFetch","uploadVideoResponse","processVideoResponse","GuidanceCommand","TrackResult","envToConfigUrl","Map","processingVerticalFoVDeg","onWasmLoaded","onFail","debugFeatures","_classCallCheck","ready","metricsSubscribers","Array","formatPose","pose","position","x","toFixed","y","z","rotation","p","warmUp","verticalFovDeg","initializationPromise","_this","VMPTFaceMeasurementInspector","updateInspector","setFilters","_ref","FaceWeb","faceWeb","_options$verticalFovD","assetsDir","get","usePoseSmoothing","enableProminentSubjectSegmenter","useLandmarksSmoothing","velocityFilter","windowSize","velocityScale","translationFilter","rotationFilter","show","inspector","remove","bottom","left","appendChild","innerHTML","pupillaryDistance","faceBreadth","concat","faceBreadth2","fps","set","smoothing","irisDiameterMM","historySize","startRuler","outlierDetectorConfig","yawLimitDeg","pitchLimitDeg","pupilMinPx","yawMaxDeg","pitchMaxDeg","_this2","rotationBound","lBound","hBound","lCommand","LOOK_DOWN","hCommand","LOOK_UP","LOOK_RIGHT","LOOK_LEFT","TILT_LEFT","TILT_RIGHT","MOVE_LEFT","MOVE_RIGHT","MOVE_UP","MOVE_DOWN","MOVE_FARTHER","MOVE_CLOSER","_i","g","_loopData","STAY_STILL","defects","_iterator","presence","sendAndReturnResults","hasFace","Float32Array","vtoPoseArray","metrics","rulerStatus","_this3","finalPDmm","finalFBmm","finalFBmm2","_iterator2","f","UNKNOWN","guidanceFW","checkDefectsFW","outlier","_results$outlier","guidanceVM","checkDefectsVM","renderDelay","guidanceCommand","wasmStatus","OK","NoFaceFound","wearsGlasses"],"sourceRoot":""}