@i.un/libs 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/common/type.ts","../src/common/generateStableUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/utils.ts","../src/common/cacheWrapper.ts","../src/common/MemoryStore.ts","../src/browser/dom.ts","../src/browser/scroll.ts","../src/browser/draggable.ts","../src/browser/WebStore.ts","../src/chrome/ChromeStore.ts","../src/linkedin/api.ts","../src/linkedin/dom.ts","../src/linkedin/utils.ts","../src/chrome/message.ts","../src/chrome/identity.ts","../src/chrome/utils.ts","../src/common/getGlobal.ts","../src/common/singleExecutionWrapper.ts"],"sourcesContent":["export const RealUndefined = Symbol(\"undefined\");\nexport type RealUndefined = typeof RealUndefined;\n\n/**\n * 异步函数类型。\n *\n * @template Args - 表示函数参数的类型数组。\n * @template T - 表示函数返回的 Promise 解析后的类型。\n *\n * @param args - 函数的参数。\n * @returns 一个 Promise 对象,解析后的值类型为 T。\n */\nexport type AsyncFunction<Args extends any[], T> = (\n this: any,\n ...args: Args\n) => Promise<T>;\n\n/**\n * 表示一个可以克隆自身的对象接口。\n *\n * @interface Cloneable\n */\nexport interface Cloneable {\n /**\n * 创建并返回当前对象的一个副本。\n *\n * @returns {this} 当前对象的一个副本。\n */\n clone(): this;\n}\n\n/**\n *\n * 检查一个对象是否实现了 Cloneable 接口。\n *\n * 这个函数是一个类型保护函数,它会在类型检查时将传入的对象类型缩小为 Cloneable。\n *\n * @param {any} obj - 要检查的对象。\n * @returns {obj is Cloneable} 如果对象实现了 Cloneable 接口,则返回 true;否则返回 false。\n */\nexport function isCloneable(obj: any): obj is Cloneable {\n return typeof obj?.clone === \"function\";\n}\n\n/**\n * 检查一个值是否是原始类型(primitive type)。\n *\n * 这个函数是一个类型保护函数,它会在类型检查时将传入的值类型缩小为原始类型之一:string, number, boolean, null 或 undefined。\n *\n * @param {any} value - 要检查的值。\n * @returns {value is string | number | boolean | null | undefined} 如果值是原始类型,则返回 true;否则返回 false。\n */\nexport function isPrimitive(\n value: any\n): value is string | number | boolean | null | undefined {\n const type = typeof value;\n return (\n value === null ||\n type === \"string\" ||\n type === \"number\" ||\n type === \"boolean\" ||\n type === \"undefined\"\n );\n}\n","import { isPrimitive } from \"./type\";\n\n/**\n * 为给定的参数生成一个稳定且唯一的键。\n *\n * 该函数确保生成的键是确定性的,即相同的输入总是会生成相同的输出。\n * 这在缓存、记忆化或任何需要一致键的场景中非常有用。\n *\n * @param params - 用于生成键的参数。可以是任何类型。\n * @returns 表示输入参数的稳定且唯一的字符串键。\n */\nexport function generateStableUniqueKey(params: any) {\n if (isPrimitive(params)) {\n return String(params);\n }\n return JSON.stringify(params, function (_key: string | number, value: any) {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return Object.keys(value)\n .sort()\n .reduce((pre: any, cur: string) => {\n pre[cur] = value[cur];\n return pre;\n }, {});\n }\n return value;\n });\n}\n","import { isCloneable } from \"./type\";\n\n/**\n * 深度克隆一个对象或数组。\n *\n * @param {T} obj - 要克隆的对象或数组。\n * @returns {T} 克隆后的对象或数组。\n */\nexport function cloneDeep<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (isCloneable(obj)) {\n return obj.clone();\n }\n\n // 处理数组\n if (Array.isArray(obj)) {\n return obj.map((item) => cloneDeep(item)) as unknown as T;\n }\n\n const newObj: { [key: string]: any } = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n newObj[key] = cloneDeep(obj[key]);\n }\n }\n return newObj as T;\n}\n","/**\n * 创建一个防抖函数,该函数会在最后一次调用后的指定时间间隔后执行。\n *\n * @param func - 需要防抖处理的函数。\n * @param wait - 延迟的毫秒数。\n * @returns 一个新的防抖函数。\n */\nexport function debounce<T extends (...args: any[]) => void>(\n func: T,\n wait: number\n): T {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n return function (this: ThisParameterType<T>, ...args: Parameters<T>) {\n const context = this;\n\n // 如果已经设定了调用,取消之前的调用\n if (timeout !== null) {\n clearTimeout(timeout);\n }\n\n // 设定一个新的调用,等待指定的时间后执行\n timeout = setTimeout(() => {\n func.apply(context, args);\n timeout = null; // 确保能够在下次触发时重新设定定时器\n }, wait);\n } as T;\n}\n\n/**\n * 创建一个节流函数,该函数会在每个指定的时间间隔内最多执行一次。\n *\n * @param func - 需要节流处理的函数。\n * @param delay - 时间间隔的毫秒数。\n * @returns 一个新的节流函数。\n */\n// export function throttle<T extends (...agrs: any[]) => any>(\n// func: T,\n// delay: number\n// ): T {\n// let lastExecutedTime: number = 0;\n\n// return function (this: ThisParameterType<T>, ...args: Parameters<T>) {\n// const context = this;\n// const currentTime = Date.now();\n\n// if (currentTime - lastExecutedTime >= delay) {\n// func.apply(context, args);\n// lastExecutedTime = currentTime;\n// }\n// } as T;\n// }\n\n/**\n * 创建一个延迟执行回调函数并返回 Promise 的函数。\n *\n * @param callback - 需要执行的回调函数。\n * @param delay - 延迟的毫秒数,默认为 0。\n * @param args - 传递给回调函数的参数。\n * @returns 一个 Promise 对象,该对象在回调函数执行后解析。\n */\nexport function delayExecution<T, Args extends any[]>(\n callback: (...args: Args) => T,\n delay: number = 0,\n ...args: Args\n): Promise<T> {\n return new Promise<T>((resolve) => {\n if (delay === 0) {\n resolve(callback(...args));\n } else {\n setTimeout(() => {\n resolve(callback(...args));\n }, delay);\n }\n });\n}\n\n/**\n * 创建一个带有默认值的代理对象。\n * 如果访问的属性不存在,则返回默认值。\n *\n * @param defaultValue - 当属性不存在时返回的默认值。\n * @returns 一个代理对象,未定义的属性将返回默认值。\n */\nexport function createDefaultObject<T>(defaultValue: T): Record<string, T> {\n return new Proxy<Record<string, T>>(\n {},\n {\n get: (target, property: string) => {\n return target.hasOwnProperty(property)\n ? target[property]\n : defaultValue;\n },\n }\n );\n}\n","// import { isNode } from \"environment\";\n\nimport { generateStableUniqueKey } from \"./generateStableUniqueKey\";\nimport { cloneDeep } from \"./cloneDeep\";\nimport { createDefaultObject } from \"./utils\";\nimport { AsyncFunction, RealUndefined } from \"./type\";\n\nconst cache: Record<string, any> = createDefaultObject<any>(RealUndefined);\nconst loadingCache = createDefaultObject(false);\nfunction getCachedData<T = any>(apiKey: string) {\n return cache[apiKey] as T;\n}\n\nfunction hasCachedData(apiKey: string) {\n return cache[apiKey] !== RealUndefined;\n}\n\nexport interface Setting {\n timeout?: number;\n timeoutResult?: any;\n identifier?: string;\n}\n\nconst defalutSetting: Setting = {\n timeout: 60000,\n timeoutResult: { code: 408, msg: \"请求超时\" },\n identifier: \"\",\n};\n\n/**\n * 为异步函数添加缓存功能。\n *\n * 该函数根据函数参数、函数名和一个可选的标识符来缓存异步函数的结果。\n * 如果结果已经缓存,则返回缓存的结果。如果函数正在执行中,则等待结果返回,并使用一个超时机制防止无限等待。\n *\n * @template Args - 函数参数的类型。\n * @template Promise<T> - 函数返回值的类型。\n * @param {AsyncFunction<Args, T>} func - 需要包装的异步函数。\n * @param {Setting} [setting=defalutSetting] - 可选的缓存设置。\n * @returns {AsyncFunction<Args, T>} - 带有缓存功能的包装函数,返回类型为 `Promise<T>`。\n */\nexport function cacheWrapper<\n Args extends any[],\n T,\n F extends AsyncFunction<Args, T>\n>(func: F, setting: Setting = defalutSetting) {\n const wrappedFunction = function (\n this: ThisParameterType<F>,\n ...args: Parameters<F>\n ) {\n // 在服务端的时候 不缓存\n // if (isNode) {\n // return func.apply(this, args);\n // }\n const apiKey: string =\n generateStableUniqueKey(args) + func.name + (setting.identifier || \"\"); //缓存key\n\n if (hasCachedData(apiKey)) {\n return Promise.resolve(cloneDeep(getCachedData<T>(apiKey)));\n }\n\n if (loadingCache[apiKey]) {\n const _setting = Object.assign({}, defalutSetting, setting);\n return new Promise((resolve) => {\n const startTime = Date.now();\n const timer = setInterval(() => {\n if (hasCachedData(apiKey)) {\n clearInterval(timer);\n resolve(cloneDeep(getCachedData<T>(apiKey)));\n } else if (Date.now() - startTime > _setting.timeout!) {\n loadingCache[apiKey] = false;\n clearInterval(timer);\n resolve(cloneDeep(_setting.timeoutResult));\n }\n }, 100);\n });\n }\n loadingCache[apiKey] = true;\n\n return func\n .apply(this, args)\n .then((res) => {\n // 缓存原始数据或其克隆,避免数据被释放\n cache[apiKey] = res;\n return cloneDeep(cache[apiKey]);\n })\n .catch((error: any) => {\n throw error;\n })\n .finally(() => {\n loadingCache[apiKey] = false;\n });\n } as F;\n\n // 设置函数名\n Object.defineProperty(wrappedFunction, \"name\", {\n value: `cacheWrapper_${func.name}`,\n configurable: true,\n });\n\n return wrappedFunction;\n}\n","/**\n * 内存存储管理类\n * 提供内存级别的数据存储,支持单例模式和变化监听\n */\n\ntype TRecord = Record<string, any>;\nexport class MemoryStore<T extends TRecord> {\n private readonly storageKey: string;\n private data: T = {} as T;\n private static instances = new Map<string, MemoryStore<TRecord>>();\n private changeCallbacks: Array<(changes: { [key: string]: { oldValue?: any; newValue?: any } }) => void> = [];\n\n private constructor(storageKey: string) {\n this.storageKey = storageKey;\n }\n\n private static getInstanceKey(storageKey: string): string {\n return `memory:${storageKey}`;\n }\n\n /**\n * 获取单例实例\n */\n private static getInstance<T extends TRecord>(\n storageKey: string\n ): MemoryStore<T> {\n const key = this.getInstanceKey(storageKey);\n\n if (!this.instances.has(key)) {\n this.instances.set(key, new MemoryStore<T>(storageKey));\n }\n\n return this.instances.get(key) as MemoryStore<T>;\n }\n\n /**\n * 创建内存存储实例\n */\n static create<T extends TRecord>(storageKey: string): MemoryStore<T> {\n return this.getInstance<T>(storageKey);\n }\n\n /**\n * 清理指定实例\n */\n static clearInstance(storageKey: string): void {\n const key = this.getInstanceKey(storageKey);\n const instance = this.instances.get(key);\n if (instance) {\n instance.clearChangeCallbacks();\n }\n this.instances.delete(key);\n }\n\n /**\n * 清理所有实例\n */\n static clearAllInstances(): void {\n this.instances.forEach(instance => {\n instance.clearChangeCallbacks();\n });\n this.instances.clear();\n }\n\n /**\n * 设置数据\n */\n set<K extends keyof T>(prop: K, value: T[K]): void {\n try {\n const oldValue = this.data[prop];\n this.data = { ...this.data, [prop]: value };\n this.triggerChange(oldValue, value);\n } catch (error) {\n console.error(\"MemoryStore.set 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 获取数据\n */\n get<K extends keyof T>(prop: K): T[K] | undefined {\n try {\n return this.data[prop];\n } catch (error) {\n console.error(\"MemoryStore.get 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 获取所有数据\n */\n getAll(): T {\n return { ...this.data };\n }\n\n /**\n * 删除指定的数据\n */\n remove<K extends keyof T>(prop: K): void {\n try {\n if (prop in this.data) {\n const oldValue = this.data[prop];\n const newData = { ...this.data };\n delete newData[prop];\n this.data = newData;\n this.triggerChange(oldValue, undefined);\n }\n } catch (error) {\n console.error(\"MemoryStore.remove 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 清空所有数据\n */\n clear(): void {\n try {\n const oldValue = { ...this.data };\n this.data = {} as T;\n this.triggerChange(oldValue, {});\n } catch (error) {\n console.error(\"MemoryStore.clear 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 批量设置多个数据\n */\n setMultiple(data: Partial<T>): void {\n try {\n const oldValue = { ...this.data };\n this.data = { ...this.data, ...data };\n this.triggerChange(oldValue, this.data);\n } catch (error) {\n console.error(\"MemoryStore.setMultiple 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 监听数据变化\n * 注意:内存存储使用自定义事件,支持实时变化监听\n */\n onChanged(\n callback: (changes: { [key: string]: { oldValue?: any; newValue?: any } }) => void\n ): void {\n this.changeCallbacks.push(callback);\n }\n\n /**\n * 触发变化事件\n */\n private triggerChange(oldValue: any, newValue: any): void {\n if (this.changeCallbacks.length > 0) {\n const changes = {\n [this.storageKey]: {\n oldValue,\n newValue,\n },\n };\n\n this.changeCallbacks.forEach(callback => {\n try {\n callback(changes);\n } catch (error) {\n console.error(\"MemoryStore 变化回调执行失败:\", error);\n }\n });\n }\n }\n\n /**\n * 清理变化回调\n */\n private clearChangeCallbacks(): void {\n this.changeCallbacks = [];\n }\n\n /**\n * 检查是否存在指定的数据\n */\n has<K extends keyof T>(prop: K): boolean {\n try {\n return prop in this.data;\n } catch (error) {\n console.error(\"MemoryStore.has 失败:\", error);\n return false;\n }\n }\n\n /**\n * 获取存储大小(字节数)\n */\n getSize(): number {\n try {\n const jsonString = JSON.stringify(this.data);\n return new Blob([jsonString]).size;\n } catch (error) {\n console.error(\"MemoryStore.getSize 失败:\", error);\n return 0;\n }\n }\n\n /**\n * 获取当前存储键名\n */\n getStoreKey(): string {\n return this.storageKey;\n }\n\n /**\n * 获取当前存储类型\n */\n getStoreType(): string {\n return \"memory\";\n }\n}\n\n// 使用示例\n// type UserData = {\n// name: string;\n// age: number;\n// email: string;\n// };\n\n// // 创建内存存储实例\n// const userMemoryStore = MemoryStore.create<UserData>('user-data');\n\n// // 监听变化\n// userMemoryStore.onChanged((changes) => {\n// console.log('数据变化:', changes);\n// });\n\n// // 设置数据\n// userMemoryStore.set('name', '张三');\n// userMemoryStore.set('age', 25);\n\n// // 获取数据\n// console.log('用户数据:', userMemoryStore.getAll());\n// console.log('用户名:', userMemoryStore.get('name'));\n\n// // 批量设置\n// userMemoryStore.setMultiple({\n// name: '李四',\n// age: 30,\n// email: 'lisi@example.com'\n// });\n\n// // 清理实例\n// MemoryStore.clearInstance('user-data');\n","/**\n * 表示 DOM 中可能的子元素类型。\n */\nexport type ChildrenType = DomOptionsType | Element | string | null;\n\n/**\n * 表示创建 DOM 元素的选项类型。\n */\nexport type DomOptionsType = {\n /**\n * 要创建的元素的标签名。默认为 \"div\"。\n */\n tag?: string;\n\n /**\n * 要附加到创建的元素的子元素。可以是单个子元素或子元素数组。\n */\n children?: ChildrenType | ChildrenType[];\n\n /**\n * 要设置在创建的元素上的属性。\n */\n props?: Record<string, any>;\n\n /**\n * 要设置在创建的元素上的属性。\n */\n attrs?: Record<string, string | boolean>;\n\n /**\n * 要应用于创建的元素的样式。\n */\n styles?: Record<string, string | number>;\n};\n\n/**\n * 设置 HTML 元素的样式属性。\n *\n * @param element - 要设置样式的 HTML 元素。\n * @param property - CSS 属性名,可以是驼峰命名法(camelCase)或连字符命名法(kebab-case)。\n * @param value - 要设置的属性值。\n * @param important - 可选参数,布尔值,表示是否将属性设置为 `important` 优先级,默认为 `false`。\n */\nfunction setStyle(\n element: HTMLElement | SVGElement,\n property: string,\n value: string | number,\n important: boolean = false\n): void {\n if (property in element.style) {\n (element.style as any)[property] = value;\n } else {\n const priority = important ? \"important\" : \"\";\n element.style.setProperty(property, String(value), priority);\n }\n}\n\n/**\n * 使用指定选项创建一个 DOM 元素。\n *\n * @param options - 创建 DOM 元素的选项。\n *\n * @returns 创建的 DOM 元素。\n *\n * @remarks\n * 此函数旨在浏览器环境中使用。\n *\n * @example\n * ```typescript\n * const element = createElement({\n * tag: 'button',\n * children: '点击我',\n * attrs: { id: 'myButton' },\n * styles: { color: 'red' }\n * });\n * document.body.appendChild(element);\n * ```\n */\nexport function createElement({\n tag = \"div\",\n children = [],\n props = {},\n attrs = {},\n styles = {},\n}: DomOptionsType = {}): HTMLElement {\n const ele = document.createElement(tag);\n\n // 设置属性\n Object.assign(ele, props);\n\n // 设置属性\n for (const [key, value] of Object.entries(attrs)) {\n if (value !== false) {\n ele.setAttribute(key, value as string);\n }\n }\n\n // 设置样式\n for (const [key, value] of Object.entries(styles)) {\n setStyle(ele, key, value);\n }\n\n // 处理子元素\n const childArray = Array.isArray(children) ? children : [children];\n for (const child of childArray) {\n if (!child) continue;\n\n if (typeof child === \"object\") {\n if (child instanceof Element) {\n ele.appendChild(child);\n } else {\n ele.appendChild(createElement(child as DomOptionsType));\n }\n } else {\n ele.appendChild(document.createTextNode(child));\n }\n }\n\n return ele;\n}\n\ninterface VNode {\n type: string;\n props: Record<string, string> | null;\n children: VNode[] | string | null;\n}\n\n/**\n * 从 VNode 对象创建 SVG 元素。\n *\n * @param {VNode} vnode - 表示 SVG 结构的 VNode 对象。\n * @returns {SVGSVGElement} 创建的 SVG 元素。\n */\nfunction createSvgFromVNode(vnode: VNode): SVGSVGElement {\n const namespace = \"http://www.w3.org/2000/svg\";\n const element = document.createElementNS(namespace, vnode.type);\n\n if (vnode.props) {\n for (const [key, value] of Object.entries(vnode.props)) {\n element.setAttribute(key, value);\n }\n }\n\n if (typeof vnode.children === \"string\") {\n const textNode = document.createTextNode(vnode.children);\n element.appendChild(textNode);\n } else if (Array.isArray(vnode.children)) {\n vnode.children.forEach((child) => {\n const childElement = createSvgFromVNode(child);\n element.appendChild(childElement);\n });\n }\n\n return element as SVGSVGElement;\n}\n\n/**\n * 从 SVG 字符串创建 SVG 元素。\n *\n * @param {string} svgString - 包含 SVG 内容的字符串。\n * @returns {SVGElement} 创建的 SVG 元素。\n * @throws {Error} 如果解析失败或结果不是 SVG 元素。\n */\nfunction createSvgFromString(svgString: string): SVGSVGElement {\n const parser = new DOMParser();\n const doc = parser.parseFromString(svgString, \"image/svg+xml\");\n\n const svgElement = doc.documentElement;\n if (!(svgElement instanceof SVGElement)) {\n throw new Error(\"解析失败,结果不是有效的 SVG 元素\");\n }\n\n return svgElement as SVGElement as SVGSVGElement;\n}\n\n/**\n * 创建 SVG 元素,根据输入参数的类型选择合适的创建方法。\n *\n * @param {VNode | string} params - VNode 对象或 SVG 字符串。\n * @returns {SVGElement} 创建的 SVG 元素。\n * @throws {Error} 如果输入字符串无法解析为有效的 SVG 元素。\n */\nexport function createSvg(params: VNode | string): SVGSVGElement {\n if (typeof params === \"string\") {\n return createSvgFromString(params);\n }\n return createSvgFromVNode(params);\n}\n\n/**\n * 从指定的 URL 加载 SVG 内容并创建 SVG 元素。\n *\n * @param {string} url - 包含 SVG 内容的 URL。\n * @returns {Promise<SVGElement>} Promise,解析为创建的 SVG 元素。\n * @throws {Error} 如果无法获取或解析 SVG 内容。\n */\nexport async function createSvgFromUrl(url: string): Promise<SVGSVGElement> {\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(\n `网络请求失败: ${response.status} ${response.statusText}`\n );\n }\n\n const svgString = await response.text();\n return createSvgFromString(svgString);\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : \"未知错误\";\n throw new Error(`无法创建 SVG 元素: ${errorMessage}`);\n }\n}\n","/**\n * 将指定的 DOM 元素滚动到底部。\n * 使用 setTimeout 确保在当前调用栈之后执行。\n *\n * @param {HTMLElement} dom - 要滚动的 DOM 元素。\n */\nexport function scrollToBottom(dom: HTMLElement) {\n if (dom) {\n setTimeout(() => {\n // 设置滚动条位置为元素的最大滚动高度,滚动到底部\n dom.scrollTop = dom.scrollHeight;\n }, 0);\n }\n}\n\n/**\n * 如果用户未与 DOM 元素交互,则将其滚动到底部。\n * 如果尚未设置事件监听器,则设置一个以跟踪用户滚动交互。\n *\n * @param {HTMLElement} dom - 可能需要滚动的 DOM 元素。\n */\nexport function scrollToBottomIfNeeded(dom: HTMLElement): void {\n if (!dom) {\n return;\n }\n // 检查是否已设置滚动监听器\n if (dom.dataset.isListeningForUserScroll !== \"true\") {\n listenForUserScroll(dom);\n dom.dataset.isListeningForUserScroll = \"true\";\n }\n\n // 如果用户未与滚动条交互,则滚动到底部\n if (dom.dataset.userInteracted !== \"true\") {\n scrollToBottom(dom);\n }\n}\n\n/**\n * 更新用户是否与滚动条交互的状态。\n *\n * @param {HTMLElement} dom - 要更新状态的 DOM 元素。\n * @param {boolean} inter - 用户是否与滚动条交互。\n */\nfunction userInteractedWithScroll(dom: HTMLElement, inter: boolean): void {\n // 根据用户交互状态更新数据属性\n dom.dataset.userInteracted = inter ? \"true\" : \"false\";\n}\n\n/**\n * 为 DOM 元素设置滚动事件监听器。\n * 当用户滚动时,更新交互状态。\n *\n * @param {HTMLElement} dom - 要监听滚动事件的 DOM 元素。\n */\nfunction listenForUserScroll(dom: HTMLElement): void {\n if (!dom) {\n return;\n }\n dom.addEventListener(\"scroll\", () => {\n // 检查用户是否滚动到接近底部\n if (dom.scrollTop + dom.clientHeight < dom.scrollHeight - 5) {\n // 用户已滚动,更新交互状态\n userInteractedWithScroll(dom, true);\n } else {\n // 用户未滚动到接近底部\n userInteractedWithScroll(dom, false);\n }\n });\n}\n","/**\n * 拖拽组件类\n * @class Draggable\n * @description 为DOM元素添加拖拽功能的类,支持拖拽开始、拖拽中、拖拽结束的回调函数\n * @example\n * const element = document.getElementById('draggable');\n * const draggable = new Draggable(element, {\n * onDragStart: (e) => console.log('开始拖拽'),\n * onDrag: (e) => console.log('拖拽中'),\n * onDragEnd: (e) => console.log('结束拖拽'),\n * coordinate: 'tl' // 可选: tl(左上), tr(右上), bl(左下), br(右下)\n * });\n */\n\ninterface DraggableOptions {\n onDragStart?: (event: MouseEvent) => void;\n onDrag?: (event: MouseEvent) => void;\n onDragEnd?: (event: MouseEvent) => void;\n position?: \"absolute\" | \"fixed\";\n coordinate?: \"tl\" | \"tr\" | \"bl\" | \"br\";\n}\n/**\n * 拖拽组件配置选项接口\n * @interface DraggableOptions\n * @property {function} [onDragStart] - 开始拖拽时的回调函数\n * @property {function} [onDrag] - 拖拽过程中的回调函数\n * @property {function} [onDragEnd] - 结束拖拽时的回调函数\n * @property {string} [position] - 定位方式,可选 absolute 或 fixed\n * @property {string} [coordinate] - 坐标原点,可选 tl(左上)、tr(右上)、bl(左下)、br(右下)\n */\n\nexport class Draggable {\n private element: HTMLElement;\n private options: DraggableOptions;\n private isDragging: boolean = false;\n private startX: number = 0;\n private startY: number = 0;\n private initialX: number = 0;\n private initialY: number = 0;\n private threshold: number = 5; // 拖动阈值\n\n private onMouseMoveHandler: (e: MouseEvent) => void;\n private onMouseUpHandler: (e: MouseEvent) => void;\n\n constructor(element: HTMLElement, options: DraggableOptions = {}) {\n this.element = element;\n this.options = {\n coordinate: \"tl\", // 默认使用左上角作为原点\n ...options,\n };\n\n let originPosition = getComputedStyle(this.element).position;\n if (!originPosition || originPosition === \"static\") {\n this.element.style.position = \"absolute\";\n }\n\n if (this.options.position) {\n this.element.style.position = this.options.position;\n }\n\n this.onMouseMoveHandler = this.onMouseMove.bind(this);\n this.onMouseUpHandler = this.onMouseUp.bind(this);\n\n this.element.addEventListener(\"mousedown\", this.onMouseDown.bind(this));\n }\n\n private onMouseDown(e: MouseEvent): void {\n e.preventDefault();\n this.startX = e.clientX;\n this.startY = e.clientY;\n this.initialX =\n parseInt(window.getComputedStyle(this.element).left, 10) || 0;\n this.initialY =\n parseInt(window.getComputedStyle(this.element).top, 10) || 0;\n\n document.addEventListener(\"mousemove\", this.onMouseMoveHandler);\n document.addEventListener(\"mouseup\", this.onMouseUpHandler);\n }\n\n private getBoundedPosition(x: number, y: number): { x: number; y: number } {\n const rect = this.element.getBoundingClientRect();\n const position = getComputedStyle(this.element).position;\n\n let maxX: number;\n let maxY: number;\n\n if (position === \"fixed\") {\n // 对于 fixed 定位,使用视口大小\n maxX = window.innerWidth - rect.width;\n maxY = window.innerHeight - rect.height;\n } else {\n // 对于 absolute 定位,使用父容器大小\n const container =\n (this.element.offsetParent as HTMLElement) || document.documentElement;\n const containerRect = container.getBoundingClientRect();\n maxX = containerRect.width - rect.width;\n maxY = containerRect.height - rect.height;\n }\n\n return {\n x: Math.min(Math.max(0, x), maxX),\n y: Math.min(Math.max(0, y), maxY),\n };\n }\n\n private onMouseMove(e: MouseEvent): void {\n if (!this.isDragging) {\n const dx = e.clientX - this.startX;\n const dy = e.clientY - this.startY;\n if (Math.abs(dx) > this.threshold || Math.abs(dy) > this.threshold) {\n this.isDragging = true;\n if (this.options.onDragStart) {\n this.options.onDragStart(e);\n }\n }\n }\n\n if (this.isDragging) {\n const dx = e.clientX - this.startX;\n const dy = e.clientY - this.startY;\n const newX = this.initialX + dx;\n const newY = this.initialY + dy;\n\n const boundedPosition = this.getBoundedPosition(newX, newY);\n\n this.element.style.right = \"auto\";\n this.element.style.bottom = \"auto\";\n this.element.style.left = boundedPosition.x + \"px\";\n this.element.style.top = boundedPosition.y + \"px\";\n\n if (this.options.onDrag) {\n this.options.onDrag(e);\n }\n }\n }\n\n private convertCoordinate(): void {\n const rect = this.element.getBoundingClientRect();\n const style = getComputedStyle(this.element);\n const position = style.position;\n\n // 获取参考容器\n let container: Element | null = null;\n let containerRect: DOMRect | null = null;\n\n if (position === \"fixed\") {\n // fixed定位相对于视口\n container = null;\n containerRect = new DOMRect(0, 0, window.innerWidth, window.innerHeight);\n } else {\n // 获取定位参考元素\n container = this.element.offsetParent as Element;\n if (!container) {\n container = document.documentElement;\n }\n const containerStyle = getComputedStyle(container);\n if (containerStyle.position === \"static\") {\n // 如果容器是static定位,使用视口作为参考\n container = null;\n containerRect = new DOMRect(\n 0,\n 0,\n window.innerWidth,\n window.innerHeight\n );\n } else {\n containerRect = container.getBoundingClientRect();\n }\n }\n\n if (!containerRect) return;\n\n // 计算当前位置\n let currentLeft: number;\n let currentTop: number;\n\n if (position === \"fixed\") {\n currentLeft = rect.left;\n currentTop = rect.top;\n } else {\n // 对于非fixed定位,需要计算相对位置\n currentLeft = rect.left - containerRect.left;\n currentTop = rect.top - containerRect.top;\n\n if (container instanceof HTMLElement) {\n // 考虑边框\n const containerStyle = getComputedStyle(container);\n const borderLeft = parseFloat(containerStyle.borderLeftWidth) || 0;\n const borderTop = parseFloat(containerStyle.borderTopWidth) || 0;\n currentLeft -= borderLeft;\n currentTop -= borderTop;\n } else {\n currentLeft = currentLeft + window.scrollX;\n currentTop = currentTop + window.scrollY;\n }\n }\n\n // 根据不同的坐标原点设置位置\n switch (this.options.coordinate) {\n case \"tr\":\n const right = containerRect.width - currentLeft - rect.width;\n this.element.style.left = \"auto\";\n this.element.style.right = `${right}px`;\n this.element.style.top = `${currentTop}px`;\n this.element.style.bottom = \"auto\";\n break;\n case \"bl\":\n const bottom = containerRect.height - currentTop - rect.height;\n this.element.style.left = `${currentLeft}px`;\n this.element.style.right = \"auto\";\n this.element.style.top = \"auto\";\n this.element.style.bottom = `${bottom}px`;\n break;\n case \"br\":\n const brRight = containerRect.width - currentLeft - rect.width;\n const brBottom = containerRect.height - currentTop - rect.height;\n this.element.style.left = \"auto\";\n this.element.style.right = `${brRight}px`;\n this.element.style.top = \"auto\";\n this.element.style.bottom = `${brBottom}px`;\n break;\n case \"tl\":\n default:\n this.element.style.left = `${currentLeft}px`;\n this.element.style.right = \"auto\";\n this.element.style.top = `${currentTop}px`;\n this.element.style.bottom = \"auto\";\n }\n }\n\n private onMouseUp(e: MouseEvent): void {\n if (this.isDragging) {\n // 在拖拽结束时转换坐标\n if (this.options.coordinate && this.options.coordinate !== \"tl\") {\n this.convertCoordinate();\n }\n\n if (this.options.onDragEnd) {\n this.options.onDragEnd(e);\n }\n }\n this.isDragging = false;\n document.removeEventListener(\"mousemove\", this.onMouseMoveHandler);\n document.removeEventListener(\"mouseup\", this.onMouseUpHandler);\n }\n}\n","/**\n * 通用的本地存储管理类\n * 提供对 localStorage 和 sessionStorage 的封装操作,支持单例模式\n */\n\ntype TStoreType = \"local\" | \"session\";\ntype TRecord = Record<string, any>;\n\nexport class WebStore<T extends TRecord> {\n private readonly storageKey: string;\n private readonly storeType: TStoreType;\n private store?: Storage;\n private static instances = new Map<string, WebStore<TRecord>>();\n\n private constructor(storageKey: string, storeType: TStoreType = \"local\") {\n this.storageKey = storageKey;\n this.storeType = storeType;\n }\n\n private static getInstanceKey(\n storageKey: string,\n storeType: TStoreType = \"local\"\n ): string {\n return `${storeType}:${storageKey}`;\n }\n\n /**\n * 获取单例实例\n */\n private static getInstance<T extends TRecord>(\n storageKey: string,\n storeType: TStoreType = \"local\"\n ): WebStore<T> {\n const key = this.getInstanceKey(storageKey, storeType);\n\n if (!this.instances.has(key)) {\n this.instances.set(key, new WebStore<T>(storageKey, storeType));\n }\n\n return this.instances.get(key) as WebStore<T>;\n }\n\n /**\n * 便捷方法:创建本地存储实例\n */\n static local<T extends TRecord>(storageKey: string): WebStore<T> {\n return this.getInstance<T>(storageKey, \"local\");\n }\n\n /**\n * 便捷方法:创建会话存储实例\n */\n static session<T extends TRecord>(\n storageKey: string\n ): WebStore<T> {\n return this.getInstance<T>(storageKey, \"session\");\n }\n\n /**\n * 清理指定实例\n */\n static clearInstance(\n storageKey: string,\n storeType: TStoreType = \"local\"\n ): void {\n const key = this.getInstanceKey(storageKey, storeType);\n this.instances.delete(key);\n }\n\n /**\n * 清理所有实例\n */\n static clearAllInstances(): void {\n this.instances.clear();\n }\n\n private getStore() {\n if (this.store) {\n return this.store;\n }\n this.store = this.storeType === \"local\" ? localStorage : sessionStorage;\n return this.store;\n }\n\n /**\n * 设置数据到 localStorage 或 sessionStorage\n */\n set<K extends keyof T>(prop: K, value: T[K]): void {\n try {\n const currentData = this.getAll();\n const updatedData = { ...currentData, [prop]: value };\n this.getStore().setItem(this.storageKey, JSON.stringify(updatedData));\n } catch (error) {\n console.error(\"WebStore.set 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 获取数据从 localStorage 或 sessionStorage\n */\n get<K extends keyof T>(prop: K): T[K] | undefined {\n try {\n const data = this.getAll();\n return data?.[prop];\n } catch (error) {\n console.error(\"WebStore.get 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 获取所有数据\n */\n getAll(): T {\n try {\n const data = this.getStore().getItem(this.storageKey);\n return data ? JSON.parse(data) : ({} as T);\n } catch (error) {\n console.error(\"WebStore.getAll 失败:\", error);\n return {} as T;\n }\n }\n\n /**\n * 删除指定的数据\n */\n remove<K extends keyof T>(prop: K): void {\n try {\n const currentData = this.getAll();\n if (currentData && prop in currentData) {\n delete currentData[prop];\n this.getStore().setItem(this.storageKey, JSON.stringify(currentData));\n }\n } catch (error) {\n console.error(\"WebStore.remove 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 清空所有数据\n */\n clear(): void {\n try {\n this.getStore().removeItem(this.storageKey);\n } catch (error) {\n console.error(\"WebStore.clear 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 批量设置多个数据\n */\n setMultiple(data: Partial<T>): void {\n try {\n const currentData = this.getAll();\n const updatedData = { ...currentData, ...data };\n this.getStore().setItem(this.storageKey, JSON.stringify(updatedData));\n } catch (error) {\n console.error(\"WebStore.setMultiple 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 监听存储变化\n * 注意:localStorage 和 sessionStorage 没有原生的事件监听,这里使用 storage 事件来模拟\n */\n onChanged(\n callback: (changes: {\n [key: string]: { oldValue?: any; newValue?: any };\n }) => void\n ): void {\n const handleStorageChange = (event: StorageEvent) => {\n if (\n event.key === this.storageKey &&\n event.storageArea === this.getStore()\n ) {\n const changes = {\n [this.storageKey]: {\n oldValue: event.oldValue ? JSON.parse(event.oldValue) : undefined,\n newValue: event.newValue ? JSON.parse(event.newValue) : undefined,\n },\n };\n callback(changes);\n }\n };\n\n window.addEventListener(\"storage\", handleStorageChange);\n }\n\n /**\n * 检查是否存在指定的数据\n */\n has<K extends keyof T>(prop: K): boolean {\n try {\n const value = this.get(prop);\n return value !== undefined;\n } catch (error) {\n console.error(\"WebStore.has 失败:\", error);\n return false;\n }\n }\n\n /**\n * 获取存储大小(字节数)\n */\n getSize(): number {\n try {\n // const data = this.getAll();\n // const jsonString = JSON.stringify(data);\n const jsonString = this.getStore().getItem(this.storageKey) || \"\";\n return new Blob([jsonString]).size;\n } catch (error) {\n console.error(\"WebStore.getSize 失败:\", error);\n return 0;\n }\n }\n\n /**\n * 获取当前存储键名\n */\n getStoreKey(): string {\n return this.storageKey;\n }\n}\n\n// //demo\n// type AppBridgeData = {\n// CommonParams: {\n// cookie: string;\n// csrfToken: string;\n// userAgent?: string;\n// locale?: string;\n// extId?: string;\n// version?: any;\n// };\n// };\n\n// // 用户登录后可用的数据\n// type UserLocalData = {\n// SubscripVersionChooseName: string; // 选择名称\n// };\n\n// type TWebStore = {\n// app_bridge_data: AppBridgeData;\n// user_local_data: UserLocalData;\n// };\n\n// function getStore<T extends keyof TWebStore>(key: T) {\n// return WebStore.local<TWebStore[T]>(key);\n// }\n\n// // 创建特定类型的存储实例\n// export const AppBridgeStore = getStore(\"app_bridge_data\");\n// export const UserLocalStore = getStore(\"user_local_data\");\n// AppBridgeStore.get(\"CommonParams\");\n// UserLocalStore.get(\"SubscripVersionChooseName\");\n","/**\n * 通用的chrome存储管理类\n * 提供对 chrome.storage.local 和 chrome.storage.sync 的封装操作,支持单例模式\n */\n\ntype TStoreType = \"local\" | \"sync\";\ntype TRecord = Record<string, any>;\nexport class ChromeStore<T extends TRecord> {\n private readonly storageKey: string;\n private readonly storeType: TStoreType;\n private store?: chrome.storage.StorageArea;\n private static instances = new Map<string, ChromeStore<TRecord>>();\n\n private constructor(\n storageKey: string,\n storeType: TStoreType = \"local\"\n ) {\n this.storageKey = storageKey;\n this.storeType = storeType;\n }\n\n private static getInstanceKey(\n storageKey: string,\n storeType: TStoreType = \"local\"\n ): string {\n return `${storeType}:${storageKey}`;\n }\n\n /**\n * 获取单例实例\n */\n private static getInstance<T extends TRecord>(\n storageKey: string,\n storeType: TStoreType = \"local\"\n ): ChromeStore<T> {\n const key = this.getInstanceKey(storageKey, storeType);\n\n if (!this.instances.has(key)) {\n this.instances.set(key, new ChromeStore<T>(storageKey, storeType));\n }\n\n return this.instances.get(key) as ChromeStore<T>;\n }\n\n /**\n * 便捷方法:创建本地存储实例\n */\n static local<T extends TRecord>(\n storageKey: string\n ): ChromeStore<T> {\n return this.getInstance<T>(storageKey, \"local\");\n }\n\n /**\n * 便捷方法:创建同步存储实例\n */\n static sync<T extends TRecord>(\n storageKey: string\n ): ChromeStore<T> {\n return this.getInstance<T>(storageKey, \"sync\");\n }\n\n /**\n * 清理指定实例\n */\n static clearInstance(\n storageKey: string,\n storeType: TStoreType = \"local\"\n ): void {\n const key = this.getInstanceKey(storageKey, storeType);\n this.instances.delete(key);\n }\n\n /**\n * 清理所有实例\n */\n static clearAllInstances(): void {\n this.instances.clear();\n }\n\n private getStore() {\n if (this.store) {\n return this.store;\n }\n this.store = chrome.storage[this.storeType];\n return this.store;\n }\n\n /**\n * 设置数据到 chrome.storage.local 或 chrome.storage.sync\n */\n async set<K extends keyof T>(prop: K, value: T[K]): Promise<void> {\n try {\n const currentData = await this.getAll();\n const updatedData = { ...currentData, [prop]: value };\n await this.getStore().set({\n [this.storageKey]: updatedData,\n });\n } catch (error) {\n console.error(\"ChromeStore.set 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 获取数据从 chrome.storage.local 或 chrome.storage.sync\n */\n async get<K extends keyof T>(prop: K): Promise<T[K] | undefined> {\n try {\n const data = await this.getAll();\n return data?.[prop];\n } catch (error) {\n console.error(\"ChromeStore.get 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 获取所有数据从 chrome.storage.local 或 chrome.storage.sync\n */\n async getAll(): Promise<T> {\n try {\n const result = await this.getStore().get(this.storageKey);\n return (result[this.storageKey] as T) || ({} as T);\n } catch (error) {\n console.error(\"ChromeStore.getAll 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 删除指定的数据从 chrome.storage.local 或 chrome.storage.sync\n */\n async remove<K extends keyof T>(prop: K): Promise<void> {\n try {\n const currentData = await this.getAll();\n if (currentData && prop in currentData) {\n delete currentData[prop];\n await this.getStore().set({\n [this.storageKey]: currentData,\n });\n }\n } catch (error) {\n console.error(\"ChromeStore.remove 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 清空所有数据\n */\n async clear(): Promise<void> {\n try {\n await this.getStore().remove(this.storageKey);\n } catch (error) {\n console.error(\"ChromeStore.clear 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 批量设置多个数据\n */\n async setMultiple(data: Partial<T>): Promise<void> {\n try {\n const currentData = await this.getAll();\n const updatedData = { ...currentData, ...data };\n await this.getStore().set({\n [this.storageKey]: updatedData,\n });\n } catch (error) {\n console.error(\"ChromeStore.setMultiple 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 监听存储变化\n */\n onChanged(\n callback: (changes: { [key: string]: chrome.storage.StorageChange }) => void\n ): void {\n chrome.storage.onChanged.addListener((changes, namespace) => {\n if (namespace === this.storeType && changes[this.storageKey]) {\n callback(changes);\n }\n });\n }\n\n /**\n * 检查是否存在指定的数据\n */\n async has<K extends keyof T>(prop: K): Promise<boolean> {\n try {\n const value = await this.get(prop);\n return value !== undefined;\n } catch (error) {\n console.error(\"ChromeStore.has 失败:\", error);\n return false;\n }\n }\n\n /**\n * 获取存储大小(字节数)\n */\n async getSize(): Promise<number> {\n try {\n const data = await this.getAll();\n const jsonString = JSON.stringify(data);\n return new Blob([jsonString]).size;\n } catch (error) {\n console.error(\"ChromeStore.getSize 失败:\", error);\n return 0;\n }\n }\n\n /**\n * 获取当前存储键名\n */\n getStoreKey(): string {\n return this.storageKey;\n }\n}\n\n// // demo\n// type AppData = {\n// InstallTimestamp: number; // 安装时间\n// };\n\n// // 用户登录后可用的数据\n// type UserData = {\n// AddedInstallReward: boolean; // 是否已经添加奖励\n// ResharePostTimes: number; // 转发post次数\n// };\n\n// type TChromeStore = {\n// app_data: AppData;\n// user_data: UserData;\n// };\n\n// function getStore<T extends keyof TChromeStore>(key: T) {\n// return ChromeStore.local<TChromeStore[T]>(key);\n// }\n\n// // 创建特定类型的存储实例\n// export const AppStore = getStore(\"app_data\");\n// export const UserStore = getStore(\"user_data\");\n\n// AppStore.get('InstallTimestamp');\n// UserStore.set('AddedInstallReward', true);","const LinkedinApiUrl = \"https://www.linkedin.com/voyager/api\";\n\nconst linkedinMeExample = {\n plainId: 450174691,\n miniProfile: {\n memorialized: false,\n firstName: \"nova\",\n lastName: \"zh\",\n dashEntityUrn: \"urn:li:fsd_profile:ACoAABrVHuMBRCnqjgiNThyBf4eRn_jHZxpbYYs\",\n occupation: \"This is a English document\",\n objectUrn: \"urn:li:member:450174691\",\n entityUrn: \"urn:li:fs_miniProfile:ACoAABrVHuMBRCnqjgiNThyBf4eRn_jHZxpbYYs\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"cc5c6a1a-5acf-485f-b81d-34ffd74c8991\",\n },\n backgroundImage: {\n \"com.linkedin.common.VectorImage\": {\n artifacts: [\n {\n width: 800,\n fileIdentifyingUrlPathSegment:\n \"200_800/profile-displaybackgroundimage-shrink_200_800/0/1691978277687?e=1767225600&v=beta&t=b2aEdzTPlnTKgBBYFVps1TTaYNUryB7rW-zyO-X6-dw\",\n expiresAt: 1767225600000,\n height: 200,\n },\n {\n width: 1400,\n fileIdentifyingUrlPathSegment:\n \"350_1400/profile-displaybackgroundimage-shrink_350_1400/0/1691978277687?e=1767225600&v=beta&t=XeQhz7fpDq84srUMSVQ9852tMD_IOR2TbRwOP-ff1WQ\",\n expiresAt: 1767225600000,\n height: 350,\n },\n ],\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D5616AQFqZ4J2fWgoDg/profile-displaybackgroundimage-shrink_\",\n },\n },\n publicIdentifier: \"云-张-917919106\",\n picture: {\n \"com.linkedin.common.VectorImage\": {\n artifacts: [\n {\n width: 389,\n fileIdentifyingUrlPathSegment:\n \"800_800/B4EZX1ZVYVG0Ac-/0/1743578814438?e=1767225600&v=beta&t=va8CxCfLy771PIkgCio-bdrEaCjIWGOt893iE_TXDms\",\n expiresAt: 1767225600000,\n height: 389,\n },\n {\n width: 100,\n fileIdentifyingUrlPathSegment:\n \"100_100/B4EZX1ZVYVG0AU-/0/1743578814438?e=1767225600&v=beta&t=6FBqPHaShouHGqnLK14r8OfZvMUzxJQROfKo8E64rYc\",\n expiresAt: 1767225600000,\n height: 100,\n },\n {\n width: 389,\n fileIdentifyingUrlPathSegment:\n \"400_400/B4EZX1ZVYVG0Ag-/0/1743578814438?e=1767225600&v=beta&t=Sw8rHuKMyKSbilGZrgOMIAVNOuTx04hwL_CAJ35evMY\",\n expiresAt: 1767225600000,\n height: 389,\n },\n {\n width: 200,\n fileIdentifyingUrlPathSegment:\n \"200_200/B4EZX1ZVYVG0AY-/0/1743578814437?e=1767225600&v=beta&t=yLljmWG54q4RG5i0BsLm_bAGkqrP_YFLgjzsZLKnntM\",\n expiresAt: 1767225600000,\n height: 200,\n },\n ],\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E03AQE1lS6Odi33tw/profile-displayphoto-shrink_\",\n },\n },\n trackingId: \"W1PBGV2SS2aULx1jLsaJ8A==\",\n },\n publicContactInfo: {},\n premiumSubscriber: false,\n};\nexport async function getLinkedinMe({\n csrfToken,\n cookies,\n}: {\n csrfToken: string;\n cookies?: Record<string, string> | string;\n}): Promise<typeof linkedinMeExample | null> {\n const url = `${LinkedinApiUrl}/me`;\n const headers = createLinkedinHeaders(csrfToken, cookies);\n return fetch(url, {\n method: \"GET\",\n headers,\n })\n .then(async (response) => {\n if (response.ok) {\n return response.json();\n }\n return null;\n })\n .catch((error) => {\n console.error(error);\n return null;\n });\n}\n\nconst linkedinProfileExample = {\n profileVideoPreview: {\n paging: {\n start: 0,\n count: 10,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon105506655\",\n elements: [],\n },\n profileTreasuryMediaProfile: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n objectUrn: \"urn:li:member:262384451\",\n multiLocaleLastName: {\n fr_FR: \"Gadreau\",\n },\n profileOrganizations: {\n paging: {\n total: 0,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileOrganizationsInjection\",\n elements: [],\n },\n multiLocaleFirstNamePronunciationHint: {},\n multiLocaleLastNamePronunciationHint: {},\n profileEducations: {\n paging: {\n total: 5,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileEducationsInjection\",\n elements: [\n {\n dateRange: {\n start: {\n year: 2016,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n },\n end: {\n year: 2016,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"27710b4a-c9f6-475c-8075-80ed2fa3ded4\",\n },\n profileTreasuryMediaEducation: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n description:\n \"Modéliser l’application par des diagramme UML\\nConcevoir l’application et son interface utilisateur\\nProgrammer l’application, en même temps que ses tests unitaires associés.\\nDéployer l’application pour une mise en production.\\nDocumenter l’application\\nEmployer les méthodes agiles, tant côté technique que côté organisation.\\nLangage Orienté Objet : Java\\nArchitecture JEE\\nFramework : Hibernate, Struts, Spring\",\n companyUrn: \"urn:li:fsd_company:18221081\",\n schoolUrn: \"urn:li:fsd_school:3264003\",\n entityUrn:\n \"urn:li:fsd_profileEducation:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,353005345)\",\n school: {\n entityUrn: \"urn:li:fsd_school:3264003\",\n name: \"LDNR formation\",\n logo: {\n vectorImage: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.VectorImage\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E0BAQHCH__qt-JPGg/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1693316454106/ldnr_formation_logo?e=1763596800&v=beta&t=OKixRPwD9Fj287WIdZwvqsHDF0002CBSHI2cVuV3OS8\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1693316454106/ldnr_formation_logo?e=1763596800&v=beta&t=lSYJPsAMIekQV0aCHdoiF-AnjCscmXKmZQ0grp8pBR0\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1693316454106/ldnr_formation_logo?e=1763596800&v=beta&t=7Z16njnyUR6oRvLJVPIQOXzkunBTjQM0JDtD0Tk4zts\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n active: true,\n $recipeType: \"com.linkedin.voyager.dash.deco.organization.MiniSchool\",\n url: \"https://www.linkedin.com/school/ldnr-formation/\",\n },\n company: {\n entityUrn: \"urn:li:fsd_company:18221081\",\n name: \"LDNR formation\",\n logo: {\n vectorImage: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.VectorImage\",\n digitalmediaAsset: \"urn:li:digitalmediaAsset:D4E0BAQHCH__qt-JPGg\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E0BAQHCH__qt-JPGg/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1693316454106/ldnr_formation_logo?e=1763596800&v=beta&t=OKixRPwD9Fj287WIdZwvqsHDF0002CBSHI2cVuV3OS8\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1693316454106/ldnr_formation_logo?e=1763596800&v=beta&t=lSYJPsAMIekQV0aCHdoiF-AnjCscmXKmZQ0grp8pBR0\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1693316454106/ldnr_formation_logo?e=1763596800&v=beta&t=7Z16njnyUR6oRvLJVPIQOXzkunBTjQM0JDtD0Tk4zts\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.organization.MiniCompany\",\n url: \"https://www.linkedin.com/school/ldnr-formation/\",\n },\n schoolName: \"LDNR formation\",\n fieldOfStudy: \"Concepteur Développeur Java JEE\",\n degree: {\n entityUrn: \"urn:li:fsd_degree:2102\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon875016385\",\n },\n degreeName: \"Titre professionnel (TP) de niveau 6\",\n multiLocaleGrade: {\n fr_FR: \"Embauche en CDI\",\n },\n multiLocaleSchoolName: {\n fr_FR: \"LDNR formation\",\n },\n grade: \"Embauche en CDI\",\n multiLocaleFieldOfStudy: {\n fr_FR: \"Concepteur Développeur Java JEE\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileEducation\",\n multiLocaleDescription: {\n fr_FR:\n \"Modéliser l’application par des diagramme UML\\nConcevoir l’application et son interface utilisateur\\nProgrammer l’application, en même temps que ses tests unitaires associés.\\nDéployer l’application pour une mise en production.\\nDocumenter l’application\\nEmployer les méthodes agiles, tant côté technique que côté organisation.\\nLangage Orienté Objet : Java\\nArchitecture JEE\\nFramework : Hibernate, Struts, Spring\",\n },\n degreeUrn: \"urn:li:fsd_degree:2102\",\n multiLocaleDegreeName: {\n fr_FR: \"Titre professionnel (TP) de niveau 6\",\n },\n },\n {\n dateRange: {\n start: {\n year: 2015,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n },\n end: {\n year: 2015,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"4629a808-dbf9-4edb-b675-36601bd9dcca\",\n },\n profileTreasuryMediaEducation: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n description:\n \"- Piloter un projet web : Méthode Agiles, modélisation UML\\n- Langage PHP / HTML5 / CSS3 / Javascript\\n- Architecture d'un projet web : Framework Symfony\\n- Gérer un projet multimédia : gérer une équipe projet, piloter le projet (planning, budget, validation)\\n- Concevoir/Développer un projet multimédia\",\n entityUrn:\n \"urn:li:fsd_profileEducation:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,273044881)\",\n schoolName: \"AP Formation\",\n fieldOfStudy: \"Concepteur Réalisateur Multimédia et Internet\",\n degree: {\n entityUrn: \"urn:li:fsd_degree:2102\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon875016385\",\n },\n degreeName: \"Titre professionnel (TP) de niveau 6\",\n multiLocaleGrade: {\n fr_FR: \"14.2/20 - bien\",\n },\n multiLocaleSchoolName: {\n fr_FR: \"AP Formation\",\n },\n grade: \"14.2/20 - bien\",\n multiLocaleFieldOfStudy: {\n fr_FR: \"Concepteur Réalisateur Multimédia et Internet\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileEducation\",\n multiLocaleDescription: {\n fr_FR:\n \"- Piloter un projet web : Méthode Agiles, modélisation UML\\n- Langage PHP / HTML5 / CSS3 / Javascript\\n- Architecture d'un projet web : Framework Symfony\\n- Gérer un projet multimédia : gérer une équipe projet, piloter le projet (planning, budget, validation)\\n- Concevoir/Développer un projet multimédia\",\n },\n degreeUrn: \"urn:li:fsd_degree:2102\",\n multiLocaleDegreeName: {\n fr_FR: \"Titre professionnel (TP) de niveau 6\",\n },\n },\n {\n dateRange: {\n start: {\n year: 2009,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n },\n end: {\n year: 2011,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"7f7f9fa4-1b4b-4137-9542-5d68258cd011\",\n },\n profileTreasuryMediaEducation: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n description:\n \"- Démarche créative\\n- Elaboration d’une charte graphique\\n- Utilisation des outils de PAO\\n- UI/UX Design\",\n companyUrn: \"urn:li:fsd_company:3312600\",\n schoolUrn: \"urn:li:fsd_school:42189\",\n entityUrn:\n \"urn:li:fsd_profileEducation:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,273042987)\",\n school: {\n entityUrn: \"urn:li:fsd_school:42189\",\n name: \"L'Idem\",\n logo: {\n vectorImage: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.VectorImage\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4D0BAQE2ZM59fbTZyg/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1736156052876/lidemfrance_logo?e=1763596800&v=beta&t=wkouQ2jQbZi3abbyNRdJcp7qJgXQLj-rzdZrGcx6T-4\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1736156052876/lidemfrance_logo?e=1763596800&v=beta&t=VlGRnufupZ362YPuPjpBrkibOKGDSBmFYxFUrv1fX0E\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1736156052876/lidemfrance_logo?e=1763596800&v=beta&t=9XZ7LPvFNZvNKSUq2DlzITUS7c_gbpPA6xA2nBbO6Mc\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n active: true,\n $recipeType: \"com.linkedin.voyager.dash.deco.organization.MiniSchool\",\n url: \"https://www.linkedin.com/school/lidemfrance/\",\n },\n company: {\n entityUrn: \"urn:li:fsd_company:3312600\",\n name: \"L'Idem\",\n logo: {\n vectorImage: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.VectorImage\",\n digitalmediaAsset: \"urn:li:digitalmediaAsset:D4D0BAQE2ZM59fbTZyg\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4D0BAQE2ZM59fbTZyg/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1736156052876/lidemfrance_logo?e=1763596800&v=beta&t=wkouQ2jQbZi3abbyNRdJcp7qJgXQLj-rzdZrGcx6T-4\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1736156052876/lidemfrance_logo?e=1763596800&v=beta&t=VlGRnufupZ362YPuPjpBrkibOKGDSBmFYxFUrv1fX0E\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1736156052876/lidemfrance_logo?e=1763596800&v=beta&t=9XZ7LPvFNZvNKSUq2DlzITUS7c_gbpPA6xA2nBbO6Mc\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.organization.MiniCompany\",\n url: \"https://www.linkedin.com/school/lidemfrance/\",\n },\n schoolName: \"L'Idem - Creative Arts School\",\n fieldOfStudy: \"Concepteur en Communication Visuelle\",\n degree: {\n entityUrn: \"urn:li:fsd_degree:2102\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon875016385\",\n },\n degreeName: \"Titre professionnel (TP) de niveau 6\",\n multiLocaleSchoolName: {\n fr_FR: \"L'Idem - Creative Arts School\",\n },\n multiLocaleFieldOfStudy: {\n fr_FR: \"Concepteur en Communication Visuelle\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileEducation\",\n multiLocaleDescription: {\n fr_FR:\n \"- Démarche créative\\n- Elaboration d’une charte graphique\\n- Utilisation des outils de PAO\\n- UI/UX Design\",\n },\n degreeUrn: \"urn:li:fsd_degree:2102\",\n multiLocaleDegreeName: {\n fr_FR: \"Titre professionnel (TP) de niveau 6\",\n },\n },\n {\n dateRange: {\n start: {\n year: 2007,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n },\n end: {\n year: 2009,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"16e346df-8a0b-4c5f-8ef1-da281104d9d6\",\n },\n profileTreasuryMediaEducation: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n description:\n \"- Physique appliquée\\n- Mathématiques\\n- Informatique industrielle\\n- Programmation\\n- Réseau\",\n standardizedFieldOfStudy: {\n entityUrn: \"urn:li:fsd_fieldOfStudy:100178\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon2017432627\",\n },\n entityUrn:\n \"urn:li:fsd_profileEducation:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,323454801)\",\n standardizedFieldOfStudyUrn: \"urn:li:fsd_fieldOfStudy:100178\",\n schoolName: \"Lycée Pablo Picasso\",\n fieldOfStudy: \"Programmation informatique\",\n degreeName:\n \"BTS IRIS (Informatique et Réseaux pour l’Industries et les Services techniques)\",\n multiLocaleSchoolName: {\n fr_FR: \"Lycée Pablo Picasso\",\n },\n multiLocaleActivities: {\n fr_FR: \"Projet Gestion d'une pisciculture depuis une application web\",\n },\n activities:\n \"Projet Gestion d'une pisciculture depuis une application web\",\n multiLocaleFieldOfStudy: {\n fr_FR: \"Programmation informatique\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileEducation\",\n multiLocaleDescription: {\n fr_FR:\n \"- Physique appliquée\\n- Mathématiques\\n- Informatique industrielle\\n- Programmation\\n- Réseau\",\n },\n multiLocaleDegreeName: {\n fr_FR:\n \"BTS IRIS (Informatique et Réseaux pour l’Industries et les Services techniques)\",\n },\n },\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 9,\n year: 2006,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 6,\n year: 2007,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"be9cac39-5fe9-46b7-99ce-058d1fc72713\",\n },\n profileTreasuryMediaEducation: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n degreeName: \"Baccalauréat scientifique - Option Science de l'ingénieur\",\n multiLocaleGrade: {\n fr_FR: \"Bien\",\n },\n multiLocaleSchoolName: {\n fr_FR: \"Lycée Pablo Picasso\",\n },\n entityUrn:\n \"urn:li:fsd_profileEducation:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,897196193)\",\n grade: \"Bien\",\n multiLocaleFieldOfStudy: {\n fr_FR: \"Science de l'ingénieur\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileEducation\",\n schoolName: \"Lycée Pablo Picasso\",\n fieldOfStudy: \"Science de l'ingénieur\",\n multiLocaleDegreeName: {\n fr_FR: \"Baccalauréat scientifique - Option Science de l'ingénieur\",\n },\n },\n ],\n },\n multiLocaleFirstName: {\n fr_FR: \"Florent\",\n },\n companyNameOnProfileTopCardShown: true,\n profilePublications: {\n paging: {\n total: 0,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePublicationsInjection\",\n elements: [],\n },\n publicIdentifier: \"florentgadreau\",\n profileCertifications: {\n paging: {\n total: 1,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileCertificationsInjection\",\n elements: [\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 6,\n year: 2023,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"faeda9d1-ba34-49b8-8943-41fb706a16d2\",\n },\n multiLocaleLicenseNumber: {\n fr_FR: \"4dDfdiNVlbYPeT0H6_-xBQ\",\n },\n companyUrn: \"urn:li:fsd_company:967435\",\n url: \"https://www.codingame.com/certification/4dDfdiNVlbYPeT0H6_-xBQ\",\n multiLocaleAuthority: {\n fr_FR: \"CodinGame\",\n },\n entityUrn:\n \"urn:li:fsd_profileCertification:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,111623122)\",\n authority: \"CodinGame\",\n name: \"Certification CodinGame - JavaScript\",\n multiLocaleName: {\n fr_FR: \"Certification CodinGame - JavaScript\",\n },\n licenseNumber: \"4dDfdiNVlbYPeT0H6_-xBQ\",\n company: {\n entityUrn: \"urn:li:fsd_company:967435\",\n name: \"CodinGame\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C560BAQGOd-eWEWqChA/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1630597986114/codingame_logo?e=1763596800&v=beta&t=b2jLPM_nVdRdQ_2UvJQcc1l33qFDpKYOoQALODrjWK8\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100-alternative/company-logo_100_100-alternative/0/1630597986140/codingame_logo?e=1763596800&v=beta&t=4iMdjZeVzLzZqBk_Eh9becJdhZPkw8evce3Od0sevro\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200-alternative/company-logo_200_200-alternative/0/1630597986140/codingame_logo?e=1763596800&v=beta&t=W2r5NYug9fDtVX3sk0eV6pSnhB9gH8cvmySOIbUCIQA\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1630597986114/codingame_logo?e=1763596800&v=beta&t=h_GT9p5xFUeGhUBiWVXyOFRsoIaoI__RYoWR0umQh4A\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400-alternative/company-logo_400_400-alternative/0/1630597986140/codingame_logo?e=1763596800&v=beta&t=riePu5BCWcDsNJRBS7mxE9JwMRMrgyvtiW4Dv1K69qg\",\n expiresAt: 1763596800000,\n height: 400,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1630597986114/codingame_logo?e=1763596800&v=beta&t=hd1U2mg6ZjgyNKaOPj3UwSAZjknDpQcR3pOP70b1Ty0\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkableMiniCompany\",\n universalName: \"codingame\",\n url: \"https://www.linkedin.com/company/codingame/\",\n },\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon1003157995\",\n displaySource: \"codingame.com\",\n },\n ],\n },\n trackingId: \"rvQK/mX5RX+TNHz5ljxnjQ==\",\n multiLocaleSummary: {\n fr_FR:\n \"Je suis un passionné de mon métier et toujours en quête d'apprentissage et connaissance nouvelle.\\n\\nDiplômé en Architecture et Ingénierie du Logiciel et du Web, j’ai développé durant ma carrière de solides compétences dans les technologies Web, aussi bien en Frontend, Backend et process DevOps.\\n\\nMon expertise s’articule autour de la conception, du développement, de l'architecture logicielle et de l'intégration continue.\\n\\nMon expérience acquise me permet de répondre efficacement à tous les types de projets, de garantir des résultats de qualité de manière optimal\",\n },\n profileVolunteerExperiences: {\n paging: {\n total: 1,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileVolunteerExperiencesInjection\",\n elements: [\n {\n multiLocaleRole: {\n fr_FR: \"Chef de projet web\",\n },\n role: \"Chef de projet web\",\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 3,\n year: 2015,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 9,\n year: 2015,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Blackelk Recordings\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"bc54cbfa-6d39-414e-ac09-40bb653e23b8\",\n },\n companyName: \"Blackelk Recordings\",\n description:\n \"Mise en place d'un cahier des charges, développement du nouveau site web, mise en place des méthodes de SEO pour un référencement optimum.\",\n cause: \"ARTS_AND_CULTURE\",\n entityUrn:\n \"urn:li:fsd_profileVolunteerExperience:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,790953094)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon474972167\",\n multiLocaleDescription: {\n fr_FR:\n \"Mise en place d'un cahier des charges, développement du nouveau site web, mise en place des méthodes de SEO pour un référencement optimum.\",\n },\n },\n ],\n },\n versionTag: \"3217399415\",\n firstName: \"Florent\",\n profilePicture: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.ProfilePhotoDecoSpecEditableProfilePicture\",\n a11yText: \"Florent Gadreau\",\n displayImageReference: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E03AQHTXLMcbyvcaA/profile-displayphoto-shrink_\",\n artifacts: [\n {\n width: 100,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/profile-displayphoto-shrink_100_100/0/1677553377218?e=1763596800&v=beta&t=gam7S7kWHN8EplxJR0Qgv6GGucpYrbucRG66349rSrQ\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 200,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/profile-displayphoto-shrink_200_200/0/1677553377218?e=1763596800&v=beta&t=pAFGhovwqkG03xi3G1lOmZ3FCl_ILzGB8K5SgxcM4Vc\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 400,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/profile-displayphoto-shrink_400_400/0/1677553377218?e=1763596800&v=beta&t=L5Py7uatZUalgHp-dxrk6FfqTSELCn8Cw33A41sNxbc\",\n expiresAt: 1763596800000,\n height: 400,\n },\n {\n width: 560,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"800_800/profile-displayphoto-shrink_800_800/0/1677553377218?e=1763596800&v=beta&t=yGwffZ6As8XofKgWtO3PCu6BBOleipRLzJCjvuFzNiw\",\n expiresAt: 1763596800000,\n height: 560,\n },\n ],\n },\n },\n displayImageUrn: \"urn:li:digitalmediaAsset:D4E03AQHTXLMcbyvcaA\",\n },\n profileSkills: {\n paging: {\n total: 50,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkillsInjection\",\n elements: [\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,13)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"2f425097-5899-4173-b051-b2fa973061d3\",\n },\n name: \"gRPC\",\n multiLocaleName: {\n fr_FR: \"gRPC\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,14)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"1775b0ed-931e-47ba-a00e-0802a4f6d1dd\",\n },\n name: \"Go\",\n multiLocaleName: {\n fr_FR: \"Go\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2065123633)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"3a94794a-2d30-4a90-bddb-efb47262a224\",\n },\n name: \"Infrastructure cloud\",\n multiLocaleName: {\n fr_FR: \"Infrastructure cloud\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2064555358)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"74a5ee55-42fa-4ac6-b713-10aefaa9d487\",\n },\n name: \"Git\",\n multiLocaleName: {\n fr_FR: \"Git\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,10)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"29327f35-8410-409b-8cc4-f54aa5c1d01c\",\n },\n name: \"FaaS\",\n multiLocaleName: {\n fr_FR: \"FaaS\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,11)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"f849c73e-f8fd-4017-9773-0b68249215a9\",\n },\n name: \"Big data\",\n multiLocaleName: {\n fr_FR: \"Big data\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,8)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"cc0da718-1a95-4a40-a8a3-c5d50ae52080\",\n },\n name: \"React Native\",\n multiLocaleName: {\n fr_FR: \"React Native\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,46)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"ef2951f8-a624-441f-8269-f085399a0137\",\n },\n name: \"C#\",\n multiLocaleName: {\n fr_FR: \"C#\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,47)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"516b833f-872e-4d34-8321-cb9a024c71bd\",\n },\n name: \"XAML\",\n multiLocaleName: {\n fr_FR: \"XAML\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,30)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"05f6ba76-021f-4b63-be92-a85235db34bb\",\n },\n name: \"Méthodes agiles\",\n multiLocaleName: {\n fr_FR: \"Méthodes agiles\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,42)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"429ece68-bed0-4808-a4aa-01494f3183a6\",\n },\n name: \"GWT\",\n multiLocaleName: {\n fr_FR: \"GWT\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,43)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"8d637b5c-cdbf-459b-8bf4-72828c119d3c\",\n },\n name: \"Oracle SQL\",\n multiLocaleName: {\n fr_FR: \"Oracle SQL\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,44)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"7e028249-3e54-40b5-aa05-cc89b43fc24e\",\n },\n name: \"Eclipse\",\n multiLocaleName: {\n fr_FR: \"Eclipse\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,45)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"b2311bbd-16e2-417d-87f4-c9cb9b1d3003\",\n },\n name: \"Tomcat\",\n multiLocaleName: {\n fr_FR: \"Tomcat\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,12)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"27547806-5966-43d6-a4df-3a0fec31876c\",\n },\n name: \"XML\",\n multiLocaleName: {\n fr_FR: \"XML\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,16)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"77f6b735-799c-409e-a19a-dd68e856661a\",\n },\n name: \"XSLT\",\n multiLocaleName: {\n fr_FR: \"XSLT\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,17)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"51e3ed03-7df2-4ad9-94b6-e30bf5ce41c4\",\n },\n name: \"Sonarqube\",\n multiLocaleName: {\n fr_FR: \"Sonarqube\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,22)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"2324e45b-be2a-4d17-921d-15b0ac2022b9\",\n },\n name: \"Revue de code\",\n multiLocaleName: {\n fr_FR: \"Revue de code\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,5)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"cc6bdf59-de77-4727-a5b9-05b4af507421\",\n },\n name: \"PL/SQL\",\n multiLocaleName: {\n fr_FR: \"PL/SQL\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,1)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"385a1efc-4458-476e-a435-7569ec62dd5b\",\n },\n name: \"C++\",\n multiLocaleName: {\n fr_FR: \"C++\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n ],\n },\n profileProjects: {\n paging: {\n total: 1,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileProjectsInjection\",\n elements: [\n {\n occupation: {\n profilePosition: {\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,757982648)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon517843535\",\n },\n },\n multiLocaleTitle: {\n fr_FR: \"Airbus - TMA projet divers\",\n },\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 10,\n year: 2016,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 2,\n year: 2017,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"387631f4-1f3b-41fb-8d81-cc7fe7096567\",\n },\n description:\n \"Projets :\\n- TMA sur une application (Java, C, CORBA).\\n- Migration de données (Java, SQL, Talend).\\n- Développement d’un plugin de connexion FTPS (java).\\n\\nMission :\\n- Chiffrage, maintenance et évolution d’une application.\\n- Analyse et création d’un prototype de migration de données.\\n- Recueil du besoin du client.\\n- Etude Fonctionnelle.\\n- Développement d’un plugin de transfert de donnée via le protocole FTPS.\\nEnvironnement technique :\\nWindows 7, Java, Eclipse, OpenSSL, Keytool, C, PRO-C, ORACLE SQL, Talend\",\n occupationUnion: {\n profilePosition:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,757982648)\",\n },\n title: \"Airbus - TMA projet divers\",\n entityUrn:\n \"urn:li:fsd_profileProject:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,420303925)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon610321565\",\n contributors: [\n {\n standardizedContributor: {\n profileUrn:\n \"urn:li:fsd_profile:ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.StandardizedContributor\",\n profile: {\n lastName: \"Gadreau\",\n memorialized: false,\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"3a86ae77-c0fe-43df-8663-7bd6145afe4a\",\n },\n firstName: \"Florent\",\n profilePicture: {\n a11yText: \"Florent Gadreau\",\n displayImageReference: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E03AQHTXLMcbyvcaA/profile-displayphoto-shrink_\",\n artifacts: [\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/profile-displayphoto-shrink_100_100/0/1677553377218?e=1763596800&v=beta&t=gam7S7kWHN8EplxJR0Qgv6GGucpYrbucRG66349rSrQ\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/profile-displayphoto-shrink_200_200/0/1677553377218?e=1763596800&v=beta&t=pAFGhovwqkG03xi3G1lOmZ3FCl_ILzGB8K5SgxcM4Vc\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/profile-displayphoto-shrink_400_400/0/1677553377218?e=1763596800&v=beta&t=L5Py7uatZUalgHp-dxrk6FfqTSELCn8Cw33A41sNxbc\",\n expiresAt: 1763596800000,\n height: 400,\n },\n {\n width: 560,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"800_800/profile-displayphoto-shrink_800_800/0/1677553377218?e=1763596800&v=beta&t=yGwffZ6As8XofKgWtO3PCu6BBOleipRLzJCjvuFzNiw\",\n expiresAt: 1763596800000,\n height: 560,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.ProfilePhotoDecoSpecReadOnlyProfilePicture\",\n displayImageUrn:\n \"urn:li:digitalmediaAsset:D4E03AQHTXLMcbyvcaA\",\n },\n entityUrn:\n \"urn:li:fsd_profile:ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho\",\n memberRelationship: {\n memberRelationshipUnion: {\n noConnection: {\n memberDistance: \"OUT_OF_NETWORK\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.relationships.NoConnection\",\n invitationUnion: {\n noInvitation: {\n inviter:\n \"urn:li:fsd_profile:ACoAABrVHuMBRCnqjgiNThyBf4eRn_jHZxpbYYs\",\n targetInviteeResolutionResult: {\n lastName: \"Gadreau\",\n memorialized: false,\n $anti_abuse_metadata: {\n $anti_abuse_uuid:\n \"5910b41c-3717-4d3a-a481-c8b48e674e30\",\n },\n firstName: \"Florent\",\n entityUrn:\n \"urn:li:fsd_profile:ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.relationships.ProfileWithEmailRequired\",\n publicIdentifier: \"florentgadreau\",\n emailRequired: false,\n headline:\n \"Fullstack Software Engineer | Software Technical Lead\",\n },\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1031101697\",\n targetInvitee:\n \"urn:li:fsd_profile:ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho\",\n inviterResolutionResult: {\n lastName: \"zh\",\n memorialized: false,\n $anti_abuse_metadata: {\n $anti_abuse_uuid:\n \"018fe065-e249-4cb5-8105-69fd7102eb40\",\n },\n iweWarned: false,\n firstName: \"nova\",\n entityUrn:\n \"urn:li:fsd_profile:ACoAABrVHuMBRCnqjgiNThyBf4eRn_jHZxpbYYs\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.relationships.ProfileWithIweWarned\",\n publicIdentifier: \"nova-zh-917919106\",\n headline: \"manager\",\n },\n },\n },\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.relationships.MemberRelationshipV2ForInjection\",\n memberRelationshipData: {\n noInvitation: {\n inviter:\n \"urn:li:fsd_profile:ACoAABrVHuMBRCnqjgiNThyBf4eRn_jHZxpbYYs\",\n targetInviteeResolutionResult: {\n lastName: \"Gadreau\",\n memorialized: false,\n $anti_abuse_metadata: {\n $anti_abuse_uuid:\n \"5910b41c-3717-4d3a-a481-c8b48e674e30\",\n },\n firstName: \"Florent\",\n entityUrn:\n \"urn:li:fsd_profile:ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.relationships.ProfileWithEmailRequired\",\n publicIdentifier: \"florentgadreau\",\n emailRequired: false,\n headline:\n \"Fullstack Software Engineer | Software Technical Lead\",\n },\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1031101697\",\n targetInvitee:\n \"urn:li:fsd_profile:ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho\",\n inviterResolutionResult: {\n lastName: \"zh\",\n memorialized: false,\n $anti_abuse_metadata: {\n $anti_abuse_uuid:\n \"018fe065-e249-4cb5-8105-69fd7102eb40\",\n },\n iweWarned: false,\n firstName: \"nova\",\n entityUrn:\n \"urn:li:fsd_profile:ACoAABrVHuMBRCnqjgiNThyBf4eRn_jHZxpbYYs\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.relationships.ProfileWithIweWarned\",\n publicIdentifier: \"nova-zh-917919106\",\n headline: \"manager\",\n },\n },\n },\n entityUrn:\n \"urn:li:fsd_memberRelationship:ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.MiniProfile\",\n publicIdentifier: \"florentgadreau\",\n headline:\n \"Fullstack Software Engineer | Software Technical Lead\",\n },\n },\n },\n ],\n multiLocaleDescription: {\n fr_FR:\n \"Projets :\\n- TMA sur une application (Java, C, CORBA).\\n- Migration de données (Java, SQL, Talend).\\n- Développement d’un plugin de connexion FTPS (java).\\n\\nMission :\\n- Chiffrage, maintenance et évolution d’une application.\\n- Analyse et création d’un prototype de migration de données.\\n- Recueil du besoin du client.\\n- Etude Fonctionnelle.\\n- Développement d’un plugin de transfert de donnée via le protocole FTPS.\\nEnvironnement technique :\\nWindows 7, Java, Eclipse, OpenSSL, Keytool, C, PRO-C, ORACLE SQL, Talend\",\n },\n },\n ],\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileWithEntities\",\n multiLocaleHeadline: {\n fr_FR: \"Fullstack Software Engineer | Software Technical Lead\",\n },\n profileHonors: {\n paging: {\n total: 0,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileHonorsInjection\",\n elements: [],\n },\n lastName: \"Gadreau\",\n memorialized: false,\n profilePatents: {\n paging: {\n total: 0,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePatentsInjection\",\n elements: [],\n },\n showPremiumSubscriberBadge: false,\n industry: {\n name: \"Computer Software\",\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:4\",\n },\n geoLocationBackfilled: false,\n profileTestScores: {\n paging: {\n total: 0,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTestScoresInjection\",\n elements: [],\n },\n multiLocaleFullNamePronunciationAudio: {},\n premium: false,\n influencer: false,\n entityUrn: \"urn:li:fsd_profile:ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho\",\n profileLanguages: {\n paging: {\n total: 3,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileLanguagesInjection\",\n elements: [\n {\n entityUrn:\n \"urn:li:fsd_profileLanguage:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,3)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"88e95595-ee63-4207-887c-3b4dc434c53c\",\n },\n name: \"Anglais\",\n multiLocaleName: {\n fr_FR: \"Anglais\",\n },\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon608483337\",\n proficiency: \"PROFESSIONAL_WORKING\",\n },\n {\n entityUrn:\n \"urn:li:fsd_profileLanguage:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"af5f23e5-c269-43fb-ad1b-77c5f79f1d12\",\n },\n name: \"Espagnol\",\n multiLocaleName: {\n fr_FR: \"Espagnol\",\n },\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon608483337\",\n proficiency: \"PROFESSIONAL_WORKING\",\n },\n {\n entityUrn:\n \"urn:li:fsd_profileLanguage:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,1)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"d6030287-e9cd-4021-96bb-68a9a8b5b8a1\",\n },\n name: \"Français\",\n multiLocaleName: {\n fr_FR: \"Français\",\n },\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon608483337\",\n proficiency: \"NATIVE_OR_BILINGUAL\",\n },\n ],\n },\n headline: \"Fullstack Software Engineer | Software Technical Lead\",\n summary:\n \"Je suis un passionné de mon métier et toujours en quête d'apprentissage et connaissance nouvelle.\\n\\nDiplômé en Architecture et Ingénierie du Logiciel et du Web, j’ai développé durant ma carrière de solides compétences dans les technologies Web, aussi bien en Frontend, Backend et process DevOps.\\n\\nMon expertise s’articule autour de la conception, du développement, de l'architecture logicielle et de l'intégration continue.\\n\\nMon expérience acquise me permet de répondre efficacement à tous les types de projets, de garantir des résultats de qualité de manière optimal\",\n creator: true,\n profileCourses: {\n paging: {\n total: 0,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileCoursesInjection\",\n elements: [],\n },\n supportedLocales: [\n {\n country: \"FR\",\n language: \"fr\",\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Locale\",\n },\n ],\n educationOnProfileTopCardShown: true,\n industryUrn: \"urn:li:fsd_industry:4\",\n profilePositionGroups: {\n paging: {\n total: 6,\n start: 0,\n count: 10,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionGroupsInjection\",\n elements: [\n {\n entityUrn:\n \"urn:li:fsd_profilePositionGroup:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,822e789ca7a38ecf212e8696ce779472da967e10)\",\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 9,\n year: 2023,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Edusign\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"9bf4aa8f-3e81-4721-8dba-3c6984e8e543\",\n },\n companyName: \"Edusign\",\n profilePositionInPositionGroup: {\n paging: {\n total: 2,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionsInGroup\",\n elements: [\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 3,\n year: 2024,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Edusign\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"ce99d6fa-c183-49e1-8bcf-22395285fc02\",\n },\n companyName: \"Edusign\",\n title: \"Software Technical Lead\",\n companyUrn: \"urn:li:fsd_company:34635039\",\n employmentTypeUrn: \"urn:li:fsd_employmentType:12\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2363264751)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Paris, fr\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:4\": {\n name: \"Computer Software\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:4\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:4\"],\n url: \"https://www.linkedin.com/company/edusign/\",\n employeeCountRange: {\n start: 11,\n end: 50,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:34635039\",\n name: \"Edusign\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E0BAQGZe_guvaFAsA/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1695796168179/edusign_logo?e=1763596800&v=beta&t=chizSM_RcBhjU8ipgODGn9mPhXdQHUYKSd0xzXJGGWA\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1695796168179/edusign_logo?e=1763596800&v=beta&t=1SjAedr0o-ZirYY0BrkiKDQptcnTyfsNU5dxZJ5gHgY\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1695796168179/edusign_logo?e=1763596800&v=beta&t=ARquS6ZXyPOdzLRS9iXeKRp5gbPq3EkPVRHoxo7dNkA\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"edusign\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Paris, fr\",\n multiLocaleTitle: {\n fr_FR: \"Software Technical Lead\",\n },\n employmentType: {\n name: \"Full-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:12\",\n companyNameRequired: true,\n },\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n geoLocationName: \"Paris, fr\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n multiLocaleLocationName: {\n fr_FR: \"Paris, fr\",\n },\n },\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 9,\n year: 2023,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 3,\n year: 2024,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Edusign\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"e88d5228-8de5-4a1c-8c54-5e26a468b08b\",\n },\n companyName: \"Edusign\",\n title: \"Senior Software Engineer\",\n companyUrn: \"urn:li:fsd_company:34635039\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:108924708\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n employmentTypeUrn: \"urn:li:fsd_employmentType:12\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2252204349)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Saint-Pierre, La Réunion\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:4\": {\n name: \"Computer Software\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:4\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:4\"],\n url: \"https://www.linkedin.com/company/edusign/\",\n employeeCountRange: {\n start: 11,\n end: 50,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:34635039\",\n name: \"Edusign\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E0BAQGZe_guvaFAsA/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1695796168179/edusign_logo?e=1763596800&v=beta&t=chizSM_RcBhjU8ipgODGn9mPhXdQHUYKSd0xzXJGGWA\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1695796168179/edusign_logo?e=1763596800&v=beta&t=1SjAedr0o-ZirYY0BrkiKDQptcnTyfsNU5dxZJ5gHgY\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1695796168179/edusign_logo?e=1763596800&v=beta&t=ARquS6ZXyPOdzLRS9iXeKRp5gbPq3EkPVRHoxo7dNkA\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"edusign\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Saint-Pierre, La Réunion\",\n multiLocaleTitle: {\n fr_FR: \"Senior Software Engineer\",\n },\n employmentType: {\n name: \"Full-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:12\",\n companyNameRequired: true,\n },\n geoUrn: \"urn:li:fsd_geo:108924708\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(re,0)\",\n geoLocationName: \"Saint-Pierre, La Réunion\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(re,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Saint-Pierre, La Réunion\",\n },\n sourceOfHireType: \"OTHER_JOB_SITES\",\n },\n ],\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:4\": {\n name: \"Computer Software\",\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:4\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:4\"],\n url: \"https://www.linkedin.com/company/edusign/\",\n employeeCountRange: {\n start: 11,\n end: 50,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:34635039\",\n name: \"Edusign\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E0BAQGZe_guvaFAsA/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1695796168179/edusign_logo?e=1763596800&v=beta&t=chizSM_RcBhjU8ipgODGn9mPhXdQHUYKSd0xzXJGGWA\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1695796168179/edusign_logo?e=1763596800&v=beta&t=1SjAedr0o-ZirYY0BrkiKDQptcnTyfsNU5dxZJ5gHgY\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1695796168179/edusign_logo?e=1763596800&v=beta&t=ARquS6ZXyPOdzLRS9iXeKRp5gbPq3EkPVRHoxo7dNkA\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"edusign\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionGroup\",\n companyUrn: \"urn:li:fsd_company:34635039\",\n },\n {\n entityUrn:\n \"urn:li:fsd_profilePositionGroup:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,d49305d79beade6a49a8edcd205e62bb3064aab7)\",\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 11,\n year: 2019,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 9,\n year: 2023,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Demand Side Instruments\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"d67270da-f633-4d7f-981c-6eda74eebc41\",\n },\n companyName: \"Demand Side Instruments\",\n profilePositionInPositionGroup: {\n paging: {\n total: 2,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionsInGroup\",\n elements: [\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 1,\n year: 2021,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 9,\n year: 2023,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Demand Side Instruments\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"830c8c1a-b5a6-41e2-a087-904c4aa00d53\",\n },\n companyName: \"Demand Side Instruments\",\n description:\n \"Chez Demand Side, nous imaginons et concevons des solutions innovantes sur-mesure pour permettre aux écosystèmes urbains ou ruraux de s’adapter aux changements climatiques et de les atténuer en s’appuyant sur les nouvelles technologies de l’information et de la communication.\\n\\nProjets :\\n - Refonte d'une application web - Configuration, maintenance et traitement des données d'un parc IoT\\n - Refonte d'une application embarqué - Gateway IoT multiprotocalaire\\n - Application de Configuration et Préparation d'objet IoT\\n\\nMission :\\n - Animation/Accompagnement de l'équipe Web et Mobile (NodeJS) (5 personnes)\\n - Animation/Accompagnement de l'équipe Embarqué (Go / Python / C) (6 personnes)\\n - Etude et Conception (Domain Driven Design / Clean Architecture)\\n - Architecture/Infrastructure Cloud (pipeline de données / Serverless / Metrics)\\n - Code Review / Peer programming\\n - Mise en place des pratiques DevOps (CICD / IaaC / Monitoring)\\n - Développement de Bot Slack pour fluidifier les échanges inter service\\n - Management de proximité équipe Réunion (entretiens annuels, suivi d'objectifs, accompagnement...)\",\n title: \"Software Technical Lead\",\n companyUrn: \"urn:li:fsd_company:5377564\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:108924708\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n employmentTypeUrn: \"urn:li:fsd_employmentType:12\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2130825482)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Saint-Pierre, La Réunion\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:8\": {\n name: \"Telecommunications\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:8\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:8\"],\n url: \"https://www.linkedin.com/company/demand-side-instruments/\",\n employeeCountRange: {\n start: 11,\n end: 50,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:5377564\",\n name: \"Demand Side Instruments\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQEvYBelnkXIDw/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1634205062819/demand_side_instruments_logo?e=1763596800&v=beta&t=_rLRXR1LahwXW-XNzmz6y1DM0K6s5WtKgsrUvhV4xS8\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1634205062819/demand_side_instruments_logo?e=1763596800&v=beta&t=0e-Skfvo-BVdjZ3yphf4c9AjflRy3fFY4p_nmfspdiM\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1634205062819/demand_side_instruments_logo?e=1763596800&v=beta&t=Y_IeSrYvzC9H1PxaGvbVpi5D3o2nBErtglXpuS1VzOk\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"demand-side-instruments\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Saint-Pierre, La Réunion\",\n multiLocaleTitle: {\n fr_FR: \"Software Technical Lead\",\n },\n employmentType: {\n name: \"Full-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:12\",\n companyNameRequired: true,\n },\n geoUrn: \"urn:li:fsd_geo:108924708\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(re,0)\",\n geoLocationName: \"Saint-Pierre, La Réunion\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(re,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleDescription: {\n fr_FR:\n \"Chez Demand Side, nous imaginons et concevons des solutions innovantes sur-mesure pour permettre aux écosystèmes urbains ou ruraux de s’adapter aux changements climatiques et de les atténuer en s’appuyant sur les nouvelles technologies de l’information et de la communication.\\n\\nProjets :\\n - Refonte d'une application web - Configuration, maintenance et traitement des données d'un parc IoT\\n - Refonte d'une application embarqué - Gateway IoT multiprotocalaire\\n - Application de Configuration et Préparation d'objet IoT\\n\\nMission :\\n - Animation/Accompagnement de l'équipe Web et Mobile (NodeJS) (5 personnes)\\n - Animation/Accompagnement de l'équipe Embarqué (Go / Python / C) (6 personnes)\\n - Etude et Conception (Domain Driven Design / Clean Architecture)\\n - Architecture/Infrastructure Cloud (pipeline de données / Serverless / Metrics)\\n - Code Review / Peer programming\\n - Mise en place des pratiques DevOps (CICD / IaaC / Monitoring)\\n - Développement de Bot Slack pour fluidifier les échanges inter service\\n - Management de proximité équipe Réunion (entretiens annuels, suivi d'objectifs, accompagnement...)\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Saint-Pierre, La Réunion\",\n },\n },\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 11,\n year: 2019,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 1,\n year: 2021,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Demand Side Instruments\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"7921d790-2914-4ad6-84cb-33e2f2642e27\",\n },\n companyName: \"Demand Side Instruments\",\n description:\n \"Projets :\\n - Maintenance d'une application web - Configuration, maintenance et traitement des données d'un parc IoT.\\n\\nMission :\\n - Etude et Conception\\n - DevOps - CI/CD - Script de contrôle / validation / automatisation\\n - Developpement Backend / Frontend\\n - Revue de code / Contrôle qualité\",\n title: \"Software Engineer\",\n companyUrn: \"urn:li:fsd_company:5377564\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:108924708\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n employmentTypeUrn: \"urn:li:fsd_employmentType:12\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2131148068)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Saint-Pierre, La Réunion\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:8\": {\n name: \"Telecommunications\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:8\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:8\"],\n url: \"https://www.linkedin.com/company/demand-side-instruments/\",\n employeeCountRange: {\n start: 11,\n end: 50,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:5377564\",\n name: \"Demand Side Instruments\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQEvYBelnkXIDw/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1634205062819/demand_side_instruments_logo?e=1763596800&v=beta&t=_rLRXR1LahwXW-XNzmz6y1DM0K6s5WtKgsrUvhV4xS8\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1634205062819/demand_side_instruments_logo?e=1763596800&v=beta&t=0e-Skfvo-BVdjZ3yphf4c9AjflRy3fFY4p_nmfspdiM\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1634205062819/demand_side_instruments_logo?e=1763596800&v=beta&t=Y_IeSrYvzC9H1PxaGvbVpi5D3o2nBErtglXpuS1VzOk\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"demand-side-instruments\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Saint-Pierre, La Réunion\",\n multiLocaleTitle: {\n fr_FR: \"Software Engineer\",\n },\n employmentType: {\n name: \"Full-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:12\",\n companyNameRequired: true,\n },\n geoUrn: \"urn:li:fsd_geo:108924708\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(re,0)\",\n geoLocationName: \"Saint-Pierre, La Réunion\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(re,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleDescription: {\n fr_FR:\n \"Projets :\\n - Maintenance d'une application web - Configuration, maintenance et traitement des données d'un parc IoT.\\n\\nMission :\\n - Etude et Conception\\n - DevOps - CI/CD - Script de contrôle / validation / automatisation\\n - Developpement Backend / Frontend\\n - Revue de code / Contrôle qualité\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Saint-Pierre, La Réunion\",\n },\n },\n ],\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:8\": {\n name: \"Telecommunications\",\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:8\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:8\"],\n url: \"https://www.linkedin.com/company/demand-side-instruments/\",\n employeeCountRange: {\n start: 11,\n end: 50,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:5377564\",\n name: \"Demand Side Instruments\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQEvYBelnkXIDw/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1634205062819/demand_side_instruments_logo?e=1763596800&v=beta&t=_rLRXR1LahwXW-XNzmz6y1DM0K6s5WtKgsrUvhV4xS8\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1634205062819/demand_side_instruments_logo?e=1763596800&v=beta&t=0e-Skfvo-BVdjZ3yphf4c9AjflRy3fFY4p_nmfspdiM\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1634205062819/demand_side_instruments_logo?e=1763596800&v=beta&t=Y_IeSrYvzC9H1PxaGvbVpi5D3o2nBErtglXpuS1VzOk\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"demand-side-instruments\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionGroup\",\n companyUrn: \"urn:li:fsd_company:5377564\",\n },\n {\n entityUrn:\n \"urn:li:fsd_profilePositionGroup:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,e0f3cd67a9f65b91084e0a19aeb5699f4a8514f7)\",\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 10,\n year: 2016,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 9,\n year: 2019,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Groupe Koncept Komet\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"0fc0c3c9-0bbe-43ec-8060-77e5ab2bfcb8\",\n },\n companyName: \"Groupe Koncept Komet\",\n profilePositionInPositionGroup: {\n paging: {\n total: 6,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionsInGroup\",\n elements: [\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 6,\n year: 2018,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 9,\n year: 2019,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Groupe Koncept Komet\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"42dcd9ef-ef20-46b8-9f63-2bcbc965ece8\",\n },\n companyName: \"Groupe Koncept Komet\",\n description:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - Projet en Agile sur une application avec architecture microservice\\n - Conception et Développement Back-end et Front-end\\n\\nMission :\\n - Etude et Conception Architecture microservice\\n - Chiffrage, maintenance et évolution de l’application\\n - Gestion d'équipe / Respect de la conduite Agile du projet\\n - Définition et priorisation des taches\\n - Echange client / PO\\n - DevOps\\n - Développement Back-end / Front-end\\n - Revue de code / Contrôle qualité\",\n title: \"Software Technical Lead\",\n companyUrn: \"urn:li:fsd_company:28151802\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:105073465\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2131738774)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:96\": {\n name: \"Information Technology & Services\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:96\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:96\"],\n url: \"https://www.linkedin.com/company/konceptkomet/\",\n employeeCountRange: {\n start: 51,\n end: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:28151802\",\n name: \"Groupe Koncept Komet\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQG7ofkqq1sxog/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=0wYUakFbBlXosgyBVjmasjvRO3526mTNXYB972Dj94U\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=3YnFcCioKlE4YyUVKXea41F74xxZ-f2_Z_6awTufdVY\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=Ta4BHqwnyVJw6rOVX9Uo0jpSTwHKtJ4euRVNZs540u4\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"konceptkomet\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Toulouse, Occitanie, France\",\n multiLocaleTitle: {\n fr_FR: \"Software Technical Lead\",\n },\n geoUrn: \"urn:li:fsd_geo:105073465\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(fr,0)\",\n geoLocationName: \"Toulouse, Occitanie, France\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(fr,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleDescription: {\n fr_FR:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - Projet en Agile sur une application avec architecture microservice\\n - Conception et Développement Back-end et Front-end\\n\\nMission :\\n - Etude et Conception Architecture microservice\\n - Chiffrage, maintenance et évolution de l’application\\n - Gestion d'équipe / Respect de la conduite Agile du projet\\n - Définition et priorisation des taches\\n - Echange client / PO\\n - DevOps\\n - Développement Back-end / Front-end\\n - Revue de code / Contrôle qualité\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n },\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 2,\n year: 2018,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 6,\n year: 2018,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Groupe Koncept Komet\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"21c85b19-5ead-4ab8-bbbc-4e4bee432bc0\",\n },\n companyName: \"Groupe Koncept Komet\",\n description:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - Projet en Agile sur une application avec architecture microservice\\n - Développement Back-end et Front-end\\n\\nMission :\\n - Étude Fonctionnelle.\\n - Chiffrage, maintenance et évolution de l’application (Back-end / Front-end).\\n - Développement Back-end (microservice en Typscript sur server node) / API / Front-end (Angular 2+)\\n - Script SQL.\\n - Revue de code, conception pour l’équipe Indienne.\",\n title: \"Lead Software Engineer\",\n companyUrn: \"urn:li:fsd_company:28151802\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:105073465\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n employmentTypeUrn: \"urn:li:fsd_employmentType:12\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2131734897)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:96\": {\n name: \"Information Technology & Services\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:96\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:96\"],\n url: \"https://www.linkedin.com/company/konceptkomet/\",\n employeeCountRange: {\n start: 51,\n end: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:28151802\",\n name: \"Groupe Koncept Komet\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQG7ofkqq1sxog/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=0wYUakFbBlXosgyBVjmasjvRO3526mTNXYB972Dj94U\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=3YnFcCioKlE4YyUVKXea41F74xxZ-f2_Z_6awTufdVY\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=Ta4BHqwnyVJw6rOVX9Uo0jpSTwHKtJ4euRVNZs540u4\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"konceptkomet\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Toulouse, Occitanie, France\",\n multiLocaleTitle: {\n fr_FR: \"Lead Software Engineer\",\n },\n employmentType: {\n name: \"Full-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:12\",\n companyNameRequired: true,\n },\n geoUrn: \"urn:li:fsd_geo:105073465\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(fr,0)\",\n geoLocationName: \"Toulouse, Occitanie, France\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(fr,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleDescription: {\n fr_FR:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - Projet en Agile sur une application avec architecture microservice\\n - Développement Back-end et Front-end\\n\\nMission :\\n - Étude Fonctionnelle.\\n - Chiffrage, maintenance et évolution de l’application (Back-end / Front-end).\\n - Développement Back-end (microservice en Typscript sur server node) / API / Front-end (Angular 2+)\\n - Script SQL.\\n - Revue de code, conception pour l’équipe Indienne.\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n },\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 10,\n year: 2017,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 1,\n year: 2018,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Groupe Koncept Komet\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"bf28730c-47a8-4f50-b1d0-bf127302714d\",\n },\n companyName: \"Groupe Koncept Komet\",\n description:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - Projet en Agile sur une application Windows RT (C#, XAML) Win 8.1\\n - Evolution Back-end et Front-end\\n\\nMission :\\n - Étude Fonctionnelle\\n - Rédaction de dossiers de spécification\\n - Chiffrage, maintenance et évolution de l’application (Back-end / Front-end)\\n - Amélioration des performances et rafraichissement graphique Front-end\\n - Convertisseur RTF -> HTML / HTML -> RTF\\n - Edition de UserControls (contrôle utilisateur personnalisé)\",\n title: \"Software Engineer\",\n companyUrn: \"urn:li:fsd_company:28151802\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:105073465\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n employmentTypeUrn: \"urn:li:fsd_employmentType:12\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2131736619)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:96\": {\n name: \"Information Technology & Services\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:96\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:96\"],\n url: \"https://www.linkedin.com/company/konceptkomet/\",\n employeeCountRange: {\n start: 51,\n end: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:28151802\",\n name: \"Groupe Koncept Komet\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQG7ofkqq1sxog/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=0wYUakFbBlXosgyBVjmasjvRO3526mTNXYB972Dj94U\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=3YnFcCioKlE4YyUVKXea41F74xxZ-f2_Z_6awTufdVY\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=Ta4BHqwnyVJw6rOVX9Uo0jpSTwHKtJ4euRVNZs540u4\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"konceptkomet\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Toulouse, Occitanie, France\",\n multiLocaleTitle: {\n fr_FR: \"Software Engineer\",\n },\n employmentType: {\n name: \"Full-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:12\",\n companyNameRequired: true,\n },\n geoUrn: \"urn:li:fsd_geo:105073465\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(fr,0)\",\n geoLocationName: \"Toulouse, Occitanie, France\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(fr,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleDescription: {\n fr_FR:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - Projet en Agile sur une application Windows RT (C#, XAML) Win 8.1\\n - Evolution Back-end et Front-end\\n\\nMission :\\n - Étude Fonctionnelle\\n - Rédaction de dossiers de spécification\\n - Chiffrage, maintenance et évolution de l’application (Back-end / Front-end)\\n - Amélioration des performances et rafraichissement graphique Front-end\\n - Convertisseur RTF -> HTML / HTML -> RTF\\n - Edition de UserControls (contrôle utilisateur personnalisé)\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n },\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 5,\n year: 2017,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 9,\n year: 2017,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Groupe Koncept Komet\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"1566042a-6726-48f2-8abd-d169cd29db97\",\n },\n companyName: \"Groupe Koncept Komet\",\n description:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - Projet en Agile sur une application JAVA (Java, GWT, Hibernate, XML).\\n - Revue de code (Java, SonarCube).\\nMission :\\n - Recueil du besoin du client.\\n - Étude Fonctionnelle.\\n - Rédaction de dossiers de spécification/test.\\n - Chiffrage, maintenance et évolution de l’application.\\n - Application de la méthode Agile SCRUM.\",\n title: \"Software Engineer\",\n companyUrn: \"urn:li:fsd_company:28151802\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:105073465\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n employmentTypeUrn: \"urn:li:fsd_employmentType:12\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2131738411)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:96\": {\n name: \"Information Technology & Services\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:96\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:96\"],\n url: \"https://www.linkedin.com/company/konceptkomet/\",\n employeeCountRange: {\n start: 51,\n end: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:28151802\",\n name: \"Groupe Koncept Komet\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQG7ofkqq1sxog/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=0wYUakFbBlXosgyBVjmasjvRO3526mTNXYB972Dj94U\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=3YnFcCioKlE4YyUVKXea41F74xxZ-f2_Z_6awTufdVY\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=Ta4BHqwnyVJw6rOVX9Uo0jpSTwHKtJ4euRVNZs540u4\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"konceptkomet\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Toulouse, Occitanie, France\",\n multiLocaleTitle: {\n fr_FR: \"Software Engineer\",\n },\n employmentType: {\n name: \"Full-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:12\",\n companyNameRequired: true,\n },\n geoUrn: \"urn:li:fsd_geo:105073465\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(fr,0)\",\n geoLocationName: \"Toulouse, Occitanie, France\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(fr,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleDescription: {\n fr_FR:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - Projet en Agile sur une application JAVA (Java, GWT, Hibernate, XML).\\n - Revue de code (Java, SonarCube).\\nMission :\\n - Recueil du besoin du client.\\n - Étude Fonctionnelle.\\n - Rédaction de dossiers de spécification/test.\\n - Chiffrage, maintenance et évolution de l’application.\\n - Application de la méthode Agile SCRUM.\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n },\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 3,\n year: 2017,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 5,\n year: 2017,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Groupe Koncept Komet\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"4cd45ca9-ab8f-4812-ad1e-9f261acd3f7e\",\n },\n companyName: \"Groupe Koncept Komet\",\n description:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - Migration de données par conversion XSLT (Java, XML, XSLT, Talend)\\n - Revue de code (Java, SonarCube)\\nMission :\\n - Recueil du besoin du client.\\n - Etude Fonctionnelle.\\n - Chiffrage, maintenance et évolution de l’application de migration\\n - Développement de composant Talend\\n - Conversion de donnée XML via XSLT\",\n title: \"Software Engineer\",\n companyUrn: \"urn:li:fsd_company:28151802\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:105073465\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n employmentTypeUrn: \"urn:li:fsd_employmentType:12\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2131734546)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:96\": {\n name: \"Information Technology & Services\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:96\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:96\"],\n url: \"https://www.linkedin.com/company/konceptkomet/\",\n employeeCountRange: {\n start: 51,\n end: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:28151802\",\n name: \"Groupe Koncept Komet\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQG7ofkqq1sxog/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=0wYUakFbBlXosgyBVjmasjvRO3526mTNXYB972Dj94U\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=3YnFcCioKlE4YyUVKXea41F74xxZ-f2_Z_6awTufdVY\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=Ta4BHqwnyVJw6rOVX9Uo0jpSTwHKtJ4euRVNZs540u4\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"konceptkomet\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Toulouse, Occitanie, France\",\n multiLocaleTitle: {\n fr_FR: \"Software Engineer\",\n },\n employmentType: {\n name: \"Full-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:12\",\n companyNameRequired: true,\n },\n geoUrn: \"urn:li:fsd_geo:105073465\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(fr,0)\",\n geoLocationName: \"Toulouse, Occitanie, France\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(fr,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleDescription: {\n fr_FR:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - Migration de données par conversion XSLT (Java, XML, XSLT, Talend)\\n - Revue de code (Java, SonarCube)\\nMission :\\n - Recueil du besoin du client.\\n - Etude Fonctionnelle.\\n - Chiffrage, maintenance et évolution de l’application de migration\\n - Développement de composant Talend\\n - Conversion de donnée XML via XSLT\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n },\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 10,\n year: 2016,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 2,\n year: 2017,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Koncept - Komet Groupe\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"a9799ab0-02ea-435e-bb2a-4ff007627c39\",\n },\n companyName: \"Koncept - Komet Groupe\",\n description:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - TMA sur une application (Java, C, CORBA)\\n - Migration de données (Java, SQL, Talend)\\n - Développement d’un plugin de connexion FTPS (java)\\n\\nMission :\\n - Chiffrage, maintenance et évolution d’une application.\\n - Analyse et création d’un prototype de migration de données.\\n - Recueil du besoin du client.\\n - Etude Fonctionnelle.\\n - Développement d’un plugin de transfert de donnée via le protocole FTPS.\",\n title: \"Software Engineer\",\n companyUrn: \"urn:li:fsd_company:28151802\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:105073465\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n employmentTypeUrn: \"urn:li:fsd_employmentType:12\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,757982648)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:96\": {\n name: \"Information Technology & Services\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:96\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:96\"],\n url: \"https://www.linkedin.com/company/konceptkomet/\",\n employeeCountRange: {\n start: 51,\n end: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:28151802\",\n name: \"Groupe Koncept Komet\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQG7ofkqq1sxog/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=0wYUakFbBlXosgyBVjmasjvRO3526mTNXYB972Dj94U\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=3YnFcCioKlE4YyUVKXea41F74xxZ-f2_Z_6awTufdVY\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=Ta4BHqwnyVJw6rOVX9Uo0jpSTwHKtJ4euRVNZs540u4\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"konceptkomet\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Toulouse, Occitanie, France\",\n multiLocaleTitle: {\n fr_FR: \"Software Engineer\",\n },\n employmentType: {\n name: \"Full-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:12\",\n companyNameRequired: true,\n },\n geoUrn: \"urn:li:fsd_geo:105073465\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(fr,0)\",\n geoLocationName: \"Toulouse, Occitanie, France\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(fr,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleDescription: {\n fr_FR:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - TMA sur une application (Java, C, CORBA)\\n - Migration de données (Java, SQL, Talend)\\n - Développement d’un plugin de connexion FTPS (java)\\n\\nMission :\\n - Chiffrage, maintenance et évolution d’une application.\\n - Analyse et création d’un prototype de migration de données.\\n - Recueil du besoin du client.\\n - Etude Fonctionnelle.\\n - Développement d’un plugin de transfert de donnée via le protocole FTPS.\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n },\n ],\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:96\": {\n name: \"Information Technology & Services\",\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:96\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:96\"],\n url: \"https://www.linkedin.com/company/konceptkomet/\",\n employeeCountRange: {\n start: 51,\n end: 200,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:28151802\",\n name: \"Groupe Koncept Komet\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQG7ofkqq1sxog/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=0wYUakFbBlXosgyBVjmasjvRO3526mTNXYB972Dj94U\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=3YnFcCioKlE4YyUVKXea41F74xxZ-f2_Z_6awTufdVY\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=Ta4BHqwnyVJw6rOVX9Uo0jpSTwHKtJ4euRVNZs540u4\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"konceptkomet\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionGroup\",\n companyUrn: \"urn:li:fsd_company:28151802\",\n },\n {\n entityUrn:\n \"urn:li:fsd_profilePositionGroup:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,5b5ba1c4d2927e1c0a9832c08d26f0543a73ebdc)\",\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 12,\n year: 2015,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 12,\n year: 2015,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Observatoir Regional de la Santé\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"6e85621e-4014-4850-b071-15ef9cb3f788\",\n },\n companyName: \"Observatoir Regional de la Santé\",\n profilePositionInPositionGroup: {\n paging: {\n total: 1,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionsInGroup\",\n elements: [\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 12,\n year: 2015,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 12,\n year: 2015,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Observatoir Regional de la Santé\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"529dd93d-18c4-4258-a554-72da046ba91f\",\n },\n companyName: \"Observatoir Regional de la Santé\",\n description:\n \"Projet :\\n - Développement du site de recensement des publications de l’ORS.\\n\\nMission :\\n - Recueil du besoin du client.\\n - Etude Fonctionnelle.\\n - Utilisation du CMS Wordpress.\\n - Création d’un Template personnalisé.\\n - Développement d’un module Javascript pour recenser les profils de santé sur une\\ncarte interactive.\",\n title: \"Software Developer\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:105073465\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n employmentTypeUrn: \"urn:li:fsd_employmentType:18\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2131738091)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Toulouse, Occitanie, France\",\n multiLocaleTitle: {\n fr_FR: \"Software Developer\",\n },\n employmentType: {\n name: \"Internship\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:18\",\n companyNameRequired: true,\n },\n geoUrn: \"urn:li:fsd_geo:105073465\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(fr,0)\",\n geoLocationName: \"Toulouse, Occitanie, France\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(fr,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleDescription: {\n fr_FR:\n \"Projet :\\n - Développement du site de recensement des publications de l’ORS.\\n\\nMission :\\n - Recueil du besoin du client.\\n - Etude Fonctionnelle.\\n - Utilisation du CMS Wordpress.\\n - Création d’un Template personnalisé.\\n - Développement d’un module Javascript pour recenser les profils de santé sur une\\ncarte interactive.\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n },\n ],\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionGroup\",\n },\n {\n entityUrn:\n \"urn:li:fsd_profilePositionGroup:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,e5c6a153131544bff9a92b944de58002b02bdf77)\",\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 2,\n year: 2013,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 1,\n year: 2015,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Artec\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"d5b4f4ae-7910-469b-9e41-4e832b2968aa\",\n },\n companyName: \"Artec\",\n profilePositionInPositionGroup: {\n paging: {\n total: 1,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionsInGroup\",\n elements: [\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 2,\n year: 2013,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 1,\n year: 2015,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Artec\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"c8d9bfb1-9302-4730-b78a-f22ac771aacb\",\n },\n companyName: \"Artec\",\n description:\n \"- Développer et apporter une assistance commerciale auprès des professionnels et\\nparticuliers.\\n- Définir et argumenter une assistance technique auprès de particuliers.\\n- Développement Intranet / Extranet / Site Vitrine :\\n * Recueil des besoins des utilisateurs.\\n * Développement des solutions en PHP, HTML5 et CCS3.\",\n title: \"Agent de Contact Clients\",\n employmentTypeUrn: \"urn:li:fsd_employmentType:12\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,654045324)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"labege\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"labege\",\n multiLocaleTitle: {\n fr_FR: \"Agent de Contact Clients\",\n },\n employmentType: {\n name: \"Full-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:12\",\n companyNameRequired: true,\n },\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n geoLocationName: \"labege\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n multiLocaleDescription: {\n fr_FR:\n \"- Développer et apporter une assistance commerciale auprès des professionnels et\\nparticuliers.\\n- Définir et argumenter une assistance technique auprès de particuliers.\\n- Développement Intranet / Extranet / Site Vitrine :\\n * Recueil des besoins des utilisateurs.\\n * Développement des solutions en PHP, HTML5 et CCS3.\",\n },\n multiLocaleLocationName: {\n fr_FR: \"labege\",\n },\n },\n ],\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionGroup\",\n },\n {\n entityUrn:\n \"urn:li:fsd_profilePositionGroup:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,f785efccdf13a7b99680b5aea12eb3fb9aa737c1)\",\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 8,\n year: 2013,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 12,\n year: 2014,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Infomil\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"90a141a0-3665-4dd0-880a-138d92abaf2b\",\n },\n companyName: \"Infomil\",\n profilePositionInPositionGroup: {\n paging: {\n total: 1,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionsInGroup\",\n elements: [\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 8,\n year: 2013,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 12,\n year: 2014,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Infomil\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"f793a843-2cc6-4c9e-893f-696f4205d13b\",\n },\n companyName: \"Infomil\",\n description:\n \"- Contrôle de la conformité des visuels en rapport à la charte Drive Leclerc\\n- Élaboration des solutions d'amélioration de productivité\\n- Gestion et pilotage d'une équipe de deux photographes.\",\n title: \"Responsable Qualité Photo Drive\",\n companyUrn: \"urn:li:fsd_company:10598044\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:105073465\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n employmentTypeUrn: \"urn:li:fsd_employmentType:11\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2131733457)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:4\": {\n name: \"Computer Software\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:4\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:4\"],\n url: \"https://www.linkedin.com/company/infomil/\",\n employeeCountRange: {\n start: 501,\n end: 1000,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:10598044\",\n name: \"Infomil\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C560BAQHkHqq-rveGPg/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1631319488193?e=1763596800&v=beta&t=isGNpA-S4FChBd2DXTsnd4GhnJumv9g0j5pr30wV43U\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1631319488193?e=1763596800&v=beta&t=8yv9PA6EvhbayIeCCAqSDQhgtnGjdK79bsHBLzyHJR8\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1631319488193?e=1763596800&v=beta&t=1k7zl09LSF6X1awOV6uTfdqVhSeA7b2MNv0OBW3y_90\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"infomil\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Toulouse, Occitanie, France\",\n multiLocaleTitle: {\n fr_FR: \"Responsable Qualité Photo Drive\",\n },\n employmentType: {\n name: \"Part-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:11\",\n companyNameRequired: true,\n },\n geoUrn: \"urn:li:fsd_geo:105073465\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(fr,0)\",\n geoLocationName: \"Toulouse, Occitanie, France\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(fr,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleDescription: {\n fr_FR:\n \"- Contrôle de la conformité des visuels en rapport à la charte Drive Leclerc\\n- Élaboration des solutions d'amélioration de productivité\\n- Gestion et pilotage d'une équipe de deux photographes.\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n },\n ],\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:4\": {\n name: \"Computer Software\",\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:4\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:4\"],\n url: \"https://www.linkedin.com/company/infomil/\",\n employeeCountRange: {\n start: 501,\n end: 1000,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:10598044\",\n name: \"Infomil\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C560BAQHkHqq-rveGPg/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1631319488193?e=1763596800&v=beta&t=isGNpA-S4FChBd2DXTsnd4GhnJumv9g0j5pr30wV43U\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1631319488193?e=1763596800&v=beta&t=8yv9PA6EvhbayIeCCAqSDQhgtnGjdK79bsHBLzyHJR8\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1631319488193?e=1763596800&v=beta&t=1k7zl09LSF6X1awOV6uTfdqVhSeA7b2MNv0OBW3y_90\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"infomil\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionGroup\",\n companyUrn: \"urn:li:fsd_company:10598044\",\n },\n ],\n },\n coverPhotoItems: [],\n geoLocation: {\n geo: {\n countryUrn: \"urn:li:fsd_geo:104265812\",\n country: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.CountryGeo\",\n entityUrn: \"urn:li:fsd_geo:104265812\",\n defaultLocalizedName: \"Reunion\",\n },\n defaultLocalizedNameWithoutCountryName: \"Saint-Pierre, Saint-Pierre\",\n entityUrn: \"urn:li:fsd_geo:107646956\",\n $recipeType: \"com.linkedin.voyager.dash.deco.identity.profile.Geo\",\n defaultLocalizedName: \"Saint-Pierre, Saint-Pierre, Reunion\",\n },\n geoUrn: \"urn:li:fsd_geo:107646956\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.ProfileGeoLocation\",\n },\n profileRingStatusCollection: {\n paging: {\n start: 0,\n count: 10,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon1936086081\",\n elements: [],\n },\n location: {\n countryCode: \"re\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.ProfileLocation\",\n },\n backgroundPicture: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.ProfilePhotoDecoSpecEditableBackgroundPicture\",\n displayImageReference: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E16AQFLKsQ5v3bCPQ/profile-displaybackgroundimage-shrink_\",\n artifacts: [\n {\n width: 800,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_800/profile-displaybackgroundimage-shrink_200_800/0/1677653277146?e=1763596800&v=beta&t=tLvE4ortpzdSS3jlPIVmJJQ0_8DpnioRBaxxTDJ9twc\",\n expiresAt: 1763596800000,\n height: 199,\n },\n {\n width: 1400,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"350_1400/profile-displaybackgroundimage-shrink_350_1400/0/1677653277146?e=1763596800&v=beta&t=SQaCB_dahnr2l51beC4LLfq5ZDTdpMTS1E002NQuqe4\",\n expiresAt: 1763596800000,\n height: 349,\n },\n ],\n },\n },\n displayImageUrn: \"urn:li:digitalmediaAsset:D4E16AQFLKsQ5v3bCPQ\",\n photoFilterEditInfo: {\n bottomLeft: {\n x: 0,\n y: 0.9661616161616161,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Coordinate2DFull\",\n },\n vignette: 0,\n bottomRight: {\n x: 1,\n y: 0.9661616161616161,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Coordinate2DFull\",\n },\n topRight: {\n x: 1,\n y: 0.03383838383838384,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Coordinate2DFull\",\n },\n saturation: 0,\n brightness: 0,\n photoFilterType: \"ORIGINAL\",\n contrast: 0.01,\n topLeft: {\n x: 0,\n y: 0.03383838383838384,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Coordinate2DFull\",\n },\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon1309211116\",\n },\n },\n primaryLocale: {\n country: \"FR\",\n language: \"fr\",\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Locale\",\n },\n};\n\nfunction createLinkedinHeaders(\n csrfToken: string,\n cookies?: Record<string, string> | string\n) {\n const headers: Record<string, string> = {\n \"csrf-token\": csrfToken,\n };\n if (cookies) {\n let c = \"\";\n if (typeof cookies === \"string\") {\n c = cookies;\n } else {\n c = Object.entries(cookies)\n .map(([key, value]) => `${key}=${value}`)\n .join(\"; \");\n }\n c && (headers[\"Cookie\"] = c);\n }\n return headers;\n}\n\n/**\n * decorationId: com.linkedin.voyager.dash.deco.identity.profile.FullProfileWithEntities-26\n * decorationId 便是 返回中的 $recipeType, 后面的 -26 或者其他数字,尚未了解有什么特别,目前 26 数据比较丰富\n * q: memberIdentity\n * memberIdentity: publicId\n * @param publicId Linkedin个人资料的公开ID\n * @returns Linkedin个人资料的装饰ID\n * 此方法返回的数据与lemlist一致\n */\nexport async function getLinkedinProfile(\n publicId: string,\n {\n csrfToken,\n cookies,\n }: {\n csrfToken: string;\n cookies?: Record<string, string> | string;\n }\n): Promise<typeof linkedinProfileExample | null> {\n const url = `${LinkedinApiUrl}/identity/dash/profiles?q=memberIdentity&memberIdentity=${publicId}&decorationId=com.linkedin.voyager.dash.deco.identity.profile.FullProfileWithEntities-26`;\n const headers = createLinkedinHeaders(csrfToken, cookies);\n return fetch(url, {\n method: \"GET\",\n headers,\n })\n .then(async (response) => {\n if (response.ok) {\n const data = await response.json();\n return data.elements?.[0] || null;\n }\n return null;\n })\n .catch((error) => {\n console.error(error);\n return null;\n });\n}\n\nconst linkedinCompanyExample = {\n groupedLocationsByCountry: [\n {\n localizedName: \"Amsterdam\",\n latLong: {\n latitude: 52.245632,\n longitude: 5.626918,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"NL\",\n geographicArea: \"North Holland\",\n city: \"Amsterdam\",\n headquarter: false,\n postalCode: \"1082 MD\",\n line1: \"Claude Debussylaan 34\",\n },\n ],\n },\n {\n localizedName: \"Australia\",\n latLong: {\n latitude: -25.728048,\n longitude: 134.49017,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"AU\",\n geographicArea: \"NSW\",\n city: \"Sydney\",\n headquarter: false,\n postalCode: \"2009\",\n line1: \"48 Pirrama Rd\",\n },\n {\n streetAddressOptOut: false,\n country: \"AU\",\n geographicArea: \"VIC\",\n city: \"Melbourne\",\n headquarter: false,\n postalCode: \"3000\",\n line1: \"90 Collins St\",\n },\n ],\n },\n {\n localizedName: \"Bogota\",\n latLong: {\n latitude: 4.099917,\n longitude: -72.90881,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"CO\",\n geographicArea: \"Bogota, D.C.\",\n city: \"Bogota\",\n headquarter: false,\n postalCode: \"110221\",\n line1: \"Carrera 11A 94-45\",\n },\n ],\n },\n {\n localizedName: \"Buenos Aires City\",\n latLong: {\n latitude: -34.9965,\n longitude: -64.967285,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"AR\",\n geographicArea: \"Buenos Aires Autonomous City\",\n city: \"Buenos Aires City\",\n headquarter: false,\n postalCode: \"1107\",\n line1: \"Avenida Alicia Moreau de Justo 350\",\n },\n ],\n },\n {\n localizedName: \"Canada\",\n latLong: {\n latitude: 62.57421,\n longitude: -96.60791,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"CA\",\n geographicArea: \"ON\",\n city: \"Kitchener\",\n headquarter: false,\n postalCode: \"N2H 5G5\",\n line1: \"51 Breithaupt St\",\n },\n {\n streetAddressOptOut: false,\n country: \"CA\",\n geographicArea: \"ON\",\n city: \"Toronto\",\n headquarter: false,\n postalCode: \"M5H 2G4\",\n line1: \"111 Richmond St W\",\n },\n ],\n },\n {\n localizedName: \"Dublin\",\n latLong: {\n latitude: 52.865196,\n longitude: -7.97946,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IE\",\n geographicArea: \"County Dublin\",\n city: \"Dublin\",\n headquarter: false,\n line1: \"Barrow Street\",\n },\n ],\n },\n {\n localizedName: \"Germany\",\n latLong: {\n latitude: 51.091988,\n longitude: 10.380809,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"DE\",\n geographicArea: \"BE\",\n city: \"Berlin\",\n headquarter: false,\n postalCode: \"10117\",\n line1: \"Unter den Linden 14\",\n },\n {\n streetAddressOptOut: false,\n country: \"DE\",\n geographicArea: \"BY\",\n city: \"Munich\",\n headquarter: false,\n postalCode: \"80636\",\n line1: \"Erika-Mann-Strasse 33\",\n },\n {\n streetAddressOptOut: false,\n country: \"DE\",\n geographicArea: \"HH\",\n city: \"Hamburg\",\n headquarter: false,\n postalCode: \"20354\",\n line1: \"ABC-Strasse 19\",\n },\n ],\n },\n {\n localizedName: \"India\",\n latLong: {\n latitude: 22.352509,\n longitude: 79.363686,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"HR\",\n city: \"Gurugram\",\n headquarter: false,\n postalCode: \"122001\",\n line1: \"15\",\n },\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"Karnataka\",\n city: \"Bengaluru\",\n headquarter: false,\n postalCode: \"560016\",\n line1: \"Old Madras Road\",\n },\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"Karnataka\",\n city: \"Bengaluru\",\n headquarter: false,\n postalCode: \"560016\",\n line1: \"3 Swamy Vivekananda Road\",\n },\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"Maharashtra\",\n city: \"Mumbai\",\n headquarter: false,\n postalCode: \"400051\",\n line1: \"3 Bandra Kurla Complex Road\",\n },\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"TS\",\n city: \"Hyderabad\",\n headquarter: false,\n postalCode: \"500084\",\n line1: \"13\",\n },\n ],\n },\n {\n localizedName: \"Las Condes\",\n latLong: {\n latitude: -31.761337,\n longitude: -71.31877,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"CL\",\n geographicArea: \"Santiago Metropolitan\",\n city: \"Las Condes\",\n headquarter: false,\n postalCode: \"7550000\",\n line1: \"Avenida Costanera Sur\",\n },\n ],\n },\n {\n localizedName: \"London\",\n latLong: {\n latitude: 53.943832,\n longitude: -2.550564,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"GB\",\n geographicArea: \"England\",\n city: \"London\",\n headquarter: false,\n postalCode: \"WC2H 8AG\",\n line1: \"St Giles High Street\",\n },\n ],\n },\n {\n localizedName: \"Miguel Hidalgo\",\n latLong: {\n latitude: 23.933592,\n longitude: -102.5097,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"MX\",\n geographicArea: \"CDMX\",\n city: \"Miguel Hidalgo\",\n headquarter: false,\n postalCode: \"11000\",\n line1: \"Montes Urales\",\n },\n ],\n },\n {\n localizedName: \"Milan\",\n latLong: {\n latitude: 43.52555,\n longitude: 12.160002,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IT\",\n geographicArea: \"Lomb.\",\n city: \"Milan\",\n headquarter: false,\n postalCode: \"20124\",\n line1: \"Via Federico Confalonieri, 4\",\n },\n ],\n },\n {\n localizedName: \"Paris\",\n latLong: {\n latitude: 46.62481,\n longitude: 2.458374,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"FR\",\n geographicArea: \"IdF\",\n city: \"Paris\",\n headquarter: false,\n postalCode: \"75009\",\n line1: \"8 Rue de Londres\",\n },\n ],\n },\n {\n localizedName: \"Sao Paulo\",\n latLong: {\n latitude: -10.333333,\n longitude: -53.2,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"BR\",\n geographicArea: \"SP\",\n city: \"Sao Paulo\",\n headquarter: false,\n postalCode: \"04538-133\",\n line1: \"Avenida Brigadeiro Faria Lima, 3477\",\n },\n ],\n },\n {\n localizedName: \"Singapore\",\n latLong: {\n latitude: 1.356523,\n longitude: 103.80859,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"SG\",\n geographicArea: \"Singapore\",\n city: \"Singapore\",\n headquarter: false,\n postalCode: \"118484\",\n line1: \"3 Pasir Panjang Rd\",\n },\n ],\n },\n {\n localizedName: \"Spain\",\n latLong: {\n latitude: 40.390106,\n longitude: -3.554367,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"ES\",\n geographicArea: \"Community of Madrid\",\n city: \"Madrid\",\n headquarter: false,\n postalCode: \"28046\",\n line1: \"Plaza Pablo Ruiz Picasso\",\n },\n {\n streetAddressOptOut: false,\n country: \"ES\",\n geographicArea: \"Community of Madrid\",\n city: \"Madrid\",\n headquarter: false,\n postalCode: \"28020\",\n line1: \"Plaza Pablo Ruiz Picasso\",\n },\n ],\n },\n {\n localizedName: \"Stockholm\",\n latLong: {\n latitude: 59.674973,\n longitude: 14.520859,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"SE\",\n geographicArea: \"Stockholm County\",\n city: \"Stockholm\",\n headquarter: false,\n postalCode: \"111 22\",\n line1: \"Kungsbron 2\",\n },\n ],\n },\n {\n localizedName: \"Taguig City\",\n latLong: {\n latitude: 15.947407,\n longitude: 121.42167,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"PH\",\n geographicArea: \"National Capital Region\",\n city: \"Taguig City\",\n headquarter: false,\n line1: \"5th Ave\",\n },\n ],\n },\n {\n localizedName: \"Tel Aviv-yafo\",\n latLong: {\n latitude: 30.812426,\n longitude: 34.859478,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IL\",\n geographicArea: \"Tel Aviv\",\n city: \"Tel Aviv-Yafo\",\n headquarter: false,\n postalCode: \"67891\",\n line1: \"Yigal Allon 98\",\n },\n ],\n },\n {\n localizedName: \"United States\",\n latLong: {\n latitude: 39.50357,\n longitude: -99.01834,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"Mountain View\",\n headquarter: true,\n postalCode: \"94043\",\n line1: \"1600 Amphitheatre Parkway\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"Irvine\",\n headquarter: false,\n postalCode: \"92612\",\n line1: \"19510 Jamboree Rd\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"Los Angeles\",\n headquarter: false,\n postalCode: \"90291\",\n line1: \"340 Main St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"San Bruno\",\n headquarter: false,\n postalCode: \"94066\",\n line1: \"901 Cherry Ave\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"San Francisco\",\n headquarter: false,\n postalCode: \"94105\",\n line1: \"345 Spear St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CO\",\n city: \"Boulder\",\n headquarter: false,\n postalCode: \"80302\",\n line1: \"2590 Pearl St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"DC\",\n city: \"Washington\",\n headquarter: false,\n postalCode: \"20001\",\n line1: \"25 Massachusetts Ave NW\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"GA\",\n city: \"Atlanta\",\n headquarter: false,\n postalCode: \"30309\",\n line1: \"10 10th St NE\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"IL\",\n city: \"Chicago\",\n headquarter: false,\n postalCode: \"60607\",\n line1: \"320 N Morgan St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"MA\",\n city: \"Cambridge\",\n headquarter: false,\n postalCode: \"02142\",\n line1: \"355 Main St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"MI\",\n city: \"Ann Arbor\",\n headquarter: false,\n postalCode: \"48105\",\n line1: \"2300 Traverwood Dr\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"NY\",\n city: \"New York\",\n headquarter: false,\n postalCode: \"10011\",\n line1: \"111 8th Ave\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"TX\",\n city: \"Austin\",\n headquarter: false,\n postalCode: \"78759\",\n line1: \"9606 N Mopac Expy\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"TX\",\n city: \"Frisco\",\n headquarter: false,\n postalCode: \"75034\",\n line1: \"6175 Main St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"VA\",\n city: \"Reston\",\n headquarter: false,\n postalCode: \"20190\",\n line1: \"1875 Explorer St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"WA\",\n city: \"Kirkland\",\n headquarter: false,\n postalCode: \"98033\",\n line1: \"777 6th St S\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"WA\",\n city: \"Seattle\",\n headquarter: false,\n postalCode: \"98103\",\n line1: \"601 N 34th St\",\n },\n ],\n },\n {\n localizedName: \"Wan Chai\",\n latLong: {\n latitude: 22.421183,\n longitude: 114.1661,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"HK\",\n geographicArea: \"Hong Kong\",\n city: \"Wan Chai\",\n headquarter: false,\n line1: \"2 Matheson St\",\n },\n ],\n },\n {\n localizedName: \"Warsaw\",\n latLong: {\n latitude: 52.124672,\n longitude: 19.400427,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"PL\",\n geographicArea: \"MA\",\n city: \"Warsaw\",\n headquarter: false,\n postalCode: \"00-125\",\n line1: \"ulica Emilii Plater 53\",\n },\n ],\n },\n {\n localizedName: \"Zurich\",\n latLong: {\n latitude: 46.80124,\n longitude: 8.230966,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"CH\",\n geographicArea: \"ZH\",\n city: \"Zurich\",\n headquarter: false,\n postalCode: \"8002\",\n line1: \"Brandschenkestrasse 110\",\n },\n ],\n },\n ],\n viewerPermissions: {\n canCreateBroadcast: false,\n canSeeProducts: false,\n canReadContentSuggestions: false,\n canUpdateOrganizationProfile: false,\n canSponsorShare: false,\n canEditPendingDirectSponsoredContentPosters: false,\n canUntagFromMention: false,\n canReadOrganizationActivity: false,\n canManageCareerPages: false,\n canAssociateHashtag: false,\n canDeleteShare: false,\n canInviteMemberToFollow: false,\n canReadBroadcastAnalytics: false,\n canEditPipelineBuilderAdministrators: false,\n canReadPipelineBuilderAdminPage: false,\n canDeactivateOrganization: false,\n canCreateOrganicShare: false,\n canEditDarkShare: false,\n canReadOrganizationLeadsAnalytics: false,\n canEnableCommentsShare: false,\n canDeleteDarkShare: false,\n canReadOrganizationTalentBrandAnalytics: false,\n canEditDirectSponsoredContentPosters: false,\n canPinShare: false,\n canReadPipelineBuilderAdministrators: false,\n canCreateLinkedInPagesProductFeedBack: false,\n canReadEvents: false,\n organizationRoles: [],\n canEditEvents: false,\n canReadOrganizationUpdateAnalytics: false,\n canCreateComment: false,\n canRequestAdminAccess: true,\n canEditAdministrators: false,\n canCreateDarkShare: false,\n canSeeEmployeeExperienceAsMember: false,\n canReadAdministrators: false,\n canExportLeads: false,\n canReadDirectSponsoredContentPosters: false,\n canManageEmployeeExperienceSettings: false,\n canCreateShowcase: false,\n canReadOrganizationVisitorAnalytics: false,\n canEditProducts: false,\n canReadPendingAdministrators: false,\n canEditCurators: false,\n canManageVerifiedEmailDomains: false,\n canReadPendingDirectSponsoredContentPosters: false,\n canEditPipelineBuilderAdminPage: false,\n canReadTermsAndAgreements: false,\n canReadOrganizationFollowerAnalytics: false,\n canManageOrganizationCompetitors: false,\n canCreateReaction: false,\n canDisableCommentsShare: false,\n canEditPendingAdministrators: false,\n canReadOrganizationPipelineBuilderAnalytics: false,\n canNotifyEmployees: false,\n canSeeOrganizationAdministrativePage: false,\n },\n videosTabVisible: true,\n useParentCareerPageEnabled: false,\n staffingCompany: false,\n groupedLocations: [\n {\n localizedName: \"London\",\n latLong: {\n latitude: 51.51649,\n longitude: -0.128427,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"GB\",\n geographicArea: \"England\",\n city: \"London\",\n headquarter: false,\n postalCode: \"WC2H 8AG\",\n line1: \"St Giles High Street\",\n },\n ],\n },\n {\n localizedName: \"Dublin\",\n latLong: {\n latitude: 53.427185,\n longitude: -6.244215,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IE\",\n geographicArea: \"County Dublin\",\n city: \"Dublin\",\n headquarter: false,\n line1: \"Barrow Street\",\n },\n ],\n },\n {\n localizedName: \"Bogota\",\n latLong: {\n latitude: 4.670855,\n longitude: -74.09681,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"CO\",\n geographicArea: \"Bogota, D.C.\",\n city: \"Bogota\",\n headquarter: false,\n postalCode: \"110221\",\n line1: \"Carrera 11A 94-45\",\n },\n ],\n },\n {\n localizedName: \"Singapore\",\n latLong: {\n latitude: 1.356523,\n longitude: 103.80859,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"SG\",\n geographicArea: \"Singapore\",\n city: \"Singapore\",\n headquarter: false,\n postalCode: \"118484\",\n line1: \"3 Pasir Panjang Rd\",\n },\n ],\n },\n {\n localizedName: \"Miguel Hidalgo\",\n latLong: {\n latitude: 19.425928,\n longitude: -99.13615,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"MX\",\n geographicArea: \"CDMX\",\n city: \"Miguel Hidalgo\",\n headquarter: false,\n postalCode: \"11000\",\n line1: \"Montes Urales\",\n },\n ],\n },\n {\n localizedName: \"Tel Aviv-yafo\",\n latLong: {\n latitude: 30.812426,\n longitude: 34.859478,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IL\",\n geographicArea: \"Tel Aviv\",\n city: \"Tel Aviv-Yafo\",\n headquarter: false,\n postalCode: \"67891\",\n line1: \"Yigal Allon 98\",\n },\n ],\n },\n {\n localizedName: \"Toronto\",\n latLong: {\n latitude: 43.68814,\n longitude: -79.621994,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"CA\",\n geographicArea: \"ON\",\n city: \"Toronto\",\n headquarter: false,\n postalCode: \"M5H 2G4\",\n line1: \"111 Richmond St W\",\n },\n ],\n },\n {\n localizedName: \"Kitchener\",\n latLong: {\n latitude: 43.456963,\n longitude: -80.382385,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"CA\",\n geographicArea: \"ON\",\n city: \"Kitchener\",\n headquarter: false,\n postalCode: \"N2H 5G5\",\n line1: \"51 Breithaupt St\",\n },\n ],\n },\n {\n localizedName: \"Las Condes\",\n latLong: {\n latitude: -33.452965,\n longitude: -70.6663,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"CL\",\n geographicArea: \"Santiago Metropolitan\",\n city: \"Las Condes\",\n headquarter: false,\n postalCode: \"7550000\",\n line1: \"Avenida Costanera Sur\",\n },\n ],\n },\n {\n localizedName: \"Milan\",\n latLong: {\n latitude: 45.46816,\n longitude: 9.182292,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IT\",\n geographicArea: \"Lomb.\",\n city: \"Milan\",\n headquarter: false,\n postalCode: \"20124\",\n line1: \"Via Federico Confalonieri, 4\",\n },\n ],\n },\n {\n localizedName: \"Taguig City\",\n latLong: {\n latitude: 15.947407,\n longitude: 121.42167,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"PH\",\n geographicArea: \"National Capital Region\",\n city: \"Taguig City\",\n headquarter: false,\n line1: \"5th Ave\",\n },\n ],\n },\n {\n localizedName: \"Sydney\",\n latLong: {\n latitude: -33.84907,\n longitude: 151.13834,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"AU\",\n geographicArea: \"NSW\",\n city: \"Sydney\",\n headquarter: false,\n postalCode: \"2009\",\n line1: \"48 Pirrama Rd\",\n },\n ],\n },\n {\n localizedName: \"Melbourne\",\n latLong: {\n latitude: -37.803425,\n longitude: 145.01105,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"AU\",\n geographicArea: \"VIC\",\n city: \"Melbourne\",\n headquarter: false,\n postalCode: \"3000\",\n line1: \"90 Collins St\",\n },\n ],\n },\n {\n localizedName: \"Zurich\",\n latLong: {\n latitude: 47.450603,\n longitude: 8.561746,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"CH\",\n geographicArea: \"ZH\",\n city: \"Zurich\",\n headquarter: false,\n postalCode: \"8002\",\n line1: \"Brandschenkestrasse 110\",\n },\n ],\n },\n {\n localizedName: \"Paris\",\n latLong: {\n latitude: 48.88075,\n longitude: 2.275646,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"FR\",\n geographicArea: \"IdF\",\n city: \"Paris\",\n headquarter: false,\n postalCode: \"75009\",\n line1: \"8 Rue de Londres\",\n },\n ],\n },\n {\n localizedName: \"Buenos Aires City\",\n latLong: {\n latitude: -34.805058,\n longitude: -58.541706,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"AR\",\n geographicArea: \"Buenos Aires Autonomous City\",\n city: \"Buenos Aires City\",\n headquarter: false,\n postalCode: \"1107\",\n line1: \"Avenida Alicia Moreau de Justo 350\",\n },\n ],\n },\n {\n localizedName: \"Hamburg\",\n latLong: {\n latitude: 53.63128,\n longitude: 10.006442,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"DE\",\n geographicArea: \"HH\",\n city: \"Hamburg\",\n headquarter: false,\n postalCode: \"20354\",\n line1: \"ABC-Strasse 19\",\n },\n ],\n },\n {\n localizedName: \"Berlin\",\n latLong: {\n latitude: 52.560253,\n longitude: 13.296672,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"DE\",\n geographicArea: \"BE\",\n city: \"Berlin\",\n headquarter: false,\n postalCode: \"10117\",\n line1: \"Unter den Linden 14\",\n },\n ],\n },\n {\n localizedName: \"Munich\",\n latLong: {\n latitude: 48.140095,\n longitude: 11.555375,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"DE\",\n geographicArea: \"BY\",\n city: \"Munich\",\n headquarter: false,\n postalCode: \"80636\",\n line1: \"Erika-Mann-Strasse 33\",\n },\n ],\n },\n {\n localizedName: \"Warsaw\",\n latLong: {\n latitude: 52.23702,\n longitude: 21.02,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"PL\",\n geographicArea: \"MA\",\n city: \"Warsaw\",\n headquarter: false,\n postalCode: \"00-125\",\n line1: \"ulica Emilii Plater 53\",\n },\n ],\n },\n {\n localizedName: \"Amsterdam\",\n latLong: {\n latitude: 51.89373,\n longitude: 4.523071,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"NL\",\n geographicArea: \"North Holland\",\n city: \"Amsterdam\",\n headquarter: false,\n postalCode: \"1082 MD\",\n line1: \"Claude Debussylaan 34\",\n },\n ],\n },\n {\n localizedName: \"Greater Madrid Metropolitan Area\",\n latLong: {\n latitude: 40.409824,\n longitude: -3.675558,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"ES\",\n geographicArea: \"Community of Madrid\",\n city: \"Madrid\",\n headquarter: false,\n postalCode: \"28046\",\n line1: \"Plaza Pablo Ruiz Picasso\",\n },\n {\n streetAddressOptOut: false,\n country: \"ES\",\n geographicArea: \"Community of Madrid\",\n city: \"Madrid\",\n headquarter: false,\n postalCode: \"28020\",\n line1: \"Plaza Pablo Ruiz Picasso\",\n },\n ],\n },\n {\n localizedName: \"Atlanta\",\n latLong: {\n latitude: 33.74975,\n longitude: -84.38857,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"GA\",\n city: \"Atlanta\",\n headquarter: false,\n postalCode: \"30309\",\n line1: \"10 10th St NE\",\n },\n ],\n },\n {\n localizedName: \"Cambridge\",\n latLong: {\n latitude: 42.36041,\n longitude: -71.05798,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"MA\",\n city: \"Cambridge\",\n headquarter: false,\n postalCode: \"02142\",\n line1: \"355 Main St\",\n },\n ],\n },\n {\n localizedName: \"San Francisco Bay Area\",\n latLong: {\n latitude: 37.39271,\n longitude: -122.042,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"Mountain View\",\n headquarter: true,\n postalCode: \"94043\",\n line1: \"1600 Amphitheatre Parkway\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"San Bruno\",\n headquarter: false,\n postalCode: \"94066\",\n line1: \"901 Cherry Ave\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"San Francisco\",\n headquarter: false,\n postalCode: \"94105\",\n line1: \"345 Spear St\",\n },\n ],\n },\n {\n localizedName: \"Austin\",\n latLong: {\n latitude: 30.276316,\n longitude: -97.70931,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"TX\",\n city: \"Austin\",\n headquarter: false,\n postalCode: \"78759\",\n line1: \"9606 N Mopac Expy\",\n },\n ],\n },\n {\n localizedName: \"Los Angeles Metropolitan Area\",\n latLong: {\n latitude: 34.073666,\n longitude: -118.23985,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"Irvine\",\n headquarter: false,\n postalCode: \"92612\",\n line1: \"19510 Jamboree Rd\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"Los Angeles\",\n headquarter: false,\n postalCode: \"90291\",\n line1: \"340 Main St\",\n },\n ],\n },\n {\n localizedName: \"Chicago\",\n latLong: {\n latitude: 41.948055,\n longitude: -87.655754,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"IL\",\n city: \"Chicago\",\n headquarter: false,\n postalCode: \"60607\",\n line1: \"320 N Morgan St\",\n },\n ],\n },\n {\n localizedName: \"Boulder\",\n latLong: {\n latitude: 39.756443,\n longitude: -104.99415,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CO\",\n city: \"Boulder\",\n headquarter: false,\n postalCode: \"80302\",\n line1: \"2590 Pearl St\",\n },\n ],\n },\n {\n localizedName: \"Frisco\",\n latLong: {\n latitude: 32.7513,\n longitude: -97.08263,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"TX\",\n city: \"Frisco\",\n headquarter: false,\n postalCode: \"75034\",\n line1: \"6175 Main St\",\n },\n ],\n },\n {\n localizedName: \"Ann Arbor\",\n latLong: {\n latitude: 42.339054,\n longitude: -83.04875,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"MI\",\n city: \"Ann Arbor\",\n headquarter: false,\n postalCode: \"48105\",\n line1: \"2300 Traverwood Dr\",\n },\n ],\n },\n {\n localizedName: \"Washington DC-Baltimore Area\",\n latLong: {\n latitude: 38.873062,\n longitude: -77.007385,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"DC\",\n city: \"Washington\",\n headquarter: false,\n postalCode: \"20001\",\n line1: \"25 Massachusetts Ave NW\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"VA\",\n city: \"Reston\",\n headquarter: false,\n postalCode: \"20190\",\n line1: \"1875 Explorer St\",\n },\n ],\n },\n {\n localizedName: \"Greater Seattle Area\",\n latLong: {\n latitude: 47.591396,\n longitude: -122.33279,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"WA\",\n city: \"Kirkland\",\n headquarter: false,\n postalCode: \"98033\",\n line1: \"777 6th St S\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"WA\",\n city: \"Seattle\",\n headquarter: false,\n postalCode: \"98103\",\n line1: \"601 N 34th St\",\n },\n ],\n },\n {\n localizedName: \"New York\",\n latLong: {\n latitude: 40.748295,\n longitude: -73.98556,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"NY\",\n city: \"New York\",\n headquarter: false,\n postalCode: \"10011\",\n line1: \"111 8th Ave\",\n },\n ],\n },\n {\n localizedName: \"Stockholm\",\n latLong: {\n latitude: 59.34777,\n longitude: 18.088993,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"SE\",\n geographicArea: \"Stockholm County\",\n city: \"Stockholm\",\n headquarter: false,\n postalCode: \"111 22\",\n line1: \"Kungsbron 2\",\n },\n ],\n },\n {\n localizedName: \"Sao Paulo\",\n latLong: {\n latitude: -23.624617,\n longitude: -46.659874,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"BR\",\n geographicArea: \"SP\",\n city: \"Sao Paulo\",\n headquarter: false,\n postalCode: \"04538-133\",\n line1: \"Avenida Brigadeiro Faria Lima, 3477\",\n },\n ],\n },\n {\n localizedName: \"Wan Chai\",\n latLong: {\n latitude: 22.27765,\n longitude: 114.17736,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"HK\",\n geographicArea: \"Hong Kong\",\n city: \"Wan Chai\",\n headquarter: false,\n line1: \"2 Matheson St\",\n },\n ],\n },\n {\n localizedName: \"Hyderabad\",\n latLong: {\n latitude: 17.439758,\n longitude: 78.42455,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"TS\",\n city: \"Hyderabad\",\n headquarter: false,\n postalCode: \"500084\",\n line1: \"13\",\n },\n ],\n },\n {\n localizedName: \"Mumbai\",\n latLong: {\n latitude: 19.146397,\n longitude: 72.87369,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"Maharashtra\",\n city: \"Mumbai\",\n headquarter: false,\n postalCode: \"400051\",\n line1: \"3 Bandra Kurla Complex Road\",\n },\n ],\n },\n {\n localizedName: \"Greater Bengaluru Area\",\n latLong: {\n latitude: 12.98163,\n longitude: 77.59208,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"Karnataka\",\n city: \"Bengaluru\",\n headquarter: false,\n postalCode: \"560016\",\n line1: \"Old Madras Road\",\n },\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"Karnataka\",\n city: \"Bengaluru\",\n headquarter: false,\n postalCode: \"560016\",\n line1: \"3 Swamy Vivekananda Road\",\n },\n ],\n },\n {\n localizedName: \"Gurugram\",\n latLong: {\n latitude: 28.587835,\n longitude: 77.16324,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"HR\",\n city: \"Gurugram\",\n headquarter: false,\n postalCode: \"122001\",\n line1: \"15\",\n },\n ],\n },\n ],\n multiLocaleDescriptions: {\n localized: {\n en_US:\n \"A problem isn't truly solved until it's solved for all. Googlers build products that help create opportunities for everyone, whether down the street or across the globe. Bring your insight, imagination and a healthy disregard for the impossible. Bring everything that makes you unique. Together, we can build for everyone.\\n\\nCheck out our career opportunities at goo.gle/3DLEokh\",\n },\n preferredLocale: {\n country: \"US\",\n language: \"en\",\n },\n },\n type: \"Public Company\",\n companyIndustries: [\n {\n entityUrn: \"urn:li:fs_industry:4\",\n localizedName: \"Software Development\",\n },\n ],\n logos: {\n logo: {\n \"com.linkedin.common.VectorImage\": {\n artifacts: [\n {\n width: 200,\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1631311446380?e=1759968000&v=beta&t=OQsuyFE-NRStieVKaWrjVYh9OL9IYUWGn-KFqrYbEV4\",\n expiresAt: 1759968000000,\n height: 200,\n },\n {\n width: 100,\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1631311446380?e=1759968000&v=beta&t=jnIPgQh2pNFZqcdjrYShazVuIbOZFNPBN3SVS0xecUI\",\n expiresAt: 1759968000000,\n height: 100,\n },\n {\n width: 400,\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1631311446380?e=1759968000&v=beta&t=NAS5sOIzzhGP7yJjQHJJvYLGw6ijJVQK9KucOyajADg\",\n expiresAt: 1759968000000,\n height: 400,\n },\n ],\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQHiNSL4Or29cg/company-logo_\",\n },\n },\n legacyLogo: {\n \"com.linkedin.voyager.common.MediaProcessorImage\": {\n id: \"/AAMAAgQIAAkAAQAAAAAAAA8iAAAAJDRiNTM1YzIwLWU0YjQtNDE2MC1iYWRkLWYzOWQwMjRiODdiZQ.bin\",\n },\n },\n legacySquareLogo: {\n \"com.linkedin.voyager.common.MediaProcessorImage\": {\n id: \"/AAMAAgQIAAkAAQAAAAAAAA8iAAAAJDRiNTM1YzIwLWU0YjQtNDE2MC1iYWRkLWYzOWQwMjRiODdiZQ.bin\",\n },\n },\n },\n callToAction: {\n callToActionMessage: {\n textDirection: \"USER_LOCALE\",\n text: \"Visit website\",\n },\n callToActionType: \"VIEW_WEBSITE\",\n visible: true,\n url: \"https://goo.gle/3DLEokh\",\n },\n staffCount: 316149,\n adsRule: \"REDUCED\",\n companyEmployeesSearchPageUrl: \"https://www.linkedin.com/vsearch/p?f_CC=1441\",\n viewerFollowingJobsUpdates: false,\n createdAt: 0,\n myCompanyVisible: true,\n staffCountRange: {\n start: 10001,\n },\n permissions: {\n landingPageAdmin: false,\n admin: false,\n adAccountHolder: false,\n },\n eligibleForInviteToFollow: true,\n logo: {\n type: \"SQUARE_LOGO\",\n image: {\n \"com.linkedin.common.VectorImage\": {\n artifacts: [\n {\n width: 200,\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1631311446380?e=1759968000&v=beta&t=OQsuyFE-NRStieVKaWrjVYh9OL9IYUWGn-KFqrYbEV4\",\n expiresAt: 1759968000000,\n height: 200,\n },\n {\n width: 100,\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1631311446380?e=1759968000&v=beta&t=jnIPgQh2pNFZqcdjrYShazVuIbOZFNPBN3SVS0xecUI\",\n expiresAt: 1759968000000,\n height: 100,\n },\n {\n width: 400,\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1631311446380?e=1759968000&v=beta&t=NAS5sOIzzhGP7yJjQHJJvYLGw6ijJVQK9KucOyajADg\",\n expiresAt: 1759968000000,\n height: 400,\n },\n ],\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQHiNSL4Or29cg/company-logo_\",\n },\n },\n },\n pysmAvailable: false,\n claimable: false,\n specialities: [\n \"search\",\n \"ads\",\n \"mobile\",\n \"android\",\n \"online video\",\n \"apps\",\n \"machine learning\",\n \"virtual reality\",\n \"cloud\",\n \"hardware\",\n \"artificial intelligence\",\n \"youtube\",\n \"software\",\n ],\n confirmedLocations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"Mountain View\",\n headquarter: true,\n postalCode: \"94043\",\n line1: \"1600 Amphitheatre Parkway\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"NY\",\n city: \"New York\",\n headquarter: false,\n postalCode: \"10011\",\n line1: \"111 8th Ave\",\n },\n {\n streetAddressOptOut: false,\n country: \"NL\",\n geographicArea: \"North Holland\",\n city: \"Amsterdam\",\n headquarter: false,\n postalCode: \"1082 MD\",\n line1: \"Claude Debussylaan 34\",\n },\n {\n streetAddressOptOut: false,\n country: \"BR\",\n geographicArea: \"SP\",\n city: \"Sao Paulo\",\n headquarter: false,\n postalCode: \"04538-133\",\n line1: \"Avenida Brigadeiro Faria Lima, 3477\",\n },\n {\n streetAddressOptOut: false,\n country: \"CA\",\n geographicArea: \"ON\",\n city: \"Kitchener\",\n headquarter: false,\n postalCode: \"N2H 5G5\",\n line1: \"51 Breithaupt St\",\n },\n {\n streetAddressOptOut: false,\n country: \"IE\",\n geographicArea: \"County Dublin\",\n city: \"Dublin\",\n headquarter: false,\n line1: \"Barrow Street\",\n },\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"Karnataka\",\n city: \"Bengaluru\",\n headquarter: false,\n postalCode: \"560016\",\n line1: \"Old Madras Road\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CO\",\n city: \"Boulder\",\n headquarter: false,\n postalCode: \"80302\",\n line1: \"2590 Pearl St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"WA\",\n city: \"Seattle\",\n headquarter: false,\n postalCode: \"98103\",\n line1: \"601 N 34th St\",\n },\n {\n streetAddressOptOut: false,\n country: \"AU\",\n geographicArea: \"NSW\",\n city: \"Sydney\",\n headquarter: false,\n postalCode: \"2009\",\n line1: \"48 Pirrama Rd\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"Irvine\",\n headquarter: false,\n postalCode: \"92612\",\n line1: \"19510 Jamboree Rd\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"IL\",\n city: \"Chicago\",\n headquarter: false,\n postalCode: \"60607\",\n line1: \"320 N Morgan St\",\n },\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"Maharashtra\",\n city: \"Mumbai\",\n headquarter: false,\n postalCode: \"400051\",\n line1: \"3 Bandra Kurla Complex Road\",\n },\n {\n streetAddressOptOut: false,\n country: \"PH\",\n geographicArea: \"National Capital Region\",\n city: \"Taguig City\",\n headquarter: false,\n line1: \"5th Ave\",\n },\n {\n streetAddressOptOut: false,\n country: \"SG\",\n geographicArea: \"Singapore\",\n city: \"Singapore\",\n headquarter: false,\n postalCode: \"118484\",\n line1: \"3 Pasir Panjang Rd\",\n },\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"TS\",\n city: \"Hyderabad\",\n headquarter: false,\n postalCode: \"500084\",\n line1: \"13\",\n },\n {\n streetAddressOptOut: false,\n country: \"AU\",\n geographicArea: \"VIC\",\n city: \"Melbourne\",\n headquarter: false,\n postalCode: \"3000\",\n line1: \"90 Collins St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"San Bruno\",\n headquarter: false,\n postalCode: \"94066\",\n line1: \"901 Cherry Ave\",\n },\n {\n streetAddressOptOut: false,\n country: \"ES\",\n geographicArea: \"Community of Madrid\",\n city: \"Madrid\",\n headquarter: false,\n postalCode: \"28046\",\n line1: \"Plaza Pablo Ruiz Picasso\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"DC\",\n city: \"Washington\",\n headquarter: false,\n postalCode: \"20001\",\n line1: \"25 Massachusetts Ave NW\",\n },\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"HR\",\n city: \"Gurugram\",\n headquarter: false,\n postalCode: \"122001\",\n line1: \"15\",\n },\n {\n streetAddressOptOut: false,\n country: \"CO\",\n geographicArea: \"Bogota, D.C.\",\n city: \"Bogota\",\n headquarter: false,\n postalCode: \"110221\",\n line1: \"Carrera 11A 94-45\",\n },\n {\n streetAddressOptOut: false,\n country: \"HK\",\n geographicArea: \"Hong Kong\",\n city: \"Wan Chai\",\n headquarter: false,\n line1: \"2 Matheson St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"VA\",\n city: \"Reston\",\n headquarter: false,\n postalCode: \"20190\",\n line1: \"1875 Explorer St\",\n },\n {\n streetAddressOptOut: false,\n country: \"CA\",\n geographicArea: \"ON\",\n city: \"Toronto\",\n headquarter: false,\n postalCode: \"M5H 2G4\",\n line1: \"111 Richmond St W\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"San Francisco\",\n headquarter: false,\n postalCode: \"94105\",\n line1: \"345 Spear St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"MA\",\n city: \"Cambridge\",\n headquarter: false,\n postalCode: \"02142\",\n line1: \"355 Main St\",\n },\n {\n streetAddressOptOut: false,\n country: \"IT\",\n geographicArea: \"Lomb.\",\n city: \"Milan\",\n headquarter: false,\n postalCode: \"20124\",\n line1: \"Via Federico Confalonieri, 4\",\n },\n {\n streetAddressOptOut: false,\n country: \"GB\",\n geographicArea: \"England\",\n city: \"London\",\n headquarter: false,\n postalCode: \"WC2H 8AG\",\n line1: \"St Giles High Street\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"TX\",\n city: \"Austin\",\n headquarter: false,\n postalCode: \"78759\",\n line1: \"9606 N Mopac Expy\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"Los Angeles\",\n headquarter: false,\n postalCode: \"90291\",\n line1: \"340 Main St\",\n },\n {\n streetAddressOptOut: false,\n country: \"ES\",\n geographicArea: \"Community of Madrid\",\n city: \"Madrid\",\n headquarter: false,\n postalCode: \"28020\",\n line1: \"Plaza Pablo Ruiz Picasso\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"MI\",\n city: \"Ann Arbor\",\n headquarter: false,\n postalCode: \"48105\",\n line1: \"2300 Traverwood Dr\",\n },\n {\n streetAddressOptOut: false,\n country: \"CL\",\n geographicArea: \"Santiago Metropolitan\",\n city: \"Las Condes\",\n headquarter: false,\n postalCode: \"7550000\",\n line1: \"Avenida Costanera Sur\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"GA\",\n city: \"Atlanta\",\n headquarter: false,\n postalCode: \"30309\",\n line1: \"10 10th St NE\",\n },\n {\n streetAddressOptOut: false,\n country: \"PL\",\n geographicArea: \"MA\",\n city: \"Warsaw\",\n headquarter: false,\n postalCode: \"00-125\",\n line1: \"ulica Emilii Plater 53\",\n },\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"Karnataka\",\n city: \"Bengaluru\",\n headquarter: false,\n postalCode: \"560016\",\n line1: \"3 Swamy Vivekananda Road\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"WA\",\n city: \"Kirkland\",\n headquarter: false,\n postalCode: \"98033\",\n line1: \"777 6th St S\",\n },\n {\n streetAddressOptOut: false,\n country: \"DE\",\n geographicArea: \"BY\",\n city: \"Munich\",\n headquarter: false,\n postalCode: \"80636\",\n line1: \"Erika-Mann-Strasse 33\",\n },\n {\n streetAddressOptOut: false,\n country: \"MX\",\n geographicArea: \"CDMX\",\n city: \"Miguel Hidalgo\",\n headquarter: false,\n postalCode: \"11000\",\n line1: \"Montes Urales\",\n },\n {\n streetAddressOptOut: false,\n country: \"AR\",\n geographicArea: \"Buenos Aires Autonomous City\",\n city: \"Buenos Aires City\",\n headquarter: false,\n postalCode: \"1107\",\n line1: \"Avenida Alicia Moreau de Justo 350\",\n },\n {\n streetAddressOptOut: false,\n country: \"FR\",\n geographicArea: \"IdF\",\n city: \"Paris\",\n headquarter: false,\n postalCode: \"75009\",\n line1: \"8 Rue de Londres\",\n },\n {\n streetAddressOptOut: false,\n country: \"IL\",\n geographicArea: \"Tel Aviv\",\n city: \"Tel Aviv-Yafo\",\n headquarter: false,\n postalCode: \"67891\",\n line1: \"Yigal Allon 98\",\n },\n {\n streetAddressOptOut: false,\n country: \"DE\",\n geographicArea: \"BE\",\n city: \"Berlin\",\n headquarter: false,\n postalCode: \"10117\",\n line1: \"Unter den Linden 14\",\n },\n {\n streetAddressOptOut: false,\n country: \"DE\",\n geographicArea: \"HH\",\n city: \"Hamburg\",\n headquarter: false,\n postalCode: \"20354\",\n line1: \"ABC-Strasse 19\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"TX\",\n city: \"Frisco\",\n headquarter: false,\n postalCode: \"75034\",\n line1: \"6175 Main St\",\n },\n {\n streetAddressOptOut: false,\n country: \"CH\",\n geographicArea: \"ZH\",\n city: \"Zurich\",\n headquarter: false,\n postalCode: \"8002\",\n line1: \"Brandschenkestrasse 110\",\n },\n {\n streetAddressOptOut: false,\n country: \"SE\",\n geographicArea: \"Stockholm County\",\n city: \"Stockholm\",\n headquarter: false,\n postalCode: \"111 22\",\n line1: \"Kungsbron 2\",\n },\n ],\n croppedBackgroundCoverImageUrn:\n \"urn:li:digitalmediaAsset:D4E3DAQEqjNAQpi0pRA\",\n eligibleForOnlineJobPostingEntry: true,\n followingInfo: {\n entityUrn: \"urn:li:fs_followingInfo:urn:li:company:1441\",\n dashFollowingStateUrn: \"urn:li:fsd_followingState:urn:li:fsd_company:1441\",\n following: true,\n followingType: \"FOLLOWING\",\n followerCount: 38746067,\n },\n backgroundCoverPhoto: {\n \"com.linkedin.common.VectorImage\": {\n artifacts: [\n {\n width: 750,\n fileIdentifyingUrlPathSegment:\n \"27_750/B4EZge3rc4HgAU-/0/1752864569790/google_cover?e=1757912400&v=beta&t=Km6J1teSw4bgeISG3VSD86zfgKeMPG1cPh4Ct4wHoyQ\",\n expiresAt: 1757912400000,\n height: 126,\n },\n {\n width: 108,\n fileIdentifyingUrlPathSegment:\n \"08_640/B4EZge3rc4HgAY-/0/1752864569790/google_cover?e=1757912400&v=beta&t=fTzHkW1D8RakE1FAzZl1e5eKa07rlvLJ3j_2Lr3badA\",\n expiresAt: 1757912400000,\n height: 18,\n },\n {\n width: 1128,\n fileIdentifyingUrlPathSegment:\n \"91_1128/B4EZge3rc4HgAk-/0/1752864569790/google_cover?e=1757912400&v=beta&t=8PVYp2G18l7_x7WnvDS8FQn5XXINuqakuTO6YsfFSQs\",\n expiresAt: 1757912400000,\n height: 191,\n },\n ],\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E3DAQEqjNAQpi0pRA/image-scale_1\",\n },\n },\n active: true,\n versionTag: \"4137901683\",\n premiumFeatures: [\"ENHANCED_ANALYTICS\"],\n logoUrn: \"urn:li:digitalmediaAsset:C4D0BAQHiNSL4Or29cg\",\n affiliatedCompaniesWithEmployeesRollup: [\n \"urn:li:fs_normalized_company:17876832\",\n \"urn:li:fs_normalized_company:791962\",\n \"urn:li:fs_normalized_company:2374003\",\n \"urn:li:fs_normalized_company:18950635\",\n \"urn:li:fs_normalized_company:16140\",\n ],\n viewerEmployee: false,\n defaultLocale: {\n country: \"US\",\n language: \"en\",\n },\n lcpTreatment: true,\n websiteOptOut: false,\n affiliatedCompaniesWithJobsRollup: [\n \"urn:li:fs_normalized_company:17876832\",\n \"urn:li:fs_normalized_company:791962\",\n \"urn:li:fs_normalized_company:2374003\",\n \"urn:li:fs_normalized_company:18950635\",\n \"urn:li:fs_normalized_company:16140\",\n \"urn:li:fs_normalized_company:89982912\",\n ],\n trackingInfo: {\n objectUrn: \"urn:li:company:1441\",\n trackingId: \"ZGy+tMpNRN2W27Hf29/Lkg==\",\n },\n firstDegreeConnectionsThatFollow: [\n \"urn:li:fs_normalized_profile:ACoAAC3gupwBIDY9OqgQ3yno39iPGoDVTYzgioU\",\n \"urn:li:fs_normalized_profile:ACoAACQFy2IBuVneu_nJfcm5zV0_Sc5zOSdNzs0\",\n ],\n name: \"Google\",\n organizationLixes: [],\n fundingData: {\n fundingRoundListCrunchbaseUrl:\n \"https://www.crunchbase.com/organization/google/funding_rounds/funding_rounds_list?utm_source=linkedin&utm_medium=referral&utm_campaign=linkedin_companies&utm_content=all_fundings\",\n companyCrunchbaseUrl:\n \"https://www.crunchbase.com/organization/google?utm_source=linkedin&utm_medium=referral&utm_campaign=linkedin_companies&utm_content=profile_cta\",\n lastFundingRound: {\n investorsCrunchbaseUrl:\n \"https://www.crunchbase.com/funding_round/google-series-unknown--6c4715f9?utm_source=linkedin&utm_medium=referral&utm_campaign=linkedin_companies&utm_content=all_investors\",\n leadInvestors: [\n {\n name: {\n text: \"Kleiner Perkins\",\n },\n investorCrunchbaseUrl:\n \"https://www.crunchbase.com/organization/kleiner-perkins-caufield-byers?utm_source=linkedin&utm_medium=referral&utm_campaign=linkedin_companies&utm_content=investor\",\n image: {\n attributes: [\n {\n sourceType: \"URL\",\n imageUrl:\n \"https://media.licdn.com/dms/image/sync/v2/D4D38AQFcDueDDWFLRw/crunchbase_investor_logo_100/crunchbase_investor_logo_100/0/1750357484072?e=1757912400&v=beta&t=Uor-oRiYbLmi8O_iV92msNOQpnNVvdNfHlENQ9spMag\",\n },\n ],\n },\n },\n {\n name: {\n text: \"Sequoia Capital\",\n },\n investorCrunchbaseUrl:\n \"https://www.crunchbase.com/organization/sequoia-capital?utm_source=linkedin&utm_medium=referral&utm_campaign=linkedin_companies&utm_content=investor\",\n image: {\n attributes: [\n {\n sourceType: \"URL\",\n imageUrl:\n \"https://media.licdn.com/dms/image/sync/v2/D4D38AQFTbW9ThA5fOw/crunchbase_investor_logo_100/crunchbase_investor_logo_100/0/1750357477963?e=1757912400&v=beta&t=RqSgOSPZby6Y_R_F-KPhK9jEv6NeWD0WqK50yi9ZyK8\",\n },\n ],\n },\n },\n ],\n fundingRoundCrunchbaseUrl:\n \"https://www.crunchbase.com/funding_round/google-series-unknown--6c4715f9?utm_source=linkedin&utm_medium=referral&utm_campaign=linkedin_companies&utm_content=last_funding\",\n fundingType: \"SERIES_UNKNOWN\",\n moneyRaised: {\n currencyCode: \"USD\",\n amount: \"25000000\",\n },\n numOtherInvestors: 0,\n announcedOn: {\n month: 6,\n day: 7,\n year: 1999,\n },\n },\n numFundingRounds: 3,\n updatedAt: 1754885702,\n },\n multiLocaleNames: {\n localized: {\n zh_TW: \"谷歌\",\n ko_KR: \"Google\",\n en_US: \"Google\",\n zh_CN: \"谷歌\",\n },\n preferredLocale: {\n country: \"US\",\n language: \"en\",\n },\n },\n overviewPhoto: {\n \"com.linkedin.voyager.common.MediaProcessorImage\": {\n id: \"/AAEAAQAAAAAAAAl6AAAAJDAwMDBlMTIwLTQ1ODEtNDcyNC04NjlhLWViZjZlMTlmOWVkZA.png\",\n },\n },\n viewerCurrentEmployee: false,\n backgroundCoverImageCropInfo: {\n x: 0,\n width: 1128,\n y: 0,\n height: 191,\n },\n dashEntityUrn: \"urn:li:fsd_company:1441\",\n campaignManagerUrl:\n \"https://www.linkedin.com/ad/accounts?entity=company%3A1441&trk=biz_scin_sponsor_now\",\n employeeExperienceSettings: {\n myCompanyVisibility: true,\n pymkVisibility: \"ALL_EMPLOYEES\",\n myCompanyEmployeeVerificationRequired: false,\n broadcastsVisibility: \"ALL_EMPLOYEES\",\n highlightsVisibility: \"ALL_EMPLOYEES\",\n trendingContentVisibility: \"ALL_EMPLOYEES\",\n },\n description:\n \"A problem isn't truly solved until it's solved for all. Googlers build products that help create opportunities for everyone, whether down the street or across the globe. Bring your insight, imagination and a healthy disregard for the impossible. Bring everything that makes you unique. Together, we can build for everyone.\\n\\nCheck out our career opportunities at goo.gle/3DLEokh\",\n emailDomainsAssociated: false,\n archived: false,\n entityUrn: \"urn:li:fs_normalized_company:1441\",\n headquarter: {\n country: \"US\",\n geographicArea: \"CA\",\n city: \"Mountain View\",\n postalCode: \"94043\",\n line1: \"1600 Amphitheatre Parkway\",\n },\n careerPageQuota: 2147483647,\n originalBackgroundCoverImageUrn:\n \"urn:li:digitalmediaAsset:D4E1BAQGppW6ZLvm9Jg\",\n paidCompany: true,\n universalName: \"google\",\n viewerPendingAdministrator: false,\n publishedProductsOwner: false,\n companyPageUrl: \"https://goo.gle/3DLEokh\",\n viewerConnectedToAdministrator: false,\n affiliatedCompanies: [\n \"urn:li:fs_normalized_company:17876832\",\n \"urn:li:fs_normalized_company:791962\",\n \"urn:li:fs_normalized_company:2374003\",\n \"urn:li:fs_normalized_company:18950635\",\n \"urn:li:fs_normalized_company:16140\",\n \"urn:li:fs_normalized_company:89982912\",\n ],\n companyType: {\n localizedName: \"Public Company\",\n code: \"PUBLIC_COMPANY\",\n },\n dataVersion: -1,\n associatedHashtags: [\"urn:li:fs_contentTopicData:urn:li:hashtag:google\"],\n coverPhoto: {\n \"com.linkedin.voyager.common.MediaProcessorImage\": {\n id: \"/AAEAAQAAAAAAAAl6AAAAJDAwMDBlMTIwLTQ1ODEtNDcyNC04NjlhLWViZjZlMTlmOWVkZA.png\",\n },\n },\n groups: [],\n eventsTabVisible: true,\n productsOwner: true,\n url: \"https://www.linkedin.com/company/google\",\n recentNewsAvailable: false,\n showcasePages: [\n \"urn:li:fs_normalized_company:102720926\",\n \"urn:li:fs_normalized_company:66341749\",\n \"urn:li:fs_normalized_company:103755306\",\n \"urn:li:fs_normalized_company:5392727\",\n \"urn:li:fs_normalized_company:10337946\",\n \"urn:li:fs_normalized_company:10476436\",\n \"urn:li:fs_normalized_company:12997578\",\n \"urn:li:fs_normalized_company:3611194\",\n \"urn:li:fs_normalized_company:2868133\",\n \"urn:li:fs_normalized_company:29015212\",\n \"urn:li:fs_normalized_company:18321920\",\n \"urn:li:fs_normalized_company:106703041\",\n \"urn:li:fs_normalized_company:11094280\",\n \"urn:li:fs_normalized_company:24866\",\n \"urn:li:fs_normalized_company:27109944\",\n \"urn:li:fs_normalized_company:3668753\",\n \"urn:li:fs_normalized_company:77163696\",\n \"urn:li:fs_normalized_company:105576160\",\n \"urn:li:fs_normalized_company:3648281\",\n \"urn:li:fs_normalized_company:33198155\",\n \"urn:li:fs_normalized_company:7959499\",\n \"urn:li:fs_normalized_company:12895996\",\n \"urn:li:fs_normalized_company:74357847\",\n \"urn:li:fs_normalized_company:10124320\",\n \"urn:li:fs_normalized_company:18925599\",\n \"urn:li:fs_normalized_company:15859534\",\n \"urn:li:fs_normalized_company:105292422\",\n \"urn:li:fs_normalized_company:107776681\",\n \"urn:li:fs_normalized_company:82540973\",\n \"urn:li:fs_normalized_company:6644131\",\n \"urn:li:fs_normalized_company:92586569\",\n \"urn:li:fs_normalized_company:18557142\",\n \"urn:li:fs_normalized_company:6599465\",\n \"urn:li:fs_normalized_company:82286774\",\n \"urn:li:fs_normalized_company:66345263\",\n \"urn:li:fs_normalized_company:96908570\",\n \"urn:li:fs_normalized_company:29116768\",\n \"urn:li:fs_normalized_company:18221770\",\n \"urn:li:fs_normalized_company:25014428\",\n \"urn:li:fs_normalized_company:11321165\",\n \"urn:li:fs_normalized_company:107516683\",\n \"urn:li:fs_normalized_company:102840132\",\n \"urn:li:fs_normalized_company:106770356\",\n \"urn:li:fs_normalized_company:71625768\",\n \"urn:li:fs_normalized_company:11830105\",\n \"urn:li:fs_normalized_company:8629486\",\n \"urn:li:fs_normalized_company:107571353\",\n \"urn:li:fs_normalized_company:105044144\",\n \"urn:li:fs_normalized_company:82288532\",\n \"urn:li:fs_normalized_company:68591333\",\n \"urn:li:fs_normalized_company:82288531\",\n \"urn:li:fs_normalized_company:25013385\",\n \"urn:li:fs_normalized_company:18950740\",\n \"urn:li:fs_normalized_company:99371798\",\n \"urn:li:fs_normalized_company:6644127\",\n \"urn:li:fs_normalized_company:9416052\",\n \"urn:li:fs_normalized_company:6625054\",\n \"urn:li:fs_normalized_company:101031931\",\n \"urn:li:fs_normalized_company:68699878\",\n \"urn:li:fs_normalized_company:68684775\",\n \"urn:li:fs_normalized_company:27115234\",\n ],\n viewerQualifiedForJobReferral: false,\n claimableByViewer: false,\n stockQuotes: [\"urn:li:fs_organizationStockQuote:(1441,GOOGL)\"],\n industries: [\"Software Development\"],\n jobSearchPageUrl:\n \"https://www.linkedin.com/jobs/search?geoId=92000000&f_C=1441%2C17876832%2C791962%2C2374003%2C18950635%2C16140%2C89982912\",\n showcase: false,\n autoGenerated: false,\n backgroundCoverImage: {\n image: {\n \"com.linkedin.common.VectorImage\": {\n artifacts: [\n {\n width: 750,\n fileIdentifyingUrlPathSegment:\n \"27_750/B4EZge3rc4HgAU-/0/1752864569790/google_cover?e=1757912400&v=beta&t=Km6J1teSw4bgeISG3VSD86zfgKeMPG1cPh4Ct4wHoyQ\",\n expiresAt: 1757912400000,\n height: 126,\n },\n {\n width: 108,\n fileIdentifyingUrlPathSegment:\n \"08_640/B4EZge3rc4HgAY-/0/1752864569790/google_cover?e=1757912400&v=beta&t=fTzHkW1D8RakE1FAzZl1e5eKa07rlvLJ3j_2Lr3badA\",\n expiresAt: 1757912400000,\n height: 18,\n },\n {\n width: 1128,\n fileIdentifyingUrlPathSegment:\n \"91_1128/B4EZge3rc4HgAk-/0/1752864569790/google_cover?e=1757912400&v=beta&t=8PVYp2G18l7_x7WnvDS8FQn5XXINuqakuTO6YsfFSQs\",\n expiresAt: 1757912400000,\n height: 191,\n },\n ],\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E3DAQEqjNAQpi0pRA/image-scale_1\",\n },\n },\n cropInfo: {\n x: 0,\n width: 1128,\n y: 0,\n height: 191,\n },\n },\n};\n\n/**\n * \n * @param params { universalName: string; urn?: never } | { universalName?: never; urn: string } | string\n * @param {\n csrfToken: string;\n cookies: Record<string, string> | string;\n }\n * @returns typeof linkedinCompanyExample | null\n */\nexport async function getLinkedinCompany(\n params:\n | { universalName: string; urn?: never }\n | { universalName?: never; urn: string }\n | string,\n {\n csrfToken,\n cookies,\n }: {\n csrfToken: string;\n cookies?: Record<string, string> | string;\n }\n): Promise<typeof linkedinCompanyExample | null> {\n let suffix = \"\";\n const queryParams =\n typeof params === \"string\" ? { universalName: params } : params;\n const isUniversalName = \"universalName\" in queryParams;\n if (isUniversalName) {\n suffix = `?q=universalName&universalName=${queryParams.universalName}`;\n } else {\n suffix = `/${queryParams.urn}`;\n }\n\n const url = `${LinkedinApiUrl}/organization/companies${suffix}`;\n\n const headers = createLinkedinHeaders(csrfToken, cookies);\n return fetch(url, {\n method: \"GET\",\n headers,\n })\n .then(async (response) => {\n if (response.ok) {\n const data = await response.json();\n if (isUniversalName) {\n return data.elements?.[0] || null;\n } else {\n return data;\n }\n }\n return null;\n })\n .catch((error) => {\n console.error(error);\n return null;\n });\n}\n","const selectors = {\n profilePage: {\n userPicture: [\n \".pv-top-card__non-self-photo-wrapper img\",\n \"#recent-activity-top-card img\",\n \".pv-top-card__photo-wrapper img\",\n 'div[componentkey^=\"com.linkedin.sdui.profile.card\"] div[data-view-name=\"profile-top-card-member-photo\"] img',\n ],\n userName: [\n 'a[href^=\"/in\"] h1',\n \"#recent-activity-top-card h3\",\n 'div[data-view-name=\"profile-top-card-verified-badge\"] div[role=\"button\"]',\n ],\n userOccupation: [\n \".artdeco-entity-lockup .artdeco-entity-lockup__subtitle\",\n \"#recent-activity-top-card h4\",\n ],\n // lemlistProfileCardLeadName: [\".lemlist-profile-card .lead-name\"],\n linkedinProfileCard: [\n \".scaffold-layout__main .artdeco-card:first-child\",\n // \"main .artdeco-card:first-child:not(.lemlist-header)\",\n 'div[componentkey^=\"com.linkedin.sdui.profile.card\"]',\n ],\n // lemlistProfileCard: [\".lemlist-profile-card\"],\n // alreadyInLemlistTag: [\".lemlist-profile-card .already-in-lemlist\"],\n // notInLemlistTag: [\".lemlist-profile-card .not-in-lemlist\"],\n // findEmailTag: [\".lemlist-profile-card .find-email\"],\n // findPhoneTag: [\".lemlist-profile-card .find-phone\"],\n // lemlistEmailFound: [\".lemlist-profile-card .lemlist-email-found\"],\n privateProfileInfoSection: [\".pv-profile-info-section\"],\n howToContainer: [\"#profile-content, header#global-nav\"],\n companyName: [\n \".top-card-background-hero-image+div .mt2 ul>li span\",\n 'div[componentkey^=\"com.linkedin.sdui.profile.card\"] div:has(div[data-view-name=\"profile-top-card-verified-badge\"]) + div div[role=\"button\"] p',\n ],\n companyLogo: [\".top-card-background-hero-image+div .mt2 ul>li img\"],\n // howToTippyContainer: [\"#lemlist-sidebar .sidebar\"],\n // lemlistListContainer: [\".ui-row.lemlist-list-container\"],\n campaignsListContainer: [\".ui-row.sm.campaigns-list-container\"],\n contactListContainer: [\".ui-row.sm.contact-list-container\"],\n // addButtonText: [\".lemlist-add-button-text\"],\n location: [\n \"#profile-content .artdeco-card .top-card-background-hero-image+div .text-body-small.inline.t-black--light\",\n ],\n campaignsListContainerDisplay: [\n \".ui-col.sm.campaigns-list-container-display\",\n ],\n contactListContainerDisplay: [\".ui-col.sm.contact-list-container-display\"],\n // notInLemlistButton: [\n // \".lemlist-profile-card .action-primary.not-in-lemlist\",\n // ],\n // alreadyInLemlistButton: [\n // \".lemlist-profile-card .action-primary.already-in-lemlist\",\n // ],\n mainExperienceContainer: [\n \".artdeco-card:has(#experience) li:first-child\",\n 'div[componentkey^=\"com.linkedin.sdui.profile.card\"][componentkey$=\"ExperienceTopLevelSection\"] div:has(h2) + div > div',\n ],\n experienceCompanyLogo: [\n '[data-field=\"experience_company_logo\"] img',\n 'div[componentkey^=\"com.linkedin.sdui.profile.card\"][componentkey$=\"ExperienceTopLevelSection\"] div:has(h2) + div figure[data-view-name=\"image\"] img',\n ],\n experienceCompanyName: [\n 'div:has([data-field=\"experience_company_logo\"])+div .t-normal span:not(.visually-hidden)',\n ],\n experienceOccupation: [\n 'div:has([data-field=\"experience_company_logo\"])+div .t-bold span:not(.visually-hidden)',\n ],\n experienceMultipleCompany: [\n \"li:has([data-view-name=profile-component-entity] .pvs-entity__sub-components .pvs-entity__sub-components) .t-bold span:not(.visually-hidden)\",\n ],\n experienceMultipleOccupation: [\n '[data-view-name=\"profile-component-entity\"] li:first-child .t-bold span:not(.visually-hidden)',\n ],\n // memberId: [\"[data-member-id]\"],\n // lemlistHowToOverlay: [\".lemlist-how-to-overlay\"],\n },\n // salesNavListsPeoplePage: {\n // fullName: ['[data-anonymize=\"person-name\"]'],\n // userOccupation: ['[data-anonymize=\"job-title\"]'],\n // companyName: ['[data-anonymize=\"company-name\"]'],\n // userPicture: ['img[data-anonymize=\"headshot-photo\"]'],\n // linkedinUrl: ['a[href^=\"/sales/lead/\"]'],\n // // lemlistAlreadyInCampaign: [\".lemlist-already-in-campaign\"],\n // lastCell: [\"td:last-child\"],\n // lastHeader: [\"th:last-child\"],\n // linkedinCheckbox: ['.artdeco-list__item input[type=\"checkbox\"]'],\n // linkedinCheckbox2: ['[data-scroll-into-view] input[type=\"checkbox\"]'],\n // linkedinCheckbox3: ['table input[type=\"checkbox\"]'],\n // linkedinCheckbox3Checked: ['table input[type=\"checkbox\"]'],\n // linkedinCheckboxSelectAll: ['input[id=\"bulk-actions-select\"]'],\n // bulkToolbar: ['.list-detail div:has(input[type=\"checkbox\"])'],\n // mainContainer: [\"#content-main\"],\n // // lemlistTableHeader: [\"th.lemlist-already-in-campaign\"],\n // profileSideContainer: [\"#inline-sidesheet-outlet\"],\n // checkboxContainer: [\"tr\"],\n // },\n salesNavProfilePage: {\n profileCardSection: [\"#profile-card-section\"],\n userName: ['#profile-card-section [data-anonymize=\"person-name\"]'],\n userPicture: ['#profile-card-section img[data-anonymize=\"headshot-photo\"]'],\n userOccupation: ['#profile-card-section [data-anonymize=\"headline\"]'],\n profileUrl: ['#profile-card-section a[href^=\"/sales/lead\"]'],\n linkedinProfileCard: [\"#profile-card-section\"],\n // lemlistProfileCard: [\".lemlist-profile-card\"],\n // findEmailTag: [\".lemlist-profile-card .find-email\"],\n // findPhoneTag: [\".lemlist-profile-card .find-phone\"],\n // lemlistEmailFound: [\".lemlist-profile-card .lemlist-email-found\"],\n // alreadyInLemlistTag: [\".lemlist-profile-card .already-in-lemlist\"],\n // notInLemlistTag: [\".lemlist-profile-card .not-in-lemlist\"],\n // lemlistListContainer: [\".ui-row.lemlist-list-container\"],\n campaignsListContainer: [\".ui-row.sm.campaigns-list-container\"],\n contactListContainer: [\".ui-row.sm.contact-list-container\"],\n // addButtonText: [\".lemlist-add-button-text\"],\n campaignsListContainerDisplay: [\n \".ui-col.sm.campaigns-list-container-display\",\n ],\n contactListContainerDisplay: [\".ui-col.sm.contact-list-container-display\"],\n // notInLemlistButton: [\n // \".lemlist-profile-card .action-primary.not-in-lemlist\",\n // ],\n // alreadyInLemlistButton: [\n // \".lemlist-profile-card .action-primary.already-in-lemlist\",\n // ],\n location: [\"#profile-card-section>section>div>div:last-child div:has(svg)\"],\n companyName: ['#profile-card-section a[data-anonymize=\"company-name\"]'],\n companyLogo: ['#profile-card-section img[data-anonymize=\"company-logo\"]'],\n moreInfoButton: [\n \"#profile-card-section section[data-x--lead-actions-bar] button[data-x--lead-actions-bar-overflow-menu]\",\n '#profile-card-section button[aria-label=\"Open actions overflow menu\"]',\n ],\n linkedinProfileLinkButton: [\n '#hue-web-menu-outlet a[href^=\"https://www.linkedin.com/in/\"]',\n ],\n mainExperienceContainer: ['[data-sn-view-name=\"feature-lead-experience\"]'],\n experienceCompanyLogo: [\n 'li:first-child img[data-anonymize=\"company-logo\"]',\n ],\n experienceCompanyName: ['li:first-child [data-anonymize=\"company-name\"]'],\n experienceOccupation: ['li:first-child [data-anonymize=\"job-title\"]'],\n experienceMultipleOccupation: [\n 'ul li ul li:first-child [data-anonymize=\"job-title\"]',\n 'ul li [data-anonymize=\"job-title\"]',\n ],\n experienceMultipleCompany: [\n 'li:first-child [data-anonymize=\"company-name\"]',\n ],\n },\n // salesNavSearchPeoplePage: {\n // linkedinUrl: ['a[href^=\"/sales/lead/\"]'],\n // fullName: ['[data-anonymize=\"person-name\"]'],\n // userOccupation: ['[data-anonymize=\"title\"]'],\n // companyName: ['a[data-anonymize=\"company-name\"]'],\n // userPicture: ['img[data-anonymize=\"headshot-photo\"]'],\n // actionsDiv: [\"ul:has(li [data-anchor-send-message])\"],\n // linkedinCheckbox: ['.artdeco-list__item input[type=\"checkbox\"]'],\n // linkedinCheckboxChecked: [\n // '.artdeco-list__item input[type=\"checkbox\"]:checked',\n // ],\n // linkedinCheckbox2: ['[data-scroll-into-view] input[type=\"checkbox\"]'],\n // linkedinCheckboxSelectAll: [\n // 'input[id^=\"multi-selector-checkbox-ember\"]',\n // 'li input#bulk-actions-select[type=\"checkbox\"]',\n // ],\n // // lemlistAlreadyInCampaignTagContainer: [\n // // \".artdeco-list__item ul:has(li [data-anchor-send-message])\",\n // // ],\n // // lemlistHeaderContainer: [\"div:has(+ #search-results-container)\"],\n // entityLockup: [\".artdeco-entity-lockup\"],\n // listItem: [\".artdeco-list__item\"],\n // checkbox: ['input[type=\"checkbox\"]'],\n // listItemArticle: [\".artdeco-list__item article\"],\n // dataScrollIntoView: [\"[data-scroll-into-view]\"],\n // leadSearchResults: ['[data-sn-view-name=\"module-lead-search-results\"]'],\n // completeCheckboxes: [\n // '[data-scroll-into-view]:has(+:not(:is(article))) input[type=\"checkbox\"]',\n // ],\n // incompleteCheckboxes: [\n // '[data-scroll-into-view]:has(+article) input[type=\"checkbox\"]',\n // ],\n // profileSideContainer: [\"#inline-sidesheet-outlet\"],\n // // linkedinSearchPageContainer: [\n // // \".lemlist-header + #search-results-container\",\n // // ],\n // howToContainer: [\"header.application-header\"],\n // // howToScrollToElement: [\".lemlist-header\"],\n // // selectAllCheckbox: [\".lemlist-checkbox-all\"],\n // // selectAllCheckboxLabel: [\"span.lemlist-select-all-text\"],\n // // selectCheckboxChecked: [\n // // \".lemlist-checkbox:not(.lemlist-checkbox-all).checked\",\n // // ],\n // },\n searchPeoplePage: {\n searchEntityResult: [\n '[data-view-name=\"search-entity-result-universal-template\"]',\n ],\n linkedinUrl: [\n 'a[data-test-app-aware-link][href^=\"https://www.linkedin.com/in/\"]',\n 'a[data-view-name=\"search-result-lockup-title\"]',\n ],\n image: [\".presence-entity img\", \"a>div>div>figure>img\"],\n userOccupation: [\n 'p:has(a[data-view-name=\"search-result-lockup-title\"]) + p',\n \".entity-result__primary-subtitle\",\n \".entity-result__divider > div div:nth-child(2)\",\n \"div>div>div:nth-child(2)>div>div:nth-child(2)\",\n \"figure + div p:nth-child(2)\",\n ],\n fullName: [\n \".entity-result__title-text a span>span\",\n \".entity-result__title-line a span>span\",\n \".entity-result__title-line span>a>span>span\",\n \"a:has(+.entity-result__badge)>span>span\",\n \".linked-area div:nth-child(2) > div:first-child > div.t-roman.t-sans a\",\n 'a[data-view-name=\"search-result-lockup-title\"]',\n ],\n resultList: [\n \".search-results-container>div:has(.reusable-search__result-container)\",\n ],\n actionsDiv: [\n \".entity-result__actions\",\n \".linked-area > div > div:last-child\",\n \"div:has(figure) > div:last-child\",\n ],\n validResult: [\n \"[data-chameleon-result-urn] , .reusable-search__result-container\",\n ],\n searchResult: [\n \".search-results-container li:has(>[data-chameleon-result-urn])\",\n '[data-view-name=\"people-search-result\"]',\n ],\n searchResultsContainer: [\n \".search-results-container\",\n '[role=\"main\"] div:has(>hr[role=\"presentation\"])',\n ],\n mainLayoutLeft: [\".search-marvel-srp\", '[role=\"main\"] div:has(hr)>div>div'],\n howToContainer: [\n \".hasLegacyFeedLineHeight div:has(main)\",\n \".authentication-outlet\",\n ],\n // howToScrollToElement: [\".lemlist-header\"],\n // selectAllCheckbox: [\".lemlist-checkbox-all\"],\n // selectAllCheckboxLabel: [\"span.lemlist-select-all-text\"],\n // selectCheckboxChecked: [\n // \".lemlist-checkbox:not(.lemlist-checkbox-all).checked\",\n // ],\n },\n searchAllPage: {\n peopleButton: [\"nav ul.search-reusables__filter-list>li>button\"],\n toolbar: [\".scaffold-layout-toolbar\"],\n },\n // linkedinComposerPage: {\n // composerWrapper: [\".msg-convo-wrapper\"],\n // textareaSelector: [\".msg-form__contenteditable\"],\n // footer: [\".msg-form__message-texteditor\"],\n // messagingOverlay: [\"#msg-overlay\"],\n // form: [\".msg-form\"],\n // formContainer: [\"form.msg-form.msg-form--thread-footer-feature\"],\n // composerEvent: [\".msg-s-event-listitem\"],\n // composerEventBody: [\".msg-s-event-listitem__body\"],\n // composerEventName: [\".msg-s-message-group__name\"],\n // composerEventDate: [\".msg-s-message-group__timestamp\"],\n // interOPOutlet: [\"#interop-outlet\"],\n // },\n // gmail: {\n // userEmailElm: [\".gb_A.gb_Xa.gb_Z\"],\n // userEmailElmFallback: [\".gb_Bc .gb_g + div\"],\n // },\n // gmailComposerPage: {\n // gmailComposerForm: [\"form input[name=composeid]\"],\n // gmailComposer: [\"div.M9\"],\n // previousMessagesButton: [\".ajR\"],\n // previousMessages: [\".gmail_quote_container blockquote\"],\n // // lemlistActionBar: [\".gmail-action-bar\"],\n // // lemlistActionBarAskAIElements: [\".gmail-ask-ai-elements\"],\n // // lemlistActionBarTemplatesButton: [\".gmail-action-bar .templates\"],\n // previousEmail: ['form > input[name=\"rm\"]'],\n // body: [\".editable.LW-avf\"],\n // },\n // gmailSidebarPage: {\n // appIconsContainer: ['div[role=\"tablist\"]'],\n // appIconsActiveIcon: [\n // \"div[role=tablist] div[data-guest-app-id].aT5-aOt-I-KO .aT5-aOt-I-JX-Jw\",\n // ],\n // appIcons: ['div[role=\"tablist\"] div[data-guest-app-id]'],\n // },\n // gmailEmailPage: {\n // topBarDate: [\".gH.bAk\"],\n // body: [\".a3s.aiL > div[dir]\"],\n // },\n};\n\ntype TPage = keyof typeof selectors;\ntype TKey<T extends TPage> = keyof (typeof selectors)[T];\n\n// 定义两种参数组合的联合类型\ntype PageKeyParams<T extends TPage> = {\n page: T;\n key: TKey<T>;\n selector?: never;\n};\n\ntype SelectorParams = {\n page?: never;\n key?: never;\n selector: string;\n};\n\n// 基础参数类型\ntype BaseParams = {\n container?: Document | HTMLElement;\n mode?: \"all\" | \"closest\";\n // critical?: boolean;\n};\n\n// 最终的参数类型:page+key 或 selector 二选一\ntype GetElementParams<T extends TPage> = BaseParams &\n (PageKeyParams<T> | SelectorParams);\n\n// 根据 mode 推断返回类型\ntype GetElementReturnType<M extends \"all\" | \"closest\" | undefined> =\n M extends \"all\" ? HTMLElement[] | null : HTMLElement | null;\n\n// const IFRAME_SELECTOR = 'iframe[src=\"/preload/\"]';\n\nfunction getSelector<T extends TPage>({\n page,\n key,\n}: {\n page: T;\n key: TKey<T>;\n}): string[] {\n return selectors[page][key] as string[];\n}\n\n// 辅助函数:根据模式查询元素\nfunction queryElement(\n container: Document | HTMLElement,\n selector: string,\n mode?: \"closest\"\n): HTMLElement | null;\nfunction queryElement(\n container: Document | HTMLElement,\n selector: string,\n mode: \"all\"\n): HTMLElement[] | null;\nfunction queryElement(\n container: Document | HTMLElement,\n selector: string,\n mode?: \"all\" | \"closest\"\n): HTMLElement | HTMLElement[] | null {\n switch (mode) {\n case \"all\":\n const allResults = container.querySelectorAll(selector);\n return allResults.length > 0\n ? (Array.from(allResults) as HTMLElement[])\n : null;\n\n case \"closest\":\n if (container instanceof HTMLElement) {\n return container.closest(selector) as HTMLElement | null;\n }\n return null;\n\n default:\n return container.querySelector(selector) as HTMLElement | null;\n }\n}\n\nexport function getElement<\n T extends TPage,\n M extends \"all\" | \"closest\" | undefined = undefined\n>({\n page,\n key,\n selector,\n container,\n mode,\n}: GetElementParams<T> & { mode?: M }): GetElementReturnType<M> {\n container ??= document;\n\n // 获取选择器数组 - 现在类型安全\n const sels: string[] = page && key ? getSelector({ page, key }) : [selector!];\n\n // 处理 LinkedIn iframe 样式注入\n // let iframeDoc: Document | null = null;\n // if (window.location.host.includes(\"linkedin.com\")) {\n // const iframe = document.querySelector(IFRAME_SELECTOR) as HTMLIFrameElement;\n // iframeDoc = iframe?.contentDocument || null;\n\n // if (iframeDoc && !iframeDoc.querySelector(\"style.lemlist-style\")) {\n // (async (doc: Document) => {\n // const cssFiles = [\"src/linkedin.css\", \"src/ui.css\"];\n // for (const file of cssFiles) {\n // try {\n // const url = chrome.runtime.getURL(file);\n // const cssText = await fetch(url).then(res => res.text());\n // const style = document.createElement(\"style\");\n // style.classList.add(\"lemlist-style\");\n // style.textContent = cssText;\n // doc.head.appendChild(style);\n // } catch (error) {\n // console.warn(`Failed to load CSS file: ${file}`, error);\n // }\n // }\n // })(iframeDoc);\n // }\n // }\n\n // 遍历选择器查找元素\n for (const sel of sels) {\n const result = queryElement(container, sel, mode as any);\n if (result) return result as GetElementReturnType<M>;\n\n // 如果在 iframe 中查找\n // if (iframeDoc) {\n // const iframeResult = queryElement(iframeDoc, sel, mode as any);\n // if (iframeResult) return iframeResult as GetElementReturnType<M>;\n // }\n }\n\n return null as GetElementReturnType<M>;\n}\n\nfunction decodeHtmlEntities(e: string | undefined) {\n if (!e) return \"\";\n const t = document.createElement(\"textarea\");\n t.innerHTML = e;\n return t.value.trim();\n}\n\nfunction getContactPage() {\n return window.location.href.includes(\"linkedin.com/sales\")\n ? \"salesNavProfilePage\"\n : \"profilePage\";\n}\n\n// 还不太准确\nexport function getContactInfo() {\n const page = getContactPage();\n function g(key: TKey<typeof page>) {\n return getElement({ page: page, key: key, container: document });\n }\n const n = g(\"userName\")?.innerText;\n if (!n) return console.error(\"extractUserInfos: no userName found\"), {};\n const a = (g(\"userPicture\") as HTMLImageElement)?.src,\n s = g(\"userOccupation\")?.innerHTML,\n i = g(\"companyName\")?.innerText,\n c = (g(\"companyLogo\") as HTMLImageElement)?.src,\n r = g(\"location\")?.innerText;\n let l;\n return (\n \"salesNavProfilePage\" === page &&\n (l = /linkedin\\.com\\/sales\\/lead/i.test(window.location.href)\n ? window.location.href\n : (g(\"profileUrl\" as any) as HTMLAnchorElement)?.href),\n {\n name: decodeHtmlEntities(n),\n profileUrl: l,\n picture: a,\n occupation: decodeHtmlEntities(s),\n companyName: i,\n companyPicture: c,\n location: r,\n }\n );\n}\n\n// (window as any).getContactInfo = getContactInfo;\n// (window as any).getElement = getElement;\n\n// 类型安全验证示例(这些调用在编译时会被检查)\n// ✅ 正确的用法:\n// getElement({ page: \"searchPeoplePage\", key: \"fullName\" })\n// getElement({ selector: \".some-class\" })\n//\n// ❌ 错误的用法(编译时会报错):\n// getElement({ page: \"searchPeoplePage\" }) // 缺少 key\n// getElement({ key: \"fullName\" }) // 缺少 page\n// getElement({ page: \"searchPeoplePage\", key: \"fullName\", selector: \".class\" }) // 不能同时提供\n// getElement({}) // 必须提供 page+key 或 selector\n","/**\n * Checks if the given URL is a LinkedIn URL.\n * @param url - The URL string to check.\n * @returns true if the URL is a LinkedIn URL, false otherwise.\n */\nexport function isLinkedInUrl(url: string) {\n const regex = /^https?:\\/\\/(www|.{2})\\.linkedin\\.com/;\n return regex.test(url);\n}\n\n/** 表示各种 LinkedIn 页面类型的类型。 */\nexport type PageType =\n | \"profile\"\n | \"feed\"\n | \"post\"\n | \"company\"\n | \"login\"\n | \"messages\"\n | \"search-all\"\n | \"search-people\"\n | \"connections\"\n | \"chrome\"\n | \"chrome-extension\"\n | \"view-source\"\n | \"\";\n/** 将页面类型映射到数值。 */\nexport const pageTypeMap: Record<string, number> = {\n \"\": 0,\n chrome: 1,\n \"chrome-extension\": 2,\n \"view-source\": 3,\n ftp: 4,\n file: 5,\n data: 6,\n blob: 7,\n about: 8,\n};\n/**\n * 根据 URL 确定 LinkedIn 页面的类型。\n * @param url - 要分析的 URL。默认为空字符串。\n * @returns 页面类型字符串。\n */\nexport function getLinkedinPageType(url = \"\") {\n let type: PageType = \"\";\n // 先去除 # 及其后面的内容\n const cleanUrl = url.split(\"#\")[0].toLocaleLowerCase();\n return (\n /^https\\:\\/\\/(www|.{2})\\.linkedin\\.com\\/in\\/[^/?]+(\\/recent-activity\\/|\\/details\\/|\\/overlay\\/|\\/?\\?[^/]*|\\/?$)/.test(\n cleanUrl\n ) ||\n /^https\\:\\/\\/(www|.{2})\\.linkedin\\.com\\/sales\\/people\\/(.+?),/.test(\n cleanUrl\n ) ||\n /^https\\:\\/\\/(www|.{2})\\.linkedin\\.com\\/sales\\/(profile|lead)\\/([^,]{39}),/.test(\n cleanUrl\n )\n ? (type = \"profile\")\n : cleanUrl.includes(\"linkedin.com/feed\")\n ? (type = \"feed\")\n : cleanUrl.includes(\"linkedin.com/posts/\")\n ? (type = \"post\")\n : cleanUrl.includes(\"linkedin.com/login\") ||\n cleanUrl.includes(\"linkedin.com/checkpoint\") ||\n cleanUrl.includes(\"linkedin.com/authwall\")\n ? (type = \"login\")\n : cleanUrl.includes(\"linkedin.com/company/\")\n ? (type = \"company\")\n : cleanUrl.includes(\"linkedin.com/messaging/thread/\")\n ? (type = \"messages\")\n : cleanUrl.includes(\"linkedin.com/search/results/people/?\") ||\n cleanUrl.includes(\"linkedin.com/sales/search/people\")\n ? (type = \"search-people\")\n : cleanUrl.includes(\"linkedin.com/search/results/all\")\n ? (type = \"search-all\")\n : cleanUrl.includes(\"linkedin.com/mynetwork/\") && (type = \"connections\"),\n type\n );\n}\n\n/**\n * 从 LinkedIn 个人资料 URL 中提取公共 ID。\n * @param url - 要从中提取的 URL。默认为当前页面 URL。\n * @returns 公共 ID 字符串,如果未找到则为空字符串。\n */\nexport function getProfilePublicId(url: string = \"\") {\n url = url || window.top?.location.href || document.URL;\n const id =\n (url.match(/linkedin\\.com\\/in\\/([^?/]+)/) || [])[1] ||\n (url.match(/linkedin\\.com\\/sales\\/people\\/(.+?),/) || [])[1] ||\n (url.match(/linkedin\\.com\\/sales\\/(?:profile|lead)\\/([^,]{39}),/) ||\n [])[1] ||\n \"\";\n return decodeURIComponent(id);\n}\n\n/**\n * 从 LinkedIn 帖子 URL 中提取公共 ID。\n * @param url - 要从中提取的 URL。默认为当前页面 URL。\n * @returns 公共 ID 字符串,如果未找到则为空字符串。\n */\nexport function getPostPublicId(url: string = \"\") {\n url = url || window.top?.location.href || document.URL;\n const id = (url.match(/linkedin\\.com\\/posts\\/([^\\/]+)\\//) || [])[1] || \"\";\n return decodeURIComponent(id);\n}\n\n/**\n * 从 LinkedIn 公司 URL 中提取公共 ID。\n * @param url - 要从中提取的 URL。默认为当前页面 URL。\n * @returns 公共 ID 字符串,如果未找到则为空字符串。\n */\nexport function getCompanyPublicId(url: string = \"\") {\n url = url || window.top?.location.href || document.URL;\n const id = (url.match(/linkedin\\.com\\/company\\/([^?/]+)/) || [])[1] || \"\";\n return decodeURIComponent(id);\n}\n\n/**\n * 从 LinkedIn URL 中提取公共 ID,尝试个人资料或公司。\n * @param url - 要从中提取的 URL。默认为当前页面 URL。\n * @returns 公共 ID 字符串,如果未找到则为空字符串。\n */\nexport function getLinkedinPublicId(url: string = \"\") {\n url = url || window.top?.location.href || document.URL;\n return getProfilePublicId(url) || getCompanyPublicId(url) || \"\";\n}\n\n/**\n * 确定页面类型,检查协议或 LinkedIn 页面类型。\n * @param url - 要分析的 URL。\n * @returns 页面类型字符串。\n */\nexport function getPageType(url = \"\") {\n if (!url) return \"\";\n const protocolMap = Object.keys(pageTypeMap);\n const protocol = new URL(url).protocol.replace(\":\", \"\");\n return protocolMap.includes(protocol) ? protocol : getLinkedinPageType(url);\n}\n","/**\n * Chrome Runtime 消息通信封装\n * 基于 TypeScript 的类型安全消息系统(Builder 模式)\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// 配置\n// ============================================================================\n\n/**\n * 运行时配置选项\n */\nexport interface RuntimeConfig {\n /** 是否启用调试日志,默认 true */\n debug?: boolean;\n /** 日志前缀,默认 \"[MessageBus]\" */\n logPrefix?: string;\n}\n\n// ============================================================================\n// 核心类型定义\n// ============================================================================\n\n/**\n * 消息定义结构\n */\nexport interface MessageDefinition {\n payload: unknown;\n response: unknown;\n}\n\n/**\n * 消息协议表类型\n */\nexport type MessageProtocol = Record<string, MessageDefinition>;\n\n/**\n * 错误响应结构\n */\nexport interface ErrorResponse {\n __error: true;\n message: string;\n}\n\n/**\n * 类型守卫:检查响应是否为错误响应\n */\nexport function isErrorResponse(response: unknown): response is ErrorResponse {\n return (\n typeof response === \"object\" &&\n response !== null &&\n \"__error\" in response &&\n (response as ErrorResponse).__error === true\n );\n}\n\n// ============================================================================\n// 消息总线类型\n// ============================================================================\n\n/**\n * 消息处理器类型\n */\nexport type MessageHandler<P, R> = (\n payload: P,\n sender: chrome.runtime.MessageSender\n) => R | Promise<R>;\n\n/**\n * 消息总线接口\n */\nexport interface MessageBus<T extends MessageProtocol> {\n /**\n * 发送消息到 background\n */\n send<K extends keyof T>(\n type: K,\n payload: T[K][\"payload\"]\n ): Promise<T[K][\"response\"]>;\n\n /**\n * 发送消息到指定 Tab\n */\n sendToTab<K extends keyof T>(\n tabId: number,\n type: K,\n payload: T[K][\"payload\"]\n ): Promise<T[K][\"response\"]>;\n\n /**\n * 监听消息\n */\n on<K extends keyof T>(\n type: K,\n handler: MessageHandler<T[K][\"payload\"], T[K][\"response\"]>\n ): () => void;\n\n /**\n * 批量注册监听器\n */\n onMany<K extends keyof T>(\n handlers: Partial<{\n [P in K]: MessageHandler<T[P][\"payload\"], T[P][\"response\"]>;\n }>\n ): () => void;\n\n /**\n * 检查是否已注册处理器\n */\n hasHandler(type: keyof T): boolean;\n\n /**\n * 获取已注册的消息类型\n */\n getRegisteredTypes(): (keyof T)[];\n\n /**\n * 清除所有处理器\n */\n clearAllHandlers(): void;\n}\n\n// ============================================================================\n// 消息总线实现\n// ============================================================================\n\n/**\n * 创建类型安全的消息总线\n *\n * @param config - 可选配置\n * @returns 类型化的消息总线实例\n *\n * @example\n * ```ts\n * // 1. 定义消息类型\n * type MyMessages = {\n * \"user/login\": {\n * payload: { username: string; password: string };\n * response: { token: string };\n * };\n * \"user/logout\": {\n * payload: void;\n * response: void;\n * };\n * };\n *\n * // 2. 创建消息总线\n * const bus = createMessageBus<MyMessages>();\n *\n * // 3. 发送消息(content script)\n * const result = await bus.send(\"user/login\", {\n * username: \"admin\",\n * password: \"123456\"\n * });\n * console.log(result.token); // 类型安全!\n *\n * // 4. 监听消息(background)\n * bus.on(\"user/login\", async ({ username, password }) => {\n * const user = await authenticate(username, password);\n * return { token: user.token };\n * });\n * ```\n */\nexport function createMessageBus<T extends MessageProtocol>(\n config: RuntimeConfig = {}\n): MessageBus<T> {\n const { debug = false, logPrefix = \"[MessageBus]\" } = config;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handlers = new Map<keyof T, MessageHandler<any, any>>();\n let isListenerRegistered = false;\n\n // 日志函数\n function logError(message: string, ...args: unknown[]): void {\n if (debug) {\n console.error(`${logPrefix} ${message}`, ...args);\n }\n }\n\n // 确保全局监听器已注册\n function ensureListener(): void {\n if (isListenerRegistered) return;\n\n chrome.runtime.onMessage.addListener(\n (\n message: { type: keyof T; payload: unknown },\n sender: chrome.runtime.MessageSender,\n sendResponse: (response: unknown) => void\n ): boolean | undefined => {\n // 验证消息格式\n if (!message || typeof message.type !== \"string\") {\n return undefined;\n }\n\n const handler = handlers.get(message.type);\n if (!handler) {\n return undefined;\n }\n\n try {\n const result = handler(message.payload, sender);\n\n if (result instanceof Promise) {\n result.then(sendResponse).catch((error: unknown) => {\n logError(`Error handling \"${String(message.type)}\":`, error);\n sendResponse({\n __error: true,\n message: error instanceof Error ? error.message : String(error),\n } satisfies ErrorResponse);\n });\n return true;\n }\n\n sendResponse(result);\n return false;\n } catch (error) {\n logError(`Error handling \"${String(message.type)}\":`, error);\n sendResponse({\n __error: true,\n message: error instanceof Error ? error.message : String(error),\n } satisfies ErrorResponse);\n return false;\n }\n }\n );\n\n isListenerRegistered = true;\n }\n\n return {\n send<K extends keyof T>(\n type: K,\n payload: T[K][\"payload\"]\n ): Promise<T[K][\"response\"]> {\n return chrome.runtime.sendMessage({ type, payload });\n },\n\n sendToTab<K extends keyof T>(\n tabId: number,\n type: K,\n payload: T[K][\"payload\"]\n ): Promise<T[K][\"response\"]> {\n return chrome.tabs.sendMessage(tabId, { type, payload });\n },\n\n on<K extends keyof T>(\n type: K,\n handler: MessageHandler<T[K][\"payload\"], T[K][\"response\"]>\n ): () => void {\n ensureListener();\n handlers.set(type, handler);\n return () => {\n handlers.delete(type);\n };\n },\n\n onMany<K extends keyof T>(\n handlerMap: Partial<{\n [P in K]: MessageHandler<T[P][\"payload\"], T[P][\"response\"]>;\n }>\n ): () => void {\n ensureListener();\n const registeredTypes: K[] = [];\n\n for (const [type, handler] of Object.entries(handlerMap)) {\n if (handler) {\n handlers.set(type as K, handler as MessageHandler<unknown, unknown>);\n registeredTypes.push(type as K);\n }\n }\n\n return () => {\n for (const type of registeredTypes) {\n handlers.delete(type);\n }\n };\n },\n\n hasHandler(type: keyof T): boolean {\n return handlers.has(type);\n },\n\n getRegisteredTypes(): (keyof T)[] {\n return Array.from(handlers.keys());\n },\n\n clearAllHandlers(): void {\n handlers.clear();\n },\n };\n}\n","type TClientId = `${string}.apps.googleusercontent.com`;\ntype TResponseType = \"id_token\" | \"code\";\n\ntype TLaunchWebAuthFlowParams = {\n clientId: TClientId;\n responseType: TResponseType | readonly TResponseType[];\n state?: string; // 通过redirectUrl的state参数返回\n nonce?: string; // 通过解析 redirectUrl的id_token参数返回, nonce 包含在 id_token 的 payload 中\n interactive?: boolean; // 是否需要用户交互\n};\n\ntype TMapping = {\n id_token: { id_token: string };\n code: { code: string };\n};\n\n// 2. TResult 根据输入类型,返回 TMapping 中对应的类型\ntype TResult<T extends TResponseType | readonly TResponseType[]> =\n T extends TResponseType // 如果是单个字面量\n ? TMapping[T]\n : T extends readonly (infer Element)[] // 如果是数组/元组\n ? { [K in Element & keyof TMapping]: string }\n : never;\n\n// 辅助类型,用于从联合类型创建对象类型\n// type UnionToObject<T extends string> = {\n// [K in T]: string;\n// };\n\n// // 辅助类型,用于将 TResponseType[] 数组类型转换为联合类型\n// type ElementOf<T> = T extends readonly (infer U)[] ? U : never;\n\n/**\n * 根据 responseType 推断返回类型\n * 例如: TResult<\"code\"> => { code: string }\n * TResult<[\"id_token\", \"code\"]> => { id_token: string; code: string }\n * TResult<[\"code\", \"id_token\"]> => { id_token: string; code: string }\n */\n// type TResult<T> = T extends \"id_token\"\n// ? { id_token: string }\n// : T extends \"code\"\n// ? { code: string }\n// : T extends readonly TResponseType[]\n// ? UnionToObject<ElementOf<T>>\n// : never;\n\n/**\n * 支持 Google OAuth2 登录的 client_id 类型(参数 clientId)\n * 需要 identity 权限\n * @param clientId - Google OAuth2 Web 应用 类型的 client_id,例如: \"xxxxxx.apps.googleusercontent.com\"\n * @param responseType - 响应类型,默认: \"code\"\n * @returns Promise<string> - 返回 id_token 或 code\n */\nexport async function launchWebAuthFlow<P extends TLaunchWebAuthFlowParams>({\n clientId,\n responseType = \"code\",\n state,\n nonce,\n interactive = true,\n}: P): Promise<\n TResult<P[\"responseType\"]> &\n (P extends { state: string } ? { state: string } : {})\n> {\n const redirectUri = chrome.identity.getRedirectURL(); // 使用这个可以不打开窗口,而将redirectUri传给回掉函数或then\n // const clientId =\n // \"351437144506-j211m0v70p0f8t2bh4pdgdm9jpfgojra.apps.googleusercontent.com\"; //web 这里需要web client id\n // const clientId = '351437144506-2srn3bbnjhnfpu2vq2rknk41rfrk30ks.apps.googleusercontent.com'; //extension\n const scope = \"openid email profile\"; // \"https://www.googleapis.com/auth/userinfo.email\";\n // const responseType = \"id_token\";\n const resType = Array.isArray(responseType) ? responseType : [responseType];\n\n // console.log(\"nonce\", nonce);\n const authUrl = new URL(\"https://accounts.google.com/o/oauth2/v2/auth\");\n authUrl.searchParams.set(\"client_id\", clientId);\n authUrl.searchParams.set(\"redirect_uri\", redirectUri);\n authUrl.searchParams.set(\"response_type\", resType.join(\" \"));\n authUrl.searchParams.set(\"scope\", scope);\n nonce && authUrl.searchParams.set(\"nonce\", nonce);\n state && authUrl.searchParams.set(\"state\", state);\n\n return chrome.identity\n .launchWebAuthFlow({ url: authUrl.toString(), interactive: interactive })\n .then((redirectUrl?: string) => {\n if (!redirectUrl) {\n return Promise.reject(new Error(\"redirectUrl is null\"));\n }\n const splitChar = redirectUrl.includes(\"?\") ? \"?\" : \"#\";\n const urlParams = new URLSearchParams(redirectUrl.split(splitChar)[1]);\n const result = {} as Record<string, string>;\n urlParams.forEach((value, key) => {\n result[key] = value;\n });\n return result as any;\n })\n .catch((error: any) => {\n console.log(\"error\", error);\n return Promise.reject(error);\n });\n}\n\n/**\n * 解码 JWT\n * @param idToken - JWT\n * @returns 返回 JWT 的 payload\n */\nexport function decodeJWT(idToken: string): Record<string, any> {\n let base64Url = idToken.split(\".\")[1];\n let base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n let jsonPayload = decodeURIComponent(\n atob(base64)\n .split(\"\")\n .map(function (c) {\n return \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2);\n })\n .join(\"\")\n );\n return JSON.parse(jsonPayload);\n}\n\n// function getNonce(): string {\n// var a = new Uint32Array(2);\n// window.crypto.getRandomValues(a);\n// return a[0].toString(16) + a[1].toString(16);\n// }\n\n// const a = await launchWebAuthFlow({\n// clientId:\n// \"351437144506-j211m0v70p0f8t2bh4pdgdm9jpfgojra.apps.googleusercontent.com\",\n// responseType: \"code\",\n// state: \"123\",\n// });\n// console.log(a);\n// const a2 = await launchWebAuthFlow({\n// clientId:\n// \"351437144506-j211m0v70p0f8t2bh4pdgdm9jpfgojra.apps.googleusercontent.com\",\n// responseType: [\"code\"],\n// });\n// console.log(a2);\n// const b = await launchWebAuthFlow({\n// clientId:\n// \"351437144506-j211m0v70p0f8t2bh4pdgdm9jpfgojra.apps.googleusercontent.com\",\n// responseType: \"id_token\",\n// state: \"123\",\n// });\n// console.log(b);\n// const c = await launchWebAuthFlow({\n// clientId:\n// \"351437144506-j211m0v70p0f8t2bh4pdgdm9jpfgojra.apps.googleusercontent.com\",\n// responseType: [\"id_token\", \"code\"],\n// state: \"123\",\n// });\n// console.log(c);\n// const d = await launchWebAuthFlow({\n// clientId:\n// \"351437144506-j211m0v70p0f8t2bh4pdgdm9jpfgojra.apps.googleusercontent.com\",\n// responseType: [\"code\", \"id_token\"],\n// });\n// console.log(d);\n","/**\n * 将 chrome.cookies 返回的 Cookie 数组转换为适合请求头使用的字符串。\n * 仅用于扩展内部工具函数。\n */\nfunction cookies2str(cookies: chrome.cookies.Cookie[]) {\n return cookies.map((cookie) => `${cookie.name}=${cookie.value}`).join(\"; \");\n}\n\n/**\n * 获取指定 URL 下某个 Cookie 的值。\n *\n * 注意:\n * - 依赖 chrome.cookies API,只能在浏览器扩展的后台上下文中调用\n * (如 MV3 service worker、background page、extension page 等)。\n * - 不能在普通网页环境或仅有 content-script 的上下文中直接使用。\n */\nexport function getCookie(\n url: string,\n name: string,\n onlyValue: true\n): Promise<string>;\nexport function getCookie(\n url: string,\n name: string,\n onlyValue?: false\n): Promise<chrome.cookies.Cookie | undefined>;\nexport function getCookie(\n url: string,\n name: string,\n onlyValue = false\n): Promise<string | chrome.cookies.Cookie | undefined> {\n return chrome.cookies.get({ url, name }).then((cookie) => {\n return onlyValue\n ? cookie?.value?.replace(/\"/g, \"\") || \"\"\n : cookie ?? undefined;\n });\n}\n\n/**\n * 获取指定 URL 下的所有 Cookie,并以 \"key=value; key2=value2\" 的形式返回。\n *\n * 同样依赖 chrome.cookies API,只能在扩展后台(service worker / background 等)\n * 或具有相应权限的扩展页面中调用。\n */\nexport function getCookies(url: string, stringified: true): Promise<string>;\nexport function getCookies(\n url: string,\n stringified?: false\n): Promise<chrome.cookies.Cookie[]>;\nexport function getCookies(\n url: string,\n stringified = false\n): Promise<string | chrome.cookies.Cookie[]> {\n return chrome.cookies.getAll({ url }).then((cookies) => {\n return stringified ? cookies2str(cookies) : cookies;\n });\n}\n\n/**\n * 获取当前扩展的基础信息:语言、ID、版本等。\n * 需要在扩展上下文中运行(具有 chrome.runtime / chrome.i18n 的环境)。\n */\nexport function getExtensionInfo() {\n return {\n locale: chrome.i18n?.getUILanguage(),\n extId: chrome.runtime?.id,\n version: chrome.runtime?.getManifest().version,\n };\n}\n","declare var global: typeof globalThis;\n\n/**\n * 获取当前环境的全局对象。\n *\n * 在不同的 JavaScript 运行环境中,全局对象的名称不同:\n * - 在浏览器环境中,全局对象是 `window`。\n * - 在 Node.js 环境中,全局对象是 `global`。\n * - 在 Web Worker 环境中,全局对象是 `self`。\n *\n * 这个函数提供了一种统一的方式来获取当前环境的全局对象。\n *\n * @returns 当前环境的全局对象。\n */\nexport function getGlobal(this: any) {\n if (typeof globalThis !== \"undefined\") {\n return globalThis;\n }\n\n if (typeof self !== \"undefined\") {\n return self;\n }\n\n if (typeof window !== \"undefined\") {\n return window;\n }\n\n if (typeof global !== \"undefined\") {\n return global;\n }\n\n // 如果以上都不符合,则返回 this\n return this;\n}\n","import { AsyncFunction, RealUndefined } from \"./type\";\n\n/**\n * 定义一个类型,用于扩展函数类型,增加一个可选的 isExecuting 属性\n */\nexport type SingleExecutionFunction<F extends AsyncFunction<any[], any>> =\n F extends (this: infer This, ...args: infer Args) => Promise<infer R>\n ? ((this: This, ...args: Args) => Promise<R | RealUndefined>) & {\n isExecuting?: boolean;\n }\n : never;\n\n/**\n * 创建一个有执行状态的函数,该函数在前一次调用未完成时不会被再次调用。\n *\n * @param func - 需要包裹的函数。\n * @returns 一个增强版的函数,该函数具有 isExecuting 属性。\n */\nexport function singleExecutionWrapper<T extends AsyncFunction<any[], any>>(\n func: T,\n minTime: number = 0\n) {\n const singleExecutionFn = function (\n this: ThisParameterType<T>,\n ...args: Parameters<T>\n ): ReturnType<T> | Promise<RealUndefined> {\n if (singleExecutionFn.isExecuting) {\n // console.log(`Function(${func.name}) is executing.`);\n return Promise.resolve(RealUndefined);\n }\n singleExecutionFn.isExecuting = true;\n\n const startTime = performance.now();\n const result = func.apply(this, args) as Promise<any>;\n result.finally(() => {\n const loadTime = performance.now() - startTime;\n if (minTime && minTime > loadTime) {\n setTimeout(() => {\n singleExecutionFn.isExecuting = false;\n }, minTime - loadTime);\n } else {\n singleExecutionFn.isExecuting = false;\n }\n });\n\n return result;\n } as SingleExecutionFunction<T>;\n\n singleExecutionFn.isExecuting = false;\n\n return singleExecutionFn as unknown as T & { isExecuting: boolean };\n}\n"],"names":["RealUndefined","Symbol","isCloneable","obj","clone","isPrimitive","value","type","generateStableUniqueKey","params","String","JSON","stringify","_key","Array","isArray","Object","keys","sort","reduce","pre","cur","cloneDeep","map","item","newObj","key","prototype","hasOwnProperty","call","createDefaultObject","defaultValue","Proxy","get","target","property","cache","loadingCache","getCachedData","apiKey","hasCachedData","defalutSetting","timeout","timeoutResult","code","msg","identifier","MemoryStore","storageKey","this","data","changeCallbacks","getInstanceKey","getInstance","instances","has","set","create","clearInstance","instance","clearChangeCallbacks","clearAllInstances","forEach","clear","_proto","prop","_extends2","oldValue","_extends","triggerChange","error","console","getAll","remove","newData","undefined","setMultiple","onChanged","callback","push","newValue","length","_changes","changes","getSize","jsonString","Blob","size","getStoreKey","getStoreType","setStyle","element","important","style","priority","setProperty","createSvgFromVNode","vnode","document","createElementNS","props","_i3","_Object$entries3","entries","_Object$entries3$_i","setAttribute","children","textNode","createTextNode","appendChild","child","childElement","createSvgFromString","svgString","svgElement","DOMParser","parseFromString","documentElement","SVGElement","Error","scrollToBottom","dom","setTimeout","scrollTop","scrollHeight","Map","Draggable","options","isDragging","startX","startY","initialX","initialY","threshold","onMouseMoveHandler","onMouseUpHandler","coordinate","originPosition","getComputedStyle","position","onMouseMove","bind","onMouseUp","addEventListener","onMouseDown","e","preventDefault","clientX","clientY","parseInt","window","left","top","getBoundedPosition","x","y","maxX","maxY","rect","getBoundingClientRect","innerWidth","width","innerHeight","height","containerRect","offsetParent","Math","min","max","dy","abs","onDragStart","boundedPosition","right","bottom","onDrag","convertCoordinate","container","DOMRect","currentLeft","currentTop","HTMLElement","containerStyle","parseFloat","borderLeftWidth","borderTopWidth","scrollX","scrollY","brRight","brBottom","onDragEnd","removeEventListener","WebStore","storeType","store","local","session","getStore","localStorage","sessionStorage","updatedData","currentData","setItem","getItem","parse","removeItem","_this","event","storageArea","ChromeStore","sync","chrome","storage","Promise","resolve","_catch","then","_this$getStore$set","reject","_this2","_this3","result","_this4","_temp","_this4$getStore$set","_this5","_this6","_this6$getStore$set","_this7","addListener","namespace","_this8","_this9","LinkedinApiUrl","createLinkedinHeaders","csrfToken","cookies","c","headers","_ref2","join","selectors","profilePage","userPicture","userName","userOccupation","linkedinProfileCard","privateProfileInfoSection","howToContainer","companyName","companyLogo","campaignsListContainer","contactListContainer","location","campaignsListContainerDisplay","contactListContainerDisplay","mainExperienceContainer","experienceCompanyLogo","experienceCompanyName","experienceOccupation","experienceMultipleCompany","experienceMultipleOccupation","salesNavProfilePage","profileCardSection","profileUrl","moreInfoButton","linkedinProfileLinkButton","searchPeoplePage","searchEntityResult","linkedinUrl","image","fullName","resultList","actionsDiv","validResult","searchResult","searchResultsContainer","mainLayoutLeft","searchAllPage","peopleButton","toolbar","queryElement","selector","mode","allResults","querySelectorAll","from","closest","querySelector","getElement","page","_ref","_step","_iterator","_createForOfIteratorHelperLoose","done","decodeHtmlEntities","t","createElement","innerHTML","trim","pageTypeMap","ftp","file","blob","about","getLinkedinPageType","url","cleanUrl","split","toLocaleLowerCase","test","includes","getProfilePublicId","_window$top","id","href","URL","match","decodeURIComponent","getCompanyPublicId","_window$top3","func","setting","wrappedFunction","args","slice","arguments","name","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","apply","res","defineProperty","configurable","_ref$tag","tag","_ref$children","_ref$props","_ref$attrs","attrs","_ref$styles","styles","ele","_i","_Object$entries","_Object$entries$_i","_i2","_Object$entries2","_Object$entries2$_i","Element","config","_config$debug","debug","_config$logPrefix","logPrefix","handlers","isListenerRegistered","logError","message","_console","concat","ensureListener","runtime","onMessage","sender","sendResponse","handler","payload","__error","send","sendMessage","sendToTab","tabId","tabs","on","onMany","handlerMap","registeredTypes","_registeredTypes","hasHandler","getRegisteredTypes","clearAllHandlers","fetch","response","ok","status","statusText","text","errorMessage","wait","_arguments","context","clearTimeout","idToken","base64","replace","jsonPayload","atob","charCodeAt","toString","delay","_g","_g2","_g3","_g4","_g5","_g6","_g7","g","n","innerText","l","a","src","s","i","r","picture","occupation","companyPicture","onlyValue","cookie","_cookie$value","stringified","cookies2str","_chrome$i18n","_chrome$runtime","_chrome$runtime2","locale","i18n","getUILanguage","extId","version","getManifest","globalThis","self","global","_ref4","queryParams","universalName","isUniversalName","urn","method","_exit2","_temp4","json","_data$elements2","_temp3","elements","_result2","publicId","_ref3","_exit","_temp2","_data$elements","_result","_window$top4","protocolMap","protocol","_window$top2","clientId","_ref$responseType","responseType","state","nonce","_ref$interactive","interactive","redirectUri","identity","getRedirectURL","resType","authUrl","searchParams","launchWebAuthFlow","redirectUrl","splitChar","urlParams","URLSearchParams","log","dataset","isListeningForUserScroll","inter","userInteracted","userInteractedWithScroll","clientHeight","listenForUserScroll","minTime","singleExecutionFn","isExecuting","performance","loadTime"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/common/type.ts","../src/common/generateStableUniqueKey.ts","../src/common/cloneDeep.ts","../src/common/utils.ts","../src/common/cacheWrapper.ts","../src/common/MemoryStore.ts","../src/browser/dom.ts","../src/browser/scroll.ts","../src/browser/draggable.ts","../src/browser/WebStore.ts","../src/chrome/ChromeStore.ts","../src/linkedin/api.ts","../src/linkedin/dom.ts","../src/linkedin/utils.ts","../src/chrome/message.ts","../src/chrome/identity.ts","../src/chrome/utils.ts","../src/common/getGlobal.ts","../src/common/singleExecutionWrapper.ts"],"sourcesContent":["export const RealUndefined = Symbol(\"undefined\");\nexport type RealUndefined = typeof RealUndefined;\n\n/**\n * 异步函数类型。\n *\n * @template Args - 表示函数参数的类型数组。\n * @template T - 表示函数返回的 Promise 解析后的类型。\n *\n * @param args - 函数的参数。\n * @returns 一个 Promise 对象,解析后的值类型为 T。\n */\nexport type AsyncFunction<Args extends any[], T> = (\n this: any,\n ...args: Args\n) => Promise<T>;\n\n/**\n * 表示一个可以克隆自身的对象接口。\n *\n * @interface Cloneable\n */\nexport interface Cloneable {\n /**\n * 创建并返回当前对象的一个副本。\n *\n * @returns {this} 当前对象的一个副本。\n */\n clone(): this;\n}\n\n/**\n *\n * 检查一个对象是否实现了 Cloneable 接口。\n *\n * 这个函数是一个类型保护函数,它会在类型检查时将传入的对象类型缩小为 Cloneable。\n *\n * @param {any} obj - 要检查的对象。\n * @returns {obj is Cloneable} 如果对象实现了 Cloneable 接口,则返回 true;否则返回 false。\n */\nexport function isCloneable(obj: any): obj is Cloneable {\n return typeof obj?.clone === \"function\";\n}\n\n/**\n * 检查一个值是否是原始类型(primitive type)。\n *\n * 这个函数是一个类型保护函数,它会在类型检查时将传入的值类型缩小为原始类型之一:string, number, boolean, null 或 undefined。\n *\n * @param {any} value - 要检查的值。\n * @returns {value is string | number | boolean | null | undefined} 如果值是原始类型,则返回 true;否则返回 false。\n */\nexport function isPrimitive(\n value: any\n): value is string | number | boolean | null | undefined {\n const type = typeof value;\n return (\n value === null ||\n type === \"string\" ||\n type === \"number\" ||\n type === \"boolean\" ||\n type === \"undefined\"\n );\n}\n","import { isPrimitive } from \"./type\";\n\n/**\n * 为给定的参数生成一个稳定且唯一的键。\n *\n * 该函数确保生成的键是确定性的,即相同的输入总是会生成相同的输出。\n * 这在缓存、记忆化或任何需要一致键的场景中非常有用。\n *\n * @param params - 用于生成键的参数。可以是任何类型。\n * @returns 表示输入参数的稳定且唯一的字符串键。\n */\nexport function generateStableUniqueKey(params: any) {\n if (isPrimitive(params)) {\n return String(params);\n }\n return JSON.stringify(params, function (_key: string | number, value: any) {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return Object.keys(value)\n .sort()\n .reduce((pre: any, cur: string) => {\n pre[cur] = value[cur];\n return pre;\n }, {});\n }\n return value;\n });\n}\n","import { isCloneable } from \"./type\";\n\n/**\n * 深度克隆一个对象或数组。\n *\n * @param {T} obj - 要克隆的对象或数组。\n * @returns {T} 克隆后的对象或数组。\n */\nexport function cloneDeep<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (isCloneable(obj)) {\n return obj.clone();\n }\n\n // 处理数组\n if (Array.isArray(obj)) {\n return obj.map((item) => cloneDeep(item)) as unknown as T;\n }\n\n const newObj: { [key: string]: any } = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n newObj[key] = cloneDeep(obj[key]);\n }\n }\n return newObj as T;\n}\n","/**\n * 创建一个防抖函数,该函数会在最后一次调用后的指定时间间隔后执行。\n *\n * @param func - 需要防抖处理的函数。\n * @param wait - 延迟的毫秒数。\n * @returns 一个新的防抖函数。\n */\nexport function debounce<T extends (...args: any[]) => void>(\n func: T,\n wait: number\n): T {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n return function (this: ThisParameterType<T>, ...args: Parameters<T>) {\n const context = this;\n\n // 如果已经设定了调用,取消之前的调用\n if (timeout !== null) {\n clearTimeout(timeout);\n }\n\n // 设定一个新的调用,等待指定的时间后执行\n timeout = setTimeout(() => {\n func.apply(context, args);\n timeout = null; // 确保能够在下次触发时重新设定定时器\n }, wait);\n } as T;\n}\n\n/**\n * 创建一个节流函数,该函数会在每个指定的时间间隔内最多执行一次。\n *\n * @param func - 需要节流处理的函数。\n * @param delay - 时间间隔的毫秒数。\n * @returns 一个新的节流函数。\n */\n// export function throttle<T extends (...agrs: any[]) => any>(\n// func: T,\n// delay: number\n// ): T {\n// let lastExecutedTime: number = 0;\n\n// return function (this: ThisParameterType<T>, ...args: Parameters<T>) {\n// const context = this;\n// const currentTime = Date.now();\n\n// if (currentTime - lastExecutedTime >= delay) {\n// func.apply(context, args);\n// lastExecutedTime = currentTime;\n// }\n// } as T;\n// }\n\n/**\n * 创建一个延迟执行回调函数并返回 Promise 的函数。\n *\n * @param callback - 需要执行的回调函数。\n * @param delay - 延迟的毫秒数,默认为 0。\n * @param args - 传递给回调函数的参数。\n * @returns 一个 Promise 对象,该对象在回调函数执行后解析。\n */\nexport function delayExecution<T, Args extends any[]>(\n callback: (...args: Args) => T,\n delay: number = 0,\n ...args: Args\n): Promise<T> {\n return new Promise<T>((resolve) => {\n if (delay === 0) {\n resolve(callback(...args));\n } else {\n setTimeout(() => {\n resolve(callback(...args));\n }, delay);\n }\n });\n}\n\n/**\n * 创建一个带有默认值的代理对象。\n * 如果访问的属性不存在,则返回默认值。\n *\n * @param defaultValue - 当属性不存在时返回的默认值。\n * @returns 一个代理对象,未定义的属性将返回默认值。\n */\nexport function createDefaultObject<T>(defaultValue: T): Record<string, T> {\n return new Proxy<Record<string, T>>(\n {},\n {\n get: (target, property: string) => {\n return target.hasOwnProperty(property)\n ? target[property]\n : defaultValue;\n },\n }\n );\n}\n","// import { isNode } from \"environment\";\n\nimport { generateStableUniqueKey } from \"./generateStableUniqueKey\";\nimport { cloneDeep } from \"./cloneDeep\";\nimport { createDefaultObject } from \"./utils\";\nimport { AsyncFunction, RealUndefined } from \"./type\";\n\nconst cache: Record<string, any> = createDefaultObject<any>(RealUndefined);\nconst loadingCache = createDefaultObject(false);\nfunction getCachedData<T = any>(apiKey: string) {\n return cache[apiKey] as T;\n}\n\nfunction hasCachedData(apiKey: string) {\n return cache[apiKey] !== RealUndefined;\n}\n\nexport interface Setting {\n timeout?: number;\n timeoutResult?: any;\n identifier?: string;\n}\n\nconst defalutSetting: Setting = {\n timeout: 60000,\n timeoutResult: { code: 408, msg: \"请求超时\" },\n identifier: \"\",\n};\n\n/**\n * 为异步函数添加缓存功能。\n *\n * 该函数根据函数参数、函数名和一个可选的标识符来缓存异步函数的结果。\n * 如果结果已经缓存,则返回缓存的结果。如果函数正在执行中,则等待结果返回,并使用一个超时机制防止无限等待。\n *\n * @template Args - 函数参数的类型。\n * @template Promise<T> - 函数返回值的类型。\n * @param {AsyncFunction<Args, T>} func - 需要包装的异步函数。\n * @param {Setting} [setting=defalutSetting] - 可选的缓存设置。\n * @returns {AsyncFunction<Args, T>} - 带有缓存功能的包装函数,返回类型为 `Promise<T>`。\n */\nexport function cacheWrapper<\n Args extends any[],\n T,\n F extends AsyncFunction<Args, T>\n>(func: F, setting: Setting = defalutSetting) {\n const wrappedFunction = function (\n this: ThisParameterType<F>,\n ...args: Parameters<F>\n ) {\n // 在服务端的时候 不缓存\n // if (isNode) {\n // return func.apply(this, args);\n // }\n const apiKey: string =\n generateStableUniqueKey(args) + func.name + (setting.identifier || \"\"); //缓存key\n\n if (hasCachedData(apiKey)) {\n return Promise.resolve(cloneDeep(getCachedData<T>(apiKey)));\n }\n\n if (loadingCache[apiKey]) {\n const _setting = Object.assign({}, defalutSetting, setting);\n return new Promise((resolve) => {\n const startTime = Date.now();\n const timer = setInterval(() => {\n if (hasCachedData(apiKey)) {\n clearInterval(timer);\n resolve(cloneDeep(getCachedData<T>(apiKey)));\n } else if (Date.now() - startTime > _setting.timeout!) {\n loadingCache[apiKey] = false;\n clearInterval(timer);\n resolve(cloneDeep(_setting.timeoutResult));\n }\n }, 100);\n });\n }\n loadingCache[apiKey] = true;\n\n return func\n .apply(this, args)\n .then((res) => {\n // 缓存原始数据或其克隆,避免数据被释放\n cache[apiKey] = res;\n return cloneDeep(cache[apiKey]);\n })\n .catch((error: any) => {\n throw error;\n })\n .finally(() => {\n loadingCache[apiKey] = false;\n });\n } as F;\n\n // 设置函数名\n Object.defineProperty(wrappedFunction, \"name\", {\n value: `cacheWrapper_${func.name}`,\n configurable: true,\n });\n\n return wrappedFunction;\n}\n","/**\n * 内存存储管理类\n * 提供内存级别的数据存储,支持单例模式和变化监听\n */\n\ntype TRecord = Record<string, any>;\nexport class MemoryStore<T extends TRecord> {\n private readonly storageKey: string;\n private data: T = {} as T;\n private static instances = new Map<string, MemoryStore<TRecord>>();\n private changeCallbacks: Array<(changes: { [key: string]: { oldValue?: any; newValue?: any } }) => void> = [];\n\n private constructor(storageKey: string) {\n this.storageKey = storageKey;\n }\n\n private static getInstanceKey(storageKey: string): string {\n return `memory:${storageKey}`;\n }\n\n /**\n * 获取单例实例\n */\n private static getInstance<T extends TRecord>(\n storageKey: string\n ): MemoryStore<T> {\n const key = this.getInstanceKey(storageKey);\n\n if (!this.instances.has(key)) {\n this.instances.set(key, new MemoryStore<T>(storageKey));\n }\n\n return this.instances.get(key) as MemoryStore<T>;\n }\n\n /**\n * 创建内存存储实例\n */\n static create<T extends TRecord>(storageKey: string): MemoryStore<T> {\n return this.getInstance<T>(storageKey);\n }\n\n /**\n * 清理指定实例\n */\n static clearInstance(storageKey: string): void {\n const key = this.getInstanceKey(storageKey);\n const instance = this.instances.get(key);\n if (instance) {\n instance.clearChangeCallbacks();\n }\n this.instances.delete(key);\n }\n\n /**\n * 清理所有实例\n */\n static clearAllInstances(): void {\n this.instances.forEach(instance => {\n instance.clearChangeCallbacks();\n });\n this.instances.clear();\n }\n\n /**\n * 设置数据\n */\n set<K extends keyof T>(prop: K, value: T[K]): void {\n try {\n const oldValue = this.data[prop];\n this.data = { ...this.data, [prop]: value };\n this.triggerChange(oldValue, value);\n } catch (error) {\n console.error(\"MemoryStore.set 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 获取数据\n */\n get<K extends keyof T>(prop: K): T[K] | undefined {\n try {\n return this.data[prop];\n } catch (error) {\n console.error(\"MemoryStore.get 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 获取所有数据\n */\n getAll(): T {\n return { ...this.data };\n }\n\n /**\n * 删除指定的数据\n */\n remove<K extends keyof T>(prop: K): void {\n try {\n if (prop in this.data) {\n const oldValue = this.data[prop];\n const newData = { ...this.data };\n delete newData[prop];\n this.data = newData;\n this.triggerChange(oldValue, undefined);\n }\n } catch (error) {\n console.error(\"MemoryStore.remove 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 清空所有数据\n */\n clear(): void {\n try {\n const oldValue = { ...this.data };\n this.data = {} as T;\n this.triggerChange(oldValue, {});\n } catch (error) {\n console.error(\"MemoryStore.clear 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 批量设置多个数据\n */\n setMultiple(data: Partial<T>): void {\n try {\n const oldValue = { ...this.data };\n this.data = { ...this.data, ...data };\n this.triggerChange(oldValue, this.data);\n } catch (error) {\n console.error(\"MemoryStore.setMultiple 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 监听数据变化\n * 注意:内存存储使用自定义事件,支持实时变化监听\n */\n onChanged(\n callback: (changes: { [key: string]: { oldValue?: any; newValue?: any } }) => void\n ): void {\n this.changeCallbacks.push(callback);\n }\n\n /**\n * 触发变化事件\n */\n private triggerChange(oldValue: any, newValue: any): void {\n if (this.changeCallbacks.length > 0) {\n const changes = {\n [this.storageKey]: {\n oldValue,\n newValue,\n },\n };\n\n this.changeCallbacks.forEach(callback => {\n try {\n callback(changes);\n } catch (error) {\n console.error(\"MemoryStore 变化回调执行失败:\", error);\n }\n });\n }\n }\n\n /**\n * 清理变化回调\n */\n private clearChangeCallbacks(): void {\n this.changeCallbacks = [];\n }\n\n /**\n * 检查是否存在指定的数据\n */\n has<K extends keyof T>(prop: K): boolean {\n try {\n return prop in this.data;\n } catch (error) {\n console.error(\"MemoryStore.has 失败:\", error);\n return false;\n }\n }\n\n /**\n * 获取存储大小(字节数)\n */\n getSize(): number {\n try {\n const jsonString = JSON.stringify(this.data);\n return new Blob([jsonString]).size;\n } catch (error) {\n console.error(\"MemoryStore.getSize 失败:\", error);\n return 0;\n }\n }\n\n /**\n * 获取当前存储键名\n */\n getStoreKey(): string {\n return this.storageKey;\n }\n\n /**\n * 获取当前存储类型\n */\n getStoreType(): string {\n return \"memory\";\n }\n}\n\n// 使用示例\n// type UserData = {\n// name: string;\n// age: number;\n// email: string;\n// };\n\n// // 创建内存存储实例\n// const userMemoryStore = MemoryStore.create<UserData>('user-data');\n\n// // 监听变化\n// userMemoryStore.onChanged((changes) => {\n// console.log('数据变化:', changes);\n// });\n\n// // 设置数据\n// userMemoryStore.set('name', '张三');\n// userMemoryStore.set('age', 25);\n\n// // 获取数据\n// console.log('用户数据:', userMemoryStore.getAll());\n// console.log('用户名:', userMemoryStore.get('name'));\n\n// // 批量设置\n// userMemoryStore.setMultiple({\n// name: '李四',\n// age: 30,\n// email: 'lisi@example.com'\n// });\n\n// // 清理实例\n// MemoryStore.clearInstance('user-data');\n","/**\n * 表示 DOM 中可能的子元素类型。\n */\nexport type ChildrenType = DomOptionsType | Element | string | null;\n\n/**\n * 表示创建 DOM 元素的选项类型。\n */\nexport type DomOptionsType = {\n /**\n * 要创建的元素的标签名。默认为 \"div\"。\n */\n tag?: string;\n\n /**\n * 要附加到创建的元素的子元素。可以是单个子元素或子元素数组。\n */\n children?: ChildrenType | ChildrenType[];\n\n /**\n * 要设置在创建的元素上的属性。\n */\n props?: Record<string, any>;\n\n /**\n * 要设置在创建的元素上的属性。\n */\n attrs?: Record<string, string | boolean>;\n\n /**\n * 要应用于创建的元素的样式。\n */\n styles?: Record<string, string | number>;\n};\n\n/**\n * 设置 HTML 元素的样式属性。\n *\n * @param element - 要设置样式的 HTML 元素。\n * @param property - CSS 属性名,可以是驼峰命名法(camelCase)或连字符命名法(kebab-case)。\n * @param value - 要设置的属性值。\n * @param important - 可选参数,布尔值,表示是否将属性设置为 `important` 优先级,默认为 `false`。\n */\nfunction setStyle(\n element: HTMLElement | SVGElement,\n property: string,\n value: string | number,\n important: boolean = false\n): void {\n if (property in element.style) {\n (element.style as any)[property] = value;\n } else {\n const priority = important ? \"important\" : \"\";\n element.style.setProperty(property, String(value), priority);\n }\n}\n\n/**\n * 使用指定选项创建一个 DOM 元素。\n *\n * @param options - 创建 DOM 元素的选项。\n *\n * @returns 创建的 DOM 元素。\n *\n * @remarks\n * 此函数旨在浏览器环境中使用。\n *\n * @example\n * ```typescript\n * const element = createElement({\n * tag: 'button',\n * children: '点击我',\n * attrs: { id: 'myButton' },\n * styles: { color: 'red' }\n * });\n * document.body.appendChild(element);\n * ```\n */\nexport function createElement({\n tag = \"div\",\n children = [],\n props = {},\n attrs = {},\n styles = {},\n}: DomOptionsType = {}): HTMLElement {\n const ele = document.createElement(tag);\n\n // 设置属性\n Object.assign(ele, props);\n\n // 设置属性\n for (const [key, value] of Object.entries(attrs)) {\n if (value !== false) {\n ele.setAttribute(key, value as string);\n }\n }\n\n // 设置样式\n for (const [key, value] of Object.entries(styles)) {\n setStyle(ele, key, value);\n }\n\n // 处理子元素\n const childArray = Array.isArray(children) ? children : [children];\n for (const child of childArray) {\n if (!child) continue;\n\n if (typeof child === \"object\") {\n if (child instanceof Element) {\n ele.appendChild(child);\n } else {\n ele.appendChild(createElement(child as DomOptionsType));\n }\n } else {\n ele.appendChild(document.createTextNode(child));\n }\n }\n\n return ele;\n}\n\ninterface VNode {\n type: string;\n props: Record<string, string> | null;\n children: VNode[] | string | null;\n}\n\n/**\n * 从 VNode 对象创建 SVG 元素。\n *\n * @param {VNode} vnode - 表示 SVG 结构的 VNode 对象。\n * @returns {SVGSVGElement} 创建的 SVG 元素。\n */\nfunction createSvgFromVNode(vnode: VNode): SVGSVGElement {\n const namespace = \"http://www.w3.org/2000/svg\";\n const element = document.createElementNS(namespace, vnode.type);\n\n if (vnode.props) {\n for (const [key, value] of Object.entries(vnode.props)) {\n element.setAttribute(key, value);\n }\n }\n\n if (typeof vnode.children === \"string\") {\n const textNode = document.createTextNode(vnode.children);\n element.appendChild(textNode);\n } else if (Array.isArray(vnode.children)) {\n vnode.children.forEach((child) => {\n const childElement = createSvgFromVNode(child);\n element.appendChild(childElement);\n });\n }\n\n return element as SVGSVGElement;\n}\n\n/**\n * 从 SVG 字符串创建 SVG 元素。\n *\n * @param {string} svgString - 包含 SVG 内容的字符串。\n * @returns {SVGElement} 创建的 SVG 元素。\n * @throws {Error} 如果解析失败或结果不是 SVG 元素。\n */\nfunction createSvgFromString(svgString: string): SVGSVGElement {\n const parser = new DOMParser();\n const doc = parser.parseFromString(svgString, \"image/svg+xml\");\n\n const svgElement = doc.documentElement;\n if (!(svgElement instanceof SVGElement)) {\n throw new Error(\"解析失败,结果不是有效的 SVG 元素\");\n }\n\n return svgElement as SVGElement as SVGSVGElement;\n}\n\n/**\n * 创建 SVG 元素,根据输入参数的类型选择合适的创建方法。\n *\n * @param {VNode | string} params - VNode 对象或 SVG 字符串。\n * @returns {SVGElement} 创建的 SVG 元素。\n * @throws {Error} 如果输入字符串无法解析为有效的 SVG 元素。\n */\nexport function createSvg(params: VNode | string): SVGSVGElement {\n if (typeof params === \"string\") {\n return createSvgFromString(params);\n }\n return createSvgFromVNode(params);\n}\n\n/**\n * 从指定的 URL 加载 SVG 内容并创建 SVG 元素。\n *\n * @param {string} url - 包含 SVG 内容的 URL。\n * @returns {Promise<SVGElement>} Promise,解析为创建的 SVG 元素。\n * @throws {Error} 如果无法获取或解析 SVG 内容。\n */\nexport async function createSvgFromUrl(url: string): Promise<SVGSVGElement> {\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(\n `网络请求失败: ${response.status} ${response.statusText}`\n );\n }\n\n const svgString = await response.text();\n return createSvgFromString(svgString);\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : \"未知错误\";\n throw new Error(`无法创建 SVG 元素: ${errorMessage}`);\n }\n}\n","/**\n * 将指定的 DOM 元素滚动到底部。\n * 使用 setTimeout 确保在当前调用栈之后执行。\n *\n * @param {HTMLElement} dom - 要滚动的 DOM 元素。\n */\nexport function scrollToBottom(dom: HTMLElement) {\n if (dom) {\n setTimeout(() => {\n // 设置滚动条位置为元素的最大滚动高度,滚动到底部\n dom.scrollTop = dom.scrollHeight;\n }, 0);\n }\n}\n\n/**\n * 如果用户未与 DOM 元素交互,则将其滚动到底部。\n * 如果尚未设置事件监听器,则设置一个以跟踪用户滚动交互。\n *\n * @param {HTMLElement} dom - 可能需要滚动的 DOM 元素。\n */\nexport function scrollToBottomIfNeeded(dom: HTMLElement): void {\n if (!dom) {\n return;\n }\n // 检查是否已设置滚动监听器\n if (dom.dataset.isListeningForUserScroll !== \"true\") {\n listenForUserScroll(dom);\n dom.dataset.isListeningForUserScroll = \"true\";\n }\n\n // 如果用户未与滚动条交互,则滚动到底部\n if (dom.dataset.userInteracted !== \"true\") {\n scrollToBottom(dom);\n }\n}\n\n/**\n * 更新用户是否与滚动条交互的状态。\n *\n * @param {HTMLElement} dom - 要更新状态的 DOM 元素。\n * @param {boolean} inter - 用户是否与滚动条交互。\n */\nfunction userInteractedWithScroll(dom: HTMLElement, inter: boolean): void {\n // 根据用户交互状态更新数据属性\n dom.dataset.userInteracted = inter ? \"true\" : \"false\";\n}\n\n/**\n * 为 DOM 元素设置滚动事件监听器。\n * 当用户滚动时,更新交互状态。\n *\n * @param {HTMLElement} dom - 要监听滚动事件的 DOM 元素。\n */\nfunction listenForUserScroll(dom: HTMLElement): void {\n if (!dom) {\n return;\n }\n dom.addEventListener(\"scroll\", () => {\n // 检查用户是否滚动到接近底部\n if (dom.scrollTop + dom.clientHeight < dom.scrollHeight - 5) {\n // 用户已滚动,更新交互状态\n userInteractedWithScroll(dom, true);\n } else {\n // 用户未滚动到接近底部\n userInteractedWithScroll(dom, false);\n }\n });\n}\n","/**\n * 拖拽组件类\n * @class Draggable\n * @description 为DOM元素添加拖拽功能的类,支持拖拽开始、拖拽中、拖拽结束的回调函数\n * @example\n * const element = document.getElementById('draggable');\n * const draggable = new Draggable(element, {\n * onDragStart: (e) => console.log('开始拖拽'),\n * onDrag: (e) => console.log('拖拽中'),\n * onDragEnd: (e) => console.log('结束拖拽'),\n * coordinate: 'tl' // 可选: tl(左上), tr(右上), bl(左下), br(右下)\n * });\n */\n\ninterface DraggableOptions {\n onDragStart?: (event: MouseEvent) => void;\n onDrag?: (event: MouseEvent) => void;\n onDragEnd?: (event: MouseEvent) => void;\n position?: \"absolute\" | \"fixed\";\n coordinate?: \"tl\" | \"tr\" | \"bl\" | \"br\";\n}\n/**\n * 拖拽组件配置选项接口\n * @interface DraggableOptions\n * @property {function} [onDragStart] - 开始拖拽时的回调函数\n * @property {function} [onDrag] - 拖拽过程中的回调函数\n * @property {function} [onDragEnd] - 结束拖拽时的回调函数\n * @property {string} [position] - 定位方式,可选 absolute 或 fixed\n * @property {string} [coordinate] - 坐标原点,可选 tl(左上)、tr(右上)、bl(左下)、br(右下)\n */\n\nexport class Draggable {\n private element: HTMLElement;\n private options: DraggableOptions;\n private isDragging: boolean = false;\n private startX: number = 0;\n private startY: number = 0;\n private initialX: number = 0;\n private initialY: number = 0;\n private threshold: number = 5; // 拖动阈值\n\n private onMouseMoveHandler: (e: MouseEvent) => void;\n private onMouseUpHandler: (e: MouseEvent) => void;\n\n constructor(element: HTMLElement, options: DraggableOptions = {}) {\n this.element = element;\n this.options = {\n coordinate: \"tl\", // 默认使用左上角作为原点\n ...options,\n };\n\n let originPosition = getComputedStyle(this.element).position;\n if (!originPosition || originPosition === \"static\") {\n this.element.style.position = \"absolute\";\n }\n\n if (this.options.position) {\n this.element.style.position = this.options.position;\n }\n\n this.onMouseMoveHandler = this.onMouseMove.bind(this);\n this.onMouseUpHandler = this.onMouseUp.bind(this);\n\n this.element.addEventListener(\"mousedown\", this.onMouseDown.bind(this));\n }\n\n private onMouseDown(e: MouseEvent): void {\n e.preventDefault();\n this.startX = e.clientX;\n this.startY = e.clientY;\n this.initialX =\n parseInt(window.getComputedStyle(this.element).left, 10) || 0;\n this.initialY =\n parseInt(window.getComputedStyle(this.element).top, 10) || 0;\n\n document.addEventListener(\"mousemove\", this.onMouseMoveHandler);\n document.addEventListener(\"mouseup\", this.onMouseUpHandler);\n }\n\n private getBoundedPosition(x: number, y: number): { x: number; y: number } {\n const rect = this.element.getBoundingClientRect();\n const position = getComputedStyle(this.element).position;\n\n let maxX: number;\n let maxY: number;\n\n if (position === \"fixed\") {\n // 对于 fixed 定位,使用视口大小\n maxX = window.innerWidth - rect.width;\n maxY = window.innerHeight - rect.height;\n } else {\n // 对于 absolute 定位,使用父容器大小\n const container =\n (this.element.offsetParent as HTMLElement) || document.documentElement;\n const containerRect = container.getBoundingClientRect();\n maxX = containerRect.width - rect.width;\n maxY = containerRect.height - rect.height;\n }\n\n return {\n x: Math.min(Math.max(0, x), maxX),\n y: Math.min(Math.max(0, y), maxY),\n };\n }\n\n private onMouseMove(e: MouseEvent): void {\n if (!this.isDragging) {\n const dx = e.clientX - this.startX;\n const dy = e.clientY - this.startY;\n if (Math.abs(dx) > this.threshold || Math.abs(dy) > this.threshold) {\n this.isDragging = true;\n if (this.options.onDragStart) {\n this.options.onDragStart(e);\n }\n }\n }\n\n if (this.isDragging) {\n const dx = e.clientX - this.startX;\n const dy = e.clientY - this.startY;\n const newX = this.initialX + dx;\n const newY = this.initialY + dy;\n\n const boundedPosition = this.getBoundedPosition(newX, newY);\n\n this.element.style.right = \"auto\";\n this.element.style.bottom = \"auto\";\n this.element.style.left = boundedPosition.x + \"px\";\n this.element.style.top = boundedPosition.y + \"px\";\n\n if (this.options.onDrag) {\n this.options.onDrag(e);\n }\n }\n }\n\n private convertCoordinate(): void {\n const rect = this.element.getBoundingClientRect();\n const style = getComputedStyle(this.element);\n const position = style.position;\n\n // 获取参考容器\n let container: Element | null = null;\n let containerRect: DOMRect | null = null;\n\n if (position === \"fixed\") {\n // fixed定位相对于视口\n container = null;\n containerRect = new DOMRect(0, 0, window.innerWidth, window.innerHeight);\n } else {\n // 获取定位参考元素\n container = this.element.offsetParent as Element;\n if (!container) {\n container = document.documentElement;\n }\n const containerStyle = getComputedStyle(container);\n if (containerStyle.position === \"static\") {\n // 如果容器是static定位,使用视口作为参考\n container = null;\n containerRect = new DOMRect(\n 0,\n 0,\n window.innerWidth,\n window.innerHeight\n );\n } else {\n containerRect = container.getBoundingClientRect();\n }\n }\n\n if (!containerRect) return;\n\n // 计算当前位置\n let currentLeft: number;\n let currentTop: number;\n\n if (position === \"fixed\") {\n currentLeft = rect.left;\n currentTop = rect.top;\n } else {\n // 对于非fixed定位,需要计算相对位置\n currentLeft = rect.left - containerRect.left;\n currentTop = rect.top - containerRect.top;\n\n if (container instanceof HTMLElement) {\n // 考虑边框\n const containerStyle = getComputedStyle(container);\n const borderLeft = parseFloat(containerStyle.borderLeftWidth) || 0;\n const borderTop = parseFloat(containerStyle.borderTopWidth) || 0;\n currentLeft -= borderLeft;\n currentTop -= borderTop;\n } else {\n currentLeft = currentLeft + window.scrollX;\n currentTop = currentTop + window.scrollY;\n }\n }\n\n // 根据不同的坐标原点设置位置\n switch (this.options.coordinate) {\n case \"tr\":\n const right = containerRect.width - currentLeft - rect.width;\n this.element.style.left = \"auto\";\n this.element.style.right = `${right}px`;\n this.element.style.top = `${currentTop}px`;\n this.element.style.bottom = \"auto\";\n break;\n case \"bl\":\n const bottom = containerRect.height - currentTop - rect.height;\n this.element.style.left = `${currentLeft}px`;\n this.element.style.right = \"auto\";\n this.element.style.top = \"auto\";\n this.element.style.bottom = `${bottom}px`;\n break;\n case \"br\":\n const brRight = containerRect.width - currentLeft - rect.width;\n const brBottom = containerRect.height - currentTop - rect.height;\n this.element.style.left = \"auto\";\n this.element.style.right = `${brRight}px`;\n this.element.style.top = \"auto\";\n this.element.style.bottom = `${brBottom}px`;\n break;\n case \"tl\":\n default:\n this.element.style.left = `${currentLeft}px`;\n this.element.style.right = \"auto\";\n this.element.style.top = `${currentTop}px`;\n this.element.style.bottom = \"auto\";\n }\n }\n\n private onMouseUp(e: MouseEvent): void {\n if (this.isDragging) {\n // 在拖拽结束时转换坐标\n if (this.options.coordinate && this.options.coordinate !== \"tl\") {\n this.convertCoordinate();\n }\n\n if (this.options.onDragEnd) {\n this.options.onDragEnd(e);\n }\n }\n this.isDragging = false;\n document.removeEventListener(\"mousemove\", this.onMouseMoveHandler);\n document.removeEventListener(\"mouseup\", this.onMouseUpHandler);\n }\n}\n","/**\n * 通用的本地存储管理类\n * 提供对 localStorage 和 sessionStorage 的封装操作,支持单例模式\n */\n\ntype TStoreType = \"local\" | \"session\";\ntype TRecord = Record<string, any>;\n\nexport class WebStore<T extends TRecord> {\n private readonly storageKey: string;\n private readonly storeType: TStoreType;\n private store?: Storage;\n private static instances = new Map<string, WebStore<TRecord>>();\n\n private constructor(storageKey: string, storeType: TStoreType = \"local\") {\n this.storageKey = storageKey;\n this.storeType = storeType;\n }\n\n private static getInstanceKey(\n storageKey: string,\n storeType: TStoreType = \"local\"\n ): string {\n return `${storeType}:${storageKey}`;\n }\n\n /**\n * 获取单例实例\n */\n private static getInstance<T extends TRecord>(\n storageKey: string,\n storeType: TStoreType = \"local\"\n ): WebStore<T> {\n const key = this.getInstanceKey(storageKey, storeType);\n\n if (!this.instances.has(key)) {\n this.instances.set(key, new WebStore<T>(storageKey, storeType));\n }\n\n return this.instances.get(key) as WebStore<T>;\n }\n\n /**\n * 便捷方法:创建本地存储实例\n */\n static local<T extends TRecord>(storageKey: string): WebStore<T> {\n return this.getInstance<T>(storageKey, \"local\");\n }\n\n /**\n * 便捷方法:创建会话存储实例\n */\n static session<T extends TRecord>(\n storageKey: string\n ): WebStore<T> {\n return this.getInstance<T>(storageKey, \"session\");\n }\n\n /**\n * 清理指定实例\n */\n static clearInstance(\n storageKey: string,\n storeType: TStoreType = \"local\"\n ): void {\n const key = this.getInstanceKey(storageKey, storeType);\n this.instances.delete(key);\n }\n\n /**\n * 清理所有实例\n */\n static clearAllInstances(): void {\n this.instances.clear();\n }\n\n private getStore() {\n if (this.store) {\n return this.store;\n }\n this.store = this.storeType === \"local\" ? localStorage : sessionStorage;\n return this.store;\n }\n\n /**\n * 设置数据到 localStorage 或 sessionStorage\n */\n set<K extends keyof T>(prop: K, value: T[K]): void {\n try {\n const currentData = this.getAll();\n const updatedData = { ...currentData, [prop]: value };\n this.getStore().setItem(this.storageKey, JSON.stringify(updatedData));\n } catch (error) {\n console.error(\"WebStore.set 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 获取数据从 localStorage 或 sessionStorage\n */\n get<K extends keyof T>(prop: K): T[K] | undefined {\n try {\n const data = this.getAll();\n return data?.[prop];\n } catch (error) {\n console.error(\"WebStore.get 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 获取所有数据\n */\n getAll(): T {\n try {\n const data = this.getStore().getItem(this.storageKey);\n return data ? JSON.parse(data) : ({} as T);\n } catch (error) {\n console.error(\"WebStore.getAll 失败:\", error);\n return {} as T;\n }\n }\n\n /**\n * 删除指定的数据\n */\n remove<K extends keyof T>(prop: K): void {\n try {\n const currentData = this.getAll();\n if (currentData && prop in currentData) {\n delete currentData[prop];\n this.getStore().setItem(this.storageKey, JSON.stringify(currentData));\n }\n } catch (error) {\n console.error(\"WebStore.remove 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 清空所有数据\n */\n clear(): void {\n try {\n this.getStore().removeItem(this.storageKey);\n } catch (error) {\n console.error(\"WebStore.clear 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 批量设置多个数据\n */\n setMultiple(data: Partial<T>): void {\n try {\n const currentData = this.getAll();\n const updatedData = { ...currentData, ...data };\n this.getStore().setItem(this.storageKey, JSON.stringify(updatedData));\n } catch (error) {\n console.error(\"WebStore.setMultiple 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 监听存储变化\n * 注意:localStorage 和 sessionStorage 没有原生的事件监听,这里使用 storage 事件来模拟\n */\n onChanged(\n callback: (changes: {\n [key: string]: { oldValue?: any; newValue?: any };\n }) => void\n ): void {\n const handleStorageChange = (event: StorageEvent) => {\n if (\n event.key === this.storageKey &&\n event.storageArea === this.getStore()\n ) {\n const changes = {\n [this.storageKey]: {\n oldValue: event.oldValue ? JSON.parse(event.oldValue) : undefined,\n newValue: event.newValue ? JSON.parse(event.newValue) : undefined,\n },\n };\n callback(changes);\n }\n };\n\n window.addEventListener(\"storage\", handleStorageChange);\n }\n\n /**\n * 检查是否存在指定的数据\n */\n has<K extends keyof T>(prop: K): boolean {\n try {\n const value = this.get(prop);\n return value !== undefined;\n } catch (error) {\n console.error(\"WebStore.has 失败:\", error);\n return false;\n }\n }\n\n /**\n * 获取存储大小(字节数)\n */\n getSize(): number {\n try {\n // const data = this.getAll();\n // const jsonString = JSON.stringify(data);\n const jsonString = this.getStore().getItem(this.storageKey) || \"\";\n return new Blob([jsonString]).size;\n } catch (error) {\n console.error(\"WebStore.getSize 失败:\", error);\n return 0;\n }\n }\n\n /**\n * 获取当前存储键名\n */\n getStoreKey(): string {\n return this.storageKey;\n }\n}\n\n// //demo\n// type AppBridgeData = {\n// CommonParams: {\n// cookie: string;\n// csrfToken: string;\n// userAgent?: string;\n// locale?: string;\n// extId?: string;\n// version?: any;\n// };\n// };\n\n// // 用户登录后可用的数据\n// type UserLocalData = {\n// SubscripVersionChooseName: string; // 选择名称\n// };\n\n// type TWebStore = {\n// app_bridge_data: AppBridgeData;\n// user_local_data: UserLocalData;\n// };\n\n// function getStore<T extends keyof TWebStore>(key: T) {\n// return WebStore.local<TWebStore[T]>(key);\n// }\n\n// // 创建特定类型的存储实例\n// export const AppBridgeStore = getStore(\"app_bridge_data\");\n// export const UserLocalStore = getStore(\"user_local_data\");\n// AppBridgeStore.get(\"CommonParams\");\n// UserLocalStore.get(\"SubscripVersionChooseName\");\n","/**\n * 通用的chrome存储管理类\n * 提供对 chrome.storage.local 和 chrome.storage.sync 的封装操作,支持单例模式\n */\n\ntype TStoreType = \"local\" | \"sync\";\ntype TRecord = Record<string, any>;\nexport class ChromeStore<T extends TRecord> {\n private readonly storageKey: string;\n private readonly storeType: TStoreType;\n private store?: chrome.storage.StorageArea;\n private static instances = new Map<string, ChromeStore<TRecord>>();\n\n private constructor(\n storageKey: string,\n storeType: TStoreType = \"local\"\n ) {\n this.storageKey = storageKey;\n this.storeType = storeType;\n }\n\n private static getInstanceKey(\n storageKey: string,\n storeType: TStoreType = \"local\"\n ): string {\n return `${storeType}:${storageKey}`;\n }\n\n /**\n * 获取单例实例\n */\n private static getInstance<T extends TRecord>(\n storageKey: string,\n storeType: TStoreType = \"local\"\n ): ChromeStore<T> {\n const key = this.getInstanceKey(storageKey, storeType);\n\n if (!this.instances.has(key)) {\n this.instances.set(key, new ChromeStore<T>(storageKey, storeType));\n }\n\n return this.instances.get(key) as ChromeStore<T>;\n }\n\n /**\n * 便捷方法:创建本地存储实例\n */\n static local<T extends TRecord>(\n storageKey: string\n ): ChromeStore<T> {\n return this.getInstance<T>(storageKey, \"local\");\n }\n\n /**\n * 便捷方法:创建同步存储实例\n */\n static sync<T extends TRecord>(\n storageKey: string\n ): ChromeStore<T> {\n return this.getInstance<T>(storageKey, \"sync\");\n }\n\n /**\n * 清理指定实例\n */\n static clearInstance(\n storageKey: string,\n storeType: TStoreType = \"local\"\n ): void {\n const key = this.getInstanceKey(storageKey, storeType);\n this.instances.delete(key);\n }\n\n /**\n * 清理所有实例\n */\n static clearAllInstances(): void {\n this.instances.clear();\n }\n\n private getStore() {\n if (this.store) {\n return this.store;\n }\n this.store = chrome.storage[this.storeType];\n return this.store;\n }\n\n /**\n * 设置数据到 chrome.storage.local 或 chrome.storage.sync\n */\n async set<K extends keyof T>(prop: K, value: T[K]): Promise<void> {\n try {\n const currentData = await this.getAll();\n const updatedData = { ...currentData, [prop]: value };\n await this.getStore().set({\n [this.storageKey]: updatedData,\n });\n } catch (error) {\n console.error(\"ChromeStore.set 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 获取数据从 chrome.storage.local 或 chrome.storage.sync\n */\n async get<K extends keyof T>(prop: K): Promise<T[K] | undefined> {\n try {\n const data = await this.getAll();\n return data?.[prop];\n } catch (error) {\n console.error(\"ChromeStore.get 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 获取所有数据从 chrome.storage.local 或 chrome.storage.sync\n */\n async getAll(): Promise<T> {\n try {\n const result = await this.getStore().get(this.storageKey);\n return (result[this.storageKey] as T) || ({} as T);\n } catch (error) {\n console.error(\"ChromeStore.getAll 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 删除指定的数据从 chrome.storage.local 或 chrome.storage.sync\n */\n async remove<K extends keyof T>(prop: K): Promise<void> {\n try {\n const currentData = await this.getAll();\n if (currentData && prop in currentData) {\n delete currentData[prop];\n await this.getStore().set({\n [this.storageKey]: currentData,\n });\n }\n } catch (error) {\n console.error(\"ChromeStore.remove 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 清空所有数据\n */\n async clear(): Promise<void> {\n try {\n await this.getStore().remove(this.storageKey);\n } catch (error) {\n console.error(\"ChromeStore.clear 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 批量设置多个数据\n */\n async setMultiple(data: Partial<T>): Promise<void> {\n try {\n const currentData = await this.getAll();\n const updatedData = { ...currentData, ...data };\n await this.getStore().set({\n [this.storageKey]: updatedData,\n });\n } catch (error) {\n console.error(\"ChromeStore.setMultiple 失败:\", error);\n throw error;\n }\n }\n\n /**\n * 监听存储变化\n */\n onChanged(\n callback: (changes: { [key: string]: chrome.storage.StorageChange }) => void\n ): void {\n chrome.storage.onChanged.addListener((changes, namespace) => {\n if (namespace === this.storeType && changes[this.storageKey]) {\n callback(changes);\n }\n });\n }\n\n /**\n * 检查是否存在指定的数据\n */\n async has<K extends keyof T>(prop: K): Promise<boolean> {\n try {\n const value = await this.get(prop);\n return value !== undefined;\n } catch (error) {\n console.error(\"ChromeStore.has 失败:\", error);\n return false;\n }\n }\n\n /**\n * 获取存储大小(字节数)\n */\n async getSize(): Promise<number> {\n try {\n const data = await this.getAll();\n const jsonString = JSON.stringify(data);\n return new Blob([jsonString]).size;\n } catch (error) {\n console.error(\"ChromeStore.getSize 失败:\", error);\n return 0;\n }\n }\n\n /**\n * 获取当前存储键名\n */\n getStoreKey(): string {\n return this.storageKey;\n }\n}\n\n// // demo\n// type AppData = {\n// InstallTimestamp: number; // 安装时间\n// };\n\n// // 用户登录后可用的数据\n// type UserData = {\n// AddedInstallReward: boolean; // 是否已经添加奖励\n// ResharePostTimes: number; // 转发post次数\n// };\n\n// type TChromeStore = {\n// app_data: AppData;\n// user_data: UserData;\n// };\n\n// function getStore<T extends keyof TChromeStore>(key: T) {\n// return ChromeStore.local<TChromeStore[T]>(key);\n// }\n\n// // 创建特定类型的存储实例\n// export const AppStore = getStore(\"app_data\");\n// export const UserStore = getStore(\"user_data\");\n\n// AppStore.get('InstallTimestamp');\n// UserStore.set('AddedInstallReward', true);","const LinkedinApiUrl = \"https://www.linkedin.com/voyager/api\";\n\nconst linkedinMeExample = {\n plainId: 450174691,\n miniProfile: {\n memorialized: false,\n firstName: \"nova\",\n lastName: \"zh\",\n dashEntityUrn: \"urn:li:fsd_profile:ACoAABrVHuMBRCnqjgiNThyBf4eRn_jHZxpbYYs\",\n occupation: \"This is a English document\",\n objectUrn: \"urn:li:member:450174691\",\n entityUrn: \"urn:li:fs_miniProfile:ACoAABrVHuMBRCnqjgiNThyBf4eRn_jHZxpbYYs\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"cc5c6a1a-5acf-485f-b81d-34ffd74c8991\",\n },\n backgroundImage: {\n \"com.linkedin.common.VectorImage\": {\n artifacts: [\n {\n width: 800,\n fileIdentifyingUrlPathSegment:\n \"200_800/profile-displaybackgroundimage-shrink_200_800/0/1691978277687?e=1767225600&v=beta&t=b2aEdzTPlnTKgBBYFVps1TTaYNUryB7rW-zyO-X6-dw\",\n expiresAt: 1767225600000,\n height: 200,\n },\n {\n width: 1400,\n fileIdentifyingUrlPathSegment:\n \"350_1400/profile-displaybackgroundimage-shrink_350_1400/0/1691978277687?e=1767225600&v=beta&t=XeQhz7fpDq84srUMSVQ9852tMD_IOR2TbRwOP-ff1WQ\",\n expiresAt: 1767225600000,\n height: 350,\n },\n ],\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D5616AQFqZ4J2fWgoDg/profile-displaybackgroundimage-shrink_\",\n },\n },\n publicIdentifier: \"云-张-917919106\",\n picture: {\n \"com.linkedin.common.VectorImage\": {\n artifacts: [\n {\n width: 389,\n fileIdentifyingUrlPathSegment:\n \"800_800/B4EZX1ZVYVG0Ac-/0/1743578814438?e=1767225600&v=beta&t=va8CxCfLy771PIkgCio-bdrEaCjIWGOt893iE_TXDms\",\n expiresAt: 1767225600000,\n height: 389,\n },\n {\n width: 100,\n fileIdentifyingUrlPathSegment:\n \"100_100/B4EZX1ZVYVG0AU-/0/1743578814438?e=1767225600&v=beta&t=6FBqPHaShouHGqnLK14r8OfZvMUzxJQROfKo8E64rYc\",\n expiresAt: 1767225600000,\n height: 100,\n },\n {\n width: 389,\n fileIdentifyingUrlPathSegment:\n \"400_400/B4EZX1ZVYVG0Ag-/0/1743578814438?e=1767225600&v=beta&t=Sw8rHuKMyKSbilGZrgOMIAVNOuTx04hwL_CAJ35evMY\",\n expiresAt: 1767225600000,\n height: 389,\n },\n {\n width: 200,\n fileIdentifyingUrlPathSegment:\n \"200_200/B4EZX1ZVYVG0AY-/0/1743578814437?e=1767225600&v=beta&t=yLljmWG54q4RG5i0BsLm_bAGkqrP_YFLgjzsZLKnntM\",\n expiresAt: 1767225600000,\n height: 200,\n },\n ],\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E03AQE1lS6Odi33tw/profile-displayphoto-shrink_\",\n },\n },\n trackingId: \"W1PBGV2SS2aULx1jLsaJ8A==\",\n },\n publicContactInfo: {},\n premiumSubscriber: false,\n};\nexport async function getLinkedinMe({\n csrfToken,\n cookies,\n}: {\n csrfToken: string;\n cookies?: Record<string, string> | string;\n}): Promise<typeof linkedinMeExample | null> {\n const url = `${LinkedinApiUrl}/me`;\n const headers = createLinkedinHeaders(csrfToken, cookies);\n return fetch(url, {\n method: \"GET\",\n headers,\n })\n .then(async (response) => {\n if (response.ok) {\n return response.json();\n }\n return null;\n })\n .catch((error) => {\n console.error(error);\n return null;\n });\n}\n\nconst linkedinProfileExample = {\n profileVideoPreview: {\n paging: {\n start: 0,\n count: 10,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon105506655\",\n elements: [],\n },\n profileTreasuryMediaProfile: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n objectUrn: \"urn:li:member:262384451\",\n multiLocaleLastName: {\n fr_FR: \"Gadreau\",\n },\n profileOrganizations: {\n paging: {\n total: 0,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileOrganizationsInjection\",\n elements: [],\n },\n multiLocaleFirstNamePronunciationHint: {},\n multiLocaleLastNamePronunciationHint: {},\n profileEducations: {\n paging: {\n total: 5,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileEducationsInjection\",\n elements: [\n {\n dateRange: {\n start: {\n year: 2016,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n },\n end: {\n year: 2016,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"27710b4a-c9f6-475c-8075-80ed2fa3ded4\",\n },\n profileTreasuryMediaEducation: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n description:\n \"Modéliser l’application par des diagramme UML\\nConcevoir l’application et son interface utilisateur\\nProgrammer l’application, en même temps que ses tests unitaires associés.\\nDéployer l’application pour une mise en production.\\nDocumenter l’application\\nEmployer les méthodes agiles, tant côté technique que côté organisation.\\nLangage Orienté Objet : Java\\nArchitecture JEE\\nFramework : Hibernate, Struts, Spring\",\n companyUrn: \"urn:li:fsd_company:18221081\",\n schoolUrn: \"urn:li:fsd_school:3264003\",\n entityUrn:\n \"urn:li:fsd_profileEducation:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,353005345)\",\n school: {\n entityUrn: \"urn:li:fsd_school:3264003\",\n name: \"LDNR formation\",\n logo: {\n vectorImage: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.VectorImage\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E0BAQHCH__qt-JPGg/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1693316454106/ldnr_formation_logo?e=1763596800&v=beta&t=OKixRPwD9Fj287WIdZwvqsHDF0002CBSHI2cVuV3OS8\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1693316454106/ldnr_formation_logo?e=1763596800&v=beta&t=lSYJPsAMIekQV0aCHdoiF-AnjCscmXKmZQ0grp8pBR0\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1693316454106/ldnr_formation_logo?e=1763596800&v=beta&t=7Z16njnyUR6oRvLJVPIQOXzkunBTjQM0JDtD0Tk4zts\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n active: true,\n $recipeType: \"com.linkedin.voyager.dash.deco.organization.MiniSchool\",\n url: \"https://www.linkedin.com/school/ldnr-formation/\",\n },\n company: {\n entityUrn: \"urn:li:fsd_company:18221081\",\n name: \"LDNR formation\",\n logo: {\n vectorImage: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.VectorImage\",\n digitalmediaAsset: \"urn:li:digitalmediaAsset:D4E0BAQHCH__qt-JPGg\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E0BAQHCH__qt-JPGg/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1693316454106/ldnr_formation_logo?e=1763596800&v=beta&t=OKixRPwD9Fj287WIdZwvqsHDF0002CBSHI2cVuV3OS8\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1693316454106/ldnr_formation_logo?e=1763596800&v=beta&t=lSYJPsAMIekQV0aCHdoiF-AnjCscmXKmZQ0grp8pBR0\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1693316454106/ldnr_formation_logo?e=1763596800&v=beta&t=7Z16njnyUR6oRvLJVPIQOXzkunBTjQM0JDtD0Tk4zts\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.organization.MiniCompany\",\n url: \"https://www.linkedin.com/school/ldnr-formation/\",\n },\n schoolName: \"LDNR formation\",\n fieldOfStudy: \"Concepteur Développeur Java JEE\",\n degree: {\n entityUrn: \"urn:li:fsd_degree:2102\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon875016385\",\n },\n degreeName: \"Titre professionnel (TP) de niveau 6\",\n multiLocaleGrade: {\n fr_FR: \"Embauche en CDI\",\n },\n multiLocaleSchoolName: {\n fr_FR: \"LDNR formation\",\n },\n grade: \"Embauche en CDI\",\n multiLocaleFieldOfStudy: {\n fr_FR: \"Concepteur Développeur Java JEE\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileEducation\",\n multiLocaleDescription: {\n fr_FR:\n \"Modéliser l’application par des diagramme UML\\nConcevoir l’application et son interface utilisateur\\nProgrammer l’application, en même temps que ses tests unitaires associés.\\nDéployer l’application pour une mise en production.\\nDocumenter l’application\\nEmployer les méthodes agiles, tant côté technique que côté organisation.\\nLangage Orienté Objet : Java\\nArchitecture JEE\\nFramework : Hibernate, Struts, Spring\",\n },\n degreeUrn: \"urn:li:fsd_degree:2102\",\n multiLocaleDegreeName: {\n fr_FR: \"Titre professionnel (TP) de niveau 6\",\n },\n },\n {\n dateRange: {\n start: {\n year: 2015,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n },\n end: {\n year: 2015,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"4629a808-dbf9-4edb-b675-36601bd9dcca\",\n },\n profileTreasuryMediaEducation: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n description:\n \"- Piloter un projet web : Méthode Agiles, modélisation UML\\n- Langage PHP / HTML5 / CSS3 / Javascript\\n- Architecture d'un projet web : Framework Symfony\\n- Gérer un projet multimédia : gérer une équipe projet, piloter le projet (planning, budget, validation)\\n- Concevoir/Développer un projet multimédia\",\n entityUrn:\n \"urn:li:fsd_profileEducation:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,273044881)\",\n schoolName: \"AP Formation\",\n fieldOfStudy: \"Concepteur Réalisateur Multimédia et Internet\",\n degree: {\n entityUrn: \"urn:li:fsd_degree:2102\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon875016385\",\n },\n degreeName: \"Titre professionnel (TP) de niveau 6\",\n multiLocaleGrade: {\n fr_FR: \"14.2/20 - bien\",\n },\n multiLocaleSchoolName: {\n fr_FR: \"AP Formation\",\n },\n grade: \"14.2/20 - bien\",\n multiLocaleFieldOfStudy: {\n fr_FR: \"Concepteur Réalisateur Multimédia et Internet\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileEducation\",\n multiLocaleDescription: {\n fr_FR:\n \"- Piloter un projet web : Méthode Agiles, modélisation UML\\n- Langage PHP / HTML5 / CSS3 / Javascript\\n- Architecture d'un projet web : Framework Symfony\\n- Gérer un projet multimédia : gérer une équipe projet, piloter le projet (planning, budget, validation)\\n- Concevoir/Développer un projet multimédia\",\n },\n degreeUrn: \"urn:li:fsd_degree:2102\",\n multiLocaleDegreeName: {\n fr_FR: \"Titre professionnel (TP) de niveau 6\",\n },\n },\n {\n dateRange: {\n start: {\n year: 2009,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n },\n end: {\n year: 2011,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"7f7f9fa4-1b4b-4137-9542-5d68258cd011\",\n },\n profileTreasuryMediaEducation: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n description:\n \"- Démarche créative\\n- Elaboration d’une charte graphique\\n- Utilisation des outils de PAO\\n- UI/UX Design\",\n companyUrn: \"urn:li:fsd_company:3312600\",\n schoolUrn: \"urn:li:fsd_school:42189\",\n entityUrn:\n \"urn:li:fsd_profileEducation:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,273042987)\",\n school: {\n entityUrn: \"urn:li:fsd_school:42189\",\n name: \"L'Idem\",\n logo: {\n vectorImage: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.VectorImage\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4D0BAQE2ZM59fbTZyg/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1736156052876/lidemfrance_logo?e=1763596800&v=beta&t=wkouQ2jQbZi3abbyNRdJcp7qJgXQLj-rzdZrGcx6T-4\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1736156052876/lidemfrance_logo?e=1763596800&v=beta&t=VlGRnufupZ362YPuPjpBrkibOKGDSBmFYxFUrv1fX0E\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1736156052876/lidemfrance_logo?e=1763596800&v=beta&t=9XZ7LPvFNZvNKSUq2DlzITUS7c_gbpPA6xA2nBbO6Mc\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n active: true,\n $recipeType: \"com.linkedin.voyager.dash.deco.organization.MiniSchool\",\n url: \"https://www.linkedin.com/school/lidemfrance/\",\n },\n company: {\n entityUrn: \"urn:li:fsd_company:3312600\",\n name: \"L'Idem\",\n logo: {\n vectorImage: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.VectorImage\",\n digitalmediaAsset: \"urn:li:digitalmediaAsset:D4D0BAQE2ZM59fbTZyg\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4D0BAQE2ZM59fbTZyg/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1736156052876/lidemfrance_logo?e=1763596800&v=beta&t=wkouQ2jQbZi3abbyNRdJcp7qJgXQLj-rzdZrGcx6T-4\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1736156052876/lidemfrance_logo?e=1763596800&v=beta&t=VlGRnufupZ362YPuPjpBrkibOKGDSBmFYxFUrv1fX0E\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1736156052876/lidemfrance_logo?e=1763596800&v=beta&t=9XZ7LPvFNZvNKSUq2DlzITUS7c_gbpPA6xA2nBbO6Mc\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.organization.MiniCompany\",\n url: \"https://www.linkedin.com/school/lidemfrance/\",\n },\n schoolName: \"L'Idem - Creative Arts School\",\n fieldOfStudy: \"Concepteur en Communication Visuelle\",\n degree: {\n entityUrn: \"urn:li:fsd_degree:2102\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon875016385\",\n },\n degreeName: \"Titre professionnel (TP) de niveau 6\",\n multiLocaleSchoolName: {\n fr_FR: \"L'Idem - Creative Arts School\",\n },\n multiLocaleFieldOfStudy: {\n fr_FR: \"Concepteur en Communication Visuelle\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileEducation\",\n multiLocaleDescription: {\n fr_FR:\n \"- Démarche créative\\n- Elaboration d’une charte graphique\\n- Utilisation des outils de PAO\\n- UI/UX Design\",\n },\n degreeUrn: \"urn:li:fsd_degree:2102\",\n multiLocaleDegreeName: {\n fr_FR: \"Titre professionnel (TP) de niveau 6\",\n },\n },\n {\n dateRange: {\n start: {\n year: 2007,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n },\n end: {\n year: 2009,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"16e346df-8a0b-4c5f-8ef1-da281104d9d6\",\n },\n profileTreasuryMediaEducation: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n description:\n \"- Physique appliquée\\n- Mathématiques\\n- Informatique industrielle\\n- Programmation\\n- Réseau\",\n standardizedFieldOfStudy: {\n entityUrn: \"urn:li:fsd_fieldOfStudy:100178\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon2017432627\",\n },\n entityUrn:\n \"urn:li:fsd_profileEducation:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,323454801)\",\n standardizedFieldOfStudyUrn: \"urn:li:fsd_fieldOfStudy:100178\",\n schoolName: \"Lycée Pablo Picasso\",\n fieldOfStudy: \"Programmation informatique\",\n degreeName:\n \"BTS IRIS (Informatique et Réseaux pour l’Industries et les Services techniques)\",\n multiLocaleSchoolName: {\n fr_FR: \"Lycée Pablo Picasso\",\n },\n multiLocaleActivities: {\n fr_FR: \"Projet Gestion d'une pisciculture depuis une application web\",\n },\n activities:\n \"Projet Gestion d'une pisciculture depuis une application web\",\n multiLocaleFieldOfStudy: {\n fr_FR: \"Programmation informatique\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileEducation\",\n multiLocaleDescription: {\n fr_FR:\n \"- Physique appliquée\\n- Mathématiques\\n- Informatique industrielle\\n- Programmation\\n- Réseau\",\n },\n multiLocaleDegreeName: {\n fr_FR:\n \"BTS IRIS (Informatique et Réseaux pour l’Industries et les Services techniques)\",\n },\n },\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 9,\n year: 2006,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 6,\n year: 2007,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"be9cac39-5fe9-46b7-99ce-058d1fc72713\",\n },\n profileTreasuryMediaEducation: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n degreeName: \"Baccalauréat scientifique - Option Science de l'ingénieur\",\n multiLocaleGrade: {\n fr_FR: \"Bien\",\n },\n multiLocaleSchoolName: {\n fr_FR: \"Lycée Pablo Picasso\",\n },\n entityUrn:\n \"urn:li:fsd_profileEducation:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,897196193)\",\n grade: \"Bien\",\n multiLocaleFieldOfStudy: {\n fr_FR: \"Science de l'ingénieur\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileEducation\",\n schoolName: \"Lycée Pablo Picasso\",\n fieldOfStudy: \"Science de l'ingénieur\",\n multiLocaleDegreeName: {\n fr_FR: \"Baccalauréat scientifique - Option Science de l'ingénieur\",\n },\n },\n ],\n },\n multiLocaleFirstName: {\n fr_FR: \"Florent\",\n },\n companyNameOnProfileTopCardShown: true,\n profilePublications: {\n paging: {\n total: 0,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePublicationsInjection\",\n elements: [],\n },\n publicIdentifier: \"florentgadreau\",\n profileCertifications: {\n paging: {\n total: 1,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileCertificationsInjection\",\n elements: [\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 6,\n year: 2023,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"faeda9d1-ba34-49b8-8943-41fb706a16d2\",\n },\n multiLocaleLicenseNumber: {\n fr_FR: \"4dDfdiNVlbYPeT0H6_-xBQ\",\n },\n companyUrn: \"urn:li:fsd_company:967435\",\n url: \"https://www.codingame.com/certification/4dDfdiNVlbYPeT0H6_-xBQ\",\n multiLocaleAuthority: {\n fr_FR: \"CodinGame\",\n },\n entityUrn:\n \"urn:li:fsd_profileCertification:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,111623122)\",\n authority: \"CodinGame\",\n name: \"Certification CodinGame - JavaScript\",\n multiLocaleName: {\n fr_FR: \"Certification CodinGame - JavaScript\",\n },\n licenseNumber: \"4dDfdiNVlbYPeT0H6_-xBQ\",\n company: {\n entityUrn: \"urn:li:fsd_company:967435\",\n name: \"CodinGame\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C560BAQGOd-eWEWqChA/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1630597986114/codingame_logo?e=1763596800&v=beta&t=b2jLPM_nVdRdQ_2UvJQcc1l33qFDpKYOoQALODrjWK8\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100-alternative/company-logo_100_100-alternative/0/1630597986140/codingame_logo?e=1763596800&v=beta&t=4iMdjZeVzLzZqBk_Eh9becJdhZPkw8evce3Od0sevro\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200-alternative/company-logo_200_200-alternative/0/1630597986140/codingame_logo?e=1763596800&v=beta&t=W2r5NYug9fDtVX3sk0eV6pSnhB9gH8cvmySOIbUCIQA\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1630597986114/codingame_logo?e=1763596800&v=beta&t=h_GT9p5xFUeGhUBiWVXyOFRsoIaoI__RYoWR0umQh4A\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400-alternative/company-logo_400_400-alternative/0/1630597986140/codingame_logo?e=1763596800&v=beta&t=riePu5BCWcDsNJRBS7mxE9JwMRMrgyvtiW4Dv1K69qg\",\n expiresAt: 1763596800000,\n height: 400,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1630597986114/codingame_logo?e=1763596800&v=beta&t=hd1U2mg6ZjgyNKaOPj3UwSAZjknDpQcR3pOP70b1Ty0\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkableMiniCompany\",\n universalName: \"codingame\",\n url: \"https://www.linkedin.com/company/codingame/\",\n },\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon1003157995\",\n displaySource: \"codingame.com\",\n },\n ],\n },\n trackingId: \"rvQK/mX5RX+TNHz5ljxnjQ==\",\n multiLocaleSummary: {\n fr_FR:\n \"Je suis un passionné de mon métier et toujours en quête d'apprentissage et connaissance nouvelle.\\n\\nDiplômé en Architecture et Ingénierie du Logiciel et du Web, j’ai développé durant ma carrière de solides compétences dans les technologies Web, aussi bien en Frontend, Backend et process DevOps.\\n\\nMon expertise s’articule autour de la conception, du développement, de l'architecture logicielle et de l'intégration continue.\\n\\nMon expérience acquise me permet de répondre efficacement à tous les types de projets, de garantir des résultats de qualité de manière optimal\",\n },\n profileVolunteerExperiences: {\n paging: {\n total: 1,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileVolunteerExperiencesInjection\",\n elements: [\n {\n multiLocaleRole: {\n fr_FR: \"Chef de projet web\",\n },\n role: \"Chef de projet web\",\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 3,\n year: 2015,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 9,\n year: 2015,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Blackelk Recordings\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"bc54cbfa-6d39-414e-ac09-40bb653e23b8\",\n },\n companyName: \"Blackelk Recordings\",\n description:\n \"Mise en place d'un cahier des charges, développement du nouveau site web, mise en place des méthodes de SEO pour un référencement optimum.\",\n cause: \"ARTS_AND_CULTURE\",\n entityUrn:\n \"urn:li:fsd_profileVolunteerExperience:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,790953094)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon474972167\",\n multiLocaleDescription: {\n fr_FR:\n \"Mise en place d'un cahier des charges, développement du nouveau site web, mise en place des méthodes de SEO pour un référencement optimum.\",\n },\n },\n ],\n },\n versionTag: \"3217399415\",\n firstName: \"Florent\",\n profilePicture: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.ProfilePhotoDecoSpecEditableProfilePicture\",\n a11yText: \"Florent Gadreau\",\n displayImageReference: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E03AQHTXLMcbyvcaA/profile-displayphoto-shrink_\",\n artifacts: [\n {\n width: 100,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/profile-displayphoto-shrink_100_100/0/1677553377218?e=1763596800&v=beta&t=gam7S7kWHN8EplxJR0Qgv6GGucpYrbucRG66349rSrQ\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 200,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/profile-displayphoto-shrink_200_200/0/1677553377218?e=1763596800&v=beta&t=pAFGhovwqkG03xi3G1lOmZ3FCl_ILzGB8K5SgxcM4Vc\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 400,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/profile-displayphoto-shrink_400_400/0/1677553377218?e=1763596800&v=beta&t=L5Py7uatZUalgHp-dxrk6FfqTSELCn8Cw33A41sNxbc\",\n expiresAt: 1763596800000,\n height: 400,\n },\n {\n width: 560,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"800_800/profile-displayphoto-shrink_800_800/0/1677553377218?e=1763596800&v=beta&t=yGwffZ6As8XofKgWtO3PCu6BBOleipRLzJCjvuFzNiw\",\n expiresAt: 1763596800000,\n height: 560,\n },\n ],\n },\n },\n displayImageUrn: \"urn:li:digitalmediaAsset:D4E03AQHTXLMcbyvcaA\",\n },\n profileSkills: {\n paging: {\n total: 50,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkillsInjection\",\n elements: [\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,13)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"2f425097-5899-4173-b051-b2fa973061d3\",\n },\n name: \"gRPC\",\n multiLocaleName: {\n fr_FR: \"gRPC\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,14)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"1775b0ed-931e-47ba-a00e-0802a4f6d1dd\",\n },\n name: \"Go\",\n multiLocaleName: {\n fr_FR: \"Go\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2065123633)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"3a94794a-2d30-4a90-bddb-efb47262a224\",\n },\n name: \"Infrastructure cloud\",\n multiLocaleName: {\n fr_FR: \"Infrastructure cloud\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2064555358)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"74a5ee55-42fa-4ac6-b713-10aefaa9d487\",\n },\n name: \"Git\",\n multiLocaleName: {\n fr_FR: \"Git\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,10)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"29327f35-8410-409b-8cc4-f54aa5c1d01c\",\n },\n name: \"FaaS\",\n multiLocaleName: {\n fr_FR: \"FaaS\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,11)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"f849c73e-f8fd-4017-9773-0b68249215a9\",\n },\n name: \"Big data\",\n multiLocaleName: {\n fr_FR: \"Big data\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,8)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"cc0da718-1a95-4a40-a8a3-c5d50ae52080\",\n },\n name: \"React Native\",\n multiLocaleName: {\n fr_FR: \"React Native\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,46)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"ef2951f8-a624-441f-8269-f085399a0137\",\n },\n name: \"C#\",\n multiLocaleName: {\n fr_FR: \"C#\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,47)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"516b833f-872e-4d34-8321-cb9a024c71bd\",\n },\n name: \"XAML\",\n multiLocaleName: {\n fr_FR: \"XAML\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,30)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"05f6ba76-021f-4b63-be92-a85235db34bb\",\n },\n name: \"Méthodes agiles\",\n multiLocaleName: {\n fr_FR: \"Méthodes agiles\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,42)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"429ece68-bed0-4808-a4aa-01494f3183a6\",\n },\n name: \"GWT\",\n multiLocaleName: {\n fr_FR: \"GWT\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,43)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"8d637b5c-cdbf-459b-8bf4-72828c119d3c\",\n },\n name: \"Oracle SQL\",\n multiLocaleName: {\n fr_FR: \"Oracle SQL\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,44)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"7e028249-3e54-40b5-aa05-cc89b43fc24e\",\n },\n name: \"Eclipse\",\n multiLocaleName: {\n fr_FR: \"Eclipse\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,45)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"b2311bbd-16e2-417d-87f4-c9cb9b1d3003\",\n },\n name: \"Tomcat\",\n multiLocaleName: {\n fr_FR: \"Tomcat\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,12)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"27547806-5966-43d6-a4df-3a0fec31876c\",\n },\n name: \"XML\",\n multiLocaleName: {\n fr_FR: \"XML\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,16)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"77f6b735-799c-409e-a19a-dd68e856661a\",\n },\n name: \"XSLT\",\n multiLocaleName: {\n fr_FR: \"XSLT\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,17)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"51e3ed03-7df2-4ad9-94b6-e30bf5ce41c4\",\n },\n name: \"Sonarqube\",\n multiLocaleName: {\n fr_FR: \"Sonarqube\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,22)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"2324e45b-be2a-4d17-921d-15b0ac2022b9\",\n },\n name: \"Revue de code\",\n multiLocaleName: {\n fr_FR: \"Revue de code\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,5)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"cc6bdf59-de77-4727-a5b9-05b4af507421\",\n },\n name: \"PL/SQL\",\n multiLocaleName: {\n fr_FR: \"PL/SQL\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n {\n entityUrn:\n \"urn:li:fsd_skill:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,1)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"385a1efc-4458-476e-a435-7569ec62dd5b\",\n },\n name: \"C++\",\n multiLocaleName: {\n fr_FR: \"C++\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill\",\n },\n ],\n },\n profileProjects: {\n paging: {\n total: 1,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileProjectsInjection\",\n elements: [\n {\n occupation: {\n profilePosition: {\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,757982648)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon517843535\",\n },\n },\n multiLocaleTitle: {\n fr_FR: \"Airbus - TMA projet divers\",\n },\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 10,\n year: 2016,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 2,\n year: 2017,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"387631f4-1f3b-41fb-8d81-cc7fe7096567\",\n },\n description:\n \"Projets :\\n- TMA sur une application (Java, C, CORBA).\\n- Migration de données (Java, SQL, Talend).\\n- Développement d’un plugin de connexion FTPS (java).\\n\\nMission :\\n- Chiffrage, maintenance et évolution d’une application.\\n- Analyse et création d’un prototype de migration de données.\\n- Recueil du besoin du client.\\n- Etude Fonctionnelle.\\n- Développement d’un plugin de transfert de donnée via le protocole FTPS.\\nEnvironnement technique :\\nWindows 7, Java, Eclipse, OpenSSL, Keytool, C, PRO-C, ORACLE SQL, Talend\",\n occupationUnion: {\n profilePosition:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,757982648)\",\n },\n title: \"Airbus - TMA projet divers\",\n entityUrn:\n \"urn:li:fsd_profileProject:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,420303925)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon610321565\",\n contributors: [\n {\n standardizedContributor: {\n profileUrn:\n \"urn:li:fsd_profile:ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.StandardizedContributor\",\n profile: {\n lastName: \"Gadreau\",\n memorialized: false,\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"3a86ae77-c0fe-43df-8663-7bd6145afe4a\",\n },\n firstName: \"Florent\",\n profilePicture: {\n a11yText: \"Florent Gadreau\",\n displayImageReference: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E03AQHTXLMcbyvcaA/profile-displayphoto-shrink_\",\n artifacts: [\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/profile-displayphoto-shrink_100_100/0/1677553377218?e=1763596800&v=beta&t=gam7S7kWHN8EplxJR0Qgv6GGucpYrbucRG66349rSrQ\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/profile-displayphoto-shrink_200_200/0/1677553377218?e=1763596800&v=beta&t=pAFGhovwqkG03xi3G1lOmZ3FCl_ILzGB8K5SgxcM4Vc\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/profile-displayphoto-shrink_400_400/0/1677553377218?e=1763596800&v=beta&t=L5Py7uatZUalgHp-dxrk6FfqTSELCn8Cw33A41sNxbc\",\n expiresAt: 1763596800000,\n height: 400,\n },\n {\n width: 560,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"800_800/profile-displayphoto-shrink_800_800/0/1677553377218?e=1763596800&v=beta&t=yGwffZ6As8XofKgWtO3PCu6BBOleipRLzJCjvuFzNiw\",\n expiresAt: 1763596800000,\n height: 560,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.ProfilePhotoDecoSpecReadOnlyProfilePicture\",\n displayImageUrn:\n \"urn:li:digitalmediaAsset:D4E03AQHTXLMcbyvcaA\",\n },\n entityUrn:\n \"urn:li:fsd_profile:ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho\",\n memberRelationship: {\n memberRelationshipUnion: {\n noConnection: {\n memberDistance: \"OUT_OF_NETWORK\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.relationships.NoConnection\",\n invitationUnion: {\n noInvitation: {\n inviter:\n \"urn:li:fsd_profile:ACoAABrVHuMBRCnqjgiNThyBf4eRn_jHZxpbYYs\",\n targetInviteeResolutionResult: {\n lastName: \"Gadreau\",\n memorialized: false,\n $anti_abuse_metadata: {\n $anti_abuse_uuid:\n \"5910b41c-3717-4d3a-a481-c8b48e674e30\",\n },\n firstName: \"Florent\",\n entityUrn:\n \"urn:li:fsd_profile:ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.relationships.ProfileWithEmailRequired\",\n publicIdentifier: \"florentgadreau\",\n emailRequired: false,\n headline:\n \"Fullstack Software Engineer | Software Technical Lead\",\n },\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1031101697\",\n targetInvitee:\n \"urn:li:fsd_profile:ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho\",\n inviterResolutionResult: {\n lastName: \"zh\",\n memorialized: false,\n $anti_abuse_metadata: {\n $anti_abuse_uuid:\n \"018fe065-e249-4cb5-8105-69fd7102eb40\",\n },\n iweWarned: false,\n firstName: \"nova\",\n entityUrn:\n \"urn:li:fsd_profile:ACoAABrVHuMBRCnqjgiNThyBf4eRn_jHZxpbYYs\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.relationships.ProfileWithIweWarned\",\n publicIdentifier: \"nova-zh-917919106\",\n headline: \"manager\",\n },\n },\n },\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.relationships.MemberRelationshipV2ForInjection\",\n memberRelationshipData: {\n noInvitation: {\n inviter:\n \"urn:li:fsd_profile:ACoAABrVHuMBRCnqjgiNThyBf4eRn_jHZxpbYYs\",\n targetInviteeResolutionResult: {\n lastName: \"Gadreau\",\n memorialized: false,\n $anti_abuse_metadata: {\n $anti_abuse_uuid:\n \"5910b41c-3717-4d3a-a481-c8b48e674e30\",\n },\n firstName: \"Florent\",\n entityUrn:\n \"urn:li:fsd_profile:ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.relationships.ProfileWithEmailRequired\",\n publicIdentifier: \"florentgadreau\",\n emailRequired: false,\n headline:\n \"Fullstack Software Engineer | Software Technical Lead\",\n },\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1031101697\",\n targetInvitee:\n \"urn:li:fsd_profile:ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho\",\n inviterResolutionResult: {\n lastName: \"zh\",\n memorialized: false,\n $anti_abuse_metadata: {\n $anti_abuse_uuid:\n \"018fe065-e249-4cb5-8105-69fd7102eb40\",\n },\n iweWarned: false,\n firstName: \"nova\",\n entityUrn:\n \"urn:li:fsd_profile:ACoAABrVHuMBRCnqjgiNThyBf4eRn_jHZxpbYYs\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.relationships.ProfileWithIweWarned\",\n publicIdentifier: \"nova-zh-917919106\",\n headline: \"manager\",\n },\n },\n },\n entityUrn:\n \"urn:li:fsd_memberRelationship:ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.MiniProfile\",\n publicIdentifier: \"florentgadreau\",\n headline:\n \"Fullstack Software Engineer | Software Technical Lead\",\n },\n },\n },\n ],\n multiLocaleDescription: {\n fr_FR:\n \"Projets :\\n- TMA sur une application (Java, C, CORBA).\\n- Migration de données (Java, SQL, Talend).\\n- Développement d’un plugin de connexion FTPS (java).\\n\\nMission :\\n- Chiffrage, maintenance et évolution d’une application.\\n- Analyse et création d’un prototype de migration de données.\\n- Recueil du besoin du client.\\n- Etude Fonctionnelle.\\n- Développement d’un plugin de transfert de donnée via le protocole FTPS.\\nEnvironnement technique :\\nWindows 7, Java, Eclipse, OpenSSL, Keytool, C, PRO-C, ORACLE SQL, Talend\",\n },\n },\n ],\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileWithEntities\",\n multiLocaleHeadline: {\n fr_FR: \"Fullstack Software Engineer | Software Technical Lead\",\n },\n profileHonors: {\n paging: {\n total: 0,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileHonorsInjection\",\n elements: [],\n },\n lastName: \"Gadreau\",\n memorialized: false,\n profilePatents: {\n paging: {\n total: 0,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePatentsInjection\",\n elements: [],\n },\n showPremiumSubscriberBadge: false,\n industry: {\n name: \"Computer Software\",\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:4\",\n },\n geoLocationBackfilled: false,\n profileTestScores: {\n paging: {\n total: 0,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTestScoresInjection\",\n elements: [],\n },\n multiLocaleFullNamePronunciationAudio: {},\n premium: false,\n influencer: false,\n entityUrn: \"urn:li:fsd_profile:ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho\",\n profileLanguages: {\n paging: {\n total: 3,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileLanguagesInjection\",\n elements: [\n {\n entityUrn:\n \"urn:li:fsd_profileLanguage:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,3)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"88e95595-ee63-4207-887c-3b4dc434c53c\",\n },\n name: \"Anglais\",\n multiLocaleName: {\n fr_FR: \"Anglais\",\n },\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon608483337\",\n proficiency: \"PROFESSIONAL_WORKING\",\n },\n {\n entityUrn:\n \"urn:li:fsd_profileLanguage:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"af5f23e5-c269-43fb-ad1b-77c5f79f1d12\",\n },\n name: \"Espagnol\",\n multiLocaleName: {\n fr_FR: \"Espagnol\",\n },\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon608483337\",\n proficiency: \"PROFESSIONAL_WORKING\",\n },\n {\n entityUrn:\n \"urn:li:fsd_profileLanguage:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,1)\",\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"d6030287-e9cd-4021-96bb-68a9a8b5b8a1\",\n },\n name: \"Français\",\n multiLocaleName: {\n fr_FR: \"Français\",\n },\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon608483337\",\n proficiency: \"NATIVE_OR_BILINGUAL\",\n },\n ],\n },\n headline: \"Fullstack Software Engineer | Software Technical Lead\",\n summary:\n \"Je suis un passionné de mon métier et toujours en quête d'apprentissage et connaissance nouvelle.\\n\\nDiplômé en Architecture et Ingénierie du Logiciel et du Web, j’ai développé durant ma carrière de solides compétences dans les technologies Web, aussi bien en Frontend, Backend et process DevOps.\\n\\nMon expertise s’articule autour de la conception, du développement, de l'architecture logicielle et de l'intégration continue.\\n\\nMon expérience acquise me permet de répondre efficacement à tous les types de projets, de garantir des résultats de qualité de manière optimal\",\n creator: true,\n profileCourses: {\n paging: {\n total: 0,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileCoursesInjection\",\n elements: [],\n },\n supportedLocales: [\n {\n country: \"FR\",\n language: \"fr\",\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Locale\",\n },\n ],\n educationOnProfileTopCardShown: true,\n industryUrn: \"urn:li:fsd_industry:4\",\n profilePositionGroups: {\n paging: {\n total: 6,\n start: 0,\n count: 10,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionGroupsInjection\",\n elements: [\n {\n entityUrn:\n \"urn:li:fsd_profilePositionGroup:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,822e789ca7a38ecf212e8696ce779472da967e10)\",\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 9,\n year: 2023,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Edusign\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"9bf4aa8f-3e81-4721-8dba-3c6984e8e543\",\n },\n companyName: \"Edusign\",\n profilePositionInPositionGroup: {\n paging: {\n total: 2,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionsInGroup\",\n elements: [\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 3,\n year: 2024,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Edusign\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"ce99d6fa-c183-49e1-8bcf-22395285fc02\",\n },\n companyName: \"Edusign\",\n title: \"Software Technical Lead\",\n companyUrn: \"urn:li:fsd_company:34635039\",\n employmentTypeUrn: \"urn:li:fsd_employmentType:12\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2363264751)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Paris, fr\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:4\": {\n name: \"Computer Software\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:4\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:4\"],\n url: \"https://www.linkedin.com/company/edusign/\",\n employeeCountRange: {\n start: 11,\n end: 50,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:34635039\",\n name: \"Edusign\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E0BAQGZe_guvaFAsA/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1695796168179/edusign_logo?e=1763596800&v=beta&t=chizSM_RcBhjU8ipgODGn9mPhXdQHUYKSd0xzXJGGWA\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1695796168179/edusign_logo?e=1763596800&v=beta&t=1SjAedr0o-ZirYY0BrkiKDQptcnTyfsNU5dxZJ5gHgY\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1695796168179/edusign_logo?e=1763596800&v=beta&t=ARquS6ZXyPOdzLRS9iXeKRp5gbPq3EkPVRHoxo7dNkA\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"edusign\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Paris, fr\",\n multiLocaleTitle: {\n fr_FR: \"Software Technical Lead\",\n },\n employmentType: {\n name: \"Full-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:12\",\n companyNameRequired: true,\n },\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n geoLocationName: \"Paris, fr\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n multiLocaleLocationName: {\n fr_FR: \"Paris, fr\",\n },\n },\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 9,\n year: 2023,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 3,\n year: 2024,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Edusign\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"e88d5228-8de5-4a1c-8c54-5e26a468b08b\",\n },\n companyName: \"Edusign\",\n title: \"Senior Software Engineer\",\n companyUrn: \"urn:li:fsd_company:34635039\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:108924708\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n employmentTypeUrn: \"urn:li:fsd_employmentType:12\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2252204349)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Saint-Pierre, La Réunion\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:4\": {\n name: \"Computer Software\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:4\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:4\"],\n url: \"https://www.linkedin.com/company/edusign/\",\n employeeCountRange: {\n start: 11,\n end: 50,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:34635039\",\n name: \"Edusign\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E0BAQGZe_guvaFAsA/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1695796168179/edusign_logo?e=1763596800&v=beta&t=chizSM_RcBhjU8ipgODGn9mPhXdQHUYKSd0xzXJGGWA\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1695796168179/edusign_logo?e=1763596800&v=beta&t=1SjAedr0o-ZirYY0BrkiKDQptcnTyfsNU5dxZJ5gHgY\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1695796168179/edusign_logo?e=1763596800&v=beta&t=ARquS6ZXyPOdzLRS9iXeKRp5gbPq3EkPVRHoxo7dNkA\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"edusign\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Saint-Pierre, La Réunion\",\n multiLocaleTitle: {\n fr_FR: \"Senior Software Engineer\",\n },\n employmentType: {\n name: \"Full-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:12\",\n companyNameRequired: true,\n },\n geoUrn: \"urn:li:fsd_geo:108924708\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(re,0)\",\n geoLocationName: \"Saint-Pierre, La Réunion\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(re,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Saint-Pierre, La Réunion\",\n },\n sourceOfHireType: \"OTHER_JOB_SITES\",\n },\n ],\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:4\": {\n name: \"Computer Software\",\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:4\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:4\"],\n url: \"https://www.linkedin.com/company/edusign/\",\n employeeCountRange: {\n start: 11,\n end: 50,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:34635039\",\n name: \"Edusign\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E0BAQGZe_guvaFAsA/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1695796168179/edusign_logo?e=1763596800&v=beta&t=chizSM_RcBhjU8ipgODGn9mPhXdQHUYKSd0xzXJGGWA\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1695796168179/edusign_logo?e=1763596800&v=beta&t=1SjAedr0o-ZirYY0BrkiKDQptcnTyfsNU5dxZJ5gHgY\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1695796168179/edusign_logo?e=1763596800&v=beta&t=ARquS6ZXyPOdzLRS9iXeKRp5gbPq3EkPVRHoxo7dNkA\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"edusign\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionGroup\",\n companyUrn: \"urn:li:fsd_company:34635039\",\n },\n {\n entityUrn:\n \"urn:li:fsd_profilePositionGroup:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,d49305d79beade6a49a8edcd205e62bb3064aab7)\",\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 11,\n year: 2019,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 9,\n year: 2023,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Demand Side Instruments\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"d67270da-f633-4d7f-981c-6eda74eebc41\",\n },\n companyName: \"Demand Side Instruments\",\n profilePositionInPositionGroup: {\n paging: {\n total: 2,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionsInGroup\",\n elements: [\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 1,\n year: 2021,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 9,\n year: 2023,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Demand Side Instruments\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"830c8c1a-b5a6-41e2-a087-904c4aa00d53\",\n },\n companyName: \"Demand Side Instruments\",\n description:\n \"Chez Demand Side, nous imaginons et concevons des solutions innovantes sur-mesure pour permettre aux écosystèmes urbains ou ruraux de s’adapter aux changements climatiques et de les atténuer en s’appuyant sur les nouvelles technologies de l’information et de la communication.\\n\\nProjets :\\n - Refonte d'une application web - Configuration, maintenance et traitement des données d'un parc IoT\\n - Refonte d'une application embarqué - Gateway IoT multiprotocalaire\\n - Application de Configuration et Préparation d'objet IoT\\n\\nMission :\\n - Animation/Accompagnement de l'équipe Web et Mobile (NodeJS) (5 personnes)\\n - Animation/Accompagnement de l'équipe Embarqué (Go / Python / C) (6 personnes)\\n - Etude et Conception (Domain Driven Design / Clean Architecture)\\n - Architecture/Infrastructure Cloud (pipeline de données / Serverless / Metrics)\\n - Code Review / Peer programming\\n - Mise en place des pratiques DevOps (CICD / IaaC / Monitoring)\\n - Développement de Bot Slack pour fluidifier les échanges inter service\\n - Management de proximité équipe Réunion (entretiens annuels, suivi d'objectifs, accompagnement...)\",\n title: \"Software Technical Lead\",\n companyUrn: \"urn:li:fsd_company:5377564\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:108924708\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n employmentTypeUrn: \"urn:li:fsd_employmentType:12\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2130825482)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Saint-Pierre, La Réunion\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:8\": {\n name: \"Telecommunications\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:8\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:8\"],\n url: \"https://www.linkedin.com/company/demand-side-instruments/\",\n employeeCountRange: {\n start: 11,\n end: 50,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:5377564\",\n name: \"Demand Side Instruments\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQEvYBelnkXIDw/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1634205062819/demand_side_instruments_logo?e=1763596800&v=beta&t=_rLRXR1LahwXW-XNzmz6y1DM0K6s5WtKgsrUvhV4xS8\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1634205062819/demand_side_instruments_logo?e=1763596800&v=beta&t=0e-Skfvo-BVdjZ3yphf4c9AjflRy3fFY4p_nmfspdiM\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1634205062819/demand_side_instruments_logo?e=1763596800&v=beta&t=Y_IeSrYvzC9H1PxaGvbVpi5D3o2nBErtglXpuS1VzOk\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"demand-side-instruments\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Saint-Pierre, La Réunion\",\n multiLocaleTitle: {\n fr_FR: \"Software Technical Lead\",\n },\n employmentType: {\n name: \"Full-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:12\",\n companyNameRequired: true,\n },\n geoUrn: \"urn:li:fsd_geo:108924708\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(re,0)\",\n geoLocationName: \"Saint-Pierre, La Réunion\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(re,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleDescription: {\n fr_FR:\n \"Chez Demand Side, nous imaginons et concevons des solutions innovantes sur-mesure pour permettre aux écosystèmes urbains ou ruraux de s’adapter aux changements climatiques et de les atténuer en s’appuyant sur les nouvelles technologies de l’information et de la communication.\\n\\nProjets :\\n - Refonte d'une application web - Configuration, maintenance et traitement des données d'un parc IoT\\n - Refonte d'une application embarqué - Gateway IoT multiprotocalaire\\n - Application de Configuration et Préparation d'objet IoT\\n\\nMission :\\n - Animation/Accompagnement de l'équipe Web et Mobile (NodeJS) (5 personnes)\\n - Animation/Accompagnement de l'équipe Embarqué (Go / Python / C) (6 personnes)\\n - Etude et Conception (Domain Driven Design / Clean Architecture)\\n - Architecture/Infrastructure Cloud (pipeline de données / Serverless / Metrics)\\n - Code Review / Peer programming\\n - Mise en place des pratiques DevOps (CICD / IaaC / Monitoring)\\n - Développement de Bot Slack pour fluidifier les échanges inter service\\n - Management de proximité équipe Réunion (entretiens annuels, suivi d'objectifs, accompagnement...)\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Saint-Pierre, La Réunion\",\n },\n },\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 11,\n year: 2019,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 1,\n year: 2021,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Demand Side Instruments\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"7921d790-2914-4ad6-84cb-33e2f2642e27\",\n },\n companyName: \"Demand Side Instruments\",\n description:\n \"Projets :\\n - Maintenance d'une application web - Configuration, maintenance et traitement des données d'un parc IoT.\\n\\nMission :\\n - Etude et Conception\\n - DevOps - CI/CD - Script de contrôle / validation / automatisation\\n - Developpement Backend / Frontend\\n - Revue de code / Contrôle qualité\",\n title: \"Software Engineer\",\n companyUrn: \"urn:li:fsd_company:5377564\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:108924708\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n employmentTypeUrn: \"urn:li:fsd_employmentType:12\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2131148068)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Saint-Pierre, La Réunion\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:8\": {\n name: \"Telecommunications\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:8\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:8\"],\n url: \"https://www.linkedin.com/company/demand-side-instruments/\",\n employeeCountRange: {\n start: 11,\n end: 50,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:5377564\",\n name: \"Demand Side Instruments\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQEvYBelnkXIDw/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1634205062819/demand_side_instruments_logo?e=1763596800&v=beta&t=_rLRXR1LahwXW-XNzmz6y1DM0K6s5WtKgsrUvhV4xS8\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1634205062819/demand_side_instruments_logo?e=1763596800&v=beta&t=0e-Skfvo-BVdjZ3yphf4c9AjflRy3fFY4p_nmfspdiM\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1634205062819/demand_side_instruments_logo?e=1763596800&v=beta&t=Y_IeSrYvzC9H1PxaGvbVpi5D3o2nBErtglXpuS1VzOk\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"demand-side-instruments\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Saint-Pierre, La Réunion\",\n multiLocaleTitle: {\n fr_FR: \"Software Engineer\",\n },\n employmentType: {\n name: \"Full-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:12\",\n companyNameRequired: true,\n },\n geoUrn: \"urn:li:fsd_geo:108924708\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(re,0)\",\n geoLocationName: \"Saint-Pierre, La Réunion\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(re,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleDescription: {\n fr_FR:\n \"Projets :\\n - Maintenance d'une application web - Configuration, maintenance et traitement des données d'un parc IoT.\\n\\nMission :\\n - Etude et Conception\\n - DevOps - CI/CD - Script de contrôle / validation / automatisation\\n - Developpement Backend / Frontend\\n - Revue de code / Contrôle qualité\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Saint-Pierre, La Réunion\",\n },\n },\n ],\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:8\": {\n name: \"Telecommunications\",\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:8\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:8\"],\n url: \"https://www.linkedin.com/company/demand-side-instruments/\",\n employeeCountRange: {\n start: 11,\n end: 50,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:5377564\",\n name: \"Demand Side Instruments\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQEvYBelnkXIDw/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1634205062819/demand_side_instruments_logo?e=1763596800&v=beta&t=_rLRXR1LahwXW-XNzmz6y1DM0K6s5WtKgsrUvhV4xS8\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1634205062819/demand_side_instruments_logo?e=1763596800&v=beta&t=0e-Skfvo-BVdjZ3yphf4c9AjflRy3fFY4p_nmfspdiM\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1634205062819/demand_side_instruments_logo?e=1763596800&v=beta&t=Y_IeSrYvzC9H1PxaGvbVpi5D3o2nBErtglXpuS1VzOk\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"demand-side-instruments\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionGroup\",\n companyUrn: \"urn:li:fsd_company:5377564\",\n },\n {\n entityUrn:\n \"urn:li:fsd_profilePositionGroup:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,e0f3cd67a9f65b91084e0a19aeb5699f4a8514f7)\",\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 10,\n year: 2016,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 9,\n year: 2019,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Groupe Koncept Komet\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"0fc0c3c9-0bbe-43ec-8060-77e5ab2bfcb8\",\n },\n companyName: \"Groupe Koncept Komet\",\n profilePositionInPositionGroup: {\n paging: {\n total: 6,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionsInGroup\",\n elements: [\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 6,\n year: 2018,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 9,\n year: 2019,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Groupe Koncept Komet\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"42dcd9ef-ef20-46b8-9f63-2bcbc965ece8\",\n },\n companyName: \"Groupe Koncept Komet\",\n description:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - Projet en Agile sur une application avec architecture microservice\\n - Conception et Développement Back-end et Front-end\\n\\nMission :\\n - Etude et Conception Architecture microservice\\n - Chiffrage, maintenance et évolution de l’application\\n - Gestion d'équipe / Respect de la conduite Agile du projet\\n - Définition et priorisation des taches\\n - Echange client / PO\\n - DevOps\\n - Développement Back-end / Front-end\\n - Revue de code / Contrôle qualité\",\n title: \"Software Technical Lead\",\n companyUrn: \"urn:li:fsd_company:28151802\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:105073465\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2131738774)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:96\": {\n name: \"Information Technology & Services\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:96\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:96\"],\n url: \"https://www.linkedin.com/company/konceptkomet/\",\n employeeCountRange: {\n start: 51,\n end: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:28151802\",\n name: \"Groupe Koncept Komet\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQG7ofkqq1sxog/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=0wYUakFbBlXosgyBVjmasjvRO3526mTNXYB972Dj94U\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=3YnFcCioKlE4YyUVKXea41F74xxZ-f2_Z_6awTufdVY\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=Ta4BHqwnyVJw6rOVX9Uo0jpSTwHKtJ4euRVNZs540u4\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"konceptkomet\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Toulouse, Occitanie, France\",\n multiLocaleTitle: {\n fr_FR: \"Software Technical Lead\",\n },\n geoUrn: \"urn:li:fsd_geo:105073465\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(fr,0)\",\n geoLocationName: \"Toulouse, Occitanie, France\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(fr,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleDescription: {\n fr_FR:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - Projet en Agile sur une application avec architecture microservice\\n - Conception et Développement Back-end et Front-end\\n\\nMission :\\n - Etude et Conception Architecture microservice\\n - Chiffrage, maintenance et évolution de l’application\\n - Gestion d'équipe / Respect de la conduite Agile du projet\\n - Définition et priorisation des taches\\n - Echange client / PO\\n - DevOps\\n - Développement Back-end / Front-end\\n - Revue de code / Contrôle qualité\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n },\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 2,\n year: 2018,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 6,\n year: 2018,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Groupe Koncept Komet\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"21c85b19-5ead-4ab8-bbbc-4e4bee432bc0\",\n },\n companyName: \"Groupe Koncept Komet\",\n description:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - Projet en Agile sur une application avec architecture microservice\\n - Développement Back-end et Front-end\\n\\nMission :\\n - Étude Fonctionnelle.\\n - Chiffrage, maintenance et évolution de l’application (Back-end / Front-end).\\n - Développement Back-end (microservice en Typscript sur server node) / API / Front-end (Angular 2+)\\n - Script SQL.\\n - Revue de code, conception pour l’équipe Indienne.\",\n title: \"Lead Software Engineer\",\n companyUrn: \"urn:li:fsd_company:28151802\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:105073465\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n employmentTypeUrn: \"urn:li:fsd_employmentType:12\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2131734897)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:96\": {\n name: \"Information Technology & Services\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:96\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:96\"],\n url: \"https://www.linkedin.com/company/konceptkomet/\",\n employeeCountRange: {\n start: 51,\n end: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:28151802\",\n name: \"Groupe Koncept Komet\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQG7ofkqq1sxog/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=0wYUakFbBlXosgyBVjmasjvRO3526mTNXYB972Dj94U\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=3YnFcCioKlE4YyUVKXea41F74xxZ-f2_Z_6awTufdVY\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=Ta4BHqwnyVJw6rOVX9Uo0jpSTwHKtJ4euRVNZs540u4\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"konceptkomet\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Toulouse, Occitanie, France\",\n multiLocaleTitle: {\n fr_FR: \"Lead Software Engineer\",\n },\n employmentType: {\n name: \"Full-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:12\",\n companyNameRequired: true,\n },\n geoUrn: \"urn:li:fsd_geo:105073465\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(fr,0)\",\n geoLocationName: \"Toulouse, Occitanie, France\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(fr,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleDescription: {\n fr_FR:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - Projet en Agile sur une application avec architecture microservice\\n - Développement Back-end et Front-end\\n\\nMission :\\n - Étude Fonctionnelle.\\n - Chiffrage, maintenance et évolution de l’application (Back-end / Front-end).\\n - Développement Back-end (microservice en Typscript sur server node) / API / Front-end (Angular 2+)\\n - Script SQL.\\n - Revue de code, conception pour l’équipe Indienne.\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n },\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 10,\n year: 2017,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 1,\n year: 2018,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Groupe Koncept Komet\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"bf28730c-47a8-4f50-b1d0-bf127302714d\",\n },\n companyName: \"Groupe Koncept Komet\",\n description:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - Projet en Agile sur une application Windows RT (C#, XAML) Win 8.1\\n - Evolution Back-end et Front-end\\n\\nMission :\\n - Étude Fonctionnelle\\n - Rédaction de dossiers de spécification\\n - Chiffrage, maintenance et évolution de l’application (Back-end / Front-end)\\n - Amélioration des performances et rafraichissement graphique Front-end\\n - Convertisseur RTF -> HTML / HTML -> RTF\\n - Edition de UserControls (contrôle utilisateur personnalisé)\",\n title: \"Software Engineer\",\n companyUrn: \"urn:li:fsd_company:28151802\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:105073465\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n employmentTypeUrn: \"urn:li:fsd_employmentType:12\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2131736619)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:96\": {\n name: \"Information Technology & Services\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:96\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:96\"],\n url: \"https://www.linkedin.com/company/konceptkomet/\",\n employeeCountRange: {\n start: 51,\n end: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:28151802\",\n name: \"Groupe Koncept Komet\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQG7ofkqq1sxog/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=0wYUakFbBlXosgyBVjmasjvRO3526mTNXYB972Dj94U\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=3YnFcCioKlE4YyUVKXea41F74xxZ-f2_Z_6awTufdVY\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=Ta4BHqwnyVJw6rOVX9Uo0jpSTwHKtJ4euRVNZs540u4\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"konceptkomet\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Toulouse, Occitanie, France\",\n multiLocaleTitle: {\n fr_FR: \"Software Engineer\",\n },\n employmentType: {\n name: \"Full-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:12\",\n companyNameRequired: true,\n },\n geoUrn: \"urn:li:fsd_geo:105073465\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(fr,0)\",\n geoLocationName: \"Toulouse, Occitanie, France\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(fr,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleDescription: {\n fr_FR:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - Projet en Agile sur une application Windows RT (C#, XAML) Win 8.1\\n - Evolution Back-end et Front-end\\n\\nMission :\\n - Étude Fonctionnelle\\n - Rédaction de dossiers de spécification\\n - Chiffrage, maintenance et évolution de l’application (Back-end / Front-end)\\n - Amélioration des performances et rafraichissement graphique Front-end\\n - Convertisseur RTF -> HTML / HTML -> RTF\\n - Edition de UserControls (contrôle utilisateur personnalisé)\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n },\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 5,\n year: 2017,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 9,\n year: 2017,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Groupe Koncept Komet\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"1566042a-6726-48f2-8abd-d169cd29db97\",\n },\n companyName: \"Groupe Koncept Komet\",\n description:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - Projet en Agile sur une application JAVA (Java, GWT, Hibernate, XML).\\n - Revue de code (Java, SonarCube).\\nMission :\\n - Recueil du besoin du client.\\n - Étude Fonctionnelle.\\n - Rédaction de dossiers de spécification/test.\\n - Chiffrage, maintenance et évolution de l’application.\\n - Application de la méthode Agile SCRUM.\",\n title: \"Software Engineer\",\n companyUrn: \"urn:li:fsd_company:28151802\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:105073465\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n employmentTypeUrn: \"urn:li:fsd_employmentType:12\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2131738411)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:96\": {\n name: \"Information Technology & Services\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:96\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:96\"],\n url: \"https://www.linkedin.com/company/konceptkomet/\",\n employeeCountRange: {\n start: 51,\n end: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:28151802\",\n name: \"Groupe Koncept Komet\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQG7ofkqq1sxog/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=0wYUakFbBlXosgyBVjmasjvRO3526mTNXYB972Dj94U\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=3YnFcCioKlE4YyUVKXea41F74xxZ-f2_Z_6awTufdVY\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=Ta4BHqwnyVJw6rOVX9Uo0jpSTwHKtJ4euRVNZs540u4\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"konceptkomet\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Toulouse, Occitanie, France\",\n multiLocaleTitle: {\n fr_FR: \"Software Engineer\",\n },\n employmentType: {\n name: \"Full-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:12\",\n companyNameRequired: true,\n },\n geoUrn: \"urn:li:fsd_geo:105073465\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(fr,0)\",\n geoLocationName: \"Toulouse, Occitanie, France\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(fr,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleDescription: {\n fr_FR:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - Projet en Agile sur une application JAVA (Java, GWT, Hibernate, XML).\\n - Revue de code (Java, SonarCube).\\nMission :\\n - Recueil du besoin du client.\\n - Étude Fonctionnelle.\\n - Rédaction de dossiers de spécification/test.\\n - Chiffrage, maintenance et évolution de l’application.\\n - Application de la méthode Agile SCRUM.\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n },\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 3,\n year: 2017,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 5,\n year: 2017,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Groupe Koncept Komet\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"4cd45ca9-ab8f-4812-ad1e-9f261acd3f7e\",\n },\n companyName: \"Groupe Koncept Komet\",\n description:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - Migration de données par conversion XSLT (Java, XML, XSLT, Talend)\\n - Revue de code (Java, SonarCube)\\nMission :\\n - Recueil du besoin du client.\\n - Etude Fonctionnelle.\\n - Chiffrage, maintenance et évolution de l’application de migration\\n - Développement de composant Talend\\n - Conversion de donnée XML via XSLT\",\n title: \"Software Engineer\",\n companyUrn: \"urn:li:fsd_company:28151802\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:105073465\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n employmentTypeUrn: \"urn:li:fsd_employmentType:12\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2131734546)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:96\": {\n name: \"Information Technology & Services\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:96\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:96\"],\n url: \"https://www.linkedin.com/company/konceptkomet/\",\n employeeCountRange: {\n start: 51,\n end: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:28151802\",\n name: \"Groupe Koncept Komet\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQG7ofkqq1sxog/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=0wYUakFbBlXosgyBVjmasjvRO3526mTNXYB972Dj94U\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=3YnFcCioKlE4YyUVKXea41F74xxZ-f2_Z_6awTufdVY\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=Ta4BHqwnyVJw6rOVX9Uo0jpSTwHKtJ4euRVNZs540u4\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"konceptkomet\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Toulouse, Occitanie, France\",\n multiLocaleTitle: {\n fr_FR: \"Software Engineer\",\n },\n employmentType: {\n name: \"Full-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:12\",\n companyNameRequired: true,\n },\n geoUrn: \"urn:li:fsd_geo:105073465\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(fr,0)\",\n geoLocationName: \"Toulouse, Occitanie, France\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(fr,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleDescription: {\n fr_FR:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - Migration de données par conversion XSLT (Java, XML, XSLT, Talend)\\n - Revue de code (Java, SonarCube)\\nMission :\\n - Recueil du besoin du client.\\n - Etude Fonctionnelle.\\n - Chiffrage, maintenance et évolution de l’application de migration\\n - Développement de composant Talend\\n - Conversion de donnée XML via XSLT\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n },\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 10,\n year: 2016,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 2,\n year: 2017,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Koncept - Komet Groupe\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"a9799ab0-02ea-435e-bb2a-4ff007627c39\",\n },\n companyName: \"Koncept - Komet Groupe\",\n description:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - TMA sur une application (Java, C, CORBA)\\n - Migration de données (Java, SQL, Talend)\\n - Développement d’un plugin de connexion FTPS (java)\\n\\nMission :\\n - Chiffrage, maintenance et évolution d’une application.\\n - Analyse et création d’un prototype de migration de données.\\n - Recueil du besoin du client.\\n - Etude Fonctionnelle.\\n - Développement d’un plugin de transfert de donnée via le protocole FTPS.\",\n title: \"Software Engineer\",\n companyUrn: \"urn:li:fsd_company:28151802\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:105073465\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n employmentTypeUrn: \"urn:li:fsd_employmentType:12\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,757982648)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:96\": {\n name: \"Information Technology & Services\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:96\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:96\"],\n url: \"https://www.linkedin.com/company/konceptkomet/\",\n employeeCountRange: {\n start: 51,\n end: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:28151802\",\n name: \"Groupe Koncept Komet\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQG7ofkqq1sxog/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=0wYUakFbBlXosgyBVjmasjvRO3526mTNXYB972Dj94U\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=3YnFcCioKlE4YyUVKXea41F74xxZ-f2_Z_6awTufdVY\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=Ta4BHqwnyVJw6rOVX9Uo0jpSTwHKtJ4euRVNZs540u4\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"konceptkomet\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Toulouse, Occitanie, France\",\n multiLocaleTitle: {\n fr_FR: \"Software Engineer\",\n },\n employmentType: {\n name: \"Full-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:12\",\n companyNameRequired: true,\n },\n geoUrn: \"urn:li:fsd_geo:105073465\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(fr,0)\",\n geoLocationName: \"Toulouse, Occitanie, France\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(fr,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleDescription: {\n fr_FR:\n \"KONCEPT pour SOPRA STERIA (client Airbus)\\n\\nProjets :\\n - TMA sur une application (Java, C, CORBA)\\n - Migration de données (Java, SQL, Talend)\\n - Développement d’un plugin de connexion FTPS (java)\\n\\nMission :\\n - Chiffrage, maintenance et évolution d’une application.\\n - Analyse et création d’un prototype de migration de données.\\n - Recueil du besoin du client.\\n - Etude Fonctionnelle.\\n - Développement d’un plugin de transfert de donnée via le protocole FTPS.\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n },\n ],\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:96\": {\n name: \"Information Technology & Services\",\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:96\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:96\"],\n url: \"https://www.linkedin.com/company/konceptkomet/\",\n employeeCountRange: {\n start: 51,\n end: 200,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:28151802\",\n name: \"Groupe Koncept Komet\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQG7ofkqq1sxog/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=0wYUakFbBlXosgyBVjmasjvRO3526mTNXYB972Dj94U\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=3YnFcCioKlE4YyUVKXea41F74xxZ-f2_Z_6awTufdVY\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1630503134963/komet_is_logo?e=1763596800&v=beta&t=Ta4BHqwnyVJw6rOVX9Uo0jpSTwHKtJ4euRVNZs540u4\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"konceptkomet\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionGroup\",\n companyUrn: \"urn:li:fsd_company:28151802\",\n },\n {\n entityUrn:\n \"urn:li:fsd_profilePositionGroup:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,5b5ba1c4d2927e1c0a9832c08d26f0543a73ebdc)\",\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 12,\n year: 2015,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 12,\n year: 2015,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Observatoir Regional de la Santé\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"6e85621e-4014-4850-b071-15ef9cb3f788\",\n },\n companyName: \"Observatoir Regional de la Santé\",\n profilePositionInPositionGroup: {\n paging: {\n total: 1,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionsInGroup\",\n elements: [\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 12,\n year: 2015,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 12,\n year: 2015,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Observatoir Regional de la Santé\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"529dd93d-18c4-4258-a554-72da046ba91f\",\n },\n companyName: \"Observatoir Regional de la Santé\",\n description:\n \"Projet :\\n - Développement du site de recensement des publications de l’ORS.\\n\\nMission :\\n - Recueil du besoin du client.\\n - Etude Fonctionnelle.\\n - Utilisation du CMS Wordpress.\\n - Création d’un Template personnalisé.\\n - Développement d’un module Javascript pour recenser les profils de santé sur une\\ncarte interactive.\",\n title: \"Software Developer\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:105073465\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n employmentTypeUrn: \"urn:li:fsd_employmentType:18\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2131738091)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Toulouse, Occitanie, France\",\n multiLocaleTitle: {\n fr_FR: \"Software Developer\",\n },\n employmentType: {\n name: \"Internship\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:18\",\n companyNameRequired: true,\n },\n geoUrn: \"urn:li:fsd_geo:105073465\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(fr,0)\",\n geoLocationName: \"Toulouse, Occitanie, France\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(fr,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleDescription: {\n fr_FR:\n \"Projet :\\n - Développement du site de recensement des publications de l’ORS.\\n\\nMission :\\n - Recueil du besoin du client.\\n - Etude Fonctionnelle.\\n - Utilisation du CMS Wordpress.\\n - Création d’un Template personnalisé.\\n - Développement d’un module Javascript pour recenser les profils de santé sur une\\ncarte interactive.\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n },\n ],\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionGroup\",\n },\n {\n entityUrn:\n \"urn:li:fsd_profilePositionGroup:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,e5c6a153131544bff9a92b944de58002b02bdf77)\",\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 2,\n year: 2013,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 1,\n year: 2015,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Artec\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"d5b4f4ae-7910-469b-9e41-4e832b2968aa\",\n },\n companyName: \"Artec\",\n profilePositionInPositionGroup: {\n paging: {\n total: 1,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionsInGroup\",\n elements: [\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 2,\n year: 2013,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 1,\n year: 2015,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Artec\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"c8d9bfb1-9302-4730-b78a-f22ac771aacb\",\n },\n companyName: \"Artec\",\n description:\n \"- Développer et apporter une assistance commerciale auprès des professionnels et\\nparticuliers.\\n- Définir et argumenter une assistance technique auprès de particuliers.\\n- Développement Intranet / Extranet / Site Vitrine :\\n * Recueil des besoins des utilisateurs.\\n * Développement des solutions en PHP, HTML5 et CCS3.\",\n title: \"Agent de Contact Clients\",\n employmentTypeUrn: \"urn:li:fsd_employmentType:12\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,654045324)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"labege\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"labege\",\n multiLocaleTitle: {\n fr_FR: \"Agent de Contact Clients\",\n },\n employmentType: {\n name: \"Full-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:12\",\n companyNameRequired: true,\n },\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n geoLocationName: \"labege\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n multiLocaleDescription: {\n fr_FR:\n \"- Développer et apporter une assistance commerciale auprès des professionnels et\\nparticuliers.\\n- Définir et argumenter une assistance technique auprès de particuliers.\\n- Développement Intranet / Extranet / Site Vitrine :\\n * Recueil des besoins des utilisateurs.\\n * Développement des solutions en PHP, HTML5 et CCS3.\",\n },\n multiLocaleLocationName: {\n fr_FR: \"labege\",\n },\n },\n ],\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionGroup\",\n },\n {\n entityUrn:\n \"urn:li:fsd_profilePositionGroup:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,f785efccdf13a7b99680b5aea12eb3fb9aa737c1)\",\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 8,\n year: 2013,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 12,\n year: 2014,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Infomil\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"90a141a0-3665-4dd0-880a-138d92abaf2b\",\n },\n companyName: \"Infomil\",\n profilePositionInPositionGroup: {\n paging: {\n total: 1,\n start: 0,\n count: 20,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionsInGroup\",\n elements: [\n {\n dateRange: {\n start: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 8,\n year: 2013,\n },\n end: {\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Date\",\n month: 12,\n year: 2014,\n },\n $recipeType: \"com.linkedin.voyager.dash.deco.common.DateRange\",\n },\n multiLocaleCompanyName: {\n fr_FR: \"Infomil\",\n },\n $anti_abuse_metadata: {\n $anti_abuse_uuid: \"f793a843-2cc6-4c9e-893f-696f4205d13b\",\n },\n companyName: \"Infomil\",\n description:\n \"- Contrôle de la conformité des visuels en rapport à la charte Drive Leclerc\\n- Élaboration des solutions d'amélioration de productivité\\n- Gestion et pilotage d'une équipe de deux photographes.\",\n title: \"Responsable Qualité Photo Drive\",\n companyUrn: \"urn:li:fsd_company:10598044\",\n geo: {\n entityUrn: \"urn:li:fsd_geo:105073465\",\n $recipeType:\n \"com.linkedin.deco.recipe.anonymous.Anon1271139837\",\n },\n employmentTypeUrn: \"urn:li:fsd_employmentType:11\",\n entityUrn:\n \"urn:li:fsd_profilePosition:(ACoAAA-jq0MB4zhC6Q7TBSbB0nrCcQuenyBzWho,2131733457)\",\n multiLocaleGeoLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:4\": {\n name: \"Computer Software\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:4\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:4\"],\n url: \"https://www.linkedin.com/company/infomil/\",\n employeeCountRange: {\n start: 501,\n end: 1000,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:10598044\",\n name: \"Infomil\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C560BAQHkHqq-rveGPg/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1631319488193?e=1763596800&v=beta&t=isGNpA-S4FChBd2DXTsnd4GhnJumv9g0j5pr30wV43U\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1631319488193?e=1763596800&v=beta&t=8yv9PA6EvhbayIeCCAqSDQhgtnGjdK79bsHBLzyHJR8\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1631319488193?e=1763596800&v=beta&t=1k7zl09LSF6X1awOV6uTfdqVhSeA7b2MNv0OBW3y_90\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"infomil\",\n },\n shouldShowSourceOfHireBadge: false,\n locationName: \"Toulouse, Occitanie, France\",\n multiLocaleTitle: {\n fr_FR: \"Responsable Qualité Photo Drive\",\n },\n employmentType: {\n name: \"Part-time\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.EmploymentType\",\n entityUrn: \"urn:li:fsd_employmentType:11\",\n companyNameRequired: true,\n },\n geoUrn: \"urn:li:fsd_geo:105073465\",\n profileTreasuryMediaPosition: {\n paging: {\n total: 0,\n start: 0,\n count: 10,\n links: [],\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfileTreasuryMediaItemsInjection\",\n elements: [],\n },\n regionUrn: \"urn:li:fsd_region:(fr,0)\",\n geoLocationName: \"Toulouse, Occitanie, France\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition\",\n region: {\n entityUrn: \"urn:li:fsd_region:(fr,0)\",\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon316625974\",\n },\n multiLocaleDescription: {\n fr_FR:\n \"- Contrôle de la conformité des visuels en rapport à la charte Drive Leclerc\\n- Élaboration des solutions d'amélioration de productivité\\n- Gestion et pilotage d'une équipe de deux photographes.\",\n },\n multiLocaleLocationName: {\n fr_FR: \"Toulouse, Occitanie, France\",\n },\n },\n ],\n },\n company: {\n industry: {\n \"urn:li:fsd_industry:4\": {\n name: \"Computer Software\",\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Industry\",\n entityUrn: \"urn:li:fsd_industry:4\",\n },\n },\n industryUrns: [\"urn:li:fsd_industry:4\"],\n url: \"https://www.linkedin.com/company/infomil/\",\n employeeCountRange: {\n start: 501,\n end: 1000,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.IntegerRange\",\n },\n entityUrn: \"urn:li:fsd_company:10598044\",\n name: \"Infomil\",\n logo: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C560BAQHkHqq-rveGPg/company-logo_\",\n artifacts: [\n {\n width: 200,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1631319488193?e=1763596800&v=beta&t=isGNpA-S4FChBd2DXTsnd4GhnJumv9g0j5pr30wV43U\",\n expiresAt: 1763596800000,\n height: 200,\n },\n {\n width: 100,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1631319488193?e=1763596800&v=beta&t=8yv9PA6EvhbayIeCCAqSDQhgtnGjdK79bsHBLzyHJR8\",\n expiresAt: 1763596800000,\n height: 100,\n },\n {\n width: 400,\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1631319488193?e=1763596800&v=beta&t=1k7zl09LSF6X1awOV6uTfdqVhSeA7b2MNv0OBW3y_90\",\n expiresAt: 1763596800000,\n height: 400,\n },\n ],\n },\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.LinkablePositionCompany\",\n universalName: \"infomil\",\n },\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.FullProfilePositionGroup\",\n companyUrn: \"urn:li:fsd_company:10598044\",\n },\n ],\n },\n coverPhotoItems: [],\n geoLocation: {\n geo: {\n countryUrn: \"urn:li:fsd_geo:104265812\",\n country: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.CountryGeo\",\n entityUrn: \"urn:li:fsd_geo:104265812\",\n defaultLocalizedName: \"Reunion\",\n },\n defaultLocalizedNameWithoutCountryName: \"Saint-Pierre, Saint-Pierre\",\n entityUrn: \"urn:li:fsd_geo:107646956\",\n $recipeType: \"com.linkedin.voyager.dash.deco.identity.profile.Geo\",\n defaultLocalizedName: \"Saint-Pierre, Saint-Pierre, Reunion\",\n },\n geoUrn: \"urn:li:fsd_geo:107646956\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.ProfileGeoLocation\",\n },\n profileRingStatusCollection: {\n paging: {\n start: 0,\n count: 10,\n links: [],\n $recipeType: \"com.linkedin.voyager.dash.deco.common.FullPaging\",\n },\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon1936086081\",\n elements: [],\n },\n location: {\n countryCode: \"re\",\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.ProfileLocation\",\n },\n backgroundPicture: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.identity.profile.ProfilePhotoDecoSpecEditableBackgroundPicture\",\n displayImageReference: {\n vectorImage: {\n $recipeType:\n \"com.linkedin.voyager.dash.deco.common.VectorImageOnlyRootUrlAndAttribution\",\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E16AQFLKsQ5v3bCPQ/profile-displaybackgroundimage-shrink_\",\n artifacts: [\n {\n width: 800,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"200_800/profile-displaybackgroundimage-shrink_200_800/0/1677653277146?e=1763596800&v=beta&t=tLvE4ortpzdSS3jlPIVmJJQ0_8DpnioRBaxxTDJ9twc\",\n expiresAt: 1763596800000,\n height: 199,\n },\n {\n width: 1400,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.VectorArtifact\",\n fileIdentifyingUrlPathSegment:\n \"350_1400/profile-displaybackgroundimage-shrink_350_1400/0/1677653277146?e=1763596800&v=beta&t=SQaCB_dahnr2l51beC4LLfq5ZDTdpMTS1E002NQuqe4\",\n expiresAt: 1763596800000,\n height: 349,\n },\n ],\n },\n },\n displayImageUrn: \"urn:li:digitalmediaAsset:D4E16AQFLKsQ5v3bCPQ\",\n photoFilterEditInfo: {\n bottomLeft: {\n x: 0,\n y: 0.9661616161616161,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Coordinate2DFull\",\n },\n vignette: 0,\n bottomRight: {\n x: 1,\n y: 0.9661616161616161,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Coordinate2DFull\",\n },\n topRight: {\n x: 1,\n y: 0.03383838383838384,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Coordinate2DFull\",\n },\n saturation: 0,\n brightness: 0,\n photoFilterType: \"ORIGINAL\",\n contrast: 0.01,\n topLeft: {\n x: 0,\n y: 0.03383838383838384,\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Coordinate2DFull\",\n },\n $recipeType: \"com.linkedin.deco.recipe.anonymous.Anon1309211116\",\n },\n },\n primaryLocale: {\n country: \"FR\",\n language: \"fr\",\n $recipeType: \"com.linkedin.voyager.dash.deco.common.Locale\",\n },\n};\n\nfunction createLinkedinHeaders(\n csrfToken: string,\n cookies?: Record<string, string> | string\n) {\n const headers: Record<string, string> = {\n \"csrf-token\": csrfToken,\n };\n if (cookies) {\n let c = \"\";\n if (typeof cookies === \"string\") {\n c = cookies;\n } else {\n c = Object.entries(cookies)\n .map(([key, value]) => `${key}=${value}`)\n .join(\"; \");\n }\n c && (headers[\"Cookie\"] = c);\n }\n return headers;\n}\n\n/**\n * decorationId: com.linkedin.voyager.dash.deco.identity.profile.FullProfileWithEntities-26\n * decorationId 便是 返回中的 $recipeType, 后面的 -26 或者其他数字,尚未了解有什么特别,目前 26 数据比较丰富\n * q: memberIdentity\n * memberIdentity: publicId\n * @param publicId Linkedin个人资料的公开ID\n * @returns Linkedin个人资料的装饰ID\n * 此方法返回的数据与lemlist一致\n */\nexport async function getLinkedinProfile(\n publicId: string,\n {\n csrfToken,\n cookies,\n }: {\n csrfToken: string;\n cookies?: Record<string, string> | string;\n }\n): Promise<typeof linkedinProfileExample | null> {\n const url = `${LinkedinApiUrl}/identity/dash/profiles?q=memberIdentity&memberIdentity=${publicId}&decorationId=com.linkedin.voyager.dash.deco.identity.profile.FullProfileWithEntities-26`;\n const headers = createLinkedinHeaders(csrfToken, cookies);\n return fetch(url, {\n method: \"GET\",\n headers,\n })\n .then(async (response) => {\n if (response.ok) {\n const data = await response.json();\n return data.elements?.[0] || null;\n }\n return null;\n })\n .catch((error) => {\n console.error(error);\n return null;\n });\n}\n\nconst linkedinCompanyExample = {\n groupedLocationsByCountry: [\n {\n localizedName: \"Amsterdam\",\n latLong: {\n latitude: 52.245632,\n longitude: 5.626918,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"NL\",\n geographicArea: \"North Holland\",\n city: \"Amsterdam\",\n headquarter: false,\n postalCode: \"1082 MD\",\n line1: \"Claude Debussylaan 34\",\n },\n ],\n },\n {\n localizedName: \"Australia\",\n latLong: {\n latitude: -25.728048,\n longitude: 134.49017,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"AU\",\n geographicArea: \"NSW\",\n city: \"Sydney\",\n headquarter: false,\n postalCode: \"2009\",\n line1: \"48 Pirrama Rd\",\n },\n {\n streetAddressOptOut: false,\n country: \"AU\",\n geographicArea: \"VIC\",\n city: \"Melbourne\",\n headquarter: false,\n postalCode: \"3000\",\n line1: \"90 Collins St\",\n },\n ],\n },\n {\n localizedName: \"Bogota\",\n latLong: {\n latitude: 4.099917,\n longitude: -72.90881,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"CO\",\n geographicArea: \"Bogota, D.C.\",\n city: \"Bogota\",\n headquarter: false,\n postalCode: \"110221\",\n line1: \"Carrera 11A 94-45\",\n },\n ],\n },\n {\n localizedName: \"Buenos Aires City\",\n latLong: {\n latitude: -34.9965,\n longitude: -64.967285,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"AR\",\n geographicArea: \"Buenos Aires Autonomous City\",\n city: \"Buenos Aires City\",\n headquarter: false,\n postalCode: \"1107\",\n line1: \"Avenida Alicia Moreau de Justo 350\",\n },\n ],\n },\n {\n localizedName: \"Canada\",\n latLong: {\n latitude: 62.57421,\n longitude: -96.60791,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"CA\",\n geographicArea: \"ON\",\n city: \"Kitchener\",\n headquarter: false,\n postalCode: \"N2H 5G5\",\n line1: \"51 Breithaupt St\",\n },\n {\n streetAddressOptOut: false,\n country: \"CA\",\n geographicArea: \"ON\",\n city: \"Toronto\",\n headquarter: false,\n postalCode: \"M5H 2G4\",\n line1: \"111 Richmond St W\",\n },\n ],\n },\n {\n localizedName: \"Dublin\",\n latLong: {\n latitude: 52.865196,\n longitude: -7.97946,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IE\",\n geographicArea: \"County Dublin\",\n city: \"Dublin\",\n headquarter: false,\n line1: \"Barrow Street\",\n },\n ],\n },\n {\n localizedName: \"Germany\",\n latLong: {\n latitude: 51.091988,\n longitude: 10.380809,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"DE\",\n geographicArea: \"BE\",\n city: \"Berlin\",\n headquarter: false,\n postalCode: \"10117\",\n line1: \"Unter den Linden 14\",\n },\n {\n streetAddressOptOut: false,\n country: \"DE\",\n geographicArea: \"BY\",\n city: \"Munich\",\n headquarter: false,\n postalCode: \"80636\",\n line1: \"Erika-Mann-Strasse 33\",\n },\n {\n streetAddressOptOut: false,\n country: \"DE\",\n geographicArea: \"HH\",\n city: \"Hamburg\",\n headquarter: false,\n postalCode: \"20354\",\n line1: \"ABC-Strasse 19\",\n },\n ],\n },\n {\n localizedName: \"India\",\n latLong: {\n latitude: 22.352509,\n longitude: 79.363686,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"HR\",\n city: \"Gurugram\",\n headquarter: false,\n postalCode: \"122001\",\n line1: \"15\",\n },\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"Karnataka\",\n city: \"Bengaluru\",\n headquarter: false,\n postalCode: \"560016\",\n line1: \"Old Madras Road\",\n },\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"Karnataka\",\n city: \"Bengaluru\",\n headquarter: false,\n postalCode: \"560016\",\n line1: \"3 Swamy Vivekananda Road\",\n },\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"Maharashtra\",\n city: \"Mumbai\",\n headquarter: false,\n postalCode: \"400051\",\n line1: \"3 Bandra Kurla Complex Road\",\n },\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"TS\",\n city: \"Hyderabad\",\n headquarter: false,\n postalCode: \"500084\",\n line1: \"13\",\n },\n ],\n },\n {\n localizedName: \"Las Condes\",\n latLong: {\n latitude: -31.761337,\n longitude: -71.31877,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"CL\",\n geographicArea: \"Santiago Metropolitan\",\n city: \"Las Condes\",\n headquarter: false,\n postalCode: \"7550000\",\n line1: \"Avenida Costanera Sur\",\n },\n ],\n },\n {\n localizedName: \"London\",\n latLong: {\n latitude: 53.943832,\n longitude: -2.550564,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"GB\",\n geographicArea: \"England\",\n city: \"London\",\n headquarter: false,\n postalCode: \"WC2H 8AG\",\n line1: \"St Giles High Street\",\n },\n ],\n },\n {\n localizedName: \"Miguel Hidalgo\",\n latLong: {\n latitude: 23.933592,\n longitude: -102.5097,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"MX\",\n geographicArea: \"CDMX\",\n city: \"Miguel Hidalgo\",\n headquarter: false,\n postalCode: \"11000\",\n line1: \"Montes Urales\",\n },\n ],\n },\n {\n localizedName: \"Milan\",\n latLong: {\n latitude: 43.52555,\n longitude: 12.160002,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IT\",\n geographicArea: \"Lomb.\",\n city: \"Milan\",\n headquarter: false,\n postalCode: \"20124\",\n line1: \"Via Federico Confalonieri, 4\",\n },\n ],\n },\n {\n localizedName: \"Paris\",\n latLong: {\n latitude: 46.62481,\n longitude: 2.458374,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"FR\",\n geographicArea: \"IdF\",\n city: \"Paris\",\n headquarter: false,\n postalCode: \"75009\",\n line1: \"8 Rue de Londres\",\n },\n ],\n },\n {\n localizedName: \"Sao Paulo\",\n latLong: {\n latitude: -10.333333,\n longitude: -53.2,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"BR\",\n geographicArea: \"SP\",\n city: \"Sao Paulo\",\n headquarter: false,\n postalCode: \"04538-133\",\n line1: \"Avenida Brigadeiro Faria Lima, 3477\",\n },\n ],\n },\n {\n localizedName: \"Singapore\",\n latLong: {\n latitude: 1.356523,\n longitude: 103.80859,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"SG\",\n geographicArea: \"Singapore\",\n city: \"Singapore\",\n headquarter: false,\n postalCode: \"118484\",\n line1: \"3 Pasir Panjang Rd\",\n },\n ],\n },\n {\n localizedName: \"Spain\",\n latLong: {\n latitude: 40.390106,\n longitude: -3.554367,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"ES\",\n geographicArea: \"Community of Madrid\",\n city: \"Madrid\",\n headquarter: false,\n postalCode: \"28046\",\n line1: \"Plaza Pablo Ruiz Picasso\",\n },\n {\n streetAddressOptOut: false,\n country: \"ES\",\n geographicArea: \"Community of Madrid\",\n city: \"Madrid\",\n headquarter: false,\n postalCode: \"28020\",\n line1: \"Plaza Pablo Ruiz Picasso\",\n },\n ],\n },\n {\n localizedName: \"Stockholm\",\n latLong: {\n latitude: 59.674973,\n longitude: 14.520859,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"SE\",\n geographicArea: \"Stockholm County\",\n city: \"Stockholm\",\n headquarter: false,\n postalCode: \"111 22\",\n line1: \"Kungsbron 2\",\n },\n ],\n },\n {\n localizedName: \"Taguig City\",\n latLong: {\n latitude: 15.947407,\n longitude: 121.42167,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"PH\",\n geographicArea: \"National Capital Region\",\n city: \"Taguig City\",\n headquarter: false,\n line1: \"5th Ave\",\n },\n ],\n },\n {\n localizedName: \"Tel Aviv-yafo\",\n latLong: {\n latitude: 30.812426,\n longitude: 34.859478,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IL\",\n geographicArea: \"Tel Aviv\",\n city: \"Tel Aviv-Yafo\",\n headquarter: false,\n postalCode: \"67891\",\n line1: \"Yigal Allon 98\",\n },\n ],\n },\n {\n localizedName: \"United States\",\n latLong: {\n latitude: 39.50357,\n longitude: -99.01834,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"Mountain View\",\n headquarter: true,\n postalCode: \"94043\",\n line1: \"1600 Amphitheatre Parkway\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"Irvine\",\n headquarter: false,\n postalCode: \"92612\",\n line1: \"19510 Jamboree Rd\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"Los Angeles\",\n headquarter: false,\n postalCode: \"90291\",\n line1: \"340 Main St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"San Bruno\",\n headquarter: false,\n postalCode: \"94066\",\n line1: \"901 Cherry Ave\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"San Francisco\",\n headquarter: false,\n postalCode: \"94105\",\n line1: \"345 Spear St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CO\",\n city: \"Boulder\",\n headquarter: false,\n postalCode: \"80302\",\n line1: \"2590 Pearl St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"DC\",\n city: \"Washington\",\n headquarter: false,\n postalCode: \"20001\",\n line1: \"25 Massachusetts Ave NW\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"GA\",\n city: \"Atlanta\",\n headquarter: false,\n postalCode: \"30309\",\n line1: \"10 10th St NE\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"IL\",\n city: \"Chicago\",\n headquarter: false,\n postalCode: \"60607\",\n line1: \"320 N Morgan St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"MA\",\n city: \"Cambridge\",\n headquarter: false,\n postalCode: \"02142\",\n line1: \"355 Main St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"MI\",\n city: \"Ann Arbor\",\n headquarter: false,\n postalCode: \"48105\",\n line1: \"2300 Traverwood Dr\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"NY\",\n city: \"New York\",\n headquarter: false,\n postalCode: \"10011\",\n line1: \"111 8th Ave\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"TX\",\n city: \"Austin\",\n headquarter: false,\n postalCode: \"78759\",\n line1: \"9606 N Mopac Expy\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"TX\",\n city: \"Frisco\",\n headquarter: false,\n postalCode: \"75034\",\n line1: \"6175 Main St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"VA\",\n city: \"Reston\",\n headquarter: false,\n postalCode: \"20190\",\n line1: \"1875 Explorer St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"WA\",\n city: \"Kirkland\",\n headquarter: false,\n postalCode: \"98033\",\n line1: \"777 6th St S\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"WA\",\n city: \"Seattle\",\n headquarter: false,\n postalCode: \"98103\",\n line1: \"601 N 34th St\",\n },\n ],\n },\n {\n localizedName: \"Wan Chai\",\n latLong: {\n latitude: 22.421183,\n longitude: 114.1661,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"HK\",\n geographicArea: \"Hong Kong\",\n city: \"Wan Chai\",\n headquarter: false,\n line1: \"2 Matheson St\",\n },\n ],\n },\n {\n localizedName: \"Warsaw\",\n latLong: {\n latitude: 52.124672,\n longitude: 19.400427,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"PL\",\n geographicArea: \"MA\",\n city: \"Warsaw\",\n headquarter: false,\n postalCode: \"00-125\",\n line1: \"ulica Emilii Plater 53\",\n },\n ],\n },\n {\n localizedName: \"Zurich\",\n latLong: {\n latitude: 46.80124,\n longitude: 8.230966,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"CH\",\n geographicArea: \"ZH\",\n city: \"Zurich\",\n headquarter: false,\n postalCode: \"8002\",\n line1: \"Brandschenkestrasse 110\",\n },\n ],\n },\n ],\n viewerPermissions: {\n canCreateBroadcast: false,\n canSeeProducts: false,\n canReadContentSuggestions: false,\n canUpdateOrganizationProfile: false,\n canSponsorShare: false,\n canEditPendingDirectSponsoredContentPosters: false,\n canUntagFromMention: false,\n canReadOrganizationActivity: false,\n canManageCareerPages: false,\n canAssociateHashtag: false,\n canDeleteShare: false,\n canInviteMemberToFollow: false,\n canReadBroadcastAnalytics: false,\n canEditPipelineBuilderAdministrators: false,\n canReadPipelineBuilderAdminPage: false,\n canDeactivateOrganization: false,\n canCreateOrganicShare: false,\n canEditDarkShare: false,\n canReadOrganizationLeadsAnalytics: false,\n canEnableCommentsShare: false,\n canDeleteDarkShare: false,\n canReadOrganizationTalentBrandAnalytics: false,\n canEditDirectSponsoredContentPosters: false,\n canPinShare: false,\n canReadPipelineBuilderAdministrators: false,\n canCreateLinkedInPagesProductFeedBack: false,\n canReadEvents: false,\n organizationRoles: [],\n canEditEvents: false,\n canReadOrganizationUpdateAnalytics: false,\n canCreateComment: false,\n canRequestAdminAccess: true,\n canEditAdministrators: false,\n canCreateDarkShare: false,\n canSeeEmployeeExperienceAsMember: false,\n canReadAdministrators: false,\n canExportLeads: false,\n canReadDirectSponsoredContentPosters: false,\n canManageEmployeeExperienceSettings: false,\n canCreateShowcase: false,\n canReadOrganizationVisitorAnalytics: false,\n canEditProducts: false,\n canReadPendingAdministrators: false,\n canEditCurators: false,\n canManageVerifiedEmailDomains: false,\n canReadPendingDirectSponsoredContentPosters: false,\n canEditPipelineBuilderAdminPage: false,\n canReadTermsAndAgreements: false,\n canReadOrganizationFollowerAnalytics: false,\n canManageOrganizationCompetitors: false,\n canCreateReaction: false,\n canDisableCommentsShare: false,\n canEditPendingAdministrators: false,\n canReadOrganizationPipelineBuilderAnalytics: false,\n canNotifyEmployees: false,\n canSeeOrganizationAdministrativePage: false,\n },\n videosTabVisible: true,\n useParentCareerPageEnabled: false,\n staffingCompany: false,\n groupedLocations: [\n {\n localizedName: \"London\",\n latLong: {\n latitude: 51.51649,\n longitude: -0.128427,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"GB\",\n geographicArea: \"England\",\n city: \"London\",\n headquarter: false,\n postalCode: \"WC2H 8AG\",\n line1: \"St Giles High Street\",\n },\n ],\n },\n {\n localizedName: \"Dublin\",\n latLong: {\n latitude: 53.427185,\n longitude: -6.244215,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IE\",\n geographicArea: \"County Dublin\",\n city: \"Dublin\",\n headquarter: false,\n line1: \"Barrow Street\",\n },\n ],\n },\n {\n localizedName: \"Bogota\",\n latLong: {\n latitude: 4.670855,\n longitude: -74.09681,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"CO\",\n geographicArea: \"Bogota, D.C.\",\n city: \"Bogota\",\n headquarter: false,\n postalCode: \"110221\",\n line1: \"Carrera 11A 94-45\",\n },\n ],\n },\n {\n localizedName: \"Singapore\",\n latLong: {\n latitude: 1.356523,\n longitude: 103.80859,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"SG\",\n geographicArea: \"Singapore\",\n city: \"Singapore\",\n headquarter: false,\n postalCode: \"118484\",\n line1: \"3 Pasir Panjang Rd\",\n },\n ],\n },\n {\n localizedName: \"Miguel Hidalgo\",\n latLong: {\n latitude: 19.425928,\n longitude: -99.13615,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"MX\",\n geographicArea: \"CDMX\",\n city: \"Miguel Hidalgo\",\n headquarter: false,\n postalCode: \"11000\",\n line1: \"Montes Urales\",\n },\n ],\n },\n {\n localizedName: \"Tel Aviv-yafo\",\n latLong: {\n latitude: 30.812426,\n longitude: 34.859478,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IL\",\n geographicArea: \"Tel Aviv\",\n city: \"Tel Aviv-Yafo\",\n headquarter: false,\n postalCode: \"67891\",\n line1: \"Yigal Allon 98\",\n },\n ],\n },\n {\n localizedName: \"Toronto\",\n latLong: {\n latitude: 43.68814,\n longitude: -79.621994,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"CA\",\n geographicArea: \"ON\",\n city: \"Toronto\",\n headquarter: false,\n postalCode: \"M5H 2G4\",\n line1: \"111 Richmond St W\",\n },\n ],\n },\n {\n localizedName: \"Kitchener\",\n latLong: {\n latitude: 43.456963,\n longitude: -80.382385,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"CA\",\n geographicArea: \"ON\",\n city: \"Kitchener\",\n headquarter: false,\n postalCode: \"N2H 5G5\",\n line1: \"51 Breithaupt St\",\n },\n ],\n },\n {\n localizedName: \"Las Condes\",\n latLong: {\n latitude: -33.452965,\n longitude: -70.6663,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"CL\",\n geographicArea: \"Santiago Metropolitan\",\n city: \"Las Condes\",\n headquarter: false,\n postalCode: \"7550000\",\n line1: \"Avenida Costanera Sur\",\n },\n ],\n },\n {\n localizedName: \"Milan\",\n latLong: {\n latitude: 45.46816,\n longitude: 9.182292,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IT\",\n geographicArea: \"Lomb.\",\n city: \"Milan\",\n headquarter: false,\n postalCode: \"20124\",\n line1: \"Via Federico Confalonieri, 4\",\n },\n ],\n },\n {\n localizedName: \"Taguig City\",\n latLong: {\n latitude: 15.947407,\n longitude: 121.42167,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"PH\",\n geographicArea: \"National Capital Region\",\n city: \"Taguig City\",\n headquarter: false,\n line1: \"5th Ave\",\n },\n ],\n },\n {\n localizedName: \"Sydney\",\n latLong: {\n latitude: -33.84907,\n longitude: 151.13834,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"AU\",\n geographicArea: \"NSW\",\n city: \"Sydney\",\n headquarter: false,\n postalCode: \"2009\",\n line1: \"48 Pirrama Rd\",\n },\n ],\n },\n {\n localizedName: \"Melbourne\",\n latLong: {\n latitude: -37.803425,\n longitude: 145.01105,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"AU\",\n geographicArea: \"VIC\",\n city: \"Melbourne\",\n headquarter: false,\n postalCode: \"3000\",\n line1: \"90 Collins St\",\n },\n ],\n },\n {\n localizedName: \"Zurich\",\n latLong: {\n latitude: 47.450603,\n longitude: 8.561746,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"CH\",\n geographicArea: \"ZH\",\n city: \"Zurich\",\n headquarter: false,\n postalCode: \"8002\",\n line1: \"Brandschenkestrasse 110\",\n },\n ],\n },\n {\n localizedName: \"Paris\",\n latLong: {\n latitude: 48.88075,\n longitude: 2.275646,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"FR\",\n geographicArea: \"IdF\",\n city: \"Paris\",\n headquarter: false,\n postalCode: \"75009\",\n line1: \"8 Rue de Londres\",\n },\n ],\n },\n {\n localizedName: \"Buenos Aires City\",\n latLong: {\n latitude: -34.805058,\n longitude: -58.541706,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"AR\",\n geographicArea: \"Buenos Aires Autonomous City\",\n city: \"Buenos Aires City\",\n headquarter: false,\n postalCode: \"1107\",\n line1: \"Avenida Alicia Moreau de Justo 350\",\n },\n ],\n },\n {\n localizedName: \"Hamburg\",\n latLong: {\n latitude: 53.63128,\n longitude: 10.006442,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"DE\",\n geographicArea: \"HH\",\n city: \"Hamburg\",\n headquarter: false,\n postalCode: \"20354\",\n line1: \"ABC-Strasse 19\",\n },\n ],\n },\n {\n localizedName: \"Berlin\",\n latLong: {\n latitude: 52.560253,\n longitude: 13.296672,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"DE\",\n geographicArea: \"BE\",\n city: \"Berlin\",\n headquarter: false,\n postalCode: \"10117\",\n line1: \"Unter den Linden 14\",\n },\n ],\n },\n {\n localizedName: \"Munich\",\n latLong: {\n latitude: 48.140095,\n longitude: 11.555375,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"DE\",\n geographicArea: \"BY\",\n city: \"Munich\",\n headquarter: false,\n postalCode: \"80636\",\n line1: \"Erika-Mann-Strasse 33\",\n },\n ],\n },\n {\n localizedName: \"Warsaw\",\n latLong: {\n latitude: 52.23702,\n longitude: 21.02,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"PL\",\n geographicArea: \"MA\",\n city: \"Warsaw\",\n headquarter: false,\n postalCode: \"00-125\",\n line1: \"ulica Emilii Plater 53\",\n },\n ],\n },\n {\n localizedName: \"Amsterdam\",\n latLong: {\n latitude: 51.89373,\n longitude: 4.523071,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"NL\",\n geographicArea: \"North Holland\",\n city: \"Amsterdam\",\n headquarter: false,\n postalCode: \"1082 MD\",\n line1: \"Claude Debussylaan 34\",\n },\n ],\n },\n {\n localizedName: \"Greater Madrid Metropolitan Area\",\n latLong: {\n latitude: 40.409824,\n longitude: -3.675558,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"ES\",\n geographicArea: \"Community of Madrid\",\n city: \"Madrid\",\n headquarter: false,\n postalCode: \"28046\",\n line1: \"Plaza Pablo Ruiz Picasso\",\n },\n {\n streetAddressOptOut: false,\n country: \"ES\",\n geographicArea: \"Community of Madrid\",\n city: \"Madrid\",\n headquarter: false,\n postalCode: \"28020\",\n line1: \"Plaza Pablo Ruiz Picasso\",\n },\n ],\n },\n {\n localizedName: \"Atlanta\",\n latLong: {\n latitude: 33.74975,\n longitude: -84.38857,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"GA\",\n city: \"Atlanta\",\n headquarter: false,\n postalCode: \"30309\",\n line1: \"10 10th St NE\",\n },\n ],\n },\n {\n localizedName: \"Cambridge\",\n latLong: {\n latitude: 42.36041,\n longitude: -71.05798,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"MA\",\n city: \"Cambridge\",\n headquarter: false,\n postalCode: \"02142\",\n line1: \"355 Main St\",\n },\n ],\n },\n {\n localizedName: \"San Francisco Bay Area\",\n latLong: {\n latitude: 37.39271,\n longitude: -122.042,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"Mountain View\",\n headquarter: true,\n postalCode: \"94043\",\n line1: \"1600 Amphitheatre Parkway\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"San Bruno\",\n headquarter: false,\n postalCode: \"94066\",\n line1: \"901 Cherry Ave\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"San Francisco\",\n headquarter: false,\n postalCode: \"94105\",\n line1: \"345 Spear St\",\n },\n ],\n },\n {\n localizedName: \"Austin\",\n latLong: {\n latitude: 30.276316,\n longitude: -97.70931,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"TX\",\n city: \"Austin\",\n headquarter: false,\n postalCode: \"78759\",\n line1: \"9606 N Mopac Expy\",\n },\n ],\n },\n {\n localizedName: \"Los Angeles Metropolitan Area\",\n latLong: {\n latitude: 34.073666,\n longitude: -118.23985,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"Irvine\",\n headquarter: false,\n postalCode: \"92612\",\n line1: \"19510 Jamboree Rd\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"Los Angeles\",\n headquarter: false,\n postalCode: \"90291\",\n line1: \"340 Main St\",\n },\n ],\n },\n {\n localizedName: \"Chicago\",\n latLong: {\n latitude: 41.948055,\n longitude: -87.655754,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"IL\",\n city: \"Chicago\",\n headquarter: false,\n postalCode: \"60607\",\n line1: \"320 N Morgan St\",\n },\n ],\n },\n {\n localizedName: \"Boulder\",\n latLong: {\n latitude: 39.756443,\n longitude: -104.99415,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CO\",\n city: \"Boulder\",\n headquarter: false,\n postalCode: \"80302\",\n line1: \"2590 Pearl St\",\n },\n ],\n },\n {\n localizedName: \"Frisco\",\n latLong: {\n latitude: 32.7513,\n longitude: -97.08263,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"TX\",\n city: \"Frisco\",\n headquarter: false,\n postalCode: \"75034\",\n line1: \"6175 Main St\",\n },\n ],\n },\n {\n localizedName: \"Ann Arbor\",\n latLong: {\n latitude: 42.339054,\n longitude: -83.04875,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"MI\",\n city: \"Ann Arbor\",\n headquarter: false,\n postalCode: \"48105\",\n line1: \"2300 Traverwood Dr\",\n },\n ],\n },\n {\n localizedName: \"Washington DC-Baltimore Area\",\n latLong: {\n latitude: 38.873062,\n longitude: -77.007385,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"DC\",\n city: \"Washington\",\n headquarter: false,\n postalCode: \"20001\",\n line1: \"25 Massachusetts Ave NW\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"VA\",\n city: \"Reston\",\n headquarter: false,\n postalCode: \"20190\",\n line1: \"1875 Explorer St\",\n },\n ],\n },\n {\n localizedName: \"Greater Seattle Area\",\n latLong: {\n latitude: 47.591396,\n longitude: -122.33279,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"WA\",\n city: \"Kirkland\",\n headquarter: false,\n postalCode: \"98033\",\n line1: \"777 6th St S\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"WA\",\n city: \"Seattle\",\n headquarter: false,\n postalCode: \"98103\",\n line1: \"601 N 34th St\",\n },\n ],\n },\n {\n localizedName: \"New York\",\n latLong: {\n latitude: 40.748295,\n longitude: -73.98556,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"NY\",\n city: \"New York\",\n headquarter: false,\n postalCode: \"10011\",\n line1: \"111 8th Ave\",\n },\n ],\n },\n {\n localizedName: \"Stockholm\",\n latLong: {\n latitude: 59.34777,\n longitude: 18.088993,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"SE\",\n geographicArea: \"Stockholm County\",\n city: \"Stockholm\",\n headquarter: false,\n postalCode: \"111 22\",\n line1: \"Kungsbron 2\",\n },\n ],\n },\n {\n localizedName: \"Sao Paulo\",\n latLong: {\n latitude: -23.624617,\n longitude: -46.659874,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"BR\",\n geographicArea: \"SP\",\n city: \"Sao Paulo\",\n headquarter: false,\n postalCode: \"04538-133\",\n line1: \"Avenida Brigadeiro Faria Lima, 3477\",\n },\n ],\n },\n {\n localizedName: \"Wan Chai\",\n latLong: {\n latitude: 22.27765,\n longitude: 114.17736,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"HK\",\n geographicArea: \"Hong Kong\",\n city: \"Wan Chai\",\n headquarter: false,\n line1: \"2 Matheson St\",\n },\n ],\n },\n {\n localizedName: \"Hyderabad\",\n latLong: {\n latitude: 17.439758,\n longitude: 78.42455,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"TS\",\n city: \"Hyderabad\",\n headquarter: false,\n postalCode: \"500084\",\n line1: \"13\",\n },\n ],\n },\n {\n localizedName: \"Mumbai\",\n latLong: {\n latitude: 19.146397,\n longitude: 72.87369,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"Maharashtra\",\n city: \"Mumbai\",\n headquarter: false,\n postalCode: \"400051\",\n line1: \"3 Bandra Kurla Complex Road\",\n },\n ],\n },\n {\n localizedName: \"Greater Bengaluru Area\",\n latLong: {\n latitude: 12.98163,\n longitude: 77.59208,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"Karnataka\",\n city: \"Bengaluru\",\n headquarter: false,\n postalCode: \"560016\",\n line1: \"Old Madras Road\",\n },\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"Karnataka\",\n city: \"Bengaluru\",\n headquarter: false,\n postalCode: \"560016\",\n line1: \"3 Swamy Vivekananda Road\",\n },\n ],\n },\n {\n localizedName: \"Gurugram\",\n latLong: {\n latitude: 28.587835,\n longitude: 77.16324,\n },\n locations: [\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"HR\",\n city: \"Gurugram\",\n headquarter: false,\n postalCode: \"122001\",\n line1: \"15\",\n },\n ],\n },\n ],\n multiLocaleDescriptions: {\n localized: {\n en_US:\n \"A problem isn't truly solved until it's solved for all. Googlers build products that help create opportunities for everyone, whether down the street or across the globe. Bring your insight, imagination and a healthy disregard for the impossible. Bring everything that makes you unique. Together, we can build for everyone.\\n\\nCheck out our career opportunities at goo.gle/3DLEokh\",\n },\n preferredLocale: {\n country: \"US\",\n language: \"en\",\n },\n },\n type: \"Public Company\",\n companyIndustries: [\n {\n entityUrn: \"urn:li:fs_industry:4\",\n localizedName: \"Software Development\",\n },\n ],\n logos: {\n logo: {\n \"com.linkedin.common.VectorImage\": {\n artifacts: [\n {\n width: 200,\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1631311446380?e=1759968000&v=beta&t=OQsuyFE-NRStieVKaWrjVYh9OL9IYUWGn-KFqrYbEV4\",\n expiresAt: 1759968000000,\n height: 200,\n },\n {\n width: 100,\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1631311446380?e=1759968000&v=beta&t=jnIPgQh2pNFZqcdjrYShazVuIbOZFNPBN3SVS0xecUI\",\n expiresAt: 1759968000000,\n height: 100,\n },\n {\n width: 400,\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1631311446380?e=1759968000&v=beta&t=NAS5sOIzzhGP7yJjQHJJvYLGw6ijJVQK9KucOyajADg\",\n expiresAt: 1759968000000,\n height: 400,\n },\n ],\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQHiNSL4Or29cg/company-logo_\",\n },\n },\n legacyLogo: {\n \"com.linkedin.voyager.common.MediaProcessorImage\": {\n id: \"/AAMAAgQIAAkAAQAAAAAAAA8iAAAAJDRiNTM1YzIwLWU0YjQtNDE2MC1iYWRkLWYzOWQwMjRiODdiZQ.bin\",\n },\n },\n legacySquareLogo: {\n \"com.linkedin.voyager.common.MediaProcessorImage\": {\n id: \"/AAMAAgQIAAkAAQAAAAAAAA8iAAAAJDRiNTM1YzIwLWU0YjQtNDE2MC1iYWRkLWYzOWQwMjRiODdiZQ.bin\",\n },\n },\n },\n callToAction: {\n callToActionMessage: {\n textDirection: \"USER_LOCALE\",\n text: \"Visit website\",\n },\n callToActionType: \"VIEW_WEBSITE\",\n visible: true,\n url: \"https://goo.gle/3DLEokh\",\n },\n staffCount: 316149,\n adsRule: \"REDUCED\",\n companyEmployeesSearchPageUrl: \"https://www.linkedin.com/vsearch/p?f_CC=1441\",\n viewerFollowingJobsUpdates: false,\n createdAt: 0,\n myCompanyVisible: true,\n staffCountRange: {\n start: 10001,\n },\n permissions: {\n landingPageAdmin: false,\n admin: false,\n adAccountHolder: false,\n },\n eligibleForInviteToFollow: true,\n logo: {\n type: \"SQUARE_LOGO\",\n image: {\n \"com.linkedin.common.VectorImage\": {\n artifacts: [\n {\n width: 200,\n fileIdentifyingUrlPathSegment:\n \"200_200/company-logo_200_200/0/1631311446380?e=1759968000&v=beta&t=OQsuyFE-NRStieVKaWrjVYh9OL9IYUWGn-KFqrYbEV4\",\n expiresAt: 1759968000000,\n height: 200,\n },\n {\n width: 100,\n fileIdentifyingUrlPathSegment:\n \"100_100/company-logo_100_100/0/1631311446380?e=1759968000&v=beta&t=jnIPgQh2pNFZqcdjrYShazVuIbOZFNPBN3SVS0xecUI\",\n expiresAt: 1759968000000,\n height: 100,\n },\n {\n width: 400,\n fileIdentifyingUrlPathSegment:\n \"400_400/company-logo_400_400/0/1631311446380?e=1759968000&v=beta&t=NAS5sOIzzhGP7yJjQHJJvYLGw6ijJVQK9KucOyajADg\",\n expiresAt: 1759968000000,\n height: 400,\n },\n ],\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/C4D0BAQHiNSL4Or29cg/company-logo_\",\n },\n },\n },\n pysmAvailable: false,\n claimable: false,\n specialities: [\n \"search\",\n \"ads\",\n \"mobile\",\n \"android\",\n \"online video\",\n \"apps\",\n \"machine learning\",\n \"virtual reality\",\n \"cloud\",\n \"hardware\",\n \"artificial intelligence\",\n \"youtube\",\n \"software\",\n ],\n confirmedLocations: [\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"Mountain View\",\n headquarter: true,\n postalCode: \"94043\",\n line1: \"1600 Amphitheatre Parkway\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"NY\",\n city: \"New York\",\n headquarter: false,\n postalCode: \"10011\",\n line1: \"111 8th Ave\",\n },\n {\n streetAddressOptOut: false,\n country: \"NL\",\n geographicArea: \"North Holland\",\n city: \"Amsterdam\",\n headquarter: false,\n postalCode: \"1082 MD\",\n line1: \"Claude Debussylaan 34\",\n },\n {\n streetAddressOptOut: false,\n country: \"BR\",\n geographicArea: \"SP\",\n city: \"Sao Paulo\",\n headquarter: false,\n postalCode: \"04538-133\",\n line1: \"Avenida Brigadeiro Faria Lima, 3477\",\n },\n {\n streetAddressOptOut: false,\n country: \"CA\",\n geographicArea: \"ON\",\n city: \"Kitchener\",\n headquarter: false,\n postalCode: \"N2H 5G5\",\n line1: \"51 Breithaupt St\",\n },\n {\n streetAddressOptOut: false,\n country: \"IE\",\n geographicArea: \"County Dublin\",\n city: \"Dublin\",\n headquarter: false,\n line1: \"Barrow Street\",\n },\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"Karnataka\",\n city: \"Bengaluru\",\n headquarter: false,\n postalCode: \"560016\",\n line1: \"Old Madras Road\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CO\",\n city: \"Boulder\",\n headquarter: false,\n postalCode: \"80302\",\n line1: \"2590 Pearl St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"WA\",\n city: \"Seattle\",\n headquarter: false,\n postalCode: \"98103\",\n line1: \"601 N 34th St\",\n },\n {\n streetAddressOptOut: false,\n country: \"AU\",\n geographicArea: \"NSW\",\n city: \"Sydney\",\n headquarter: false,\n postalCode: \"2009\",\n line1: \"48 Pirrama Rd\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"Irvine\",\n headquarter: false,\n postalCode: \"92612\",\n line1: \"19510 Jamboree Rd\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"IL\",\n city: \"Chicago\",\n headquarter: false,\n postalCode: \"60607\",\n line1: \"320 N Morgan St\",\n },\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"Maharashtra\",\n city: \"Mumbai\",\n headquarter: false,\n postalCode: \"400051\",\n line1: \"3 Bandra Kurla Complex Road\",\n },\n {\n streetAddressOptOut: false,\n country: \"PH\",\n geographicArea: \"National Capital Region\",\n city: \"Taguig City\",\n headquarter: false,\n line1: \"5th Ave\",\n },\n {\n streetAddressOptOut: false,\n country: \"SG\",\n geographicArea: \"Singapore\",\n city: \"Singapore\",\n headquarter: false,\n postalCode: \"118484\",\n line1: \"3 Pasir Panjang Rd\",\n },\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"TS\",\n city: \"Hyderabad\",\n headquarter: false,\n postalCode: \"500084\",\n line1: \"13\",\n },\n {\n streetAddressOptOut: false,\n country: \"AU\",\n geographicArea: \"VIC\",\n city: \"Melbourne\",\n headquarter: false,\n postalCode: \"3000\",\n line1: \"90 Collins St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"San Bruno\",\n headquarter: false,\n postalCode: \"94066\",\n line1: \"901 Cherry Ave\",\n },\n {\n streetAddressOptOut: false,\n country: \"ES\",\n geographicArea: \"Community of Madrid\",\n city: \"Madrid\",\n headquarter: false,\n postalCode: \"28046\",\n line1: \"Plaza Pablo Ruiz Picasso\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"DC\",\n city: \"Washington\",\n headquarter: false,\n postalCode: \"20001\",\n line1: \"25 Massachusetts Ave NW\",\n },\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"HR\",\n city: \"Gurugram\",\n headquarter: false,\n postalCode: \"122001\",\n line1: \"15\",\n },\n {\n streetAddressOptOut: false,\n country: \"CO\",\n geographicArea: \"Bogota, D.C.\",\n city: \"Bogota\",\n headquarter: false,\n postalCode: \"110221\",\n line1: \"Carrera 11A 94-45\",\n },\n {\n streetAddressOptOut: false,\n country: \"HK\",\n geographicArea: \"Hong Kong\",\n city: \"Wan Chai\",\n headquarter: false,\n line1: \"2 Matheson St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"VA\",\n city: \"Reston\",\n headquarter: false,\n postalCode: \"20190\",\n line1: \"1875 Explorer St\",\n },\n {\n streetAddressOptOut: false,\n country: \"CA\",\n geographicArea: \"ON\",\n city: \"Toronto\",\n headquarter: false,\n postalCode: \"M5H 2G4\",\n line1: \"111 Richmond St W\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"San Francisco\",\n headquarter: false,\n postalCode: \"94105\",\n line1: \"345 Spear St\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"MA\",\n city: \"Cambridge\",\n headquarter: false,\n postalCode: \"02142\",\n line1: \"355 Main St\",\n },\n {\n streetAddressOptOut: false,\n country: \"IT\",\n geographicArea: \"Lomb.\",\n city: \"Milan\",\n headquarter: false,\n postalCode: \"20124\",\n line1: \"Via Federico Confalonieri, 4\",\n },\n {\n streetAddressOptOut: false,\n country: \"GB\",\n geographicArea: \"England\",\n city: \"London\",\n headquarter: false,\n postalCode: \"WC2H 8AG\",\n line1: \"St Giles High Street\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"TX\",\n city: \"Austin\",\n headquarter: false,\n postalCode: \"78759\",\n line1: \"9606 N Mopac Expy\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"CA\",\n city: \"Los Angeles\",\n headquarter: false,\n postalCode: \"90291\",\n line1: \"340 Main St\",\n },\n {\n streetAddressOptOut: false,\n country: \"ES\",\n geographicArea: \"Community of Madrid\",\n city: \"Madrid\",\n headquarter: false,\n postalCode: \"28020\",\n line1: \"Plaza Pablo Ruiz Picasso\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"MI\",\n city: \"Ann Arbor\",\n headquarter: false,\n postalCode: \"48105\",\n line1: \"2300 Traverwood Dr\",\n },\n {\n streetAddressOptOut: false,\n country: \"CL\",\n geographicArea: \"Santiago Metropolitan\",\n city: \"Las Condes\",\n headquarter: false,\n postalCode: \"7550000\",\n line1: \"Avenida Costanera Sur\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"GA\",\n city: \"Atlanta\",\n headquarter: false,\n postalCode: \"30309\",\n line1: \"10 10th St NE\",\n },\n {\n streetAddressOptOut: false,\n country: \"PL\",\n geographicArea: \"MA\",\n city: \"Warsaw\",\n headquarter: false,\n postalCode: \"00-125\",\n line1: \"ulica Emilii Plater 53\",\n },\n {\n streetAddressOptOut: false,\n country: \"IN\",\n geographicArea: \"Karnataka\",\n city: \"Bengaluru\",\n headquarter: false,\n postalCode: \"560016\",\n line1: \"3 Swamy Vivekananda Road\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"WA\",\n city: \"Kirkland\",\n headquarter: false,\n postalCode: \"98033\",\n line1: \"777 6th St S\",\n },\n {\n streetAddressOptOut: false,\n country: \"DE\",\n geographicArea: \"BY\",\n city: \"Munich\",\n headquarter: false,\n postalCode: \"80636\",\n line1: \"Erika-Mann-Strasse 33\",\n },\n {\n streetAddressOptOut: false,\n country: \"MX\",\n geographicArea: \"CDMX\",\n city: \"Miguel Hidalgo\",\n headquarter: false,\n postalCode: \"11000\",\n line1: \"Montes Urales\",\n },\n {\n streetAddressOptOut: false,\n country: \"AR\",\n geographicArea: \"Buenos Aires Autonomous City\",\n city: \"Buenos Aires City\",\n headquarter: false,\n postalCode: \"1107\",\n line1: \"Avenida Alicia Moreau de Justo 350\",\n },\n {\n streetAddressOptOut: false,\n country: \"FR\",\n geographicArea: \"IdF\",\n city: \"Paris\",\n headquarter: false,\n postalCode: \"75009\",\n line1: \"8 Rue de Londres\",\n },\n {\n streetAddressOptOut: false,\n country: \"IL\",\n geographicArea: \"Tel Aviv\",\n city: \"Tel Aviv-Yafo\",\n headquarter: false,\n postalCode: \"67891\",\n line1: \"Yigal Allon 98\",\n },\n {\n streetAddressOptOut: false,\n country: \"DE\",\n geographicArea: \"BE\",\n city: \"Berlin\",\n headquarter: false,\n postalCode: \"10117\",\n line1: \"Unter den Linden 14\",\n },\n {\n streetAddressOptOut: false,\n country: \"DE\",\n geographicArea: \"HH\",\n city: \"Hamburg\",\n headquarter: false,\n postalCode: \"20354\",\n line1: \"ABC-Strasse 19\",\n },\n {\n streetAddressOptOut: false,\n country: \"US\",\n geographicArea: \"TX\",\n city: \"Frisco\",\n headquarter: false,\n postalCode: \"75034\",\n line1: \"6175 Main St\",\n },\n {\n streetAddressOptOut: false,\n country: \"CH\",\n geographicArea: \"ZH\",\n city: \"Zurich\",\n headquarter: false,\n postalCode: \"8002\",\n line1: \"Brandschenkestrasse 110\",\n },\n {\n streetAddressOptOut: false,\n country: \"SE\",\n geographicArea: \"Stockholm County\",\n city: \"Stockholm\",\n headquarter: false,\n postalCode: \"111 22\",\n line1: \"Kungsbron 2\",\n },\n ],\n croppedBackgroundCoverImageUrn:\n \"urn:li:digitalmediaAsset:D4E3DAQEqjNAQpi0pRA\",\n eligibleForOnlineJobPostingEntry: true,\n followingInfo: {\n entityUrn: \"urn:li:fs_followingInfo:urn:li:company:1441\",\n dashFollowingStateUrn: \"urn:li:fsd_followingState:urn:li:fsd_company:1441\",\n following: true,\n followingType: \"FOLLOWING\",\n followerCount: 38746067,\n },\n backgroundCoverPhoto: {\n \"com.linkedin.common.VectorImage\": {\n artifacts: [\n {\n width: 750,\n fileIdentifyingUrlPathSegment:\n \"27_750/B4EZge3rc4HgAU-/0/1752864569790/google_cover?e=1757912400&v=beta&t=Km6J1teSw4bgeISG3VSD86zfgKeMPG1cPh4Ct4wHoyQ\",\n expiresAt: 1757912400000,\n height: 126,\n },\n {\n width: 108,\n fileIdentifyingUrlPathSegment:\n \"08_640/B4EZge3rc4HgAY-/0/1752864569790/google_cover?e=1757912400&v=beta&t=fTzHkW1D8RakE1FAzZl1e5eKa07rlvLJ3j_2Lr3badA\",\n expiresAt: 1757912400000,\n height: 18,\n },\n {\n width: 1128,\n fileIdentifyingUrlPathSegment:\n \"91_1128/B4EZge3rc4HgAk-/0/1752864569790/google_cover?e=1757912400&v=beta&t=8PVYp2G18l7_x7WnvDS8FQn5XXINuqakuTO6YsfFSQs\",\n expiresAt: 1757912400000,\n height: 191,\n },\n ],\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E3DAQEqjNAQpi0pRA/image-scale_1\",\n },\n },\n active: true,\n versionTag: \"4137901683\",\n premiumFeatures: [\"ENHANCED_ANALYTICS\"],\n logoUrn: \"urn:li:digitalmediaAsset:C4D0BAQHiNSL4Or29cg\",\n affiliatedCompaniesWithEmployeesRollup: [\n \"urn:li:fs_normalized_company:17876832\",\n \"urn:li:fs_normalized_company:791962\",\n \"urn:li:fs_normalized_company:2374003\",\n \"urn:li:fs_normalized_company:18950635\",\n \"urn:li:fs_normalized_company:16140\",\n ],\n viewerEmployee: false,\n defaultLocale: {\n country: \"US\",\n language: \"en\",\n },\n lcpTreatment: true,\n websiteOptOut: false,\n affiliatedCompaniesWithJobsRollup: [\n \"urn:li:fs_normalized_company:17876832\",\n \"urn:li:fs_normalized_company:791962\",\n \"urn:li:fs_normalized_company:2374003\",\n \"urn:li:fs_normalized_company:18950635\",\n \"urn:li:fs_normalized_company:16140\",\n \"urn:li:fs_normalized_company:89982912\",\n ],\n trackingInfo: {\n objectUrn: \"urn:li:company:1441\",\n trackingId: \"ZGy+tMpNRN2W27Hf29/Lkg==\",\n },\n firstDegreeConnectionsThatFollow: [\n \"urn:li:fs_normalized_profile:ACoAAC3gupwBIDY9OqgQ3yno39iPGoDVTYzgioU\",\n \"urn:li:fs_normalized_profile:ACoAACQFy2IBuVneu_nJfcm5zV0_Sc5zOSdNzs0\",\n ],\n name: \"Google\",\n organizationLixes: [],\n fundingData: {\n fundingRoundListCrunchbaseUrl:\n \"https://www.crunchbase.com/organization/google/funding_rounds/funding_rounds_list?utm_source=linkedin&utm_medium=referral&utm_campaign=linkedin_companies&utm_content=all_fundings\",\n companyCrunchbaseUrl:\n \"https://www.crunchbase.com/organization/google?utm_source=linkedin&utm_medium=referral&utm_campaign=linkedin_companies&utm_content=profile_cta\",\n lastFundingRound: {\n investorsCrunchbaseUrl:\n \"https://www.crunchbase.com/funding_round/google-series-unknown--6c4715f9?utm_source=linkedin&utm_medium=referral&utm_campaign=linkedin_companies&utm_content=all_investors\",\n leadInvestors: [\n {\n name: {\n text: \"Kleiner Perkins\",\n },\n investorCrunchbaseUrl:\n \"https://www.crunchbase.com/organization/kleiner-perkins-caufield-byers?utm_source=linkedin&utm_medium=referral&utm_campaign=linkedin_companies&utm_content=investor\",\n image: {\n attributes: [\n {\n sourceType: \"URL\",\n imageUrl:\n \"https://media.licdn.com/dms/image/sync/v2/D4D38AQFcDueDDWFLRw/crunchbase_investor_logo_100/crunchbase_investor_logo_100/0/1750357484072?e=1757912400&v=beta&t=Uor-oRiYbLmi8O_iV92msNOQpnNVvdNfHlENQ9spMag\",\n },\n ],\n },\n },\n {\n name: {\n text: \"Sequoia Capital\",\n },\n investorCrunchbaseUrl:\n \"https://www.crunchbase.com/organization/sequoia-capital?utm_source=linkedin&utm_medium=referral&utm_campaign=linkedin_companies&utm_content=investor\",\n image: {\n attributes: [\n {\n sourceType: \"URL\",\n imageUrl:\n \"https://media.licdn.com/dms/image/sync/v2/D4D38AQFTbW9ThA5fOw/crunchbase_investor_logo_100/crunchbase_investor_logo_100/0/1750357477963?e=1757912400&v=beta&t=RqSgOSPZby6Y_R_F-KPhK9jEv6NeWD0WqK50yi9ZyK8\",\n },\n ],\n },\n },\n ],\n fundingRoundCrunchbaseUrl:\n \"https://www.crunchbase.com/funding_round/google-series-unknown--6c4715f9?utm_source=linkedin&utm_medium=referral&utm_campaign=linkedin_companies&utm_content=last_funding\",\n fundingType: \"SERIES_UNKNOWN\",\n moneyRaised: {\n currencyCode: \"USD\",\n amount: \"25000000\",\n },\n numOtherInvestors: 0,\n announcedOn: {\n month: 6,\n day: 7,\n year: 1999,\n },\n },\n numFundingRounds: 3,\n updatedAt: 1754885702,\n },\n multiLocaleNames: {\n localized: {\n zh_TW: \"谷歌\",\n ko_KR: \"Google\",\n en_US: \"Google\",\n zh_CN: \"谷歌\",\n },\n preferredLocale: {\n country: \"US\",\n language: \"en\",\n },\n },\n overviewPhoto: {\n \"com.linkedin.voyager.common.MediaProcessorImage\": {\n id: \"/AAEAAQAAAAAAAAl6AAAAJDAwMDBlMTIwLTQ1ODEtNDcyNC04NjlhLWViZjZlMTlmOWVkZA.png\",\n },\n },\n viewerCurrentEmployee: false,\n backgroundCoverImageCropInfo: {\n x: 0,\n width: 1128,\n y: 0,\n height: 191,\n },\n dashEntityUrn: \"urn:li:fsd_company:1441\",\n campaignManagerUrl:\n \"https://www.linkedin.com/ad/accounts?entity=company%3A1441&trk=biz_scin_sponsor_now\",\n employeeExperienceSettings: {\n myCompanyVisibility: true,\n pymkVisibility: \"ALL_EMPLOYEES\",\n myCompanyEmployeeVerificationRequired: false,\n broadcastsVisibility: \"ALL_EMPLOYEES\",\n highlightsVisibility: \"ALL_EMPLOYEES\",\n trendingContentVisibility: \"ALL_EMPLOYEES\",\n },\n description:\n \"A problem isn't truly solved until it's solved for all. Googlers build products that help create opportunities for everyone, whether down the street or across the globe. Bring your insight, imagination and a healthy disregard for the impossible. Bring everything that makes you unique. Together, we can build for everyone.\\n\\nCheck out our career opportunities at goo.gle/3DLEokh\",\n emailDomainsAssociated: false,\n archived: false,\n entityUrn: \"urn:li:fs_normalized_company:1441\",\n headquarter: {\n country: \"US\",\n geographicArea: \"CA\",\n city: \"Mountain View\",\n postalCode: \"94043\",\n line1: \"1600 Amphitheatre Parkway\",\n },\n careerPageQuota: 2147483647,\n originalBackgroundCoverImageUrn:\n \"urn:li:digitalmediaAsset:D4E1BAQGppW6ZLvm9Jg\",\n paidCompany: true,\n universalName: \"google\",\n viewerPendingAdministrator: false,\n publishedProductsOwner: false,\n companyPageUrl: \"https://goo.gle/3DLEokh\",\n viewerConnectedToAdministrator: false,\n affiliatedCompanies: [\n \"urn:li:fs_normalized_company:17876832\",\n \"urn:li:fs_normalized_company:791962\",\n \"urn:li:fs_normalized_company:2374003\",\n \"urn:li:fs_normalized_company:18950635\",\n \"urn:li:fs_normalized_company:16140\",\n \"urn:li:fs_normalized_company:89982912\",\n ],\n companyType: {\n localizedName: \"Public Company\",\n code: \"PUBLIC_COMPANY\",\n },\n dataVersion: -1,\n associatedHashtags: [\"urn:li:fs_contentTopicData:urn:li:hashtag:google\"],\n coverPhoto: {\n \"com.linkedin.voyager.common.MediaProcessorImage\": {\n id: \"/AAEAAQAAAAAAAAl6AAAAJDAwMDBlMTIwLTQ1ODEtNDcyNC04NjlhLWViZjZlMTlmOWVkZA.png\",\n },\n },\n groups: [],\n eventsTabVisible: true,\n productsOwner: true,\n url: \"https://www.linkedin.com/company/google\",\n recentNewsAvailable: false,\n showcasePages: [\n \"urn:li:fs_normalized_company:102720926\",\n \"urn:li:fs_normalized_company:66341749\",\n \"urn:li:fs_normalized_company:103755306\",\n \"urn:li:fs_normalized_company:5392727\",\n \"urn:li:fs_normalized_company:10337946\",\n \"urn:li:fs_normalized_company:10476436\",\n \"urn:li:fs_normalized_company:12997578\",\n \"urn:li:fs_normalized_company:3611194\",\n \"urn:li:fs_normalized_company:2868133\",\n \"urn:li:fs_normalized_company:29015212\",\n \"urn:li:fs_normalized_company:18321920\",\n \"urn:li:fs_normalized_company:106703041\",\n \"urn:li:fs_normalized_company:11094280\",\n \"urn:li:fs_normalized_company:24866\",\n \"urn:li:fs_normalized_company:27109944\",\n \"urn:li:fs_normalized_company:3668753\",\n \"urn:li:fs_normalized_company:77163696\",\n \"urn:li:fs_normalized_company:105576160\",\n \"urn:li:fs_normalized_company:3648281\",\n \"urn:li:fs_normalized_company:33198155\",\n \"urn:li:fs_normalized_company:7959499\",\n \"urn:li:fs_normalized_company:12895996\",\n \"urn:li:fs_normalized_company:74357847\",\n \"urn:li:fs_normalized_company:10124320\",\n \"urn:li:fs_normalized_company:18925599\",\n \"urn:li:fs_normalized_company:15859534\",\n \"urn:li:fs_normalized_company:105292422\",\n \"urn:li:fs_normalized_company:107776681\",\n \"urn:li:fs_normalized_company:82540973\",\n \"urn:li:fs_normalized_company:6644131\",\n \"urn:li:fs_normalized_company:92586569\",\n \"urn:li:fs_normalized_company:18557142\",\n \"urn:li:fs_normalized_company:6599465\",\n \"urn:li:fs_normalized_company:82286774\",\n \"urn:li:fs_normalized_company:66345263\",\n \"urn:li:fs_normalized_company:96908570\",\n \"urn:li:fs_normalized_company:29116768\",\n \"urn:li:fs_normalized_company:18221770\",\n \"urn:li:fs_normalized_company:25014428\",\n \"urn:li:fs_normalized_company:11321165\",\n \"urn:li:fs_normalized_company:107516683\",\n \"urn:li:fs_normalized_company:102840132\",\n \"urn:li:fs_normalized_company:106770356\",\n \"urn:li:fs_normalized_company:71625768\",\n \"urn:li:fs_normalized_company:11830105\",\n \"urn:li:fs_normalized_company:8629486\",\n \"urn:li:fs_normalized_company:107571353\",\n \"urn:li:fs_normalized_company:105044144\",\n \"urn:li:fs_normalized_company:82288532\",\n \"urn:li:fs_normalized_company:68591333\",\n \"urn:li:fs_normalized_company:82288531\",\n \"urn:li:fs_normalized_company:25013385\",\n \"urn:li:fs_normalized_company:18950740\",\n \"urn:li:fs_normalized_company:99371798\",\n \"urn:li:fs_normalized_company:6644127\",\n \"urn:li:fs_normalized_company:9416052\",\n \"urn:li:fs_normalized_company:6625054\",\n \"urn:li:fs_normalized_company:101031931\",\n \"urn:li:fs_normalized_company:68699878\",\n \"urn:li:fs_normalized_company:68684775\",\n \"urn:li:fs_normalized_company:27115234\",\n ],\n viewerQualifiedForJobReferral: false,\n claimableByViewer: false,\n stockQuotes: [\"urn:li:fs_organizationStockQuote:(1441,GOOGL)\"],\n industries: [\"Software Development\"],\n jobSearchPageUrl:\n \"https://www.linkedin.com/jobs/search?geoId=92000000&f_C=1441%2C17876832%2C791962%2C2374003%2C18950635%2C16140%2C89982912\",\n showcase: false,\n autoGenerated: false,\n backgroundCoverImage: {\n image: {\n \"com.linkedin.common.VectorImage\": {\n artifacts: [\n {\n width: 750,\n fileIdentifyingUrlPathSegment:\n \"27_750/B4EZge3rc4HgAU-/0/1752864569790/google_cover?e=1757912400&v=beta&t=Km6J1teSw4bgeISG3VSD86zfgKeMPG1cPh4Ct4wHoyQ\",\n expiresAt: 1757912400000,\n height: 126,\n },\n {\n width: 108,\n fileIdentifyingUrlPathSegment:\n \"08_640/B4EZge3rc4HgAY-/0/1752864569790/google_cover?e=1757912400&v=beta&t=fTzHkW1D8RakE1FAzZl1e5eKa07rlvLJ3j_2Lr3badA\",\n expiresAt: 1757912400000,\n height: 18,\n },\n {\n width: 1128,\n fileIdentifyingUrlPathSegment:\n \"91_1128/B4EZge3rc4HgAk-/0/1752864569790/google_cover?e=1757912400&v=beta&t=8PVYp2G18l7_x7WnvDS8FQn5XXINuqakuTO6YsfFSQs\",\n expiresAt: 1757912400000,\n height: 191,\n },\n ],\n rootUrl:\n \"https://media.licdn.com/dms/image/v2/D4E3DAQEqjNAQpi0pRA/image-scale_1\",\n },\n },\n cropInfo: {\n x: 0,\n width: 1128,\n y: 0,\n height: 191,\n },\n },\n};\n\n/**\n * \n * @param params { universalName: string; urn?: never } | { universalName?: never; urn: string } | string\n * @param {\n csrfToken: string;\n cookies: Record<string, string> | string;\n }\n * @returns typeof linkedinCompanyExample | null\n */\nexport async function getLinkedinCompany(\n params:\n | { universalName: string; urn?: never }\n | { universalName?: never; urn: string }\n | string,\n {\n csrfToken,\n cookies,\n }: {\n csrfToken: string;\n cookies?: Record<string, string> | string;\n }\n): Promise<typeof linkedinCompanyExample | null> {\n let suffix = \"\";\n const queryParams =\n typeof params === \"string\" ? { universalName: params } : params;\n const isUniversalName = \"universalName\" in queryParams;\n if (isUniversalName) {\n suffix = `?q=universalName&universalName=${queryParams.universalName}`;\n } else {\n suffix = `/${queryParams.urn}`;\n }\n\n const url = `${LinkedinApiUrl}/organization/companies${suffix}`;\n\n const headers = createLinkedinHeaders(csrfToken, cookies);\n return fetch(url, {\n method: \"GET\",\n headers,\n })\n .then(async (response) => {\n if (response.ok) {\n const data = await response.json();\n if (isUniversalName) {\n return data.elements?.[0] || null;\n } else {\n return data;\n }\n }\n return null;\n })\n .catch((error) => {\n console.error(error);\n return null;\n });\n}\n","const selectors = {\n profilePage: {\n userPicture: [\n \".pv-top-card__non-self-photo-wrapper img\",\n \"#recent-activity-top-card img\",\n \".pv-top-card__photo-wrapper img\",\n 'div[componentkey^=\"com.linkedin.sdui.profile.card\"] div[data-view-name=\"profile-top-card-member-photo\"] img',\n ],\n userName: [\n 'a[href^=\"/in\"] h1',\n \"#recent-activity-top-card h3\",\n 'div[data-view-name=\"profile-top-card-verified-badge\"] div[role=\"button\"]',\n ],\n userOccupation: [\n \".artdeco-entity-lockup .artdeco-entity-lockup__subtitle\",\n \"#recent-activity-top-card h4\",\n ],\n // lemlistProfileCardLeadName: [\".lemlist-profile-card .lead-name\"],\n linkedinProfileCard: [\n \".scaffold-layout__main .artdeco-card:first-child\",\n // \"main .artdeco-card:first-child:not(.lemlist-header)\",\n 'div[componentkey^=\"com.linkedin.sdui.profile.card\"]',\n ],\n // lemlistProfileCard: [\".lemlist-profile-card\"],\n // alreadyInLemlistTag: [\".lemlist-profile-card .already-in-lemlist\"],\n // notInLemlistTag: [\".lemlist-profile-card .not-in-lemlist\"],\n // findEmailTag: [\".lemlist-profile-card .find-email\"],\n // findPhoneTag: [\".lemlist-profile-card .find-phone\"],\n // lemlistEmailFound: [\".lemlist-profile-card .lemlist-email-found\"],\n privateProfileInfoSection: [\".pv-profile-info-section\"],\n howToContainer: [\"#profile-content, header#global-nav\"],\n companyName: [\n \".top-card-background-hero-image+div .mt2 ul>li span\",\n 'div[componentkey^=\"com.linkedin.sdui.profile.card\"] div:has(div[data-view-name=\"profile-top-card-verified-badge\"]) + div div[role=\"button\"] p',\n ],\n companyLogo: [\".top-card-background-hero-image+div .mt2 ul>li img\"],\n // howToTippyContainer: [\"#lemlist-sidebar .sidebar\"],\n // lemlistListContainer: [\".ui-row.lemlist-list-container\"],\n campaignsListContainer: [\".ui-row.sm.campaigns-list-container\"],\n contactListContainer: [\".ui-row.sm.contact-list-container\"],\n // addButtonText: [\".lemlist-add-button-text\"],\n location: [\n \"#profile-content .artdeco-card .top-card-background-hero-image+div .text-body-small.inline.t-black--light\",\n ],\n campaignsListContainerDisplay: [\n \".ui-col.sm.campaigns-list-container-display\",\n ],\n contactListContainerDisplay: [\".ui-col.sm.contact-list-container-display\"],\n // notInLemlistButton: [\n // \".lemlist-profile-card .action-primary.not-in-lemlist\",\n // ],\n // alreadyInLemlistButton: [\n // \".lemlist-profile-card .action-primary.already-in-lemlist\",\n // ],\n mainExperienceContainer: [\n \".artdeco-card:has(#experience) li:first-child\",\n 'div[componentkey^=\"com.linkedin.sdui.profile.card\"][componentkey$=\"ExperienceTopLevelSection\"] div:has(h2) + div > div',\n ],\n experienceCompanyLogo: [\n '[data-field=\"experience_company_logo\"] img',\n 'div[componentkey^=\"com.linkedin.sdui.profile.card\"][componentkey$=\"ExperienceTopLevelSection\"] div:has(h2) + div figure[data-view-name=\"image\"] img',\n ],\n experienceCompanyName: [\n 'div:has([data-field=\"experience_company_logo\"])+div .t-normal span:not(.visually-hidden)',\n ],\n experienceOccupation: [\n 'div:has([data-field=\"experience_company_logo\"])+div .t-bold span:not(.visually-hidden)',\n ],\n experienceMultipleCompany: [\n \"li:has([data-view-name=profile-component-entity] .pvs-entity__sub-components .pvs-entity__sub-components) .t-bold span:not(.visually-hidden)\",\n ],\n experienceMultipleOccupation: [\n '[data-view-name=\"profile-component-entity\"] li:first-child .t-bold span:not(.visually-hidden)',\n ],\n // memberId: [\"[data-member-id]\"],\n // lemlistHowToOverlay: [\".lemlist-how-to-overlay\"],\n },\n // salesNavListsPeoplePage: {\n // fullName: ['[data-anonymize=\"person-name\"]'],\n // userOccupation: ['[data-anonymize=\"job-title\"]'],\n // companyName: ['[data-anonymize=\"company-name\"]'],\n // userPicture: ['img[data-anonymize=\"headshot-photo\"]'],\n // linkedinUrl: ['a[href^=\"/sales/lead/\"]'],\n // // lemlistAlreadyInCampaign: [\".lemlist-already-in-campaign\"],\n // lastCell: [\"td:last-child\"],\n // lastHeader: [\"th:last-child\"],\n // linkedinCheckbox: ['.artdeco-list__item input[type=\"checkbox\"]'],\n // linkedinCheckbox2: ['[data-scroll-into-view] input[type=\"checkbox\"]'],\n // linkedinCheckbox3: ['table input[type=\"checkbox\"]'],\n // linkedinCheckbox3Checked: ['table input[type=\"checkbox\"]'],\n // linkedinCheckboxSelectAll: ['input[id=\"bulk-actions-select\"]'],\n // bulkToolbar: ['.list-detail div:has(input[type=\"checkbox\"])'],\n // mainContainer: [\"#content-main\"],\n // // lemlistTableHeader: [\"th.lemlist-already-in-campaign\"],\n // profileSideContainer: [\"#inline-sidesheet-outlet\"],\n // checkboxContainer: [\"tr\"],\n // },\n salesNavProfilePage: {\n profileCardSection: [\"#profile-card-section\"],\n userName: ['#profile-card-section [data-anonymize=\"person-name\"]'],\n userPicture: ['#profile-card-section img[data-anonymize=\"headshot-photo\"]'],\n userOccupation: ['#profile-card-section [data-anonymize=\"headline\"]'],\n profileUrl: ['#profile-card-section a[href^=\"/sales/lead\"]'],\n linkedinProfileCard: [\"#profile-card-section\"],\n // lemlistProfileCard: [\".lemlist-profile-card\"],\n // findEmailTag: [\".lemlist-profile-card .find-email\"],\n // findPhoneTag: [\".lemlist-profile-card .find-phone\"],\n // lemlistEmailFound: [\".lemlist-profile-card .lemlist-email-found\"],\n // alreadyInLemlistTag: [\".lemlist-profile-card .already-in-lemlist\"],\n // notInLemlistTag: [\".lemlist-profile-card .not-in-lemlist\"],\n // lemlistListContainer: [\".ui-row.lemlist-list-container\"],\n campaignsListContainer: [\".ui-row.sm.campaigns-list-container\"],\n contactListContainer: [\".ui-row.sm.contact-list-container\"],\n // addButtonText: [\".lemlist-add-button-text\"],\n campaignsListContainerDisplay: [\n \".ui-col.sm.campaigns-list-container-display\",\n ],\n contactListContainerDisplay: [\".ui-col.sm.contact-list-container-display\"],\n // notInLemlistButton: [\n // \".lemlist-profile-card .action-primary.not-in-lemlist\",\n // ],\n // alreadyInLemlistButton: [\n // \".lemlist-profile-card .action-primary.already-in-lemlist\",\n // ],\n location: [\"#profile-card-section>section>div>div:last-child div:has(svg)\"],\n companyName: ['#profile-card-section a[data-anonymize=\"company-name\"]'],\n companyLogo: ['#profile-card-section img[data-anonymize=\"company-logo\"]'],\n moreInfoButton: [\n \"#profile-card-section section[data-x--lead-actions-bar] button[data-x--lead-actions-bar-overflow-menu]\",\n '#profile-card-section button[aria-label=\"Open actions overflow menu\"]',\n ],\n linkedinProfileLinkButton: [\n '#hue-web-menu-outlet a[href^=\"https://www.linkedin.com/in/\"]',\n ],\n mainExperienceContainer: ['[data-sn-view-name=\"feature-lead-experience\"]'],\n experienceCompanyLogo: [\n 'li:first-child img[data-anonymize=\"company-logo\"]',\n ],\n experienceCompanyName: ['li:first-child [data-anonymize=\"company-name\"]'],\n experienceOccupation: ['li:first-child [data-anonymize=\"job-title\"]'],\n experienceMultipleOccupation: [\n 'ul li ul li:first-child [data-anonymize=\"job-title\"]',\n 'ul li [data-anonymize=\"job-title\"]',\n ],\n experienceMultipleCompany: [\n 'li:first-child [data-anonymize=\"company-name\"]',\n ],\n },\n // salesNavSearchPeoplePage: {\n // linkedinUrl: ['a[href^=\"/sales/lead/\"]'],\n // fullName: ['[data-anonymize=\"person-name\"]'],\n // userOccupation: ['[data-anonymize=\"title\"]'],\n // companyName: ['a[data-anonymize=\"company-name\"]'],\n // userPicture: ['img[data-anonymize=\"headshot-photo\"]'],\n // actionsDiv: [\"ul:has(li [data-anchor-send-message])\"],\n // linkedinCheckbox: ['.artdeco-list__item input[type=\"checkbox\"]'],\n // linkedinCheckboxChecked: [\n // '.artdeco-list__item input[type=\"checkbox\"]:checked',\n // ],\n // linkedinCheckbox2: ['[data-scroll-into-view] input[type=\"checkbox\"]'],\n // linkedinCheckboxSelectAll: [\n // 'input[id^=\"multi-selector-checkbox-ember\"]',\n // 'li input#bulk-actions-select[type=\"checkbox\"]',\n // ],\n // // lemlistAlreadyInCampaignTagContainer: [\n // // \".artdeco-list__item ul:has(li [data-anchor-send-message])\",\n // // ],\n // // lemlistHeaderContainer: [\"div:has(+ #search-results-container)\"],\n // entityLockup: [\".artdeco-entity-lockup\"],\n // listItem: [\".artdeco-list__item\"],\n // checkbox: ['input[type=\"checkbox\"]'],\n // listItemArticle: [\".artdeco-list__item article\"],\n // dataScrollIntoView: [\"[data-scroll-into-view]\"],\n // leadSearchResults: ['[data-sn-view-name=\"module-lead-search-results\"]'],\n // completeCheckboxes: [\n // '[data-scroll-into-view]:has(+:not(:is(article))) input[type=\"checkbox\"]',\n // ],\n // incompleteCheckboxes: [\n // '[data-scroll-into-view]:has(+article) input[type=\"checkbox\"]',\n // ],\n // profileSideContainer: [\"#inline-sidesheet-outlet\"],\n // // linkedinSearchPageContainer: [\n // // \".lemlist-header + #search-results-container\",\n // // ],\n // howToContainer: [\"header.application-header\"],\n // // howToScrollToElement: [\".lemlist-header\"],\n // // selectAllCheckbox: [\".lemlist-checkbox-all\"],\n // // selectAllCheckboxLabel: [\"span.lemlist-select-all-text\"],\n // // selectCheckboxChecked: [\n // // \".lemlist-checkbox:not(.lemlist-checkbox-all).checked\",\n // // ],\n // },\n searchPeoplePage: {\n searchEntityResult: [\n '[data-view-name=\"search-entity-result-universal-template\"]',\n ],\n linkedinUrl: [\n 'a[data-test-app-aware-link][href^=\"https://www.linkedin.com/in/\"]',\n 'a[data-view-name=\"search-result-lockup-title\"]',\n ],\n image: [\".presence-entity img\", \"a>div>div>figure>img\"],\n userOccupation: [\n 'p:has(a[data-view-name=\"search-result-lockup-title\"]) + p',\n \".entity-result__primary-subtitle\",\n \".entity-result__divider > div div:nth-child(2)\",\n \"div>div>div:nth-child(2)>div>div:nth-child(2)\",\n \"figure + div p:nth-child(2)\",\n ],\n fullName: [\n \".entity-result__title-text a span>span\",\n \".entity-result__title-line a span>span\",\n \".entity-result__title-line span>a>span>span\",\n \"a:has(+.entity-result__badge)>span>span\",\n \".linked-area div:nth-child(2) > div:first-child > div.t-roman.t-sans a\",\n 'a[data-view-name=\"search-result-lockup-title\"]',\n ],\n resultList: [\n \".search-results-container>div:has(.reusable-search__result-container)\",\n ],\n actionsDiv: [\n \".entity-result__actions\",\n \".linked-area > div > div:last-child\",\n \"div:has(figure) > div:last-child\",\n ],\n validResult: [\n \"[data-chameleon-result-urn] , .reusable-search__result-container\",\n ],\n searchResult: [\n \".search-results-container li:has(>[data-chameleon-result-urn])\",\n '[data-view-name=\"people-search-result\"]',\n ],\n searchResultsContainer: [\n \".search-results-container\",\n '[role=\"main\"] div:has(>hr[role=\"presentation\"])',\n ],\n mainLayoutLeft: [\".search-marvel-srp\", '[role=\"main\"] div:has(hr)>div>div'],\n howToContainer: [\n \".hasLegacyFeedLineHeight div:has(main)\",\n \".authentication-outlet\",\n ],\n // howToScrollToElement: [\".lemlist-header\"],\n // selectAllCheckbox: [\".lemlist-checkbox-all\"],\n // selectAllCheckboxLabel: [\"span.lemlist-select-all-text\"],\n // selectCheckboxChecked: [\n // \".lemlist-checkbox:not(.lemlist-checkbox-all).checked\",\n // ],\n },\n searchAllPage: {\n peopleButton: [\"nav ul.search-reusables__filter-list>li>button\"],\n toolbar: [\".scaffold-layout-toolbar\"],\n },\n // linkedinComposerPage: {\n // composerWrapper: [\".msg-convo-wrapper\"],\n // textareaSelector: [\".msg-form__contenteditable\"],\n // footer: [\".msg-form__message-texteditor\"],\n // messagingOverlay: [\"#msg-overlay\"],\n // form: [\".msg-form\"],\n // formContainer: [\"form.msg-form.msg-form--thread-footer-feature\"],\n // composerEvent: [\".msg-s-event-listitem\"],\n // composerEventBody: [\".msg-s-event-listitem__body\"],\n // composerEventName: [\".msg-s-message-group__name\"],\n // composerEventDate: [\".msg-s-message-group__timestamp\"],\n // interOPOutlet: [\"#interop-outlet\"],\n // },\n // gmail: {\n // userEmailElm: [\".gb_A.gb_Xa.gb_Z\"],\n // userEmailElmFallback: [\".gb_Bc .gb_g + div\"],\n // },\n // gmailComposerPage: {\n // gmailComposerForm: [\"form input[name=composeid]\"],\n // gmailComposer: [\"div.M9\"],\n // previousMessagesButton: [\".ajR\"],\n // previousMessages: [\".gmail_quote_container blockquote\"],\n // // lemlistActionBar: [\".gmail-action-bar\"],\n // // lemlistActionBarAskAIElements: [\".gmail-ask-ai-elements\"],\n // // lemlistActionBarTemplatesButton: [\".gmail-action-bar .templates\"],\n // previousEmail: ['form > input[name=\"rm\"]'],\n // body: [\".editable.LW-avf\"],\n // },\n // gmailSidebarPage: {\n // appIconsContainer: ['div[role=\"tablist\"]'],\n // appIconsActiveIcon: [\n // \"div[role=tablist] div[data-guest-app-id].aT5-aOt-I-KO .aT5-aOt-I-JX-Jw\",\n // ],\n // appIcons: ['div[role=\"tablist\"] div[data-guest-app-id]'],\n // },\n // gmailEmailPage: {\n // topBarDate: [\".gH.bAk\"],\n // body: [\".a3s.aiL > div[dir]\"],\n // },\n};\n\ntype TPage = keyof typeof selectors;\ntype TKey<T extends TPage> = keyof (typeof selectors)[T];\n\n// 定义两种参数组合的联合类型\ntype PageKeyParams<T extends TPage> = {\n page: T;\n key: TKey<T>;\n selector?: never;\n};\n\ntype SelectorParams = {\n page?: never;\n key?: never;\n selector: string;\n};\n\n// 基础参数类型\ntype BaseParams = {\n container?: Document | HTMLElement;\n mode?: \"all\" | \"closest\";\n // critical?: boolean;\n};\n\n// 最终的参数类型:page+key 或 selector 二选一\ntype GetElementParams<T extends TPage> = BaseParams &\n (PageKeyParams<T> | SelectorParams);\n\n// 根据 mode 推断返回类型\ntype GetElementReturnType<M extends \"all\" | \"closest\" | undefined> =\n M extends \"all\" ? HTMLElement[] | null : HTMLElement | null;\n\n// const IFRAME_SELECTOR = 'iframe[src=\"/preload/\"]';\n\nfunction getSelector<T extends TPage>({\n page,\n key,\n}: {\n page: T;\n key: TKey<T>;\n}): string[] {\n return selectors[page][key] as string[];\n}\n\n// 辅助函数:根据模式查询元素\nfunction queryElement(\n container: Document | HTMLElement,\n selector: string,\n mode?: \"closest\"\n): HTMLElement | null;\nfunction queryElement(\n container: Document | HTMLElement,\n selector: string,\n mode: \"all\"\n): HTMLElement[] | null;\nfunction queryElement(\n container: Document | HTMLElement,\n selector: string,\n mode?: \"all\" | \"closest\"\n): HTMLElement | HTMLElement[] | null {\n switch (mode) {\n case \"all\":\n const allResults = container.querySelectorAll(selector);\n return allResults.length > 0\n ? (Array.from(allResults) as HTMLElement[])\n : null;\n\n case \"closest\":\n if (container instanceof HTMLElement) {\n return container.closest(selector) as HTMLElement | null;\n }\n return null;\n\n default:\n return container.querySelector(selector) as HTMLElement | null;\n }\n}\n\nexport function getElement<\n T extends TPage,\n M extends \"all\" | \"closest\" | undefined = undefined\n>({\n page,\n key,\n selector,\n container,\n mode,\n}: GetElementParams<T> & { mode?: M }): GetElementReturnType<M> {\n container ??= document;\n\n // 获取选择器数组 - 现在类型安全\n const sels: string[] = page && key ? getSelector({ page, key }) : [selector!];\n\n // 处理 LinkedIn iframe 样式注入\n // let iframeDoc: Document | null = null;\n // if (window.location.host.includes(\"linkedin.com\")) {\n // const iframe = document.querySelector(IFRAME_SELECTOR) as HTMLIFrameElement;\n // iframeDoc = iframe?.contentDocument || null;\n\n // if (iframeDoc && !iframeDoc.querySelector(\"style.lemlist-style\")) {\n // (async (doc: Document) => {\n // const cssFiles = [\"src/linkedin.css\", \"src/ui.css\"];\n // for (const file of cssFiles) {\n // try {\n // const url = chrome.runtime.getURL(file);\n // const cssText = await fetch(url).then(res => res.text());\n // const style = document.createElement(\"style\");\n // style.classList.add(\"lemlist-style\");\n // style.textContent = cssText;\n // doc.head.appendChild(style);\n // } catch (error) {\n // console.warn(`Failed to load CSS file: ${file}`, error);\n // }\n // }\n // })(iframeDoc);\n // }\n // }\n\n // 遍历选择器查找元素\n for (const sel of sels) {\n const result = queryElement(container, sel, mode as any);\n if (result) return result as GetElementReturnType<M>;\n\n // 如果在 iframe 中查找\n // if (iframeDoc) {\n // const iframeResult = queryElement(iframeDoc, sel, mode as any);\n // if (iframeResult) return iframeResult as GetElementReturnType<M>;\n // }\n }\n\n return null as GetElementReturnType<M>;\n}\n\nfunction decodeHtmlEntities(e: string | undefined) {\n if (!e) return \"\";\n const t = document.createElement(\"textarea\");\n t.innerHTML = e;\n return t.value.trim();\n}\n\nfunction getContactPage() {\n return window.location.href.includes(\"linkedin.com/sales\")\n ? \"salesNavProfilePage\"\n : \"profilePage\";\n}\n\n// 还不太准确\nexport function getContactInfo() {\n const page = getContactPage();\n function g(key: TKey<typeof page>) {\n return getElement({ page: page, key: key, container: document });\n }\n const n = g(\"userName\")?.innerText;\n if (!n) return console.error(\"extractUserInfos: no userName found\"), {};\n const a = (g(\"userPicture\") as HTMLImageElement)?.src,\n s = g(\"userOccupation\")?.innerHTML,\n i = g(\"companyName\")?.innerText,\n c = (g(\"companyLogo\") as HTMLImageElement)?.src,\n r = g(\"location\")?.innerText;\n let l;\n return (\n \"salesNavProfilePage\" === page &&\n (l = /linkedin\\.com\\/sales\\/lead/i.test(window.location.href)\n ? window.location.href\n : (g(\"profileUrl\" as any) as HTMLAnchorElement)?.href),\n {\n name: decodeHtmlEntities(n),\n profileUrl: l,\n picture: a,\n occupation: decodeHtmlEntities(s),\n companyName: i,\n companyPicture: c,\n location: r,\n }\n );\n}\n\n// (window as any).getContactInfo = getContactInfo;\n// (window as any).getElement = getElement;\n\n// 类型安全验证示例(这些调用在编译时会被检查)\n// ✅ 正确的用法:\n// getElement({ page: \"searchPeoplePage\", key: \"fullName\" })\n// getElement({ selector: \".some-class\" })\n//\n// ❌ 错误的用法(编译时会报错):\n// getElement({ page: \"searchPeoplePage\" }) // 缺少 key\n// getElement({ key: \"fullName\" }) // 缺少 page\n// getElement({ page: \"searchPeoplePage\", key: \"fullName\", selector: \".class\" }) // 不能同时提供\n// getElement({}) // 必须提供 page+key 或 selector\n","/**\n * Checks if the given URL is a LinkedIn URL.\n * @param url - The URL string to check.\n * @returns true if the URL is a LinkedIn URL, false otherwise.\n */\nexport function isLinkedInUrl(url: string) {\n const regex = /^https?:\\/\\/(www|.{2})\\.linkedin\\.com/;\n return regex.test(url);\n}\n\n/** 表示各种 LinkedIn 页面类型的类型。 */\nexport type PageType =\n | \"profile\"\n | \"feed\"\n | \"post\"\n | \"company\"\n | \"login\"\n | \"messages\"\n | \"search-all\"\n | \"search-people\"\n | \"connections\"\n | \"chrome\"\n | \"chrome-extension\"\n | \"view-source\"\n | \"\";\n/** 将页面类型映射到数值。 */\nexport const pageTypeMap: Record<string, number> = {\n \"\": 0,\n chrome: 1,\n \"chrome-extension\": 2,\n \"view-source\": 3,\n ftp: 4,\n file: 5,\n data: 6,\n blob: 7,\n about: 8,\n};\n/**\n * 根据 URL 确定 LinkedIn 页面的类型。\n * @param url - 要分析的 URL。默认为空字符串。\n * @returns 页面类型字符串。\n */\nexport function getLinkedinPageType(url = \"\") {\n let type: PageType = \"\";\n // 先去除 # 及其后面的内容\n const cleanUrl = url.split(\"#\")[0].toLocaleLowerCase();\n return (\n /^https\\:\\/\\/(www|.{2})\\.linkedin\\.com\\/in\\/[^/?]+(\\/recent-activity\\/|\\/details\\/|\\/overlay\\/|\\/?\\?[^/]*|\\/?$)/.test(\n cleanUrl\n ) ||\n /^https\\:\\/\\/(www|.{2})\\.linkedin\\.com\\/sales\\/people\\/(.+?),/.test(\n cleanUrl\n ) ||\n /^https\\:\\/\\/(www|.{2})\\.linkedin\\.com\\/sales\\/(profile|lead)\\/([^,]{39}),/.test(\n cleanUrl\n )\n ? (type = \"profile\")\n : cleanUrl.includes(\"linkedin.com/feed\")\n ? (type = \"feed\")\n : cleanUrl.includes(\"linkedin.com/posts/\")\n ? (type = \"post\")\n : cleanUrl.includes(\"linkedin.com/login\") ||\n cleanUrl.includes(\"linkedin.com/checkpoint\") ||\n cleanUrl.includes(\"linkedin.com/authwall\")\n ? (type = \"login\")\n : cleanUrl.includes(\"linkedin.com/company/\")\n ? (type = \"company\")\n : cleanUrl.includes(\"linkedin.com/messaging/thread/\")\n ? (type = \"messages\")\n : cleanUrl.includes(\"linkedin.com/search/results/people/?\") ||\n cleanUrl.includes(\"linkedin.com/sales/search/people\")\n ? (type = \"search-people\")\n : cleanUrl.includes(\"linkedin.com/search/results/all\")\n ? (type = \"search-all\")\n : cleanUrl.includes(\"linkedin.com/mynetwork/\") && (type = \"connections\"),\n type\n );\n}\n\n/**\n * 从 LinkedIn 个人资料 URL 中提取公共 ID。\n * @param url - 要从中提取的 URL。默认为当前页面 URL。\n * @returns 公共 ID 字符串,如果未找到则为空字符串。\n */\nexport function getProfilePublicId(url: string = \"\") {\n url = url || window.top?.location.href || document.URL;\n const id =\n (url.match(/linkedin\\.com\\/in\\/([^?/]+)/) || [])[1] ||\n (url.match(/linkedin\\.com\\/sales\\/people\\/(.+?),/) || [])[1] ||\n (url.match(/linkedin\\.com\\/sales\\/(?:profile|lead)\\/([^,]{39}),/) ||\n [])[1] ||\n \"\";\n return decodeURIComponent(id);\n}\n\n/**\n * 从 LinkedIn 帖子 URL 中提取公共 ID。\n * @param url - 要从中提取的 URL。默认为当前页面 URL。\n * @returns 公共 ID 字符串,如果未找到则为空字符串。\n */\nexport function getPostPublicId(url: string = \"\") {\n url = url || window.top?.location.href || document.URL;\n const id = (url.match(/linkedin\\.com\\/posts\\/([^\\/]+)\\//) || [])[1] || \"\";\n return decodeURIComponent(id);\n}\n\n/**\n * 从 LinkedIn 公司 URL 中提取公共 ID。\n * @param url - 要从中提取的 URL。默认为当前页面 URL。\n * @returns 公共 ID 字符串,如果未找到则为空字符串。\n */\nexport function getCompanyPublicId(url: string = \"\") {\n url = url || window.top?.location.href || document.URL;\n const id = (url.match(/linkedin\\.com\\/company\\/([^?/]+)/) || [])[1] || \"\";\n return decodeURIComponent(id);\n}\n\n/**\n * 从 LinkedIn URL 中提取公共 ID,尝试个人资料或公司。\n * @param url - 要从中提取的 URL。默认为当前页面 URL。\n * @returns 公共 ID 字符串,如果未找到则为空字符串。\n */\nexport function getLinkedinPublicId(url: string = \"\") {\n url = url || window.top?.location.href || document.URL;\n return getProfilePublicId(url) || getCompanyPublicId(url) || \"\";\n}\n\n/**\n * 确定页面类型,检查协议或 LinkedIn 页面类型。\n * @param url - 要分析的 URL。\n * @returns 页面类型字符串。\n */\nexport function getPageType(url = \"\") {\n if (!url) return \"\";\n const protocolMap = Object.keys(pageTypeMap);\n const protocol = new URL(url).protocol.replace(\":\", \"\");\n return protocolMap.includes(protocol) ? protocol : getLinkedinPageType(url);\n}\n","/**\n * Chrome Runtime 消息通信封装\n * 基于 TypeScript 的类型安全消息系统(Builder 模式)\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// 配置\n// ============================================================================\n\n/**\n * 运行时配置选项\n */\nexport interface RuntimeConfig {\n /** 是否启用调试日志,默认 true */\n debug?: boolean;\n /** 日志前缀,默认 \"[MessageBus]\" */\n logPrefix?: string;\n}\n\n// ============================================================================\n// 核心类型定义\n// ============================================================================\n\n/**\n * 消息定义结构\n */\nexport interface MessageDefinition {\n payload: unknown;\n response: unknown;\n}\n\n/**\n * 消息协议表类型\n */\nexport type MessageProtocol = Record<string, MessageDefinition>;\n\n/**\n * 可选 payload 参数类型\n * 当 payload 为 void 或 undefined 时,无需传参\n */\nexport type OptionalPayload<P> = P extends void | undefined ? [] : [P];\n\n/**\n * 错误响应结构\n */\nexport interface ErrorResponse {\n __error: true;\n message: string;\n}\n\n/**\n * 类型守卫:检查响应是否为错误响应\n */\nexport function isErrorResponse(response: unknown): response is ErrorResponse {\n return (\n typeof response === \"object\" &&\n response !== null &&\n \"__error\" in response &&\n (response as ErrorResponse).__error === true\n );\n}\n\n// ============================================================================\n// 消息总线类型\n// ============================================================================\n\n/**\n * 消息处理器类型\n */\nexport type MessageHandler<P, R> = (\n payload: P,\n sender: chrome.runtime.MessageSender\n) => R | Promise<R>;\n\n/**\n * 消息总线接口\n */\nexport interface MessageBus<T extends MessageProtocol> {\n /**\n * 发送消息到 background\n */\n send<K extends keyof T>(\n type: K,\n ...payload: OptionalPayload<T[K][\"payload\"]>\n ): Promise<T[K][\"response\"]>;\n\n /**\n * 发送消息到指定 Tab\n */\n sendToTab<K extends keyof T>(\n tabId: number,\n type: K,\n ...payload: OptionalPayload<T[K][\"payload\"]>\n ): Promise<T[K][\"response\"]>;\n\n /**\n * 监听消息\n */\n on<K extends keyof T>(\n type: K,\n handler: MessageHandler<T[K][\"payload\"], T[K][\"response\"]>\n ): () => void;\n\n /**\n * 批量注册监听器\n */\n onMany<K extends keyof T>(\n handlers: Partial<{\n [P in K]: MessageHandler<T[P][\"payload\"], T[P][\"response\"]>;\n }>\n ): () => void;\n\n /**\n * 检查是否已注册处理器\n */\n hasHandler(type: keyof T): boolean;\n\n /**\n * 获取已注册的消息类型\n */\n getRegisteredTypes(): (keyof T)[];\n\n /**\n * 清除所有处理器\n */\n clearAllHandlers(): void;\n}\n\n// ============================================================================\n// 消息总线实现\n// ============================================================================\n\n/**\n * 创建类型安全的消息总线\n *\n * @param config - 可选配置\n * @returns 类型化的消息总线实例\n *\n * @example\n * ```ts\n * // 1. 定义消息类型\n * type MyMessages = {\n * \"user/login\": {\n * payload: { username: string; password: string };\n * response: { token: string };\n * };\n * \"user/logout\": {\n * payload: void;\n * response: void;\n * };\n * };\n *\n * // 2. 创建消息总线\n * const bus = createMessageBus<MyMessages>();\n *\n * // 3. 发送消息(content script)\n * const result = await bus.send(\"user/login\", {\n * username: \"admin\",\n * password: \"123456\"\n * });\n * console.log(result.token); // 类型安全!\n *\n * // 4. 监听消息(background)\n * bus.on(\"user/login\", async ({ username, password }) => {\n * const user = await authenticate(username, password);\n * return { token: user.token };\n * });\n * ```\n */\nexport function createMessageBus<T extends MessageProtocol>(\n config: RuntimeConfig = {}\n): MessageBus<T> {\n const { debug = false, logPrefix = \"[MessageBus]\" } = config;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handlers = new Map<keyof T, MessageHandler<any, any>>();\n let isListenerRegistered = false;\n\n // 日志函数\n function logError(message: string, ...args: unknown[]): void {\n if (debug) {\n console.error(`${logPrefix} ${message}`, ...args);\n }\n }\n\n // 确保全局监听器已注册\n function ensureListener(): void {\n if (isListenerRegistered) return;\n\n chrome.runtime.onMessage.addListener(\n (\n message: { type: keyof T; payload: unknown },\n sender: chrome.runtime.MessageSender,\n sendResponse: (response: unknown) => void\n ): boolean | undefined => {\n // 验证消息格式\n if (!message || typeof message.type !== \"string\") {\n return undefined;\n }\n\n const handler = handlers.get(message.type);\n if (!handler) {\n return undefined;\n }\n\n try {\n const result = handler(message.payload, sender);\n\n if (result instanceof Promise) {\n result.then(sendResponse).catch((error: unknown) => {\n logError(`Error handling \"${String(message.type)}\":`, error);\n sendResponse({\n __error: true,\n message: error instanceof Error ? error.message : String(error),\n } satisfies ErrorResponse);\n });\n return true;\n }\n\n sendResponse(result);\n return false;\n } catch (error) {\n logError(`Error handling \"${String(message.type)}\":`, error);\n sendResponse({\n __error: true,\n message: error instanceof Error ? error.message : String(error),\n } satisfies ErrorResponse);\n return false;\n }\n }\n );\n\n isListenerRegistered = true;\n }\n\n return {\n send<K extends keyof T>(\n type: K,\n ...payload: OptionalPayload<T[K][\"payload\"]>\n ): Promise<T[K][\"response\"]> {\n return chrome.runtime.sendMessage({ type, payload: payload[0] });\n },\n\n sendToTab<K extends keyof T>(\n tabId: number,\n type: K,\n ...payload: OptionalPayload<T[K][\"payload\"]>\n ): Promise<T[K][\"response\"]> {\n return chrome.tabs.sendMessage(tabId, { type, payload: payload[0] });\n },\n\n on<K extends keyof T>(\n type: K,\n handler: MessageHandler<T[K][\"payload\"], T[K][\"response\"]>\n ): () => void {\n ensureListener();\n handlers.set(type, handler);\n return () => {\n handlers.delete(type);\n };\n },\n\n onMany<K extends keyof T>(\n handlerMap: Partial<{\n [P in K]: MessageHandler<T[P][\"payload\"], T[P][\"response\"]>;\n }>\n ): () => void {\n ensureListener();\n const registeredTypes: K[] = [];\n\n for (const [type, handler] of Object.entries(handlerMap)) {\n if (handler) {\n handlers.set(type as K, handler as MessageHandler<unknown, unknown>);\n registeredTypes.push(type as K);\n }\n }\n\n return () => {\n for (const type of registeredTypes) {\n handlers.delete(type);\n }\n };\n },\n\n hasHandler(type: keyof T): boolean {\n return handlers.has(type);\n },\n\n getRegisteredTypes(): (keyof T)[] {\n return Array.from(handlers.keys());\n },\n\n clearAllHandlers(): void {\n handlers.clear();\n },\n };\n}\n","type TClientId = `${string}.apps.googleusercontent.com`;\ntype TResponseType = \"id_token\" | \"code\";\n\ntype TLaunchWebAuthFlowParams = {\n clientId: TClientId;\n responseType: TResponseType | readonly TResponseType[];\n state?: string; // 通过redirectUrl的state参数返回\n nonce?: string; // 通过解析 redirectUrl的id_token参数返回, nonce 包含在 id_token 的 payload 中\n interactive?: boolean; // 是否需要用户交互\n};\n\ntype TMapping = {\n id_token: { id_token: string };\n code: { code: string };\n};\n\n// 2. TResult 根据输入类型,返回 TMapping 中对应的类型\ntype TResult<T extends TResponseType | readonly TResponseType[]> =\n T extends TResponseType // 如果是单个字面量\n ? TMapping[T]\n : T extends readonly (infer Element)[] // 如果是数组/元组\n ? { [K in Element & keyof TMapping]: string }\n : never;\n\n// 辅助类型,用于从联合类型创建对象类型\n// type UnionToObject<T extends string> = {\n// [K in T]: string;\n// };\n\n// // 辅助类型,用于将 TResponseType[] 数组类型转换为联合类型\n// type ElementOf<T> = T extends readonly (infer U)[] ? U : never;\n\n/**\n * 根据 responseType 推断返回类型\n * 例如: TResult<\"code\"> => { code: string }\n * TResult<[\"id_token\", \"code\"]> => { id_token: string; code: string }\n * TResult<[\"code\", \"id_token\"]> => { id_token: string; code: string }\n */\n// type TResult<T> = T extends \"id_token\"\n// ? { id_token: string }\n// : T extends \"code\"\n// ? { code: string }\n// : T extends readonly TResponseType[]\n// ? UnionToObject<ElementOf<T>>\n// : never;\n\n/**\n * 支持 Google OAuth2 登录的 client_id 类型(参数 clientId)\n * 需要 identity 权限\n * @param clientId - Google OAuth2 Web 应用 类型的 client_id,例如: \"xxxxxx.apps.googleusercontent.com\"\n * @param responseType - 响应类型,默认: \"code\"\n * @returns Promise<string> - 返回 id_token 或 code\n */\nexport async function launchWebAuthFlow<P extends TLaunchWebAuthFlowParams>({\n clientId,\n responseType = \"code\",\n state,\n nonce,\n interactive = true,\n}: P): Promise<\n TResult<P[\"responseType\"]> &\n (P extends { state: string } ? { state: string } : {})\n> {\n const redirectUri = chrome.identity.getRedirectURL(); // 使用这个可以不打开窗口,而将redirectUri传给回掉函数或then\n // const clientId =\n // \"351437144506-j211m0v70p0f8t2bh4pdgdm9jpfgojra.apps.googleusercontent.com\"; //web 这里需要web client id\n // const clientId = '351437144506-2srn3bbnjhnfpu2vq2rknk41rfrk30ks.apps.googleusercontent.com'; //extension\n const scope = \"openid email profile\"; // \"https://www.googleapis.com/auth/userinfo.email\";\n // const responseType = \"id_token\";\n const resType = Array.isArray(responseType) ? responseType : [responseType];\n\n // console.log(\"nonce\", nonce);\n const authUrl = new URL(\"https://accounts.google.com/o/oauth2/v2/auth\");\n authUrl.searchParams.set(\"client_id\", clientId);\n authUrl.searchParams.set(\"redirect_uri\", redirectUri);\n authUrl.searchParams.set(\"response_type\", resType.join(\" \"));\n authUrl.searchParams.set(\"scope\", scope);\n nonce && authUrl.searchParams.set(\"nonce\", nonce);\n state && authUrl.searchParams.set(\"state\", state);\n\n return chrome.identity\n .launchWebAuthFlow({ url: authUrl.toString(), interactive: interactive })\n .then((redirectUrl?: string) => {\n if (!redirectUrl) {\n return Promise.reject(new Error(\"redirectUrl is null\"));\n }\n const splitChar = redirectUrl.includes(\"?\") ? \"?\" : \"#\";\n const urlParams = new URLSearchParams(redirectUrl.split(splitChar)[1]);\n const result = {} as Record<string, string>;\n urlParams.forEach((value, key) => {\n result[key] = value;\n });\n return result as any;\n })\n .catch((error: any) => {\n console.log(\"error\", error);\n return Promise.reject(error);\n });\n}\n\n/**\n * 解码 JWT\n * @param idToken - JWT\n * @returns 返回 JWT 的 payload\n */\nexport function decodeJWT(idToken: string): Record<string, any> {\n let base64Url = idToken.split(\".\")[1];\n let base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n let jsonPayload = decodeURIComponent(\n atob(base64)\n .split(\"\")\n .map(function (c) {\n return \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2);\n })\n .join(\"\")\n );\n return JSON.parse(jsonPayload);\n}\n\n// function getNonce(): string {\n// var a = new Uint32Array(2);\n// window.crypto.getRandomValues(a);\n// return a[0].toString(16) + a[1].toString(16);\n// }\n\n// const a = await launchWebAuthFlow({\n// clientId:\n// \"351437144506-j211m0v70p0f8t2bh4pdgdm9jpfgojra.apps.googleusercontent.com\",\n// responseType: \"code\",\n// state: \"123\",\n// });\n// console.log(a);\n// const a2 = await launchWebAuthFlow({\n// clientId:\n// \"351437144506-j211m0v70p0f8t2bh4pdgdm9jpfgojra.apps.googleusercontent.com\",\n// responseType: [\"code\"],\n// });\n// console.log(a2);\n// const b = await launchWebAuthFlow({\n// clientId:\n// \"351437144506-j211m0v70p0f8t2bh4pdgdm9jpfgojra.apps.googleusercontent.com\",\n// responseType: \"id_token\",\n// state: \"123\",\n// });\n// console.log(b);\n// const c = await launchWebAuthFlow({\n// clientId:\n// \"351437144506-j211m0v70p0f8t2bh4pdgdm9jpfgojra.apps.googleusercontent.com\",\n// responseType: [\"id_token\", \"code\"],\n// state: \"123\",\n// });\n// console.log(c);\n// const d = await launchWebAuthFlow({\n// clientId:\n// \"351437144506-j211m0v70p0f8t2bh4pdgdm9jpfgojra.apps.googleusercontent.com\",\n// responseType: [\"code\", \"id_token\"],\n// });\n// console.log(d);\n","/**\n * 将 chrome.cookies 返回的 Cookie 数组转换为适合请求头使用的字符串。\n * 仅用于扩展内部工具函数。\n */\nfunction cookies2str(cookies: chrome.cookies.Cookie[]) {\n return cookies.map((cookie) => `${cookie.name}=${cookie.value}`).join(\"; \");\n}\n\n/**\n * 获取指定 URL 下某个 Cookie 的值。\n *\n * 注意:\n * - 依赖 chrome.cookies API,只能在浏览器扩展的后台上下文中调用\n * (如 MV3 service worker、background page、extension page 等)。\n * - 不能在普通网页环境或仅有 content-script 的上下文中直接使用。\n */\nexport function getCookie(\n url: string,\n name: string,\n onlyValue: true\n): Promise<string>;\nexport function getCookie(\n url: string,\n name: string,\n onlyValue?: false\n): Promise<chrome.cookies.Cookie | undefined>;\nexport function getCookie(\n url: string,\n name: string,\n onlyValue = false\n): Promise<string | chrome.cookies.Cookie | undefined> {\n return chrome.cookies.get({ url, name }).then((cookie) => {\n return onlyValue\n ? cookie?.value?.replace(/\"/g, \"\") || \"\"\n : cookie ?? undefined;\n });\n}\n\n/**\n * 获取指定 URL 下的所有 Cookie,并以 \"key=value; key2=value2\" 的形式返回。\n *\n * 同样依赖 chrome.cookies API,只能在扩展后台(service worker / background 等)\n * 或具有相应权限的扩展页面中调用。\n */\nexport function getCookies(url: string, stringified: true): Promise<string>;\nexport function getCookies(\n url: string,\n stringified?: false\n): Promise<chrome.cookies.Cookie[]>;\nexport function getCookies(\n url: string,\n stringified = false\n): Promise<string | chrome.cookies.Cookie[]> {\n return chrome.cookies.getAll({ url }).then((cookies) => {\n return stringified ? cookies2str(cookies) : cookies;\n });\n}\n\n/**\n * 获取当前扩展的基础信息:语言、ID、版本等。\n * 需要在扩展上下文中运行(具有 chrome.runtime / chrome.i18n 的环境)。\n */\nexport function getExtensionInfo() {\n return {\n locale: chrome.i18n?.getUILanguage(),\n extId: chrome.runtime?.id,\n version: chrome.runtime?.getManifest().version,\n };\n}\n","declare var global: typeof globalThis;\n\n/**\n * 获取当前环境的全局对象。\n *\n * 在不同的 JavaScript 运行环境中,全局对象的名称不同:\n * - 在浏览器环境中,全局对象是 `window`。\n * - 在 Node.js 环境中,全局对象是 `global`。\n * - 在 Web Worker 环境中,全局对象是 `self`。\n *\n * 这个函数提供了一种统一的方式来获取当前环境的全局对象。\n *\n * @returns 当前环境的全局对象。\n */\nexport function getGlobal(this: any) {\n if (typeof globalThis !== \"undefined\") {\n return globalThis;\n }\n\n if (typeof self !== \"undefined\") {\n return self;\n }\n\n if (typeof window !== \"undefined\") {\n return window;\n }\n\n if (typeof global !== \"undefined\") {\n return global;\n }\n\n // 如果以上都不符合,则返回 this\n return this;\n}\n","import { AsyncFunction, RealUndefined } from \"./type\";\n\n/**\n * 定义一个类型,用于扩展函数类型,增加一个可选的 isExecuting 属性\n */\nexport type SingleExecutionFunction<F extends AsyncFunction<any[], any>> =\n F extends (this: infer This, ...args: infer Args) => Promise<infer R>\n ? ((this: This, ...args: Args) => Promise<R | RealUndefined>) & {\n isExecuting?: boolean;\n }\n : never;\n\n/**\n * 创建一个有执行状态的函数,该函数在前一次调用未完成时不会被再次调用。\n *\n * @param func - 需要包裹的函数。\n * @returns 一个增强版的函数,该函数具有 isExecuting 属性。\n */\nexport function singleExecutionWrapper<T extends AsyncFunction<any[], any>>(\n func: T,\n minTime: number = 0\n) {\n const singleExecutionFn = function (\n this: ThisParameterType<T>,\n ...args: Parameters<T>\n ): ReturnType<T> | Promise<RealUndefined> {\n if (singleExecutionFn.isExecuting) {\n // console.log(`Function(${func.name}) is executing.`);\n return Promise.resolve(RealUndefined);\n }\n singleExecutionFn.isExecuting = true;\n\n const startTime = performance.now();\n const result = func.apply(this, args) as Promise<any>;\n result.finally(() => {\n const loadTime = performance.now() - startTime;\n if (minTime && minTime > loadTime) {\n setTimeout(() => {\n singleExecutionFn.isExecuting = false;\n }, minTime - loadTime);\n } else {\n singleExecutionFn.isExecuting = false;\n }\n });\n\n return result;\n } as SingleExecutionFunction<T>;\n\n singleExecutionFn.isExecuting = false;\n\n return singleExecutionFn as unknown as T & { isExecuting: boolean };\n}\n"],"names":["RealUndefined","Symbol","isCloneable","obj","clone","isPrimitive","value","type","generateStableUniqueKey","params","String","JSON","stringify","_key","Array","isArray","Object","keys","sort","reduce","pre","cur","cloneDeep","map","item","newObj","key","prototype","hasOwnProperty","call","createDefaultObject","defaultValue","Proxy","get","target","property","cache","loadingCache","getCachedData","apiKey","hasCachedData","defalutSetting","timeout","timeoutResult","code","msg","identifier","MemoryStore","storageKey","this","data","changeCallbacks","getInstanceKey","getInstance","instances","has","set","create","clearInstance","instance","clearChangeCallbacks","clearAllInstances","forEach","clear","_proto","prop","_extends2","oldValue","_extends","triggerChange","error","console","getAll","remove","newData","undefined","setMultiple","onChanged","callback","push","newValue","length","_changes","changes","getSize","jsonString","Blob","size","getStoreKey","getStoreType","setStyle","element","important","style","priority","setProperty","createSvgFromVNode","vnode","document","createElementNS","props","_i3","_Object$entries3","entries","_Object$entries3$_i","setAttribute","children","textNode","createTextNode","appendChild","child","childElement","createSvgFromString","svgString","svgElement","DOMParser","parseFromString","documentElement","SVGElement","Error","scrollToBottom","dom","setTimeout","scrollTop","scrollHeight","Map","Draggable","options","isDragging","startX","startY","initialX","initialY","threshold","onMouseMoveHandler","onMouseUpHandler","coordinate","originPosition","getComputedStyle","position","onMouseMove","bind","onMouseUp","addEventListener","onMouseDown","e","preventDefault","clientX","clientY","parseInt","window","left","top","getBoundedPosition","x","y","maxX","maxY","rect","getBoundingClientRect","innerWidth","width","innerHeight","height","containerRect","offsetParent","Math","min","max","dy","abs","onDragStart","boundedPosition","right","bottom","onDrag","convertCoordinate","container","DOMRect","currentLeft","currentTop","HTMLElement","containerStyle","parseFloat","borderLeftWidth","borderTopWidth","scrollX","scrollY","brRight","brBottom","onDragEnd","removeEventListener","WebStore","storeType","store","local","session","getStore","localStorage","sessionStorage","updatedData","currentData","setItem","getItem","parse","removeItem","_this","event","storageArea","ChromeStore","sync","chrome","storage","Promise","resolve","_catch","then","_this$getStore$set","reject","_this2","_this3","result","_this4","_temp","_this4$getStore$set","_this5","_this6","_this6$getStore$set","_this7","addListener","namespace","_this8","_this9","LinkedinApiUrl","createLinkedinHeaders","csrfToken","cookies","c","headers","_ref2","join","selectors","profilePage","userPicture","userName","userOccupation","linkedinProfileCard","privateProfileInfoSection","howToContainer","companyName","companyLogo","campaignsListContainer","contactListContainer","location","campaignsListContainerDisplay","contactListContainerDisplay","mainExperienceContainer","experienceCompanyLogo","experienceCompanyName","experienceOccupation","experienceMultipleCompany","experienceMultipleOccupation","salesNavProfilePage","profileCardSection","profileUrl","moreInfoButton","linkedinProfileLinkButton","searchPeoplePage","searchEntityResult","linkedinUrl","image","fullName","resultList","actionsDiv","validResult","searchResult","searchResultsContainer","mainLayoutLeft","searchAllPage","peopleButton","toolbar","queryElement","selector","mode","allResults","querySelectorAll","from","closest","querySelector","getElement","page","_ref","_step","_iterator","_createForOfIteratorHelperLoose","done","decodeHtmlEntities","t","createElement","innerHTML","trim","pageTypeMap","ftp","file","blob","about","getLinkedinPageType","url","cleanUrl","split","toLocaleLowerCase","test","includes","getProfilePublicId","_window$top","id","href","URL","match","decodeURIComponent","getCompanyPublicId","_window$top3","func","setting","wrappedFunction","args","slice","arguments","name","_setting","assign","startTime","Date","now","timer","setInterval","clearInterval","apply","res","defineProperty","configurable","_ref$tag","tag","_ref$children","_ref$props","_ref$attrs","attrs","_ref$styles","styles","ele","_i","_Object$entries","_Object$entries$_i","_i2","_Object$entries2","_Object$entries2$_i","Element","config","_config$debug","debug","_config$logPrefix","logPrefix","handlers","isListenerRegistered","logError","message","_console","concat","ensureListener","runtime","onMessage","sender","sendResponse","handler","payload","__error","send","sendMessage","sendToTab","tabId","tabs","on","onMany","handlerMap","registeredTypes","_registeredTypes","hasHandler","getRegisteredTypes","clearAllHandlers","fetch","response","ok","status","statusText","text","errorMessage","wait","_arguments","context","clearTimeout","idToken","base64","replace","jsonPayload","atob","charCodeAt","toString","delay","_g","_g2","_g3","_g4","_g5","_g6","_g7","g","n","innerText","l","a","src","s","i","r","picture","occupation","companyPicture","onlyValue","cookie","_cookie$value","stringified","cookies2str","_chrome$i18n","_chrome$runtime","_chrome$runtime2","locale","i18n","getUILanguage","extId","version","getManifest","globalThis","self","global","_ref4","queryParams","universalName","isUniversalName","urn","method","_exit2","_temp4","json","_data$elements2","_temp3","elements","_result2","publicId","_ref3","_exit","_temp2","_data$elements","_result","_window$top4","protocolMap","protocol","_window$top2","clientId","_ref$responseType","responseType","state","nonce","_ref$interactive","interactive","redirectUri","identity","getRedirectURL","resType","authUrl","searchParams","launchWebAuthFlow","redirectUrl","splitChar","urlParams","URLSearchParams","log","dataset","isListeningForUserScroll","inter","userInteracted","userInteractedWithScroll","clientHeight","listenForUserScroll","minTime","singleExecutionFn","isExecuting","performance","loadTime"],"mappings":"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"}