six-degrees 0.4.3 → 0.4.4

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.
Files changed (259) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +3 -1
  3. package/.next/standalone/.next/build-manifest.json +3 -3
  4. package/.next/standalone/.next/prerender-manifest.json +41 -13
  5. package/.next/standalone/.next/routes-manifest.json +12 -0
  6. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  7. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_not-found/page.js +1 -1
  12. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  13. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  14. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  15. package/.next/standalone/.next/server/app/_not-found.rsc +18 -17
  16. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +18 -17
  17. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +14 -13
  18. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  19. package/.next/standalone/.next/server/app/api/admin-delete/route.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/api/admin-update/route.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/api/bridges/route.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/api/bulk-import/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/company-scores/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/connections/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/data/export/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/data/import/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/data/restart/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/data/reveal/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/data/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/delete-cluster/route.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/api/ingest/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/network/route.js.nft.json +1 -1
  34. package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/api/outreach/route.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/api/queue/route.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/api/scraper/route.js +1 -1
  38. package/.next/standalone/.next/server/app/api/scraper/route.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/api/setup-profile/route.js.nft.json +1 -1
  43. package/.next/standalone/.next/server/app/api/social/route/app-paths-manifest.json +3 -0
  44. package/.next/standalone/.next/server/app/api/social/route/build-manifest.json +12 -0
  45. package/.next/standalone/.next/server/app/api/social/route/server-reference-manifest.json +4 -0
  46. package/.next/standalone/.next/server/app/api/social/route.js +8 -0
  47. package/.next/standalone/.next/server/app/api/social/route.js.map +5 -0
  48. package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -0
  49. package/.next/standalone/.next/server/app/api/social/route_client-reference-manifest.js +3 -0
  50. package/.next/standalone/.next/server/app/api/unlock/route.js.nft.json +1 -1
  51. package/.next/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  52. package/.next/standalone/.next/server/app/api/update-images/route.js.nft.json +1 -1
  53. package/.next/standalone/.next/server/app/api/users/route.js.nft.json +1 -1
  54. package/.next/standalone/.next/server/app/avatars/[file]/route.js.nft.json +1 -1
  55. package/.next/standalone/.next/server/app/import/page.js +1 -1
  56. package/.next/standalone/.next/server/app/import/page.js.nft.json +1 -1
  57. package/.next/standalone/.next/server/app/import/page_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/app/import.html +1 -1
  59. package/.next/standalone/.next/server/app/import.rsc +22 -21
  60. package/.next/standalone/.next/server/app/import.segments/_full.segment.rsc +22 -21
  61. package/.next/standalone/.next/server/app/import.segments/_tree.segment.rsc +1 -1
  62. package/.next/standalone/.next/server/app/import.segments/import/__PAGE__.segment.rsc +16 -15
  63. package/.next/standalone/.next/server/app/index.html +1 -1
  64. package/.next/standalone/.next/server/app/index.rsc +20 -19
  65. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +16 -15
  66. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +20 -19
  67. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  68. package/.next/standalone/.next/server/app/launch/page.js +1 -1
  69. package/.next/standalone/.next/server/app/launch/page.js.nft.json +1 -1
  70. package/.next/standalone/.next/server/app/launch/page_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/launch.html +2 -2
  72. package/.next/standalone/.next/server/app/launch.rsc +22 -21
  73. package/.next/standalone/.next/server/app/launch.segments/_full.segment.rsc +22 -21
  74. package/.next/standalone/.next/server/app/launch.segments/_tree.segment.rsc +1 -1
  75. package/.next/standalone/.next/server/app/launch.segments/launch/__PAGE__.segment.rsc +16 -15
  76. package/.next/standalone/.next/server/app/page.js +1 -1
  77. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  78. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  79. package/.next/standalone/.next/server/app/paths/page.js +1 -1
  80. package/.next/standalone/.next/server/app/paths/page.js.nft.json +1 -1
  81. package/.next/standalone/.next/server/app/paths/page_client-reference-manifest.js +1 -1
  82. package/.next/standalone/.next/server/app/paths.html +1 -1
  83. package/.next/standalone/.next/server/app/paths.rsc +22 -21
  84. package/.next/standalone/.next/server/app/paths.segments/_full.segment.rsc +22 -21
  85. package/.next/standalone/.next/server/app/paths.segments/_tree.segment.rsc +1 -1
  86. package/.next/standalone/.next/server/app/paths.segments/paths/__PAGE__.segment.rsc +16 -15
  87. package/.next/standalone/.next/server/app/profile/page.js +1 -1
  88. package/.next/standalone/.next/server/app/profile/page.js.nft.json +1 -1
  89. package/.next/standalone/.next/server/app/profile/page_client-reference-manifest.js +1 -1
  90. package/.next/standalone/.next/server/app/profile.html +1 -1
  91. package/.next/standalone/.next/server/app/profile.rsc +22 -21
  92. package/.next/standalone/.next/server/app/profile.segments/_full.segment.rsc +22 -21
  93. package/.next/standalone/.next/server/app/profile.segments/_tree.segment.rsc +1 -1
  94. package/.next/standalone/.next/server/app/profile.segments/profile/__PAGE__.segment.rsc +16 -15
  95. package/.next/standalone/.next/server/app/queue/page.js +1 -1
  96. package/.next/standalone/.next/server/app/queue/page.js.nft.json +1 -1
  97. package/.next/standalone/.next/server/app/queue/page_client-reference-manifest.js +1 -1
  98. package/.next/standalone/.next/server/app/queue.html +1 -1
  99. package/.next/standalone/.next/server/app/queue.rsc +22 -21
  100. package/.next/standalone/.next/server/app/queue.segments/_full.segment.rsc +22 -21
  101. package/.next/standalone/.next/server/app/queue.segments/_tree.segment.rsc +1 -1
  102. package/.next/standalone/.next/server/app/queue.segments/queue/__PAGE__.segment.rsc +16 -15
  103. package/.next/standalone/.next/server/app/scores/page.js +1 -1
  104. package/.next/standalone/.next/server/app/scores/page.js.nft.json +1 -1
  105. package/.next/standalone/.next/server/app/scores/page_client-reference-manifest.js +1 -1
  106. package/.next/standalone/.next/server/app/scores.html +1 -1
  107. package/.next/standalone/.next/server/app/scores.rsc +22 -21
  108. package/.next/standalone/.next/server/app/scores.segments/_full.segment.rsc +22 -21
  109. package/.next/standalone/.next/server/app/scores.segments/_tree.segment.rsc +1 -1
  110. package/.next/standalone/.next/server/app/scores.segments/scores/__PAGE__.segment.rsc +16 -15
  111. package/.next/standalone/.next/server/app/settings/page.js +1 -1
  112. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  113. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  114. package/.next/standalone/.next/server/app/settings.html +1 -1
  115. package/.next/standalone/.next/server/app/settings.rsc +22 -21
  116. package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +22 -21
  117. package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  118. package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +16 -15
  119. package/.next/standalone/.next/server/app/setup/page.js +1 -1
  120. package/.next/standalone/.next/server/app/setup/page.js.nft.json +1 -1
  121. package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/setup.html +1 -1
  123. package/.next/standalone/.next/server/app/setup.rsc +22 -21
  124. package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +22 -21
  125. package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +1 -1
  126. package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +16 -15
  127. package/.next/standalone/.next/server/app/social/page/app-paths-manifest.json +3 -0
  128. package/.next/standalone/.next/server/app/social/page/build-manifest.json +20 -0
  129. package/.next/standalone/.next/server/app/social/page/next-font-manifest.json +11 -0
  130. package/.next/standalone/.next/server/app/social/page/react-loadable-manifest.json +1 -0
  131. package/.next/standalone/.next/server/app/social/page/server-reference-manifest.json +4 -0
  132. package/.next/standalone/.next/server/app/social/page.js +13 -0
  133. package/.next/standalone/.next/server/app/social/page.js.map +5 -0
  134. package/.next/standalone/.next/server/app/social/page.js.nft.json +1 -0
  135. package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +3 -0
  136. package/.next/standalone/.next/server/app/social.html +1 -0
  137. package/.next/standalone/.next/server/app/social.meta +26 -0
  138. package/.next/standalone/.next/server/app/social.rsc +26 -0
  139. package/.next/standalone/.next/server/app/social.segments/_full.segment.rsc +26 -0
  140. package/.next/standalone/.next/server/app/social.segments/_tree.segment.rsc +4 -0
  141. package/.next/standalone/.next/server/app/social.segments/social/__PAGE__.segment.rsc +30 -0
  142. package/.next/standalone/.next/server/app-paths-manifest.json +3 -1
  143. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ljnyho._.js +1 -1
  144. package/.next/standalone/.next/server/chunks/[root-of-the-server]__17kn1mk._.js +8 -0
  145. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0uag-k5._.js → [root-of-the-server]__1dmc7-t._.js} +1 -1
  146. package/.next/standalone/.next/server/chunks/_1_fynia._.js +1 -1
  147. package/.next/standalone/.next/server/chunks/_1itd1o_._.js +1 -1
  148. package/.next/standalone/.next/server/chunks/_1xh07bp._.js +3 -0
  149. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_social_route_actions_1_3c6qn.js +3 -0
  150. package/.next/standalone/.next/server/chunks/lib_db-client_15le7cw.js +1 -1
  151. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__16hs8kw._.js +3 -0
  152. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1feicqq._.js +3 -0
  153. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1jeztd-._.js +3 -0
  154. package/.next/standalone/.next/server/chunks/ssr/_005q9n1._.js +3 -0
  155. package/.next/standalone/.next/server/chunks/ssr/_08_03wh._.js +3 -0
  156. package/.next/standalone/.next/server/chunks/ssr/_08cfj2b._.js +3 -0
  157. package/.next/standalone/.next/server/chunks/ssr/_0j4-lc3._.js +3 -0
  158. package/.next/standalone/.next/server/chunks/ssr/{_0hw_qnj._.js → _0wxbq78._.js} +1 -1
  159. package/.next/standalone/.next/server/chunks/ssr/_0xkur4p._.js +3 -0
  160. package/.next/standalone/.next/server/chunks/ssr/_15x6q32._.js +3 -0
  161. package/.next/standalone/.next/server/chunks/ssr/{_1cyxocj._.js → _1ap1tu_._.js} +2 -2
  162. package/.next/standalone/.next/server/chunks/ssr/_1mj739k._.js +3 -0
  163. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_social_page_actions_176i1kl.js +3 -0
  164. package/.next/standalone/.next/server/chunks/ssr/app_page_1fazqbf.js +3 -3
  165. package/.next/standalone/.next/server/chunks/ssr/app_scores_page_09wepvv.js +1 -1
  166. package/.next/standalone/.next/server/chunks/ssr/app_setup_page_1-282zx.js +1 -1
  167. package/.next/standalone/.next/server/chunks/ssr/app_social_page_0h7zxda.js +3 -0
  168. package/.next/standalone/.next/server/chunks/ssr/lib_0i8v-s3._.js +3 -0
  169. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_server-async-storage_0t1dato.js +3 -0
  170. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  171. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  172. package/.next/standalone/.next/server/next-font-manifest.js +1 -1
  173. package/.next/standalone/.next/server/next-font-manifest.json +4 -0
  174. package/.next/standalone/.next/server/pages/404.html +1 -1
  175. package/.next/standalone/.next/server/pages/500.html +1 -1
  176. package/.next/standalone/.next/server/prefetch-hints.json +14 -0
  177. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  178. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  179. package/.next/standalone/.next/static/chunks/04a3zockahetx.js +1 -0
  180. package/.next/standalone/.next/static/chunks/{2wwmljnf7yn_5.js → 0a5iadnmt9u9k.js} +1 -1
  181. package/.next/standalone/.next/static/chunks/0g_p4p7oci18u.js +1 -0
  182. package/.next/{static/chunks/0f4ugd6v3ph0-.js → standalone/.next/static/chunks/1ra4cwcp75tfa.js} +1 -1
  183. package/.next/standalone/.next/static/chunks/236f0jtp68j_h.js +1 -0
  184. package/.next/standalone/.next/static/chunks/{1zwjy1mmpkdrg.js → 24m745q_85u34.js} +2 -2
  185. package/.next/standalone/.next/static/chunks/2hvcevue9aro4.js +1 -0
  186. package/.next/standalone/.next/static/chunks/2uo9i03_05rqi.js +18 -0
  187. package/.next/standalone/.next/static/chunks/3p_pwu5gx2i9h.js +1 -0
  188. package/.next/standalone/.next/static/chunks/3yc3rzp4dxvyo.js +1 -0
  189. package/.next/standalone/.next/static/chunks/{0_3ubivay59bq.js → 3zw8bv7-mc4n6.js} +1 -1
  190. package/.next/standalone/CHANGELOG.md +36 -0
  191. package/.next/standalone/app/api/network/route.js +11 -0
  192. package/.next/standalone/app/api/scraper/route.js +2 -0
  193. package/.next/standalone/app/api/social/route.js +96 -0
  194. package/.next/standalone/app/components/AutoScanButton.js +41 -0
  195. package/.next/standalone/app/components/ChainView.js +7 -0
  196. package/.next/standalone/app/components/ScanStatusBar.js +22 -8
  197. package/.next/standalone/app/components/SeparationView.js +9 -1
  198. package/.next/standalone/app/components/Sidebar.js +88 -26
  199. package/.next/standalone/app/components/SocialAutoSync.js +34 -0
  200. package/.next/standalone/app/components/settings/NetworkHealthSection.js +85 -0
  201. package/.next/standalone/app/layout.js +3 -0
  202. package/.next/standalone/app/page.js +29 -0
  203. package/.next/standalone/app/scores/page.js +3 -0
  204. package/.next/standalone/app/setup/page.js +1 -1
  205. package/.next/standalone/app/social/page.js +293 -0
  206. package/.next/standalone/lib/experimental-client.js +38 -0
  207. package/.next/standalone/lib/insights.js +54 -0
  208. package/.next/standalone/lib/linkedin-export.js +156 -0
  209. package/.next/standalone/lib/network-health.js +42 -0
  210. package/.next/standalone/lib/network.js +1 -0
  211. package/.next/standalone/package-lock.json +2 -2
  212. package/.next/standalone/package.json +1 -1
  213. package/.next/standalone/scripts/scrape.py +118 -2
  214. package/.next/static/chunks/04a3zockahetx.js +1 -0
  215. package/.next/static/chunks/{2wwmljnf7yn_5.js → 0a5iadnmt9u9k.js} +1 -1
  216. package/.next/static/chunks/0g_p4p7oci18u.js +1 -0
  217. package/.next/{standalone/.next/static/chunks/0f4ugd6v3ph0-.js → static/chunks/1ra4cwcp75tfa.js} +1 -1
  218. package/.next/static/chunks/236f0jtp68j_h.js +1 -0
  219. package/.next/static/chunks/{1zwjy1mmpkdrg.js → 24m745q_85u34.js} +2 -2
  220. package/.next/static/chunks/2hvcevue9aro4.js +1 -0
  221. package/.next/static/chunks/2uo9i03_05rqi.js +18 -0
  222. package/.next/static/chunks/3p_pwu5gx2i9h.js +1 -0
  223. package/.next/static/chunks/3yc3rzp4dxvyo.js +1 -0
  224. package/.next/static/chunks/{0_3ubivay59bq.js → 3zw8bv7-mc4n6.js} +1 -1
  225. package/CHANGELOG.md +36 -0
  226. package/lib/experimental-client.js +38 -0
  227. package/lib/insights.js +54 -0
  228. package/lib/linkedin-export.js +156 -0
  229. package/lib/network-health.js +42 -0
  230. package/lib/network.js +1 -0
  231. package/package.json +1 -1
  232. package/scripts/scrape.py +118 -2
  233. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0d3vjsq._.js +0 -3
  234. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0m4vk0b._.js +0 -3
  235. package/.next/standalone/.next/server/chunks/ssr/_012mop3._.js +0 -3
  236. package/.next/standalone/.next/server/chunks/ssr/_1163x49._.js +0 -3
  237. package/.next/standalone/.next/server/chunks/ssr/_1av11ws._.js +0 -3
  238. package/.next/standalone/.next/server/chunks/ssr/_1ig7em7._.js +0 -3
  239. package/.next/standalone/.next/server/chunks/ssr/_1vpfyd-._.js +0 -3
  240. package/.next/standalone/.next/server/chunks/ssr/_20w06i-._.js +0 -3
  241. package/.next/standalone/.next/server/chunks/ssr/lib_1bn38gs._.js +0 -3
  242. package/.next/standalone/.next/static/chunks/0cuuo2jwc9h94.js +0 -1
  243. package/.next/standalone/.next/static/chunks/10ogurbcuf3nq.js +0 -1
  244. package/.next/standalone/.next/static/chunks/1489t7jrjojk_.js +0 -1
  245. package/.next/standalone/.next/static/chunks/1zunq4tk-u3ng.js +0 -1
  246. package/.next/standalone/.next/static/chunks/2pyo4j84prgp6.js +0 -18
  247. package/.next/standalone/.next/static/chunks/3kllnkb3hof1s.js +0 -1
  248. package/.next/static/chunks/0cuuo2jwc9h94.js +0 -1
  249. package/.next/static/chunks/10ogurbcuf3nq.js +0 -1
  250. package/.next/static/chunks/1489t7jrjojk_.js +0 -1
  251. package/.next/static/chunks/1zunq4tk-u3ng.js +0 -1
  252. package/.next/static/chunks/2pyo4j84prgp6.js +0 -18
  253. package/.next/static/chunks/3kllnkb3hof1s.js +0 -1
  254. /package/.next/standalone/.next/static/{814ehZBeFO2rUKle7mzX- → VE8LeJXfD2H0_OgJxuJcm}/_buildManifest.js +0 -0
  255. /package/.next/standalone/.next/static/{814ehZBeFO2rUKle7mzX- → VE8LeJXfD2H0_OgJxuJcm}/_clientMiddlewareManifest.js +0 -0
  256. /package/.next/standalone/.next/static/{814ehZBeFO2rUKle7mzX- → VE8LeJXfD2H0_OgJxuJcm}/_ssgManifest.js +0 -0
  257. /package/.next/static/{814ehZBeFO2rUKle7mzX- → VE8LeJXfD2H0_OgJxuJcm}/_buildManifest.js +0 -0
  258. /package/.next/static/{814ehZBeFO2rUKle7mzX- → VE8LeJXfD2H0_OgJxuJcm}/_clientMiddlewareManifest.js +0 -0
  259. /package/.next/static/{814ehZBeFO2rUKle7mzX- → VE8LeJXfD2H0_OgJxuJcm}/_ssgManifest.js +0 -0
@@ -0,0 +1,156 @@
1
+ // The Social tab (experimental): what your own LinkedIn data export says about
2
+ // your relationships. The export is the folder LinkedIn emails you from
3
+ // Settings → Data privacy → Get a copy of your data; nothing here talks to
4
+ // LinkedIn. It runs in the browser on the files you pick, and what it keeps is
5
+ // numbers and dates only:
6
+ //
7
+ // people per profile: when you last messaged, who wrote last, how many
8
+ // messages (1:1 conversations only). Never a message's text.
9
+ // chapters your jobs (Positions.csv) and the connections made in each
10
+ // posts your posts (Shares.csv) and the connections that came the week after
11
+ // invites requests to and from you (Invitations.csv), when the export has them
12
+ //
13
+ // Plain functions, no React; tests/linkedin-export.test.mjs.
14
+
15
+ import { parseCsv } from './csv.js';
16
+ import { keyFor } from './separation.js';
17
+
18
+ const DAY = 86400000;
19
+
20
+ /** The rows of a CSV as objects, from the first line that has `mustHave` among its columns (exports put notes above the header). */
21
+ export function readTable(text, mustHave) {
22
+ const rows = parseCsv(String(text || ''));
23
+ const at = rows.findIndex((r) => r.some((c) => c.trim().toLowerCase() === mustHave.toLowerCase()));
24
+ if (at < 0) return [];
25
+ const head = rows[at].map((c) => c.trim().toLowerCase());
26
+ return rows.slice(at + 1)
27
+ .filter((r) => r.some((c) => c.trim()))
28
+ .map((r) => Object.fromEntries(head.map((h, i) => [h, (r[i] ?? '').trim()])));
29
+ }
30
+
31
+ /** A date in any of the export's formats, as ms; null when it can't be read. */
32
+ export function exportDate(s) {
33
+ const v = String(s || '').trim();
34
+ if (!v) return null;
35
+ let m = v.match(/^(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2})(?::(\d{2}))?(?:\s*UTC)?$/);
36
+ if (m) return Date.UTC(+m[1], +m[2] - 1, +m[3], +m[4], +m[5], +(m[6] || 0));
37
+ m = v.match(/^(\d{1,2})\/(\d{1,2})\/(\d{2,4}),?\s+(\d{1,2}):(\d{2})\s*(AM|PM)?$/i);
38
+ if (m) {
39
+ const y = +m[3] < 100 ? 2000 + +m[3] : +m[3];
40
+ let h = +m[4] % 12;
41
+ if ((m[6] || '').toUpperCase() === 'PM') h += 12;
42
+ return Date.UTC(y, +m[1] - 1, +m[2], h, +m[5]);
43
+ }
44
+ m = v.match(/^([A-Za-z]{3,9})\s+(\d{4})$/); // "Jan 2020"
45
+ if (m) { const t = Date.parse(`1 ${m[1]} ${m[2]} UTC`); return Number.isNaN(t) ? null : t; }
46
+ const t = Date.parse(/\d{4}$/.test(v) ? `${v} UTC` : v); // "01 May 2024"
47
+ return Number.isNaN(t) ? null : t;
48
+ }
49
+
50
+ const urlKey = (u) => keyFor({ profile_url: u });
51
+
52
+ /**
53
+ * From messages.csv, per person (by profile): { last, lastFromThem, total, recent }.
54
+ * `self` is you: the sender in the most conversations. Only 1:1 conversations
55
+ * count; group threads say little about one relationship. No text is read.
56
+ */
57
+ export function messageStats(rows = []) {
58
+ const convos = new Map();
59
+ const senders = new Map();
60
+ for (const r of rows) {
61
+ const from = urlKey(r['sender profile url']);
62
+ const id = r['conversation id'];
63
+ if (!id || !from) continue;
64
+ const to = String(r['recipient profile urls'] || '').split(/[,;\s]+/).filter(Boolean).map(urlKey);
65
+ const t = exportDate(r.date);
66
+ if (t == null) continue;
67
+ if (!convos.has(id)) convos.set(id, { people: new Set(), msgs: [] });
68
+ const c = convos.get(id);
69
+ c.people.add(from);
70
+ to.forEach((p) => c.people.add(p));
71
+ c.msgs.push({ from, t });
72
+ if (!senders.has(from)) senders.set(from, new Set());
73
+ senders.get(from).add(id);
74
+ }
75
+ let self = null;
76
+ for (const [who, ids] of senders) if (!self || ids.size > senders.get(self).size) self = who;
77
+ let asOf = 0;
78
+ const people = new Map();
79
+ for (const c of convos.values()) {
80
+ const others = [...c.people].filter((p) => p !== self);
81
+ if (others.length !== 1 || !c.people.has(self)) continue;
82
+ const other = others[0];
83
+ const s = people.get(other) || { last: 0, lastFromThem: false, total: 0, times: [] };
84
+ for (const m of c.msgs) {
85
+ s.total += 1;
86
+ s.times.push(m.t);
87
+ if (m.t >= s.last) { s.last = m.t; s.lastFromThem = m.from !== self; }
88
+ if (m.t > asOf) asOf = m.t;
89
+ }
90
+ people.set(other, s);
91
+ }
92
+ for (const s of people.values()) {
93
+ s.recent = s.times.filter((t) => t > asOf - 90 * DAY).length;
94
+ delete s.times;
95
+ }
96
+ return { self, asOf: asOf || null, people };
97
+ }
98
+
99
+ /** Warm (in the last 30 days, or 3+ in 90), cool (within a year), dormant (longer ago), or never. */
100
+ export function warmthOf(stat, asOf) {
101
+ if (!stat || !stat.total) return 'never';
102
+ const age = asOf - stat.last;
103
+ if (age <= 30 * DAY || stat.recent >= 3) return 'warm';
104
+ return age <= 365 * DAY ? 'cool' : 'dormant';
105
+ }
106
+
107
+ /** People who wrote last, 3 to 30 days before the export: replies you might owe. */
108
+ export function repliesWaiting(stats) {
109
+ const out = [];
110
+ for (const [url, s] of stats.people) {
111
+ const age = stats.asOf - s.last;
112
+ if (s.lastFromThem && age >= 3 * DAY && age <= 30 * DAY) out.push({ url, days: Math.round(age / DAY), total: s.total });
113
+ }
114
+ return out.sort((a, b) => a.days - b.days);
115
+ }
116
+
117
+ /** Your jobs, oldest first, each with the connections made while you were there. */
118
+ export function careerChapters(positions = [], connections = [], asOf = Date.now()) {
119
+ const jobs = positions
120
+ .map((p) => ({ company: p['company name'] || '', title: p.title || '', from: exportDate(p['started on']), to: exportDate(p['finished on']) }))
121
+ .filter((j) => j.company && j.from != null)
122
+ .sort((a, b) => a.from - b.from);
123
+ const made = connections.map((c) => ({ url: urlKey(c.url || c.profile_url), t: exportDate(c['connected on'] || c.connected_on) })).filter((c) => c.t != null);
124
+ return jobs.map((j) => {
125
+ const end = j.to ?? asOf;
126
+ const inside = made.filter((c) => c.t >= j.from && c.t < end);
127
+ return { ...j, to: j.to, made: inside.length, people: inside.map((c) => c.url) };
128
+ });
129
+ }
130
+
131
+ /**
132
+ * Your posts and the connections made in the 7 days after each, against your
133
+ * usual week. Something that happened after a post, not proof it came from it.
134
+ */
135
+ export function postingEffect(shares = [], connections = []) {
136
+ const posts = shares.map((s) => ({ t: exportDate(s.date), link: s.sharelink || s['share link'] || '' })).filter((p) => p.t != null).sort((a, b) => a.t - b.t);
137
+ const made = connections.map((c) => exportDate(c['connected on'] || c.connected_on)).filter((t) => t != null).sort((a, b) => a - b);
138
+ if (!made.length) return { posts: [], usualWeek: 0, afterPosts: 0 };
139
+ const span = Math.max(DAY * 7, made[made.length - 1] - made[0]);
140
+ const usualWeek = (made.length / span) * 7 * DAY;
141
+ const counted = posts.map((p) => ({ ...p, week: made.filter((t) => t >= p.t && t < p.t + 7 * DAY).length }));
142
+ const afterPosts = counted.length ? counted.reduce((n, p) => n + p.week, 0) / counted.length : 0;
143
+ return { posts: counted, usualWeek, afterPosts };
144
+ }
145
+
146
+ /** Requests to and from you, when the export has them. */
147
+ export function invitationSplit(rows = []) {
148
+ let incoming = 0;
149
+ let outgoing = 0;
150
+ for (const r of rows) {
151
+ const d = String(r.direction || '').toUpperCase();
152
+ if (d === 'INCOMING') incoming += 1;
153
+ else if (d === 'OUTGOING') outgoing += 1;
154
+ }
155
+ return { incoming, outgoing, total: incoming + outgoing };
156
+ }
@@ -0,0 +1,42 @@
1
+ // Network health for the Scores tab (item 41, Graph Study §8.5/§10.2), from
2
+ // what the app already keeps. No percentiles against other people: there is no
3
+ // data to compare with, so every number is about your own network.
4
+ //
5
+ // circles how many of your connections have a scanned circle
6
+ // early fewer than 5: say the numbers are an early estimate
7
+ // twoWays of everyone you reach through a circle, the share reached two or
8
+ // more ways (lib/brokerage.js redundancy)
9
+ // effective Burt's effective size of your own network, N − 2t/N, with t the ties
10
+ // between your connections that scans have kept (lib/ties.js), and
11
+ // efficiency ES/N. Honest only as far as those ties go.
12
+ // top your five connections by who only they reach
13
+ //
14
+ // Plain functions, no React; tests/network-health.test.mjs.
15
+
16
+ import { exclusiveReach, redundancy } from './brokerage.js';
17
+
18
+ export function networkHealth({ degree1 = [], degree2 = [], ties = 0 } = {}) {
19
+ const circleOf = new Map();
20
+ for (const row of degree2) {
21
+ if (row?.source_connection_id != null) circleOf.set(row.source_connection_id, (circleOf.get(row.source_connection_id) || 0) + 1);
22
+ }
23
+ const only = exclusiveReach(degree2, degree1);
24
+ const n = degree1.length;
25
+ const t = Math.max(0, Number(ties) || 0);
26
+ const es = n ? n - (2 * t) / n : 0;
27
+ const byId = new Map(degree1.map((c) => [c.id, c]));
28
+ const top = [...only.entries()]
29
+ .sort((a, b) => b[1].reach - a[1].reach || String(a[0]).localeCompare(String(b[0])))
30
+ .slice(0, 5)
31
+ .map(([id, r]) => {
32
+ const c = byId.get(id) || {};
33
+ return { id, name: c.name || '', company: c.company || '', tier: c.tier || '', circle: circleOf.get(id) || 0, only: r.only, share: r.total ? r.only / r.total : 0 };
34
+ });
35
+ return {
36
+ circles: circleOf.size,
37
+ early: circleOf.size < 5,
38
+ twoWays: redundancy(degree2, degree1),
39
+ effective: { n, ties: t, size: es, efficiency: n ? es / n : 0 },
40
+ top,
41
+ };
42
+ }
@@ -9,5 +9,6 @@ export async function loadNetwork(userId) {
9
9
  degree1: data.degree1 || [],
10
10
  degree2: data.degree2 || [],
11
11
  degree3: data.degree3 || [],
12
+ ties: Number(data.ties) || 0,
12
13
  };
13
14
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "six-degrees",
3
- "version": "0.4.3",
3
+ "version": "0.4.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "six-degrees",
9
- "version": "0.4.3",
9
+ "version": "0.4.4",
10
10
  "license": "MIT",
11
11
  "os": [
12
12
  "darwin",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "six-degrees",
3
- "version": "0.4.3",
3
+ "version": "0.4.4",
4
4
  "description": "Map your professional network as a galaxy — leverage tiers, bridges into new circles, and the shortest path to anyone. Runs locally on your own data.",
5
5
  "license": "MIT",
6
6
  "author": "Blake Burford",
@@ -58,6 +58,8 @@ _ENV_LOCAL = _load_env_local()
58
58
  # default to somebody else's deployment — that would send a user's network to
59
59
  # a server they don't control.
60
60
  APP_URL = os.getenv("APP_URL", "http://localhost:3000")
61
+ MESSAGING_URL = "https://www.linkedin.com/messaging/"
62
+ MESSAGE_SCROLLS = 6 # scrolls down the conversation list, a few seconds apart
61
63
 
62
64
  CONNECTIONS_URL = "https://www.linkedin.com/mynetwork/invite-connect/connections/"
63
65
 
@@ -1897,7 +1899,7 @@ def voyager_total(payload):
1897
1899
  return None
1898
1900
 
1899
1901
 
1900
- def _wire_sample(data):
1902
+ def _wire_sample(data, prefix="search"):
1901
1903
  if EXPERIMENT["wire"] >= WIRE_SAMPLES:
1902
1904
  return
1903
1905
  try:
@@ -1906,7 +1908,7 @@ def _wire_sample(data):
1906
1908
  return
1907
1909
  folder = _home() / "wire-samples"
1908
1910
  folder.mkdir(parents=True, exist_ok=True)
1909
- (folder / f"{int(time.time() * 1000)}.json").write_text(raw)
1911
+ (folder / f"{prefix}-{int(time.time() * 1000)}.json").write_text(raw)
1910
1912
  EXPERIMENT["wire"] += 1
1911
1913
  except Exception:
1912
1914
  pass
@@ -1946,6 +1948,116 @@ def _wire_merge(page, profile_url, page_results):
1946
1948
  return page_results
1947
1949
 
1948
1950
 
1951
+ _PROFILE_LINK = re.compile(r"https://www\\.linkedin\\.com/in/[^/?#\\s\"']+")
1952
+
1953
+
1954
+ def voyager_conversations(payload):
1955
+ """Conversations in a LinkedIn messaging response (experimental): per conversation,
1956
+ everyone in it (profile links), when it was last active, and unread messages.
1957
+ Anything with a lastActivityAt and participants, wherever it sits. Never the text."""
1958
+ out = []
1959
+
1960
+ def people(x):
1961
+ found = set()
1962
+ stack = [x]
1963
+ while stack:
1964
+ v = stack.pop()
1965
+ if isinstance(v, dict):
1966
+ pid = v.get("publicIdentifier")
1967
+ if isinstance(pid, str) and pid and pid != "UNKNOWN":
1968
+ found.add(f"https://www.linkedin.com/in/{pid}/")
1969
+ stack.extend(v.values())
1970
+ elif isinstance(v, list):
1971
+ stack.extend(v)
1972
+ elif isinstance(v, str):
1973
+ for m in _PROFILE_LINK.findall(v):
1974
+ found.add(m.rstrip("/") + "/")
1975
+ return found
1976
+
1977
+ def walk(x):
1978
+ if isinstance(x, dict):
1979
+ at = x.get("lastActivityAt")
1980
+ parts = [v for k, v in x.items() if "participant" in k.lower()]
1981
+ if isinstance(at, (int, float)) and at > 1e12 and parts:
1982
+ who = set()
1983
+ for v in parts:
1984
+ who |= people(v)
1985
+ if who:
1986
+ unread = x.get("unreadCount")
1987
+ out.append({"people": sorted(who), "at": int(at), "unread": int(unread) if isinstance(unread, (int, float)) else None})
1988
+ for v in x.values():
1989
+ walk(v)
1990
+ elif isinstance(x, list):
1991
+ for v in x:
1992
+ walk(v)
1993
+ walk(payload)
1994
+ return out
1995
+
1996
+
1997
+ def sync_messages(headless=False):
1998
+ """Experimental: read your LinkedIn messages list once, for the Social tab. Opens
1999
+ Messaging in your own Chrome, scrolls the list a few times, and keeps from LinkedIn's
2000
+ own data only who each 1:1 conversation is with, when it was last active and whether
2001
+ it has unread messages. No search budget; no message text is read or kept."""
2002
+ from playwright.sync_api import sync_playwright
2003
+ kept = []
2004
+ with sync_playwright() as p:
2005
+ browser = p.chromium.launch_persistent_context(
2006
+ user_data_dir=get_scraper_profile_path(), headless=headless, channel="chrome",
2007
+ args=["--disable-blink-features=AutomationControlled"], timeout=120000)
2008
+ page = browser.pages[0] if browser.pages else browser.new_page()
2009
+ page.set_default_timeout(120000)
2010
+ if not ensure_logged_in(page):
2011
+ browser.close()
2012
+ return
2013
+ page.on("response", lambda r: kept.append(r) if "/voyager/api/" in r.url and "messag" in r.url.lower() else None)
2014
+ print("Opening your messages list...")
2015
+ try:
2016
+ page.goto(MESSAGING_URL, wait_until="domcontentloaded")
2017
+ except Exception:
2018
+ pass
2019
+ time.sleep(6)
2020
+ for i in range(MESSAGE_SCROLLS):
2021
+ if stop_requested() or _window_closed(page):
2022
+ break
2023
+ try:
2024
+ page.evaluate("""() => { const l = document.querySelector('.msg-conversations-container__conversations-list, [class*="conversations-list"]');
2025
+ if (l) l.scrollTop = l.scrollHeight; }""")
2026
+ except Exception:
2027
+ pass
2028
+ print(f" Reading the list ({i + 1} of {MESSAGE_SCROLLS})...", flush=True)
2029
+ time.sleep(4)
2030
+ convos = []
2031
+ for r in kept:
2032
+ try:
2033
+ data = r.json()
2034
+ except Exception:
2035
+ continue
2036
+ _wire_sample(data, prefix="messages")
2037
+ convos.extend(voyager_conversations(data))
2038
+ browser.close()
2039
+ # You are the one in the most conversations; keep the 1:1 ones.
2040
+ counts = {}
2041
+ for c in convos:
2042
+ for u in c["people"]:
2043
+ counts[u] = counts.get(u, 0) + 1
2044
+ me = max(counts, key=counts.get) if counts else None
2045
+ people = {}
2046
+ for c in convos:
2047
+ others = [u for u in c["people"] if u != me]
2048
+ if len(others) != 1:
2049
+ continue
2050
+ cur = people.get(others[0])
2051
+ if not cur or c["at"] > cur["last"]:
2052
+ people[others[0]] = {"last": c["at"], "unread": c["unread"]}
2053
+ print(f" Found {len(convos)} conversations in LinkedIn's data, {len(people)} with one person.")
2054
+ try:
2055
+ requests.put(f"{APP_URL}/api/social", json={"live": people}, headers=app_headers(), timeout=30)
2056
+ print(" Saved for the Social tab.")
2057
+ except Exception as e:
2058
+ print(f" Couldn't save them: {e}")
2059
+
2060
+
1949
2061
  def _drip_wait(label, seconds):
1950
2062
  """Wait `seconds` for an experimental rest, saying when it ends, a line a minute. False if stopped."""
1951
2063
  seconds = max(1, int(seconds))
@@ -3960,6 +4072,8 @@ Examples:
3960
4072
  parser.add_argument("--bridge", type=str, help="Name of one bridge person to scrape")
3961
4073
  parser.add_argument("--rescrape", type=str, help="Delete + re-scrape a bridge's cluster from scratch")
3962
4074
  parser.add_argument("--company", type=str, help="Scan everyone the app can see at one company")
4075
+ parser.add_argument("--messages", action="store_true",
4076
+ help="Experimental: read your messages list once for the Social tab (who, when, unread; never text)")
3963
4077
  parser.add_argument("--experimental", action="store_true",
3964
4078
  help="Auto-Bridge, experimental: all-day pacing (sittings, rests, daytime only, "
3965
4079
  "waits for the daily budget) and reading LinkedIn's own data beside the page text")
@@ -4057,6 +4171,8 @@ Examples:
4057
4171
  only_unfinished=args.only_unfinished)
4058
4172
  done = sum(1 for r in results if r.get("status") == "done")
4059
4173
  print(f"\nDone. {done}/{len(results)} bridges mapped.")
4174
+ elif args.messages:
4175
+ sync_messages(headless=args.headless)
4060
4176
  elif args.search:
4061
4177
  scrape_full(headless=args.headless)
4062
4178
  elif args.full:
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,40643,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(22016),a=e.i(40996),o=e.i(68792);let l={full:"Scanning your network",refresh:"Checking for new connections",bridge:"Scanning a circle",resume:"Carrying on with a circle","resume-all":"Carrying on with circles","auto-bridge":"Auto-Bridge","auto-bridge-retry":"Auto-Bridge",rescrape:"Re-scanning a circle",login:"Signing in to LinkedIn",setup:"Setting up the scanner",company:"Scanning a company",photos:"Saving photos",messages:"Reading your messages list"};e.s(["default",0,function(){let e,u,[i,s]=(0,r.useState)(()=>(0,a.scannerNow)()),[c,d]=(0,r.useState)(!1),f=(0,r.useSyncExternalStore)(o.watchAllDay,o.allDayNow,()=>!1);(0,r.useEffect)(()=>(0,a.watchScanner)(()=>{let e=(0,a.scannerNow)();s(e),e.running||d(!1)}),[]);let p={position:"fixed",left:"50%",top:"var(--scan-bar-top, 94px)",transform:"translateX(-50%)",zIndex:60,maxWidth:"calc(100vw - 32px)",display:"flex",alignItems:"center",gap:12,flexWrap:"nowrap",whiteSpace:"nowrap",padding:"8px 12px",borderRadius:12,fontSize:12,color:"#cfd8d8",background:"rgba(14,16,32,0.94)"};if(!i?.running)return f?(0,t.jsxs)("div",{role:"status",style:{...p,opacity:.55,border:"1px solid rgba(255,255,255,0.1)"},children:[(0,t.jsx)("span",{style:{width:8,height:8,borderRadius:"50%",background:"#556",flexShrink:0}}),(0,t.jsx)("b",{style:{color:"#b8c4c4"},children:"Auto scan"}),(0,t.jsx)("span",{style:{color:"#8b9a9a"},children:"ready · press Auto scan beside Scan to start"})]}):null;let g=i.progress,h=g?.kind==="batch"&&g.total?`${g.current||g.done||0} of ${g.total}`:g?.kind==="walk"&&g.total?`${(g.done||0).toLocaleString()} of ${g.total.toLocaleString()} read`:g?.kind==="saving"?"saving":null,y=i.budget,m=[...i.log||[]].reverse().find(e=>e&&e.trim())?.trim();return(0,t.jsxs)("div",{role:"status","aria-live":"polite",style:{...p,border:"1px solid rgba(0,255,136,0.25)"},children:[(0,t.jsx)("span",{style:{width:8,height:8,borderRadius:"50%",background:"#00ff88",flexShrink:0}}),(0,t.jsx)("b",{style:{color:"#fff"},children:l[i.action]||"Scanning"}),i.target?.name&&(0,t.jsx)("span",{children:i.target.name}),h&&(0,t.jsx)("span",{style:{color:"#8b9a9a"},children:h}),y&&(0,t.jsxs)("span",{style:{color:(e=y.searches,(u=y.cap)?e/u>=.9?"#ff6b6b":e/u>=.6?"#FFD700":"#00ff88":"#8b9a9a")},title:"Searches on your LinkedIn account in the last 24 hours, and your daily budget",children:[y.searches,y.cap?` of ${y.cap}`:""," searches today"]}),m&&(0,t.jsx)("span",{style:{color:"#667",flex:"0 1 240px",minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:m,children:m}),(0,t.jsx)(n.default,{href:"/setup",style:{color:"#3498DB",textDecoration:"none"},children:"Details"}),(0,t.jsx)("button",{onClick:async()=>{d(!0);try{await (0,a.stopScrape)()}catch{d(!1)}},disabled:c,title:"Stops after saving what's been read; Resume on the Scan page carries on from the same page",style:{padding:"4px 10px",borderRadius:8,fontSize:12,cursor:c?"default":"pointer",background:"rgba(255,107,107,0.12)",color:"#ff9b9b",border:"1px solid rgba(255,107,107,0.35)"},children:c?"Stopping…":"Stop"})]})}])},87915,e=>{"use strict";var t=e.i(71645),r=e.i(40996),n=e.i(64745);let a=!1;e.s(["default",0,function(){return(0,t.useEffect)(()=>{if(n.IS_DEMO||a)return;let e=()=>{};return fetch("/api/social").then(e=>e.json()).then(({social:t})=>{if(!t?.autoSync||a)return;let n=t.liveAt?Date.parse(t.liveAt):0,o=new Date().getHours();Date.now()-n<864e5||o<9||o>=19||(e=(0,r.watchScanner)(()=>{let t=(0,r.scannerNow)();t.known&&!a&&(a=!0,e(),t.running||(0,r.beginScrape)("messages").catch(()=>{}))}))}).catch(()=>{}),()=>e()},[]),null}])},37711,e=>{"use strict";var t=e.i(43476),r=e.i(71645);e.s(["default",0,function(){let[e,n]=(0,r.useState)(null);return((0,r.useEffect)(()=>{let e=!0;return fetch("/api/update").then(e=>e.json()).then(t=>{e&&t?.restartNeeded&&n(t)}).catch(()=>{}),()=>{e=!1}},[]),e)?(0,t.jsxs)("div",{role:"status",style:{position:"fixed",left:0,right:0,bottom:0,zIndex:9999,background:"linear-gradient(90deg, #FFD700, #FF6B35)",color:"#1a1200",padding:"9px 16px",fontSize:13,fontWeight:600,lineHeight:1.5,display:"flex",alignItems:"center",justifyContent:"center",gap:10,flexWrap:"wrap",textAlign:"center"},children:[(0,t.jsxs)("span",{children:["You have newer code on disk (",e.sha,") than this server is running (",e.bootSha,"). Restart it to see the changes — ",(0,t.jsx)("code",{style:{background:"rgba(0,0,0,0.16)",padding:"1px 6px",borderRadius:4},children:"Ctrl-C"})," in the terminal, then ",(0,t.jsx)("code",{style:{background:"rgba(0,0,0,0.16)",padding:"1px 6px",borderRadius:4},children:"npm run dev"}),"."]}),(0,t.jsx)("button",{onClick:()=>n(null),style:{border:"none",background:"rgba(0,0,0,0.18)",color:"#1a1200",borderRadius:6,padding:"3px 10px",fontWeight:700,cursor:"pointer"},children:"Dismiss"})]}):null}])},15812,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(65084),a=e.i(64745),o=e.i(7837);let l=(0,r.createContext)({userId:null,userName:null,userProfile:null,ready:!1});e.s(["default",0,function({children:e}){let[u,i]=(0,r.useState)(null),[s,c]=(0,r.useState)(null),[d,f]=(0,r.useState)(null),[p,g]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{if(a.IS_DEMO){i(a.DEMO_USER.id),c(a.DEMO_USER.name),f({name:a.DEMO_USER.name,headline:a.DEMO_USER.headline,role:"",company:"",industry:"",sectors:[],goals:[],linkedin_url:""}),g(!0);return}if((0,o.hasCsvNetwork)()){i(o.CSV_USER.id),c(o.CSV_USER.name),f({name:o.CSV_USER.name,headline:"Imported from your LinkedIn CSV",role:"",company:"",industry:"",sectors:[],goals:[],linkedin_url:""}),g(!0);return}fetch("/api/users?me=1").then(e=>e.json()).then(e=>{let t=e.user;if(!t)throw Error("no profile");(0,n.setUser)(t.id,t.name),i(t.id),c(t.name),f({name:t.name,headline:t.headline||"",role:t.role||"",company:t.company||"",industry:t.industry||"",sectors:t.sectors||[],goals:t.goals||[],linkedin_url:t.linkedin_url||""})}).catch(()=>{(0,n.hasUser)()&&(i((0,n.getUserId)()),c((0,n.getUserName)()))}).finally(()=>g(!0))},[]),(0,t.jsx)(l.Provider,{value:{userId:u,userName:s,userProfile:d,ready:p,login:(e,t)=>{(0,n.setUser)(e,t),i(e),c(t),fetch(`/api/users?id=${e}`).then(e=>e.json()).then(e=>{e.user&&f({name:e.user.name,headline:e.user.headline||"",role:e.user.role||"",company:e.user.company||"",industry:e.user.industry||"",sectors:e.user.sectors||[],goals:e.user.goals||[],linkedin_url:e.user.linkedin_url||""})}).catch(()=>{})}},children:e})},"useUser",0,function(){return(0,r.useContext)(l)}])},64745,e=>{"use strict";var t=e.i(47167),r=e.i(7837);let n="true"===t.default.env.NEXT_PUBLIC_DEMO_MODE,a=null;async function o(){if(a)return a;let e=await fetch("/demo-data.json",{cache:"no-cache"});if(!e.ok)throw Error("demo-data.json not found — run: node scripts/gen-synthetic.mjs");let t=await e.json();return a={degree1:t.degree1||[],degree2:t.degree2||[]}}async function l(){let e=await o();return(0,r.saveSessionNetwork)({degree1:e.degree1,degree2:e.degree2,source:"sample"}),{degree1:e.degree1.length,degree2:e.degree2.length}}e.s(["DEMO_USER",0,{id:"synthetic-demo-user",name:"You",headline:"Sample network"},"IS_DEMO",0,n,"loadDemoNetwork",0,o,"loadSampleIntoSession",0,l])},68792,e=>{"use strict";var t=e.i(40996);let r=(e,t)=>{try{let r=localStorage.getItem(e);return null===r?t:JSON.parse(r)}catch{return t}};e.s(["allDayNow",0,function(){try{return"true"===localStorage.getItem("six-degrees-experimental-auto")}catch{return!1}},"startAutoScan",0,function(){let e=r("six-degrees-bridge-order","newest");return(0,t.beginScrape)("auto-bridge",{experimental:!0,maxBridges:10,order:e,tiers:"score"===e?["S","A"]:[],maxPages:r("six-degrees-bridge-pages-v2",100),deeper:r("six-degrees-bridge-finish",!0)})},"watchAllDay",0,function(e){return window.addEventListener("storage",e),window.addEventListener("six-degrees:experimental",e),()=>{window.removeEventListener("storage",e),window.removeEventListener("six-degrees:experimental",e)}}])},40996,e=>{"use strict";async function t(){let e=await fetch("/api/scraper");if(!e.ok)throw Error("Could not reach the app.");return e.json()}async function r(e,t,n={}){let a=await fetch("/api/scraper",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:e,...t?{name:t}:{},...n})}),o=await a.json().catch(()=>({}));if(!a.ok)throw Error(o.error||"Could not start the scanner.");return o}async function n(e){let t=await fetch(`/api/scraper?resume=${encodeURIComponent(e)}`);return t.ok?(await t.json()).resume??null:null}Symbol.for("six-degrees.scan-state");let a=Object.freeze({skips:[],read:[]});async function o(){try{let e=await fetch("/api/scraper?reach=1");if(!e.ok)return a;let t=await e.json();return{skips:Array.isArray(t.skips)?t.skips:[],read:Array.isArray(t.read)?t.read:[]}}catch{return a}}async function l(e){let t=await fetch(`/api/scraper?person=${encodeURIComponent(e)}`);return t.ok?t.json():{person:null}}async function u(){await fetch("/api/scraper",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"cancel"})})}let i=Object.freeze({known:!1,running:!1,pending:!1,action:null,target:null,startedAt:null,progress:null,log:[],finished:[]}),s=new Set,c=i,d=JSON.stringify(c),f=null,p=null,g=0,h=!1,y=new Set;function m(e){let t=JSON.stringify(e);if(t!==d)for(let r of(d=t,c=Object.freeze(e),[...s]))r()}async function b(){(!("u">typeof document&&document.hidden)||c.running)&&await function(){if(p&&p.epoch===g)return p.promise;let e=g,t=fetch("/api/scraper?job=1").then(e=>e.ok?e.json():null).then(t=>{e===g&&function(e){if(!e||"object"!=typeof e)return;let t=!0===e.running;t&&null!=e.startedAt&&y.add(e.startedAt);let r=(Array.isArray(e.recent)?e.recent:[]).filter(e=>y.has(e.startedAt)).map(r=>({...r,log:!t&&r.startedAt===e.startedAt&&Array.isArray(e.log)?e.log:[]}));m({known:!0,running:t||h,pending:h&&!t,action:t?e.action??null:h?c.action:null,target:t?e.target??null:h?c.target:null,startedAt:t?e.startedAt??null:null,progress:t?e.progress??null:null,budget:t?e.budget??null:null,log:t&&Array.isArray(e.log)?e.log:[],finished:r})}(t)}).catch(()=>{}).finally(()=>{p?.promise===t&&(p=null)});return p={epoch:e,promise:t},t}(),clearTimeout(f),f=s.size?setTimeout(b,c.running?1500:5e3):null}function v(e){return s.add(e),1===s.size&&b(),()=>{s.delete(e),s.size||(clearTimeout(f),f=null)}}async function _(e,{name:t,id:n,onLog:a,...o}={}){let l;g++,h=!0,m({...c,known:!0,running:!0,pending:!0,action:e,target:t||n?{id:n??null,name:t??null}:null,startedAt:null,progress:null,log:[]});try{l=await r(e,t,{...n?{id:n}:{},...o})}catch(e){throw h=!1,g++,c.pending&&m({...c,running:!1,pending:!1,action:null,target:null,log:[]}),b(),e}h=!1,g++;let u=l?.startedAt??null;null!=u&&y.add(u);let i=new Promise(e=>{let t=v(()=>{c.running&&c.startedAt===u&&a?.(c.log);let r=null==u?c.running?null:{exitCode:null,failure:null,log:[]}:c.finished.find(e=>e.startedAt===u);r&&(t(),r.log.length&&a?.(r.log),e(r))});b()});return{startedAt:u,ended:i}}function j(e){return!!e?.target&&["bridge","rescrape","resume"].includes(e.action)}e.s(["NO_SCAN_NOTES",0,a,"SCANNER_UNKNOWN",0,i,"beginScrape",0,_,"busyReason",0,function(e=c){if(!e?.running)return null;let t=e.target?.name;switch(e.action){case"bridge":case"rescrape":case"resume":return t?`${t}’s circle is being scanned`:"A circle is being scanned";case"company":return t?`${t} is being scanned`:"A company is being scanned";case"auto-bridge":case"auto-bridge-retry":case"resume-all":return"Your bridges are being mapped, one by one";case"full":case"refresh":return"Your own connections are being scanned";default:switch(e.action){case"install":return"The scanner's packages are being installed";case"setup":return"The scanner is being set up";case"login":return"The LinkedIn sign-in window is open";case"photos":return"Profile photos are being saved";default:return"A scan is running"}}},"isCircleScan",0,j,"loadScanNotes",0,o,"notReadyMessage",0,function(e){if(!e)return"Could not reach the app.";let t=e.checks||{};return t.scriptsFound?t.dependencies?t.chrome?null:"Google Chrome is not installed.":t.python||t.download?"The scanner is not set up yet — open Scan to set it up.":"No Python 3.10 to 3.14 is installed on this machine.":"The scanner files are missing from this install."},"pickedPerson",0,l,"resumePoint",0,n,"runScrape",0,function(e,t={}){return _(e,t).then(e=>e.ended)},"scannerNow",0,function(){return c},"scansCircleOf",0,function(e,t){if(!j(e)||!t)return!1;let{id:r,name:n}=e.target;return r&&t.id?r===t.id:!!n&&n===t.name},"scraperStatus",0,t,"stopScrape",0,u,"watchScanner",0,v],40996)},22016,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0});var n={default:function(){return m},useLinkStatus:function(){return v}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(90809),l=e.r(43476),u=o._(e.r(71645)),i=e.r(95057),s=e.r(8372),c=e.r(18581),d=e.r(18967),f=e.r(5550),p=e.r(88540),g=e.r(91949),h=e.r(73668),y=e.r(9396);function m(t){var r;let n,a,o,[m,v]=(0,u.useOptimistic)(g.IDLE_LINK_STATUS),_=(0,u.useRef)(null),{href:j,as:S,children:x,prefetch:P=null,passHref:O,replace:C,shallow:w,scroll:E,onClick:R,onMouseEnter:T,onTouchStart:N,legacyBehavior:A=!1,onNavigate:k,transitionTypes:M,ref:D,unstable_dynamicOnHover:F,...L}=t;n=x,A&&("string"==typeof n||"number"==typeof n)&&(n=(0,l.jsx)("a",{children:n}));let I=u.default.useContext(s.AppRouterContext),U=!1!==P,B=!1===P?"none":!0===P?"full":"auto",$="none"!==B?"auto"===B?y.FetchStrategy.PPR:y.FetchStrategy.Full:y.FetchStrategy.PPR,H="string"==typeof(r=S||j)?r:(0,i.formatUrl)(r);if(A){if(n?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});a=u.default.Children.only(n)}let z=A?a&&"object"==typeof a&&a.ref:D,V,K=u.default.useCallback(e=>(null!==I&&(_.current=(0,g.mountLinkInstance)(e,H,I,$,U,v,V)),()=>{_.current&&((0,g.unmountLinkForCurrentNavigation)(_.current),_.current=null),(0,g.unmountPrefetchableInstance)(e)}),[U,H,I,$,v,V]),W={ref:(0,c.useMergedRef)(K,z),onClick(t){A||"function"!=typeof R||R(t),A&&a.props&&"function"==typeof a.props.onClick&&a.props.onClick(t),!I||t.defaultPrevented||function(t,r,n,a,o,l,i,s="none"){if("u">typeof window){let c,{nodeName:d}=t.currentTarget;if("A"===d.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,h.isLocalURL)(r)){a&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),l){let e=!1;if(l({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:f}=e.r(99781);u.default.startTransition(()=>{f(r,a?"replace":"push",!1===o?p.ScrollBehavior.NoScroll:p.ScrollBehavior.Default,n.current,i,s)})}}(t,H,_,C,E,k,M,B)},onMouseEnter(e){A||"function"!=typeof T||T(e),A&&a.props&&"function"==typeof a.props.onMouseEnter&&a.props.onMouseEnter(e),I&&U&&(0,g.onNavigationIntent)(e.currentTarget,!0===F)},onTouchStart:function(e){A||"function"!=typeof N||N(e),A&&a.props&&"function"==typeof a.props.onTouchStart&&a.props.onTouchStart(e),I&&U&&(0,g.onNavigationIntent)(e.currentTarget,!0===F)}};return(0,d.isAbsoluteUrl)(H)?W.href=H:A&&!O&&("a"!==a.type||"href"in a.props)||(W.href=(0,f.addBasePath)(H)),o=A?u.default.cloneElement(a,W):(0,l.jsx)("a",{...L,...W,children:n}),(0,l.jsx)(b.Provider,{value:m,children:o})}let b=(0,u.createContext)(g.IDLE_LINK_STATUS),v=()=>(0,u.useContext)(b);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},28298,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useRouterBFCache",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,t,r){let[a,o]=(0,n.useState)(()=>({tree:e,cacheNode:t,stateKey:r,next:null}));if(a.tree===e)return a;let l={tree:e,cacheNode:t,stateKey:r,next:null},u=1,i=a,s=l;for(;null!==i&&u<1;){if(i.stateKey===r){s.next=i.next;break}{u++;let e={tree:i.tree,cacheNode:i.cacheNode,stateKey:i.stateKey,next:null};s.next=e,s=e}i=i.next}return o(l),l}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},47257,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ClientPageRoot",{enumerable:!0,get:function(){return s}});let n=e.r(43476),a=e.r(8372),o=e.r(71645),l=e.r(33906),u=e.r(61994),i=e.r(15783);function s({Component:e,serverProvidedParams:t}){let r,c;if(null!==t)r=t.searchParams,c=t.params;else{let e=(0,o.use)(a.LayoutRouterContext);c=null!==e?e.parentParams:{},r=(0,l.urlSearchParamsToParsedUrlQuery)((0,o.use)(u.SearchParamsContext))}let d=(0,i.createClientSearchParams)(r),f=(0,i.createClientParams)(c);return(0,n.jsx)(e,{params:f,searchParams:d})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},92825,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ClientSegmentRoot",{enumerable:!0,get:function(){return u}});let n=e.r(43476),a=e.r(8372),o=e.r(71645),l=e.r(15783);function u({Component:e,slots:t,serverProvidedParams:r}){let i;if(null!==r)i=r.params;else{let e=(0,o.use)(a.LayoutRouterContext);i=null!==e?e.parentParams:{}}let s=(0,l.createClientParams)(i);return(0,n.jsx)(e,{...t,params:s})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},68017,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"HTTPAccessFallbackBoundary",{enumerable:!0,get:function(){return c}});let n=e.r(90809),a=e.r(43476),o=n._(e.r(71645)),l=e.r(90373),u=e.r(54394),i=e.r(8372);class s extends o.default.Component{constructor(e){super(e),this.state={triggeredStatus:void 0,previousPathname:e.pathname}}componentDidCatch(){}static getDerivedStateFromError(e){if((0,u.isHTTPAccessFallbackError)(e))return{triggeredStatus:(0,u.getAccessFallbackHTTPStatus)(e)};throw e}static getDerivedStateFromProps(e,t){return e.pathname!==t.previousPathname&&t.triggeredStatus?{triggeredStatus:void 0,previousPathname:e.pathname}:{triggeredStatus:t.triggeredStatus,previousPathname:e.pathname}}render(){let{notFound:e,forbidden:t,unauthorized:r,children:n}=this.props,{triggeredStatus:o}=this.state,l={[u.HTTPAccessErrorStatus.NOT_FOUND]:e,[u.HTTPAccessErrorStatus.FORBIDDEN]:t,[u.HTTPAccessErrorStatus.UNAUTHORIZED]:r};if(o){let i=o===u.HTTPAccessErrorStatus.NOT_FOUND&&e,s=o===u.HTTPAccessErrorStatus.FORBIDDEN&&t,c=o===u.HTTPAccessErrorStatus.UNAUTHORIZED&&r;return i||s||c?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("meta",{name:"robots",content:"noindex"}),!1,l[o]]}):n}return n}}function c({notFound:e,forbidden:t,unauthorized:r,children:n}){let u=(0,l.useUntrackedPathname)(),d=(0,o.useContext)(i.MissingSlotContext);return e||t||r?(0,a.jsx)(s,{pathname:u,notFound:e,forbidden:t,unauthorized:r,missingSlots:d,children:n}):(0,a.jsx)(a.Fragment,{children:n})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},22976,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={InstantValidationBoundaryContext:function(){return o},PlaceValidationBoundaryBelowThisLevel:function(){return l},RenderValidationBoundaryAtThisLevel:function(){return u},SlotMarker:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=null,l=null,u=null,i=null;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},77694,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={InstantValidationBoundaryContext:function(){return o.InstantValidationBoundaryContext},PlaceValidationBoundaryBelowThisLevel:function(){return o.PlaceValidationBoundaryBelowThisLevel},RenderValidationBoundaryAtThisLevel:function(){return o.RenderValidationBoundaryAtThisLevel},SlotMarker:function(){return o.SlotMarker}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(22976);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},39756,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0});var n={LoadingBoundaryProvider:function(){return O},default:function(){return w}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(55682),l=e.r(90809),u=e.r(43476),i=l._(e.r(71645)),s=o._(e.r(74080)),c=e.r(8372),d=e.r(1244),f=e.r(72383),p=e.r(91915),g=e.r(58442),h=e.r(68017);e.r(77694);let y=e.r(70725),m=e.r(28298);e.r(74180);let b=e.r(61994),v=e.r(33906),_=e.r(95871);s.default.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function j(e,t,r){let n=e.getClientRects();if(0===n.length)return 0;let a=1/0;for(let e=0;e<n.length;e++){let t=n[e];t.top<a&&(a=t.top)}return a>=r()&&a<=t?1:2}i.default.Component;let S=function(e){let t=i.default.useRef(null);return(0,i.useLayoutEffect)(()=>{let{focusAndScrollRef:r,cacheNode:n}=e,a=r.forceScroll?r.scrollRef:n.scrollRef;if(null===a||!a.current)return;let o=null,l=r.hashFragment;if(l){var u;if(null===(o="top"===(u=l)?document.body:document.getElementById(u)??document.getElementsByName(u)[0]??null)){a.current=!1,r.onlyHashChange=!1,r.hashFragment=null;return}}else o=t.current;if(null===o)return;let i=!1;(0,p.disableSmoothScrollDuringRouteTransition)(()=>{let e=document.documentElement,t=null,r=null,n=null,u=()=>{var r,a;let o,l;return null===n&&(r=e,a=t,n=!Number.isFinite(l=Number.parseFloat(o=getComputedStyle(r).scrollPaddingTop))||l<0?0:o.endsWith("px")?l:o.endsWith("%")?l/100*a:0),n};(l||(t=e.clientHeight,0!==(r=j(o,t,u))))&&((i=!0,a.current=!1,l)?o.scrollIntoView():1!==r&&(e.scrollTop=0,2===j(o,t,u)&&o.scrollIntoView()))},{dontForceLayout:!0,onlyHashChange:r.onlyHashChange}),i&&(r.onlyHashChange=!1,r.hashFragment=null)},void 0),(0,u.jsx)(i.Fragment,{ref:t,children:e.children})};function x({children:e,cacheNode:t}){let r=(0,i.useContext)(c.GlobalLayoutRouterContext);if(!r)throw Object.defineProperty(Error("invariant global layout router not mounted"),"__NEXT_ERROR_CODE",{value:"E473",enumerable:!1,configurable:!0});return(0,u.jsx)(S,{focusAndScrollRef:r.focusAndScrollRef,cacheNode:t,children:e})}function P({tree:e,segmentPath:t,debugNameContext:r,cacheNode:n,params:a,url:o,isActive:l}){let s,f=(0,i.useContext)(c.GlobalLayoutRouterContext);if((0,i.useContext)(b.NavigationPromisesContext),!f)throw Object.defineProperty(Error("invariant global layout router not mounted"),"__NEXT_ERROR_CODE",{value:"E473",enumerable:!1,configurable:!0});let p=null!==n?n:(0,i.use)(d.unresolvedThenable),g=null!==p.prefetchRsc?p.prefetchRsc:p.rsc,h=(0,i.useDeferredValue)(p.rsc,g);if((0,_.isDeferredRsc)(h)){let e=(0,i.use)(h);null===e&&(0,i.use)(d.unresolvedThenable),s=e}else null===h&&(0,i.use)(d.unresolvedThenable),s=h;let y=s;return(0,u.jsx)(c.LayoutRouterContext.Provider,{value:{parentTree:e,parentCacheNode:p,parentSegmentPath:t,parentParams:a,parentLoadingData:null,debugNameContext:r,url:o,isActive:l},children:y})}function O({loading:e,children:t}){let r=(0,i.use)(c.LayoutRouterContext);return null===r?t:(0,u.jsx)(c.LayoutRouterContext.Provider,{value:{parentTree:r.parentTree,parentCacheNode:r.parentCacheNode,parentSegmentPath:r.parentSegmentPath,parentParams:r.parentParams,parentLoadingData:e,debugNameContext:r.debugNameContext,url:r.url,isActive:r.isActive},children:t})}function C({name:e,loading:t,children:r}){if(null!==t){let n=t[0],a=t[1],o=t[2];return(0,u.jsx)(i.Suspense,{name:e,fallback:(0,u.jsxs)(u.Fragment,{children:[a,o,n]}),children:r})}return(0,u.jsx)(u.Fragment,{children:r})}function w({parallelRouterKey:e,error:t,errorStyles:r,errorScripts:n,templateStyles:a,templateScripts:o,template:l,notFound:s,forbidden:p,unauthorized:b,segmentViewBoundaries:_}){let j=(0,i.useContext)(c.LayoutRouterContext);if(!j)throw Object.defineProperty(Error("invariant expected layout router to be mounted"),"__NEXT_ERROR_CODE",{value:"E56",enumerable:!1,configurable:!0});let{parentTree:S,parentCacheNode:O,parentSegmentPath:E,parentParams:R,parentLoadingData:T,url:N,isActive:A,debugNameContext:k}=j,M=S[0],D=null===E?[e]:E.concat([M,e]),F=S[1][e],L=O.slots;(void 0===F||null===L)&&(0,i.use)(d.unresolvedThenable);let I=F[0],U=L[e]??null,B=(0,y.createRouterCacheKey)(I,!0),$=(0,m.useRouterBFCache)(F,U,B),H=[];do{let e=$.tree,i=$.cacheNode,d=$.stateKey,y=e[0],m=R;if(Array.isArray(y)){let e=y[0],t=y[1],r=y[2],n=(0,v.getParamValueFromCacheKey)(t,r);null!==n&&(m={...R,[e]:n})}let _=function(e){if("/"===e)return"/";if("string"==typeof e)if("(__SLOT__)"===e)return;else return e+"/";return e[1]+"/"}(y),j=_??k,S=void 0===_?void 0:k,O=(0,u.jsxs)(x,{cacheNode:i,children:[(0,u.jsx)(f.ErrorBoundary,{errorComponent:t,errorStyles:r,errorScripts:n,children:(0,u.jsx)(C,{name:S,loading:T,children:(0,u.jsx)(h.HTTPAccessFallbackBoundary,{notFound:s,forbidden:p,unauthorized:b,children:(0,u.jsxs)(g.RedirectBoundary,{children:[(0,u.jsx)(P,{url:N,tree:e,params:m,cacheNode:i,segmentPath:D,debugNameContext:j,isActive:A&&d===B}),null]})})})}),null]}),w=(0,u.jsxs)(c.TemplateContext.Provider,{value:O,children:[a,o,l]},d);H.push(w),$=$.next}while(null!==$)return H}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},37457,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"default",{enumerable:!0,get:function(){return u}});let n=e.r(90809),a=e.r(43476),o=n._(e.r(71645)),l=e.r(8372);function u(){let e=(0,o.useContext)(l.TemplateContext);return(0,a.jsx)(a.Fragment,{children:e})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},6831,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderParamsFromClient",{enumerable:!0,get:function(){return a}});let n=new WeakMap;function a(e){let t=n.get(e);if(t)return t;let r=Promise.resolve(e);return n.set(e,r),r}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},97689,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderParamsFromClient",{enumerable:!0,get:function(){return n}});let n=e.r(6831).createRenderParamsFromClient;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},93504,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderSearchParamsFromClient",{enumerable:!0,get:function(){return a}});let n=new WeakMap;function a(e){let t=n.get(e);if(t)return t;let r=Promise.resolve(e);return n.set(e,r),r}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},66996,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderSearchParamsFromClient",{enumerable:!0,get:function(){return n}});let n=e.r(93504).createRenderSearchParamsFromClient;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},15783,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={createClientParams:function(){return o.createRenderParamsFromClient},createClientSearchParams:function(){return l.createRenderSearchParamsFromClient}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(97689),l=e.r(66996);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,t){let r=(0,n.useRef)(null),a=(0,n.useRef)(null);return(0,n.useCallback)(n=>{if(null===n){let e=r.current;e&&(r.current=null,e());let t=a.current;t&&(a.current=null,t())}else e&&(r.current=o(e,n)),t&&(a.current=o(t,n))},[e,t])}function o(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},18967,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0});var n={DecodeError:function(){return m},MiddlewareNotFoundError:function(){return j},MissingStaticPage:function(){return _},NormalizeError:function(){return b},PageNotFoundError:function(){return v},SP:function(){return h},ST:function(){return y},WEB_VITALS:function(){return o},execOnce:function(){return l},getDisplayName:function(){return d},getLocationOrigin:function(){return s},getURL:function(){return c},isAbsoluteUrl:function(){return i},isResSent:function(){return f},loadGetInitialProps:function(){return g},normalizeRepeatedSlashes:function(){return p},stringifyError:function(){return S}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=["CLS","FCP","FID","INP","LCP","TTFB"];function l(e){let t,r=!1;return(...n)=>(r||(r=!0,t=e(...n)),t)}let u=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,i=e=>{let t=e.charCodeAt(0);return!!(t>=65&&t<=90||t>=97&&t<=122)&&u.test(e)};function s(){let{protocol:e,hostname:t,port:r}=window.location;return`${e}//${t}${r?":"+r:""}`}function c(){let{href:e}=window.location,t=s();return e.substring(t.length)}function d(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function f(e){return e.finished||e.headersSent}function p(e){let t=e.split("?");return t[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(t[1]?`?${t.slice(1).join("?")}`:"")}async function g(e,t){let r=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await g(t.Component,t.ctx)}:{};let n=await e.getInitialProps(t);if(r&&f(r))return n;if(!n)throw Object.defineProperty(Error(`"${d(e)}.getInitialProps()" should resolve to an object. But found "${n}" instead.`),"__NEXT_ERROR_CODE",{value:"E1025",enumerable:!1,configurable:!0});return n}let h="u">typeof performance,y=h&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class m extends Error{}class b extends Error{}class v extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message=`Cannot find module for page: ${e}`}}class _ extends Error{constructor(e,t){super(),this.message=`Failed to load static file for page: ${e} ${t}`}}class j extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function S(e){return JSON.stringify({message:e.message,stack:e.stack})}},27201,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"IconMark",{enumerable:!0,get:function(){return a}});let n=e.r(43476),a=()=>"u">typeof window?null:(0,n.jsx)("meta",{name:"«nxt-icon»"})},91915,(e,t,r)=>{"use strict";function n(e,t={}){if(t.onlyHashChange)return void e();let r=document.documentElement;if("smooth"!==r.dataset.scrollBehavior)return void e();let a=r.style.scrollBehavior;r.style.scrollBehavior="auto",t.dontForceLayout||r.getClientRects(),e(),r.style.scrollBehavior=a}e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"disableSmoothScrollDuringRouteTransition",{enumerable:!0,get:function(){return n}})},73668,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return o}});let n=e.r(18967),a=e.r(52817);function o(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,a.hasBasePath)(r.pathname)}catch(e){return!1}}},98183,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={assign:function(){return i},searchParamsToUrlQuery:function(){return o},urlQueryToSearchParams:function(){return u}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});function o(e){let t={};for(let[r,n]of e.entries()){let e=t[r];void 0===e?t[r]=n:Array.isArray(e)?e.push(n):t[r]=[e,n]}return t}function l(e){return"string"==typeof e?e:("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function u(e){let t=new URLSearchParams;for(let[r,n]of Object.entries(e))if(Array.isArray(n))for(let e of n)t.append(r,l(e));else t.set(r,l(n));return t}function i(e,...t){for(let r of t){for(let t of r.keys())e.delete(t);for(let[t,n]of r.entries())e.append(t,n)}return e}},95057,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0});var n={formatUrl:function(){return u},formatWithValidation:function(){return s},urlObjectKeys:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(90809)._(e.r(98183)),l=/https?|ftp|gopher|file/;function u(e){let{auth:t,hostname:r}=e,n=e.protocol||"",a=e.pathname||"",u=e.hash||"",i=e.query||"",s=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?s=t+e.host:r&&(s=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(s+=":"+e.port)),i&&"object"==typeof i&&(i=String(o.urlQueryToSearchParams(i)));let c=e.search||i&&`?${i}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||l.test(n))&&!1!==s?(s="//"+(s||""),a&&"/"!==a[0]&&(a="/"+a)):s||(s=""),u&&"#"!==u[0]&&(u="#"+u),c&&"?"!==c[0]&&(c="?"+c),a=a.replace(/[?#]/g,encodeURIComponent),c=c.replace("#","%23"),`${n}${s}${a}${c}${u}`}let i=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function s(e){return u(e)}}]);