@gooin/garmin-connect 1.7.6 → 1.8.0

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 (132) hide show
  1. package/dist/common/FileMFASessionStorage.js +1 -247
  2. package/dist/common/HttpClient copy.js +1 -361
  3. package/dist/common/HttpClient.d.ts +1 -0
  4. package/dist/common/HttpClient.js +1 -612
  5. package/dist/common/HttpClient.js.map +1 -1
  6. package/dist/common/HttpClientOLD.js +1 -361
  7. package/dist/common/HttpClientOLDV1.js +1 -361
  8. package/dist/common/HttpClientV1.js +1 -577
  9. package/dist/common/MFAManager.js +1 -126
  10. package/dist/common/MFASessionStorage.js +1 -3
  11. package/dist/common/RedisMFASessionStorage.js +1 -281
  12. package/dist/common/RedisMFASessionStorage.js.map +1 -1
  13. package/dist/garmin/GarminConnect.d.ts +15 -78
  14. package/dist/garmin/GarminConnect.js +1 -592
  15. package/dist/garmin/GarminConnect.js.map +1 -1
  16. package/dist/garmin/UrlClass.d.ts +21 -0
  17. package/dist/garmin/UrlClass.js +1 -149
  18. package/dist/garmin/UrlClass.js.map +1 -1
  19. package/dist/garmin/common/DateUtils.d.ts +1 -0
  20. package/dist/garmin/common/DateUtils.js +1 -38
  21. package/dist/garmin/common/DateUtils.js.map +1 -1
  22. package/dist/garmin/common/HydrationUtils.js +1 -16
  23. package/dist/garmin/common/WeightUtils.js +1 -9
  24. package/dist/garmin/modules/activity/base.d.ts +39 -0
  25. package/dist/garmin/modules/activity/base.js +1 -0
  26. package/dist/garmin/modules/activity/base.js.map +1 -0
  27. package/dist/garmin/modules/activity/cycling.d.ts +16 -0
  28. package/dist/garmin/modules/activity/cycling.js +1 -0
  29. package/dist/garmin/modules/activity/cycling.js.map +1 -0
  30. package/dist/garmin/modules/activity/running.d.ts +15 -0
  31. package/dist/garmin/modules/activity/running.js +1 -0
  32. package/dist/garmin/modules/activity/running.js.map +1 -0
  33. package/dist/garmin/modules/activity/training-status.d.ts +13 -0
  34. package/dist/garmin/modules/activity/training-status.js +1 -0
  35. package/dist/garmin/modules/activity/training-status.js.map +1 -0
  36. package/dist/garmin/modules/coach/activity-summary.d.ts +20 -0
  37. package/dist/garmin/modules/coach/activity-summary.js +1 -0
  38. package/dist/garmin/modules/coach/activity-summary.js.map +1 -0
  39. package/dist/garmin/modules/coach/helpers.d.ts +157 -0
  40. package/dist/garmin/modules/coach/helpers.js +1 -0
  41. package/dist/garmin/modules/coach/helpers.js.map +1 -0
  42. package/dist/garmin/modules/coach/training-overview.d.ts +5 -0
  43. package/dist/garmin/modules/coach/training-overview.js +1 -0
  44. package/dist/garmin/modules/coach/training-overview.js.map +1 -0
  45. package/dist/garmin/modules/coach/wellness-overview.d.ts +5 -0
  46. package/dist/garmin/modules/coach/wellness-overview.js +1 -0
  47. package/dist/garmin/modules/coach/wellness-overview.js.map +1 -0
  48. package/dist/garmin/modules/coach/wellness-summary.d.ts +4 -0
  49. package/dist/garmin/modules/coach/wellness-summary.js +1 -0
  50. package/dist/garmin/modules/coach/wellness-summary.js.map +1 -0
  51. package/dist/garmin/modules/coach.d.ts +60 -0
  52. package/dist/garmin/modules/coach.js +1 -0
  53. package/dist/garmin/modules/coach.js.map +1 -0
  54. package/dist/garmin/modules/course.d.ts +27 -0
  55. package/dist/garmin/modules/course.js +1 -0
  56. package/dist/garmin/modules/course.js.map +1 -0
  57. package/dist/garmin/modules/device.d.ts +11 -0
  58. package/dist/garmin/modules/device.js +1 -0
  59. package/dist/garmin/modules/device.js.map +1 -0
  60. package/dist/garmin/modules/misc.d.ts +18 -0
  61. package/dist/garmin/modules/misc.js +1 -0
  62. package/dist/garmin/modules/misc.js.map +1 -0
  63. package/dist/garmin/modules/types.d.ts +10 -0
  64. package/dist/garmin/modules/types.js +1 -0
  65. package/dist/garmin/modules/types.js.map +1 -0
  66. package/dist/garmin/modules/user.d.ts +18 -0
  67. package/dist/garmin/modules/user.js +1 -0
  68. package/dist/garmin/modules/user.js.map +1 -0
  69. package/dist/garmin/modules/wellness/body-battery.d.ts +11 -0
  70. package/dist/garmin/modules/wellness/body-battery.js +1 -0
  71. package/dist/garmin/modules/wellness/body-battery.js.map +1 -0
  72. package/dist/garmin/modules/wellness/heart-rate.d.ts +11 -0
  73. package/dist/garmin/modules/wellness/heart-rate.js +1 -0
  74. package/dist/garmin/modules/wellness/heart-rate.js.map +1 -0
  75. package/dist/garmin/modules/wellness/hrv.d.ts +12 -0
  76. package/dist/garmin/modules/wellness/hrv.js +1 -0
  77. package/dist/garmin/modules/wellness/hrv.js.map +1 -0
  78. package/dist/garmin/modules/wellness/hydration.d.ts +12 -0
  79. package/dist/garmin/modules/wellness/hydration.js +1 -0
  80. package/dist/garmin/modules/wellness/hydration.js.map +1 -0
  81. package/dist/garmin/modules/wellness/sleep.d.ts +16 -0
  82. package/dist/garmin/modules/wellness/sleep.js +1 -0
  83. package/dist/garmin/modules/wellness/sleep.js.map +1 -0
  84. package/dist/garmin/modules/wellness/weight.d.ts +20 -0
  85. package/dist/garmin/modules/wellness/weight.js +1 -0
  86. package/dist/garmin/modules/wellness/weight.js.map +1 -0
  87. package/dist/garmin/modules/workout.d.ts +23 -0
  88. package/dist/garmin/modules/workout.js +1 -0
  89. package/dist/garmin/modules/workout.js.map +1 -0
  90. package/dist/garmin/types/activity-stats.d.ts +21 -0
  91. package/dist/garmin/types/activity-stats.js +1 -0
  92. package/dist/garmin/types/activity-stats.js.map +1 -0
  93. package/dist/garmin/types/activity.js +1 -27
  94. package/dist/garmin/types/body-battery.d.ts +7 -0
  95. package/dist/garmin/types/body-battery.js +1 -0
  96. package/dist/garmin/types/body-battery.js.map +1 -0
  97. package/dist/garmin/types/coach.d.ts +533 -0
  98. package/dist/garmin/types/coach.js +1 -0
  99. package/dist/garmin/types/coach.js.map +1 -0
  100. package/dist/garmin/types/course.d.ts +3 -11
  101. package/dist/garmin/types/course.js +1 -3
  102. package/dist/garmin/types/cycling.d.ts +70 -0
  103. package/dist/garmin/types/cycling.js +1 -0
  104. package/dist/garmin/types/cycling.js.map +1 -0
  105. package/dist/garmin/types/device.d.ts +32 -0
  106. package/dist/garmin/types/device.js +1 -0
  107. package/dist/garmin/types/device.js.map +1 -0
  108. package/dist/garmin/types/golf.d.ts +4 -4
  109. package/dist/garmin/types/golf.js +1 -3
  110. package/dist/garmin/types/golf.js.map +1 -1
  111. package/dist/garmin/types/heartrate.d.ts +3 -3
  112. package/dist/garmin/types/heartrate.js +1 -2
  113. package/dist/garmin/types/hrv.d.ts +3 -0
  114. package/dist/garmin/types/hrv.js +1 -3
  115. package/dist/garmin/types/hydration.d.ts +3 -3
  116. package/dist/garmin/types/hydration.js +1 -2
  117. package/dist/garmin/types/index.d.ts +15 -0
  118. package/dist/garmin/types/index.js +1 -36
  119. package/dist/garmin/types/index.js.map +1 -1
  120. package/dist/garmin/types/personal-info.js +1 -3
  121. package/dist/garmin/types/race-prediction.d.ts +50 -0
  122. package/dist/garmin/types/race-prediction.js +1 -0
  123. package/dist/garmin/types/race-prediction.js.map +1 -0
  124. package/dist/garmin/types/sleep.js +1 -3
  125. package/dist/garmin/types/training-status.js +1 -3
  126. package/dist/garmin/types/weight.d.ts +46 -4
  127. package/dist/garmin/types/weight.js +1 -3
  128. package/dist/garmin/workouts/Running.js +1 -47
  129. package/dist/garmin/workouts/templates/RunningTemplate.js +1 -78
  130. package/dist/index.js +1 -11
  131. package/dist/utils.js +1 -37
  132. package/package.json +4 -3
@@ -1,361 +1 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.HttpClient = void 0;
7
- const axios_1 = __importDefault(require("axios"));
8
- const form_data_1 = __importDefault(require("form-data"));
9
- const lodash_1 = __importDefault(require("lodash"));
10
- const luxon_1 = require("luxon");
11
- const oauth_1_0a_1 = __importDefault(require("oauth-1.0a"));
12
- const qs_1 = __importDefault(require("qs"));
13
- const node_crypto_1 = __importDefault(require("node:crypto"));
14
- const CSRF_RE = new RegExp('name="_csrf"\\s+value="(.+?)"');
15
- const TICKET_RE = new RegExp('ticket=([^"]+)"');
16
- const ACCOUNT_LOCKED_RE = new RegExp('var statuss*=s*"([^"]*)"');
17
- const PAGE_TITLE_RE = new RegExp('<title>([^<]*)</title>');
18
- const USER_AGENT_CONNECTMOBILE = 'com.garmin.android.apps.connectmobile';
19
- const USER_AGENT_BROWSER = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36';
20
- const USER_AGENT_BROWSER_MAC = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36';
21
- const OAUTH_CONSUMER_URL = 'https://thegarth.s3.amazonaws.com/oauth_consumer.json';
22
- const HTTP_STATUS = {
23
- UNAUTHORIZED: 401
24
- };
25
- let tokenRefreshPromise = null;
26
- let refreshSubscribers = [];
27
- class HttpClient {
28
- constructor(url, config) {
29
- var _a, _b;
30
- this.url = url;
31
- this.client = axios_1.default.create({
32
- timeout: (_a = config === null || config === void 0 ? void 0 : config.timeout) !== null && _a !== void 0 ? _a : 5000,
33
- timeoutErrorMessage: `Request Timeout: > ${(_b = config === null || config === void 0 ? void 0 : config.timeout) !== null && _b !== void 0 ? _b : 5000} ms`
34
- /**
35
- * Charles debugger: uncomment `proxy` and `httpsAgent`, then run bellow command.
36
- * NODE_TLS_REJECT_UNAUTHORIZED=0 node test/sync.js
37
- */
38
- // proxy: {
39
- // host: '127.0.0.1',
40
- // port: 8888,
41
- // protocol: 'http'
42
- // },
43
- // httpsAgent: new (require('https').Agent)({
44
- // rejectUnauthorized: false
45
- // })
46
- });
47
- this.config = config;
48
- this.client.interceptors.response.use((response) => response, async (error) => {
49
- var _a;
50
- if (axios_1.default.isAxiosError(error) &&
51
- error.code === 'ECONNABORTED') {
52
- throw new Error(error.message || 'Request Timeout');
53
- }
54
- const originalRequest = error.config;
55
- if (((_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.status) === HTTP_STATUS.UNAUTHORIZED &&
56
- !(originalRequest === null || originalRequest === void 0 ? void 0 : originalRequest._retry)) {
57
- if (!this.oauth2Token) {
58
- throw new Error('No OAuth2 token available');
59
- }
60
- originalRequest._retry = true;
61
- try {
62
- if (!tokenRefreshPromise) {
63
- tokenRefreshPromise =
64
- this.refreshOauth2Token().finally(() => {
65
- tokenRefreshPromise = null;
66
- });
67
- }
68
- await tokenRefreshPromise;
69
- originalRequest.headers.Authorization = `Bearer ${this.oauth2Token.access_token}`;
70
- return this.client(originalRequest);
71
- }
72
- catch (err) {
73
- console.error('Token refresh failed:', err);
74
- throw err;
75
- }
76
- }
77
- if (axios_1.default.isAxiosError(error) && error.response) {
78
- this.handleError(error.response);
79
- }
80
- else {
81
- // 处理没有response的情况
82
- throw new Error('Network error or unknown error occurred');
83
- }
84
- throw error;
85
- });
86
- this.client.interceptors.request.use(async (config) => {
87
- if (this.oauth2Token) {
88
- config.headers.Authorization =
89
- 'Bearer ' + this.oauth2Token.access_token;
90
- }
91
- return config;
92
- });
93
- }
94
- async fetchOauthConsumer() {
95
- const response = await axios_1.default.get(OAUTH_CONSUMER_URL);
96
- this.OAUTH_CONSUMER = {
97
- key: response.data.consumer_key,
98
- secret: response.data.consumer_secret
99
- };
100
- }
101
- async checkTokenVaild() {
102
- if (this.oauth2Token) {
103
- if (this.oauth2Token.expires_at < luxon_1.DateTime.now().toSeconds()) {
104
- console.error('Token expired!');
105
- await this.refreshOauth2Token();
106
- }
107
- }
108
- }
109
- async get(url, config) {
110
- const response = await this.client.get(url, config);
111
- return response === null || response === void 0 ? void 0 : response.data;
112
- }
113
- async post(url, data, config) {
114
- const response = await this.client.post(url, data, config);
115
- return response === null || response === void 0 ? void 0 : response.data;
116
- }
117
- async put(url, data, config) {
118
- const response = await this.client.put(url, data, config);
119
- return response === null || response === void 0 ? void 0 : response.data;
120
- }
121
- async delete(url, config) {
122
- const response = await this.client.post(url, null, {
123
- ...config,
124
- headers: {
125
- ...config === null || config === void 0 ? void 0 : config.headers,
126
- 'X-Http-Method-Override': 'DELETE'
127
- }
128
- });
129
- return response === null || response === void 0 ? void 0 : response.data;
130
- }
131
- setCommonHeader(headers) {
132
- lodash_1.default.each(headers, (headerValue, key) => {
133
- this.client.defaults.headers.common[key] = headerValue;
134
- });
135
- }
136
- handleError(response) {
137
- this.handleHttpError(response);
138
- }
139
- handleHttpError(response) {
140
- const { status, statusText, data } = response;
141
- const errorMessage = {
142
- status,
143
- statusText,
144
- data: typeof data === 'object' ? JSON.stringify(data) : data
145
- };
146
- console.error('HTTP Error:', errorMessage);
147
- throw new Error(`HTTP Error (${status}): ${statusText}`);
148
- }
149
- /**
150
- * Login to Garmin Connect
151
- * @param username
152
- * @param password
153
- * @returns {Promise<HttpClient>}
154
- */
155
- async login(username, password, mfaCallback) {
156
- await this.fetchOauthConsumer();
157
- // Step1-3: Get ticket from page.
158
- const ticket = await this.getLoginTicket(username, password);
159
- // Step4: Oauth1
160
- const oauth1 = await this.getOauth1Token(ticket);
161
- // TODO: Handle MFA
162
- // Step 5: Oauth2
163
- await this.exchange(oauth1);
164
- return this;
165
- }
166
- async getLoginTicket(username, password) {
167
- // Step1: Set cookie
168
- const step1Params = {
169
- clientId: 'GarminConnect',
170
- locale: 'en',
171
- service: this.url.GC_MODERN
172
- };
173
- const step1Url = `${this.url.GARMIN_SSO_EMBED}?${qs_1.default.stringify(step1Params)}`;
174
- // console.log('login - step1Url:', step1Url);
175
- await this.client.get(step1Url);
176
- // Step2 Get _csrf
177
- const step2Params = {
178
- id: 'gauth-widget',
179
- embedWidget: true,
180
- locale: 'en',
181
- gauthHost: this.url.GARMIN_SSO_EMBED
182
- };
183
- const step2Url = `${this.url.SIGNIN_URL}?${qs_1.default.stringify(step2Params)}`;
184
- // console.log('login - step2Url:', step2Url);
185
- const step2Result = await this.get(step2Url);
186
- // console.log('login - step2Result:', step2Result)
187
- const csrfRegResult = CSRF_RE.exec(step2Result);
188
- if (!csrfRegResult) {
189
- throw new Error('login - csrf not found');
190
- }
191
- const csrf_token = csrfRegResult[1];
192
- // console.log('login - csrf:', csrf_token);
193
- // Step3 Get ticket
194
- const signinParams = {
195
- id: 'gauth-widget',
196
- embedWidget: true,
197
- clientId: 'GarminConnect',
198
- locale: 'en',
199
- gauthHost: this.url.GARMIN_SSO_EMBED,
200
- service: this.url.GARMIN_SSO_EMBED,
201
- source: this.url.GARMIN_SSO_EMBED,
202
- redirectAfterAccountLoginUrl: this.url.GARMIN_SSO_EMBED,
203
- redirectAfterAccountCreationUrl: this.url.GARMIN_SSO_EMBED
204
- };
205
- const step3Url = `${this.url.SIGNIN_URL}?${qs_1.default.stringify(signinParams)}`;
206
- // console.log('login - step3Url:', step3Url);
207
- const step3Form = new form_data_1.default();
208
- step3Form.append('username', username);
209
- step3Form.append('password', password);
210
- step3Form.append('embed', 'true');
211
- step3Form.append('_csrf', csrf_token);
212
- const step3Result = await this.post(step3Url, step3Form, {
213
- headers: {
214
- 'Content-Type': 'application/x-www-form-urlencoded',
215
- Dnt: 1,
216
- Origin: this.url.GARMIN_SSO_ORIGIN,
217
- Referer: this.url.SIGNIN_URL,
218
- 'User-Agent': USER_AGENT_BROWSER
219
- }
220
- });
221
- console.log('step3Result:', step3Result);
222
- this.handleAccountLocked(step3Result);
223
- this.handlePageTitle(step3Result);
224
- this.handleMFA(step3Result);
225
- const ticketRegResult = TICKET_RE.exec(step3Result);
226
- if (!ticketRegResult) {
227
- throw new Error('login failed (Ticket not found or MFA), please check username and password');
228
- }
229
- const ticket = ticketRegResult[1];
230
- return ticket;
231
- }
232
- // TODO: Handle MFA
233
- handleMFA(htmlStr) { }
234
- // TODO: Handle Phone number
235
- handlePageTitle(htmlStr) {
236
- const pageTitileRegResult = PAGE_TITLE_RE.exec(htmlStr);
237
- if (pageTitileRegResult) {
238
- const title = pageTitileRegResult[1];
239
- console.log('login page title:', title);
240
- if (lodash_1.default.includes(title, 'Update Phone Number')) {
241
- // current I don't know where to update it
242
- // See: https://github.com/matin/garth/issues/19
243
- throw new Error('login failed (Update Phone number), please update your phone number, See: https://github.com/matin/garth/issues/19');
244
- }
245
- }
246
- }
247
- handleAccountLocked(htmlStr) {
248
- const accountLockedRegResult = ACCOUNT_LOCKED_RE.exec(htmlStr);
249
- if (accountLockedRegResult) {
250
- const msg = accountLockedRegResult[1];
251
- console.error(msg);
252
- throw new Error('login failed (AccountLocked), please open connect web page to unlock your account');
253
- }
254
- }
255
- async refreshOauth2Token() {
256
- try {
257
- if (!this.OAUTH_CONSUMER) {
258
- await this.fetchOauthConsumer();
259
- }
260
- if (!this.oauth2Token || !this.oauth1Token) {
261
- throw new Error('Missing required tokens for refresh');
262
- }
263
- const oauth1 = {
264
- oauth: this.getOauthClient(this.OAUTH_CONSUMER),
265
- token: this.oauth1Token
266
- };
267
- await this.exchange(oauth1);
268
- console.log(`「${this.config.username}」in「${this.url.domain}」 OAuth2 token refreshed successfully`);
269
- }
270
- catch (error) {
271
- console.error('Failed to refresh OAuth2 token:', error);
272
- throw error;
273
- }
274
- }
275
- async getOauth1Token(ticket) {
276
- if (!this.OAUTH_CONSUMER) {
277
- throw new Error('No OAUTH_CONSUMER');
278
- }
279
- const params = {
280
- ticket,
281
- 'login-url': this.url.GARMIN_SSO_EMBED,
282
- 'accepts-mfa-tokens': true
283
- };
284
- const url = `${this.url.OAUTH_URL}/preauthorized?${qs_1.default.stringify(params)}`;
285
- const oauth = this.getOauthClient(this.OAUTH_CONSUMER);
286
- const step4RequestData = {
287
- url: url,
288
- method: 'GET'
289
- };
290
- const headers = oauth.toHeader(oauth.authorize(step4RequestData));
291
- // console.log('getOauth1Token - headers:', headers);
292
- const response = await this.get(url, {
293
- headers: {
294
- ...headers,
295
- 'User-Agent': USER_AGENT_CONNECTMOBILE
296
- }
297
- });
298
- // console.log('getOauth1Token - response:', response);
299
- const token = qs_1.default.parse(response);
300
- // console.log('getOauth1Token - token:', token);
301
- this.oauth1Token = token;
302
- return { token, oauth };
303
- }
304
- getOauthClient(consumer) {
305
- const oauth = new oauth_1_0a_1.default({
306
- consumer: consumer,
307
- signature_method: 'HMAC-SHA1',
308
- hash_function(base_string, key) {
309
- return node_crypto_1.default
310
- .createHmac('sha1', key)
311
- .update(base_string)
312
- .digest('base64');
313
- }
314
- });
315
- return oauth;
316
- }
317
- //
318
- async exchange(oauth1) {
319
- const token = {
320
- key: oauth1.token.oauth_token,
321
- secret: oauth1.token.oauth_token_secret
322
- };
323
- // console.log('exchange - token:', token);
324
- const baseUrl = `${this.url.OAUTH_URL}/exchange/user/2.0`;
325
- const requestData = {
326
- url: baseUrl,
327
- method: 'POST',
328
- data: null
329
- };
330
- const step5AuthData = oauth1.oauth.authorize(requestData, token);
331
- // console.log('login - step5AuthData:', step5AuthData);
332
- const url = `${baseUrl}?${qs_1.default.stringify(step5AuthData)}`;
333
- // console.log('exchange - url:', url);
334
- this.oauth2Token = undefined;
335
- const response = await this.post(url, null, {
336
- headers: {
337
- 'User-Agent': USER_AGENT_CONNECTMOBILE,
338
- 'Content-Type': 'application/x-www-form-urlencoded'
339
- }
340
- });
341
- // console.log('exchange - response:', response);
342
- this.oauth2Token = this.setOauth2TokenExpiresAt(response);
343
- // console.log('exchange - oauth2Token:', this.oauth2Token);
344
- }
345
- setOauth2TokenExpiresAt(token) {
346
- const now = luxon_1.DateTime.now();
347
- const expiresAt = now.plus({ seconds: token.expires_in });
348
- const refreshTokenExpiresAt = now.plus({
349
- seconds: token.refresh_token_expires_in
350
- });
351
- return {
352
- ...token,
353
- last_update_date: now.toLocal().toString(),
354
- expires_date: expiresAt.toLocal().toString(),
355
- expires_at: expiresAt.toSeconds(),
356
- refresh_token_expires_at: refreshTokenExpiresAt.toSeconds()
357
- };
358
- }
359
- }
360
- exports.HttpClient = HttpClient;
361
- //# sourceMappingURL=HttpClientOLDV1.js.map
1
+ 'use strict';const a4_0x1c14ce=a4_0x5a43;(function(_0x4689a2,_0xcdbb7f){const _0x294328=a4_0x5a43,_0x592802=_0x4689a2();while(!![]){try{const _0x361bf9=parseInt(_0x294328(0x1f1))/0x1+-parseInt(_0x294328(0x20c))/0x2*(parseInt(_0x294328(0x243))/0x3)+parseInt(_0x294328(0x240))/0x4+parseInt(_0x294328(0x22c))/0x5+-parseInt(_0x294328(0x230))/0x6+parseInt(_0x294328(0x1fc))/0x7*(parseInt(_0x294328(0x24c))/0x8)+-parseInt(_0x294328(0x205))/0x9*(parseInt(_0x294328(0x20e))/0xa);if(_0x361bf9===_0xcdbb7f)break;else _0x592802['push'](_0x592802['shift']());}catch(_0x308265){_0x592802['push'](_0x592802['shift']());}}}(a4_0x1b3d,0x5c317));function a4_0x5a43(_0x8d5734,_0x24a1cd){_0x8d5734=_0x8d5734-0x1e6;const _0x1b3d5c=a4_0x1b3d();let _0x5a4383=_0x1b3d5c[_0x8d5734];return _0x5a4383;}const a4_0x36e8c4=a4_0x5164;(function(_0x5514df,_0x1a5092){const _0x3c2c3f=a4_0x5a43,_0x213275=a4_0x5164,_0x329faf=_0x5514df();while(!![]){try{const _0x382407=-parseInt(_0x213275(0x18b))/0x1+-parseInt(_0x213275(0x124))/0x2*(-parseInt(_0x213275(0x168))/0x3)+-parseInt(_0x213275(0x17b))/0x4+-parseInt(_0x213275(0x193))/0x5*(-parseInt(_0x213275(0x14e))/0x6)+-parseInt(_0x213275(0x169))/0x7*(parseInt(_0x213275(0x15f))/0x8)+-parseInt(_0x213275(0x164))/0x9*(parseInt(_0x213275(0x145))/0xa)+parseInt(_0x213275(0x15b))/0xb;if(_0x382407===_0x1a5092)break;else _0x329faf[_0x3c2c3f(0x25f)](_0x329faf[_0x3c2c3f(0x24b)]());}catch(_0x3c3870){_0x329faf['push'](_0x329faf[_0x3c2c3f(0x24b)]());}}}(a4_0x28d2,0xadbf8));var __importDefault=this&&this[a4_0x1c14ce(0x227)]||function(_0x2260a5){const _0x4face7=a4_0x5164;return _0x2260a5&&_0x2260a5[_0x4face7(0x163)]?_0x2260a5:{'default':_0x2260a5};};Object[a4_0x36e8c4(0x147)](exports,a4_0x36e8c4(0x163),{'value':!![]}),exports['HttpClient']=void 0x0;const axios_1=__importDefault(require(a4_0x36e8c4(0x162))),form_data_1=__importDefault(require(a4_0x1c14ce(0x20b))),lodash_1=__importDefault(require(a4_0x36e8c4(0x197))),luxon_1=require(a4_0x36e8c4(0x177)),oauth_1_0a_1=__importDefault(require(a4_0x1c14ce(0x21f))),qs_1=__importDefault(require('qs')),node_crypto_1=__importDefault(require(a4_0x36e8c4(0x13e))),CSRF_RE=new RegExp(a4_0x36e8c4(0x17a)),TICKET_RE=new RegExp(a4_0x36e8c4(0x128)),ACCOUNT_LOCKED_RE=new RegExp(a4_0x36e8c4(0x19f)),PAGE_TITLE_RE=new RegExp(a4_0x36e8c4(0x171)),USER_AGENT_CONNECTMOBILE=a4_0x1c14ce(0x257),USER_AGENT_BROWSER=a4_0x36e8c4(0x180),USER_AGENT_BROWSER_MAC=a4_0x36e8c4(0x136),OAUTH_CONSUMER_URL=a4_0x36e8c4(0x16a),HTTP_STATUS={'UNAUTHORIZED':0x191};function a4_0x28d2(){const _0x3d59bd=a4_0x1c14ce,_0x1b350c=[_0x3d59bd(0x235),_0x3d59bd(0x1f6),'timeout',_0x3d59bd(0x214),_0x3d59bd(0x25e),_0x3d59bd(0x213),'defaults',_0x3d59bd(0x22d),_0x3d59bd(0x21c),_0x3d59bd(0x21e),_0x3d59bd(0x21d),_0x3d59bd(0x242),_0x3d59bd(0x260),'OAUTH_CONSUMER',_0x3d59bd(0x22f),'each',_0x3d59bd(0x1ec),_0x3d59bd(0x248),_0x3d59bd(0x262),_0x3d59bd(0x232),_0x3d59bd(0x24a),_0x3d59bd(0x1f2),'access_token',_0x3d59bd(0x24f),'fetchOauthConsumer','login',_0x3d59bd(0x21b),_0x3d59bd(0x253),'data',_0x3d59bd(0x219),'」\x20OAuth2\x20token\x20refreshed\x20successfully',_0x3d59bd(0x220),_0x3d59bd(0x263),'log',_0x3d59bd(0x250),_0x3d59bd(0x204),'/exchange/user/2.0','username','put',_0x3d59bd(0x1f4),'true',_0x3d59bd(0x1e8),_0x3d59bd(0x202),_0x3d59bd(0x236),_0x3d59bd(0x254),_0x3d59bd(0x210),_0x3d59bd(0x1fb),_0x3d59bd(0x247),_0x3d59bd(0x221),_0x3d59bd(0x1eb),_0x3d59bd(0x256),_0x3d59bd(0x1f9),'message',_0x3d59bd(0x237),_0x3d59bd(0x22e),_0x3d59bd(0x212),_0x3d59bd(0x23a),'1809694QBwPzy',_0x3d59bd(0x1fe),_0x3d59bd(0x217),'oauth2Token','ticket=([^\x22]+)\x22','authorize',_0x3d59bd(0x1f7),_0x3d59bd(0x244),_0x3d59bd(0x23c),_0x3d59bd(0x211),_0x3d59bd(0x1fd),_0x3d59bd(0x259),_0x3d59bd(0x233),_0x3d59bd(0x22a),_0x3d59bd(0x1e7),_0x3d59bd(0x218),_0x3d59bd(0x249),_0x3d59bd(0x206),_0x3d59bd(0x25c),_0x3d59bd(0x1ee),_0x3d59bd(0x216),_0x3d59bd(0x22b),'exec','Missing\x20required\x20tokens\x20for\x20refresh','default',_0x3d59bd(0x255),'node:crypto',_0x3d59bd(0x1ea),_0x3d59bd(0x1e9),_0x3d59bd(0x241),_0x3d59bd(0x25d),_0x3d59bd(0x1ff),_0x3d59bd(0x208),_0x3d59bd(0x224),_0x3d59bd(0x225),_0x3d59bd(0x226),'get',_0x3d59bd(0x228),_0x3d59bd(0x215),'handleAccountLocked',_0x3d59bd(0x231),'refresh_token_expires_in',_0x3d59bd(0x23b),_0x3d59bd(0x251),_0x3d59bd(0x1e6),_0x3d59bd(0x1ef),'handleMFA','GARMIN_SSO_EMBED',_0x3d59bd(0x1f3),'DELETE',_0x3d59bd(0x24e),'GARMIN_SSO_ORIGIN',_0x3d59bd(0x238),_0x3d59bd(0x245),_0x3d59bd(0x222),'9198200ploAjd',_0x3d59bd(0x1f5),'oauth_token_secret','handlePageTitle',_0x3d59bd(0x23f),_0x3d59bd(0x207),_0x3d59bd(0x201),_0x3d59bd(0x252),'__esModule','108usXcMl',_0x3d59bd(0x23e),_0x3d59bd(0x1f8),_0x3d59bd(0x246),_0x3d59bd(0x25b)];return a4_0x28d2=function(){return _0x1b350c;},a4_0x28d2();}function a4_0x5164(_0x4baa10,_0x10b40f){_0x4baa10=_0x4baa10-0x122;const _0xe683b0=a4_0x28d2();let _0x1f85ea=_0xe683b0[_0x4baa10];return _0x1f85ea;}let tokenRefreshPromise=null,refreshSubscribers=[];class HttpClient{constructor(_0x119939,_0x2b84ad){const _0x29a08a=a4_0x1c14ce,_0x426b81=a4_0x36e8c4;var _0x2810b8,_0x5d60e9;this[_0x426b81(0x146)]=_0x119939,this[_0x29a08a(0x21b)]=axios_1[_0x426b81(0x13c)][_0x426b81(0x196)]({'timeout':(_0x2810b8=_0x2b84ad===null||_0x2b84ad===void 0x0?void 0x0:_0x2b84ad[_0x426b81(0x16b)])!==null&&_0x2810b8!==void 0x0?_0x2810b8:0x1388,'timeoutErrorMessage':_0x426b81(0x125)+((_0x5d60e9=_0x2b84ad===null||_0x2b84ad===void 0x0?void 0x0:_0x2b84ad[_0x426b81(0x16b)])!==null&&_0x5d60e9!==void 0x0?_0x5d60e9:0x1388)+_0x426b81(0x189)}),this[_0x426b81(0x12c)]=_0x2b84ad,this['client'][_0x426b81(0x12b)][_0x426b81(0x12d)][_0x426b81(0x18c)](_0x28054b=>_0x28054b,async _0x505ffe=>{const _0x2a2df4=_0x29a08a,_0x90e506=_0x426b81;var _0x1840f2;if(axios_1[_0x90e506(0x13c)][_0x90e506(0x130)](_0x505ffe)&&_0x505ffe[_0x2a2df4(0x203)]===_0x90e506(0x186))throw new Error(_0x505ffe[_0x90e506(0x19d)]||_0x90e506(0x149));const _0x3b18a9=_0x505ffe[_0x90e506(0x12c)];if(((_0x1840f2=_0x505ffe===null||_0x505ffe===void 0x0?void 0x0:_0x505ffe[_0x90e506(0x12d)])===null||_0x1840f2===void 0x0?void 0x0:_0x1840f2[_0x90e506(0x15a)])===HTTP_STATUS[_0x2a2df4(0x20d)]&&!(_0x3b18a9===null||_0x3b18a9===void 0x0?void 0x0:_0x3b18a9[_0x90e506(0x159)])){if(!this[_0x2a2df4(0x209)])throw new Error(_0x2a2df4(0x20f));_0x3b18a9[_0x90e506(0x159)]=!![];try{return!tokenRefreshPromise&&(tokenRefreshPromise=this[_0x90e506(0x198)]()[_0x90e506(0x170)](()=>{tokenRefreshPromise=null;})),await tokenRefreshPromise,_0x3b18a9[_0x90e506(0x19c)][_0x90e506(0x133)]=_0x2a2df4(0x200)+this[_0x90e506(0x127)][_0x90e506(0x17f)],this[_0x90e506(0x183)](_0x3b18a9);}catch(_0x30fb19){console[_0x2a2df4(0x238)](_0x90e506(0x12e),_0x30fb19);throw _0x30fb19;}}if(axios_1[_0x90e506(0x13c)][_0x2a2df4(0x233)](_0x505ffe)&&_0x505ffe[_0x90e506(0x12d)])this[_0x90e506(0x14c)](_0x505ffe[_0x90e506(0x12d)]);else throw new Error(_0x2a2df4(0x234));throw _0x505ffe;}),this[_0x29a08a(0x21b)][_0x426b81(0x12b)][_0x426b81(0x17e)][_0x426b81(0x18c)](async _0x1215fe=>{const _0x57e18a=_0x29a08a,_0xea5159=_0x426b81;return this['oauth2Token']&&(_0x1215fe[_0xea5159(0x19c)][_0xea5159(0x133)]=_0x57e18a(0x200)+this[_0xea5159(0x127)][_0xea5159(0x17f)]),_0x1215fe;});}async[a4_0x36e8c4(0x181)](){const _0x50d99c=a4_0x1c14ce,_0xd6602b=a4_0x36e8c4,_0x4e3fe4=await axios_1[_0xd6602b(0x13c)][_0xd6602b(0x148)](OAUTH_CONSUMER_URL);this[_0x50d99c(0x229)]={'key':_0x4e3fe4[_0xd6602b(0x185)][_0xd6602b(0x165)],'secret':_0x4e3fe4[_0xd6602b(0x185)]['consumer_secret']};}async[a4_0x36e8c4(0x150)](){const _0x3cb230=a4_0x1c14ce,_0xf54f26=a4_0x36e8c4;this[_0x3cb230(0x209)]&&(this['oauth2Token'][_0x3cb230(0x20a)]<luxon_1[_0x3cb230(0x1f5)][_0xf54f26(0x154)]()[_0xf54f26(0x184)]()&&(console[_0x3cb230(0x238)](_0xf54f26(0x195)),await this[_0xf54f26(0x198)]()));}async[a4_0x36e8c4(0x148)](_0x4ecf37,_0x555737){const _0x3e543a=a4_0x36e8c4,_0x11ea12=await this[_0x3e543a(0x183)][_0x3e543a(0x148)](_0x4ecf37,_0x555737);return _0x11ea12===null||_0x11ea12===void 0x0?void 0x0:_0x11ea12[_0x3e543a(0x185)];}async[a4_0x36e8c4(0x135)](_0x37f403,_0x58e5ac,_0x2a051b){const _0x4ab3ae=a4_0x36e8c4,_0xa29ab1=await this[_0x4ab3ae(0x183)][_0x4ab3ae(0x135)](_0x37f403,_0x58e5ac,_0x2a051b);return _0xa29ab1===null||_0xa29ab1===void 0x0?void 0x0:_0xa29ab1[_0x4ab3ae(0x185)];}async[a4_0x36e8c4(0x18f)](_0x4054e4,_0x2ddb7c,_0x3642ed){const _0x31e361=a4_0x36e8c4,_0x1cd480=await this[_0x31e361(0x183)][_0x31e361(0x18f)](_0x4054e4,_0x2ddb7c,_0x3642ed);return _0x1cd480===null||_0x1cd480===void 0x0?void 0x0:_0x1cd480[_0x31e361(0x185)];}async[a4_0x36e8c4(0x190)](_0x74825e,_0x30ec1b){const _0x16acf2=a4_0x36e8c4,_0x1f4b34=await this[_0x16acf2(0x183)][_0x16acf2(0x135)](_0x74825e,null,{..._0x30ec1b,'headers':{..._0x30ec1b===null||_0x30ec1b===void 0x0?void 0x0:_0x30ec1b[_0x16acf2(0x19c)],'X-Http-Method-Override':_0x16acf2(0x155)}});return _0x1f4b34===null||_0x1f4b34===void 0x0?void 0x0:_0x1f4b34[_0x16acf2(0x185)];}[a4_0x36e8c4(0x132)](_0x5e9274){const _0x36240b=a4_0x36e8c4;lodash_1[_0x36240b(0x13c)][_0x36240b(0x178)](_0x5e9274,(_0x17e659,_0x2686b7)=>{const _0x597d40=_0x36240b;this[_0x597d40(0x183)][_0x597d40(0x16f)][_0x597d40(0x19c)][_0x597d40(0x167)][_0x2686b7]=_0x17e659;});}[a4_0x1c14ce(0x231)](_0x6941ca){const _0x432a37=a4_0x1c14ce;this[_0x432a37(0x223)](_0x6941ca);}['handleHttpError'](_0x252e3d){const _0x345215=a4_0x36e8c4,{status:_0x2286e3,statusText:_0x1ecd0b,data:_0x4ac101}=_0x252e3d,_0x2685a0={'status':_0x2286e3,'statusText':_0x1ecd0b,'data':typeof _0x4ac101===_0x345215(0x142)?JSON[_0x345215(0x134)](_0x4ac101):_0x4ac101};console[_0x345215(0x158)](_0x345215(0x140),_0x2685a0);throw new Error(_0x345215(0x14f)+_0x2286e3+_0x345215(0x12f)+_0x1ecd0b);}async[a4_0x36e8c4(0x182)](_0x434bd5,_0x5f502d,_0x549fe5){const _0x3abd38=a4_0x36e8c4;await this[_0x3abd38(0x181)]();const _0x157b31=await this[_0x3abd38(0x126)](_0x434bd5,_0x5f502d),_0x4f9fda=await this[_0x3abd38(0x14a)](_0x157b31);return await this[_0x3abd38(0x137)](_0x4f9fda),this;}async[a4_0x36e8c4(0x126)](_0x335e4d,_0x40a1b5){const _0x2188d4=a4_0x1c14ce,_0x5b2756=a4_0x36e8c4,_0x19771a={'clientId':'GarminConnect','locale':'en','service':this[_0x5b2756(0x146)][_0x2188d4(0x23d)]},_0x41ad46=this[_0x5b2756(0x146)][_0x5b2756(0x153)]+'?'+qs_1['default'][_0x5b2756(0x134)](_0x19771a);await this[_0x5b2756(0x183)][_0x5b2756(0x148)](_0x41ad46);const _0x1ebffe={'id':_0x5b2756(0x161),'embedWidget':!![],'locale':'en','gauthHost':this[_0x5b2756(0x146)][_0x5b2756(0x153)]},_0x6d09f6=this[_0x5b2756(0x146)][_0x5b2756(0x194)]+'?'+qs_1[_0x5b2756(0x13c)][_0x2188d4(0x249)](_0x1ebffe),_0x4053a4=await this[_0x5b2756(0x148)](_0x6d09f6),_0x3ee383=CSRF_RE[_0x5b2756(0x13a)](_0x4053a4);if(!_0x3ee383)throw new Error('login\x20-\x20csrf\x20not\x20found');const _0x5d0ecb=_0x3ee383[0x1],_0x4e2bdf={'id':_0x5b2756(0x161),'embedWidget':!![],'clientId':_0x5b2756(0x13f),'locale':'en','gauthHost':this[_0x5b2756(0x146)]['GARMIN_SSO_EMBED'],'service':this[_0x5b2756(0x146)][_0x5b2756(0x153)],'source':this[_0x5b2756(0x146)][_0x5b2756(0x153)],'redirectAfterAccountLoginUrl':this[_0x5b2756(0x146)][_0x2188d4(0x21a)],'redirectAfterAccountCreationUrl':this[_0x5b2756(0x146)][_0x5b2756(0x153)]},_0x403fa9=this[_0x5b2756(0x146)]['SIGNIN_URL']+'?'+qs_1[_0x5b2756(0x13c)][_0x2188d4(0x249)](_0x4e2bdf),_0x9014ff=new form_data_1[(_0x5b2756(0x13c))]();_0x9014ff[_0x5b2756(0x188)](_0x5b2756(0x18e),_0x335e4d),_0x9014ff[_0x5b2756(0x188)](_0x5b2756(0x179),_0x40a1b5),_0x9014ff[_0x5b2756(0x188)](_0x5b2756(0x123),_0x5b2756(0x191)),_0x9014ff[_0x5b2756(0x188)](_0x5b2756(0x175),_0x5d0ecb);const _0x533aac=await this[_0x5b2756(0x135)](_0x403fa9,_0x9014ff,{'headers':{'Content-Type':_0x5b2756(0x192),'Dnt':0x1,'Origin':this[_0x5b2756(0x146)][_0x5b2756(0x157)],'Referer':this[_0x5b2756(0x146)][_0x5b2756(0x194)],'User-Agent':USER_AGENT_BROWSER}});console[_0x5b2756(0x18a)](_0x5b2756(0x160),_0x533aac),this[_0x5b2756(0x14b)](_0x533aac),this[_0x5b2756(0x15e)](_0x533aac),this[_0x5b2756(0x152)](_0x533aac);const _0x40f36d=TICKET_RE[_0x5b2756(0x13a)](_0x533aac);if(!_0x40f36d)throw new Error(_0x5b2756(0x17c));const _0x534391=_0x40f36d[0x1];return _0x534391;}[a4_0x36e8c4(0x152)](_0x169f6a){}['handlePageTitle'](_0x51196f){const _0x4bf8a8=a4_0x36e8c4,_0x4c031d=PAGE_TITLE_RE[_0x4bf8a8(0x13a)](_0x51196f);if(_0x4c031d){const _0x3fd409=_0x4c031d[0x1];console[_0x4bf8a8(0x18a)](_0x4bf8a8(0x151),_0x3fd409);if(lodash_1[_0x4bf8a8(0x13c)][_0x4bf8a8(0x143)](_0x3fd409,_0x4bf8a8(0x173)))throw new Error('login\x20failed\x20(Update\x20Phone\x20number),\x20please\x20update\x20your\x20phone\x20number,\x20See:\x20\x20https://github.com/matin/garth/issues/19');}}['handleAccountLocked'](_0x5b0a98){const _0x2c0805=a4_0x1c14ce,_0x2203eb=a4_0x36e8c4,_0x2c8e5c=ACCOUNT_LOCKED_RE[_0x2c0805(0x258)](_0x5b0a98);if(_0x2c8e5c){const _0xcd39b8=_0x2c8e5c[0x1];console[_0x2203eb(0x158)](_0xcd39b8);throw new Error('login\x20failed\x20(AccountLocked),\x20please\x20open\x20connect\x20web\x20page\x20to\x20unlock\x20your\x20account');}}async[a4_0x36e8c4(0x198)](){const _0x785d6e=a4_0x1c14ce,_0x4042a8=a4_0x36e8c4;try{!this[_0x4042a8(0x176)]&&await this[_0x4042a8(0x181)]();if(!this[_0x785d6e(0x209)]||!this[_0x4042a8(0x17d)])throw new Error(_0x4042a8(0x13b));const _0x230cfc={'oauth':this[_0x4042a8(0x16e)](this[_0x4042a8(0x176)]),'token':this[_0x785d6e(0x24a)]};await this[_0x785d6e(0x1ee)](_0x230cfc),console['log']('「'+this[_0x4042a8(0x12c)][_0x4042a8(0x18e)]+_0x4042a8(0x19b)+this[_0x4042a8(0x146)][_0x4042a8(0x139)]+_0x4042a8(0x187));}catch(_0x1b5fdd){console[_0x4042a8(0x158)](_0x4042a8(0x141),_0x1b5fdd);throw _0x1b5fdd;}}async[a4_0x36e8c4(0x14a)](_0x17a0ec){const _0x3076ca=a4_0x1c14ce,_0x595f47=a4_0x36e8c4;if(!this[_0x595f47(0x176)])throw new Error(_0x3076ca(0x239));const _0x44a782={'ticket':_0x17a0ec,'login-url':this[_0x3076ca(0x225)][_0x595f47(0x153)],'accepts-mfa-tokens':!![]},_0x44f32e=this[_0x595f47(0x146)][_0x595f47(0x144)]+_0x3076ca(0x1fa)+qs_1['default'][_0x595f47(0x134)](_0x44a782),_0x15b1be=this[_0x595f47(0x16e)](this[_0x595f47(0x176)]),_0x345b21={'url':_0x44f32e,'method':_0x595f47(0x172)},_0x5c4f83=_0x15b1be[_0x595f47(0x166)](_0x15b1be[_0x595f47(0x129)](_0x345b21)),_0x388331=await this['get'](_0x44f32e,{'headers':{..._0x5c4f83,'User-Agent':USER_AGENT_CONNECTMOBILE}}),_0x3740cf=qs_1[_0x595f47(0x13c)][_0x595f47(0x16d)](_0x388331);return this[_0x595f47(0x17d)]=_0x3740cf,{'token':_0x3740cf,'oauth':_0x15b1be};}[a4_0x36e8c4(0x16e)](_0x102a1a){const _0x23215e=a4_0x36e8c4,_0x20e096=new oauth_1_0a_1[(_0x23215e(0x13c))]({'consumer':_0x102a1a,'signature_method':_0x23215e(0x138),'hash_function'(_0x794730,_0x404c5a){const _0x110008=a4_0x5a43,_0x30bcb2=_0x23215e;return node_crypto_1[_0x30bcb2(0x13c)][_0x30bcb2(0x16c)](_0x30bcb2(0x13d),_0x404c5a)[_0x110008(0x1ed)](_0x794730)[_0x30bcb2(0x156)](_0x30bcb2(0x131));}});return _0x20e096;}async[a4_0x36e8c4(0x137)](_0x12673b){const _0x1aa1b9=a4_0x1c14ce,_0x41ab0b=a4_0x36e8c4,_0x3f8037={'key':_0x12673b[_0x41ab0b(0x12a)][_0x1aa1b9(0x1f0)],'secret':_0x12673b[_0x1aa1b9(0x1f7)][_0x41ab0b(0x15d)]},_0x13087b=this[_0x41ab0b(0x146)][_0x41ab0b(0x144)]+_0x41ab0b(0x18d),_0x132051={'url':_0x13087b,'method':_0x1aa1b9(0x261),'data':null},_0xe43300=_0x12673b[_0x41ab0b(0x19a)][_0x1aa1b9(0x24d)](_0x132051,_0x3f8037),_0x4d4796=_0x13087b+'?'+qs_1['default'][_0x41ab0b(0x134)](_0xe43300);this[_0x41ab0b(0x127)]=undefined;const _0x4ee9cf=await this[_0x41ab0b(0x135)](_0x4d4796,null,{'headers':{'User-Agent':USER_AGENT_CONNECTMOBILE,'Content-Type':_0x1aa1b9(0x1e8)}});this[_0x41ab0b(0x127)]=this[_0x41ab0b(0x174)](_0x4ee9cf);}[a4_0x36e8c4(0x174)](_0x2cb7d0){const _0x5387a1=a4_0x1c14ce,_0x1c64c8=a4_0x36e8c4,_0x147647=luxon_1[_0x1c64c8(0x15c)][_0x1c64c8(0x154)](),_0x55b562=_0x147647['plus']({'seconds':_0x2cb7d0[_0x1c64c8(0x19e)]}),_0x5793e5=_0x147647['plus']({'seconds':_0x2cb7d0[_0x1c64c8(0x14d)]});return{..._0x2cb7d0,'last_update_date':_0x147647[_0x5387a1(0x25a)]()['toString'](),'expires_date':_0x55b562['toLocal']()[_0x1c64c8(0x199)](),'expires_at':_0x55b562[_0x1c64c8(0x184)](),'refresh_token_expires_at':_0x5793e5['toSeconds']()};}}exports[a4_0x36e8c4(0x122)]=HttpClient;function a4_0x1b3d(){const _0x59da8a=['var\x20statuss*=s*\x22([^\x22]*)\x22','luxon','3854664sLIQGP','handleError','login\x20failed\x20(Ticket\x20not\x20found\x20or\x20MFA),\x20please\x20check\x20username\x20and\x20password','isAxiosError','Network\x20error\x20or\x20unknown\x20error\x20occurred','7iKzdNG','SIGNIN_URL','expires_in','error','No\x20OAUTH_CONSUMER','embed','138bUuDxC','config','GC_MODERN','consumer_key','3360104vXbGVO','342172xHnIaX','Failed\x20to\x20refresh\x20OAuth2\x20token:','setOauth2TokenExpiresAt','159qLAcGY','interceptors','_retry','common','refreshOauth2Token','name=\x22_csrf\x22\x5cs+value=\x22(.+?)\x22','stringify','oauth1Token','shift','200sTuPcC','authorize','digest','Mozilla/5.0\x20(Windows\x20NT\x2010.0;\x20Win64;\x20x64)\x20AppleWebKit/537.36\x20(KHTML,\x20like\x20Gecko)\x20Chrome/117.0.0.0\x20Safari/537.36','788900rUKDOK','HTTP\x20Error\x20(','axios','toSeconds','Token\x20expired!','sha1','」in「','com.garmin.android.apps.connectmobile','exec','):\x20','toLocal','3jUcfSr','Mozilla/5.0\x20(Macintosh;\x20Intel\x20Mac\x20OS\x20X\x2010_15_7)\x20AppleWebKit/537.36\x20(KHTML,\x20like\x20Gecko)\x20Chrome/131.0.0.0\x20Safari/537.36','object','parse','push','_csrf','POST','282608AnMcqa','\x20ms','checkTokenVaild','setCommonHeader','application/x-www-form-urlencoded','HTTP\x20Error:','GarminConnect','oauth','password','update','exchange','login\x20page\x20title:','oauth_token','141725McSzxB','request','now','delete','DateTime','https://thegarth.s3.amazonaws.com/oauth_consumer.json','token','toHeader','headers','/preauthorized?','lodash','199577TwHjhg','Token\x20refresh\x20failed:','Request\x20Timeout:\x20>\x20','includes','Bearer\x20','gauth-widget','147290HKUtVu','code','use','243VWzVuz','post','step3Result:','OAUTH_URL','oauth2Token','expires_at','form-data','9578JwOOqO','UNAUTHORIZED','48010JSzMOv','No\x20OAuth2\x20token\x20available','create','response','HttpClient','getOauthClient','createHmac','getOauth1Token','HMAC-SHA1','getLoginTicket','Authorization','ECONNABORTED','GARMIN_SSO_EMBED','client','<title>([^<]*)</title>','Update\x20Phone\x20Number','GET','oauth-1.0a','append','toString','status','handleHttpError','356120zMBIEK','url','defineProperty','__importDefault','Request\x20Timeout','OAUTH_CONSUMER','base64','domain','2317340qbLNBt','finally'];a4_0x1b3d=function(){return _0x59da8a;};return a4_0x1b3d();}