bullmq 5.49.0 → 5.49.2

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 (64) hide show
  1. package/dist/cjs/classes/flow-producer.js +1 -0
  2. package/dist/cjs/classes/flow-producer.js.map +1 -1
  3. package/dist/cjs/classes/job.js +3 -0
  4. package/dist/cjs/classes/job.js.map +1 -1
  5. package/dist/cjs/classes/worker.js +4 -0
  6. package/dist/cjs/classes/worker.js.map +1 -1
  7. package/dist/cjs/commands/includes/moveChildFromDependenciesIfNeeded.lua +15 -31
  8. package/dist/cjs/commands/includes/moveParentToWait.lua +32 -33
  9. package/dist/cjs/commands/includes/moveParentToWaitIfNeeded.lua +8 -4
  10. package/dist/cjs/commands/includes/moveParentToWaitIfNoPendingDependencies.lua +13 -0
  11. package/dist/cjs/commands/includes/updateParentDepsIfNeeded.lua +2 -2
  12. package/dist/cjs/commands/moveStalledJobsToWait-9.lua +0 -2
  13. package/dist/cjs/commands/moveToFinished-14.lua +5 -3
  14. package/dist/cjs/commands/moveToWaitingChildren-8.lua +0 -2
  15. package/dist/cjs/scripts/addDelayedJob-6.js +51 -37
  16. package/dist/cjs/scripts/addDelayedJob-6.js.map +1 -1
  17. package/dist/cjs/scripts/addParentJob-4.js +51 -37
  18. package/dist/cjs/scripts/addParentJob-4.js.map +1 -1
  19. package/dist/cjs/scripts/addPrioritizedJob-8.js +51 -37
  20. package/dist/cjs/scripts/addPrioritizedJob-8.js.map +1 -1
  21. package/dist/cjs/scripts/addStandardJob-8.js +51 -37
  22. package/dist/cjs/scripts/addStandardJob-8.js.map +1 -1
  23. package/dist/cjs/scripts/moveStalledJobsToWait-9.js +64 -61
  24. package/dist/cjs/scripts/moveStalledJobsToWait-9.js.map +1 -1
  25. package/dist/cjs/scripts/moveToFinished-14.js +69 -63
  26. package/dist/cjs/scripts/moveToFinished-14.js.map +1 -1
  27. package/dist/cjs/scripts/moveToWaitingChildren-8.js +64 -61
  28. package/dist/cjs/scripts/moveToWaitingChildren-8.js.map +1 -1
  29. package/dist/cjs/tsconfig-cjs.tsbuildinfo +1 -1
  30. package/dist/cjs/version.js +1 -1
  31. package/dist/esm/classes/flow-producer.js +1 -0
  32. package/dist/esm/classes/flow-producer.js.map +1 -1
  33. package/dist/esm/classes/job.d.ts +5 -0
  34. package/dist/esm/classes/job.js +3 -0
  35. package/dist/esm/classes/job.js.map +1 -1
  36. package/dist/esm/classes/worker.js +5 -1
  37. package/dist/esm/classes/worker.js.map +1 -1
  38. package/dist/esm/commands/includes/moveChildFromDependenciesIfNeeded.lua +15 -31
  39. package/dist/esm/commands/includes/moveParentToWait.lua +32 -33
  40. package/dist/esm/commands/includes/moveParentToWaitIfNeeded.lua +8 -4
  41. package/dist/esm/commands/includes/moveParentToWaitIfNoPendingDependencies.lua +13 -0
  42. package/dist/esm/commands/includes/updateParentDepsIfNeeded.lua +2 -2
  43. package/dist/esm/commands/moveStalledJobsToWait-9.lua +0 -2
  44. package/dist/esm/commands/moveToFinished-14.lua +5 -3
  45. package/dist/esm/commands/moveToWaitingChildren-8.lua +0 -2
  46. package/dist/esm/interfaces/job-json.d.ts +1 -0
  47. package/dist/esm/scripts/addDelayedJob-6.js +51 -37
  48. package/dist/esm/scripts/addDelayedJob-6.js.map +1 -1
  49. package/dist/esm/scripts/addParentJob-4.js +51 -37
  50. package/dist/esm/scripts/addParentJob-4.js.map +1 -1
  51. package/dist/esm/scripts/addPrioritizedJob-8.js +51 -37
  52. package/dist/esm/scripts/addPrioritizedJob-8.js.map +1 -1
  53. package/dist/esm/scripts/addStandardJob-8.js +51 -37
  54. package/dist/esm/scripts/addStandardJob-8.js.map +1 -1
  55. package/dist/esm/scripts/moveStalledJobsToWait-9.js +64 -61
  56. package/dist/esm/scripts/moveStalledJobsToWait-9.js.map +1 -1
  57. package/dist/esm/scripts/moveToFinished-14.js +69 -63
  58. package/dist/esm/scripts/moveToFinished-14.js.map +1 -1
  59. package/dist/esm/scripts/moveToWaitingChildren-8.js +64 -61
  60. package/dist/esm/scripts/moveToWaitingChildren-8.js.map +1 -1
  61. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  62. package/dist/esm/version.d.ts +1 -1
  63. package/dist/esm/version.js +1 -1
  64. package/package.json +1 -1
@@ -90,12 +90,19 @@ end
90
90
  Validate and move or add dependencies to parent.
91
91
  ]]
92
92
  -- Includes
93
+ --[[
94
+ Validate and move parent to a wait status (waiting, delayed or prioritized)
95
+ if no pending dependencies.
96
+ ]]
97
+ -- Includes
93
98
  --[[
94
99
  Validate and move parent to a wait status (waiting, delayed or prioritized) if needed.
95
100
  ]]
101
+ -- Includes
96
102
  --[[
97
- Validate and move parent to a wait status (wait, prioritized or delayed)
103
+ Move parent to a wait status (wait, prioritized or delayed)
98
104
  ]]
105
+ -- Includes
99
106
  --[[
100
107
  Add delay marker if needed.
101
108
  ]]
@@ -190,52 +197,59 @@ local function getTargetQueueList(queueMetaKey, activeKey, waitKey, pausedKey)
190
197
  return waitKey, false
191
198
  end
192
199
  local function moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
193
- local isParentWaitingChildren = rcall("ZREM", parentQueueKey .. ":waiting-children", parentId)
194
- if isParentWaitingChildren > 0 then
195
- local parentWaitKey = parentQueueKey .. ":wait"
196
- local parentPausedKey = parentQueueKey .. ":paused"
197
- local parentActiveKey = parentQueueKey .. ":active"
198
- local parentMetaKey = parentQueueKey .. ":meta"
199
- local parentMarkerKey = parentQueueKey .. ":marker"
200
- local jobAttributes = rcall("HMGET", parentKey, "priority", "delay")
201
- local priority = tonumber(jobAttributes[1]) or 0
202
- local delay = tonumber(jobAttributes[2]) or 0
203
- -- ignore dependencies if any left
204
- rcall("HSET", parentKey, "igdp", 1)
205
- if delay > 0 then
206
- local delayedTimestamp = tonumber(timestamp) + delay
207
- local score = delayedTimestamp * 0x1000
208
- local parentDelayedKey = parentQueueKey .. ":delayed"
209
- rcall("ZADD", parentDelayedKey, score, parentId)
210
- rcall("XADD", parentQueueKey .. ":events", "*", "event", "delayed", "jobId", parentId, "delay",
211
- delayedTimestamp)
212
- addDelayMarkerIfNeeded(parentMarkerKey, parentDelayedKey)
200
+ local parentWaitKey = parentQueueKey .. ":wait"
201
+ local parentPausedKey = parentQueueKey .. ":paused"
202
+ local parentActiveKey = parentQueueKey .. ":active"
203
+ local parentMetaKey = parentQueueKey .. ":meta"
204
+ local parentMarkerKey = parentQueueKey .. ":marker"
205
+ local jobAttributes = rcall("HMGET", parentKey, "priority", "delay")
206
+ local priority = tonumber(jobAttributes[1]) or 0
207
+ local delay = tonumber(jobAttributes[2]) or 0
208
+ -- ignore dependencies if any left
209
+ rcall("HSET", parentKey, "igdp", 1)
210
+ if delay > 0 then
211
+ local delayedTimestamp = tonumber(timestamp) + delay
212
+ local score = delayedTimestamp * 0x1000
213
+ local parentDelayedKey = parentQueueKey .. ":delayed"
214
+ rcall("ZADD", parentDelayedKey, score, parentId)
215
+ rcall("XADD", parentQueueKey .. ":events", "*", "event", "delayed", "jobId", parentId, "delay",
216
+ delayedTimestamp)
217
+ addDelayMarkerIfNeeded(parentMarkerKey, parentDelayedKey)
218
+ else
219
+ if priority == 0 then
220
+ local parentTarget, isParentPausedOrMaxed = getTargetQueueList(parentMetaKey, parentActiveKey,
221
+ parentWaitKey, parentPausedKey)
222
+ addJobInTargetList(parentTarget, parentMarkerKey, "RPUSH", isParentPausedOrMaxed, parentId)
213
223
  else
214
- if priority == 0 then
215
- local parentTarget, isParentPausedOrMaxed = getTargetQueueList(parentMetaKey, parentActiveKey,
216
- parentWaitKey, parentPausedKey)
217
- addJobInTargetList(parentTarget, parentMarkerKey, "RPUSH", isParentPausedOrMaxed, parentId)
218
- else
219
- local isPausedOrMaxed = isQueuePausedOrMaxed(parentMetaKey, parentActiveKey)
220
- addJobWithPriority(parentMarkerKey, parentQueueKey .. ":prioritized", priority, parentId,
221
- parentQueueKey .. ":pc", isPausedOrMaxed)
222
- end
223
- rcall("XADD", parentQueueKey .. ":events", "*", "event", "waiting", "jobId", parentId, "prev",
224
- "waiting-children")
224
+ local isPausedOrMaxed = isQueuePausedOrMaxed(parentMetaKey, parentActiveKey)
225
+ addJobWithPriority(parentMarkerKey, parentQueueKey .. ":prioritized", priority, parentId,
226
+ parentQueueKey .. ":pc", isPausedOrMaxed)
225
227
  end
228
+ rcall("XADD", parentQueueKey .. ":events", "*", "event", "waiting", "jobId", parentId, "prev",
229
+ "waiting-children")
226
230
  end
227
231
  end
228
- local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
229
- local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
230
- if doNotHavePendingDependencies then
231
- moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
232
+ local function moveParentToWaitIfNeeded(parentQueueKey, parentKey, parentId, timestamp)
233
+ if rcall("EXISTS", parentKey) == 1 then
234
+ local parentWaitingChildrenKey = parentQueueKey .. ":waiting-children"
235
+ if rcall("ZSCORE", parentWaitingChildrenKey, parentId) then
236
+ rcall("ZREM", parentWaitingChildrenKey, parentId)
237
+ moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
232
238
  end
239
+ end
240
+ end
241
+ local function moveParentToWaitIfNoPendingDependencies(parentQueueKey, parentDependenciesKey, parentKey,
242
+ parentId, timestamp)
243
+ local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
244
+ if doNotHavePendingDependencies then
245
+ moveParentToWaitIfNeeded(parentQueueKey, parentKey, parentId, timestamp)
246
+ end
233
247
  end
234
248
  local function updateParentDepsIfNeeded(parentKey, parentQueueKey, parentDependenciesKey,
235
249
  parentId, jobIdKey, returnvalue, timestamp )
236
250
  local processedSet = parentKey .. ":processed"
237
251
  rcall("HSET", processedSet, jobIdKey, returnvalue)
238
- moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
252
+ moveParentToWaitIfNoPendingDependencies(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
239
253
  end
240
254
  local function updateExistingJobsParent(parentKey, parent, parentData,
241
255
  parentDependenciesKey, completedKey,
@@ -1 +1 @@
1
- {"version":3,"file":"addParentJob-4.js","sourceRoot":"","sources":["../../../src/scripts/addParentJob-4.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoVf,CAAC;AACF,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,cAAc;IACpB,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
1
+ {"version":3,"file":"addParentJob-4.js","sourceRoot":"","sources":["../../../src/scripts/addParentJob-4.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkWf,CAAC;AACF,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,cAAc;IACpB,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
@@ -152,12 +152,19 @@ end
152
152
  Validate and move or add dependencies to parent.
153
153
  ]]
154
154
  -- Includes
155
+ --[[
156
+ Validate and move parent to a wait status (waiting, delayed or prioritized)
157
+ if no pending dependencies.
158
+ ]]
159
+ -- Includes
155
160
  --[[
156
161
  Validate and move parent to a wait status (waiting, delayed or prioritized) if needed.
157
162
  ]]
163
+ -- Includes
158
164
  --[[
159
- Validate and move parent to a wait status (wait, prioritized or delayed)
165
+ Move parent to a wait status (wait, prioritized or delayed)
160
166
  ]]
167
+ -- Includes
161
168
  --[[
162
169
  Add delay marker if needed.
163
170
  ]]
@@ -227,52 +234,59 @@ local function getTargetQueueList(queueMetaKey, activeKey, waitKey, pausedKey)
227
234
  return waitKey, false
228
235
  end
229
236
  local function moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
230
- local isParentWaitingChildren = rcall("ZREM", parentQueueKey .. ":waiting-children", parentId)
231
- if isParentWaitingChildren > 0 then
232
- local parentWaitKey = parentQueueKey .. ":wait"
233
- local parentPausedKey = parentQueueKey .. ":paused"
234
- local parentActiveKey = parentQueueKey .. ":active"
235
- local parentMetaKey = parentQueueKey .. ":meta"
236
- local parentMarkerKey = parentQueueKey .. ":marker"
237
- local jobAttributes = rcall("HMGET", parentKey, "priority", "delay")
238
- local priority = tonumber(jobAttributes[1]) or 0
239
- local delay = tonumber(jobAttributes[2]) or 0
240
- -- ignore dependencies if any left
241
- rcall("HSET", parentKey, "igdp", 1)
242
- if delay > 0 then
243
- local delayedTimestamp = tonumber(timestamp) + delay
244
- local score = delayedTimestamp * 0x1000
245
- local parentDelayedKey = parentQueueKey .. ":delayed"
246
- rcall("ZADD", parentDelayedKey, score, parentId)
247
- rcall("XADD", parentQueueKey .. ":events", "*", "event", "delayed", "jobId", parentId, "delay",
248
- delayedTimestamp)
249
- addDelayMarkerIfNeeded(parentMarkerKey, parentDelayedKey)
237
+ local parentWaitKey = parentQueueKey .. ":wait"
238
+ local parentPausedKey = parentQueueKey .. ":paused"
239
+ local parentActiveKey = parentQueueKey .. ":active"
240
+ local parentMetaKey = parentQueueKey .. ":meta"
241
+ local parentMarkerKey = parentQueueKey .. ":marker"
242
+ local jobAttributes = rcall("HMGET", parentKey, "priority", "delay")
243
+ local priority = tonumber(jobAttributes[1]) or 0
244
+ local delay = tonumber(jobAttributes[2]) or 0
245
+ -- ignore dependencies if any left
246
+ rcall("HSET", parentKey, "igdp", 1)
247
+ if delay > 0 then
248
+ local delayedTimestamp = tonumber(timestamp) + delay
249
+ local score = delayedTimestamp * 0x1000
250
+ local parentDelayedKey = parentQueueKey .. ":delayed"
251
+ rcall("ZADD", parentDelayedKey, score, parentId)
252
+ rcall("XADD", parentQueueKey .. ":events", "*", "event", "delayed", "jobId", parentId, "delay",
253
+ delayedTimestamp)
254
+ addDelayMarkerIfNeeded(parentMarkerKey, parentDelayedKey)
255
+ else
256
+ if priority == 0 then
257
+ local parentTarget, isParentPausedOrMaxed = getTargetQueueList(parentMetaKey, parentActiveKey,
258
+ parentWaitKey, parentPausedKey)
259
+ addJobInTargetList(parentTarget, parentMarkerKey, "RPUSH", isParentPausedOrMaxed, parentId)
250
260
  else
251
- if priority == 0 then
252
- local parentTarget, isParentPausedOrMaxed = getTargetQueueList(parentMetaKey, parentActiveKey,
253
- parentWaitKey, parentPausedKey)
254
- addJobInTargetList(parentTarget, parentMarkerKey, "RPUSH", isParentPausedOrMaxed, parentId)
255
- else
256
- local isPausedOrMaxed = isQueuePausedOrMaxed(parentMetaKey, parentActiveKey)
257
- addJobWithPriority(parentMarkerKey, parentQueueKey .. ":prioritized", priority, parentId,
258
- parentQueueKey .. ":pc", isPausedOrMaxed)
259
- end
260
- rcall("XADD", parentQueueKey .. ":events", "*", "event", "waiting", "jobId", parentId, "prev",
261
- "waiting-children")
261
+ local isPausedOrMaxed = isQueuePausedOrMaxed(parentMetaKey, parentActiveKey)
262
+ addJobWithPriority(parentMarkerKey, parentQueueKey .. ":prioritized", priority, parentId,
263
+ parentQueueKey .. ":pc", isPausedOrMaxed)
262
264
  end
265
+ rcall("XADD", parentQueueKey .. ":events", "*", "event", "waiting", "jobId", parentId, "prev",
266
+ "waiting-children")
263
267
  end
264
268
  end
265
- local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
266
- local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
267
- if doNotHavePendingDependencies then
268
- moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
269
+ local function moveParentToWaitIfNeeded(parentQueueKey, parentKey, parentId, timestamp)
270
+ if rcall("EXISTS", parentKey) == 1 then
271
+ local parentWaitingChildrenKey = parentQueueKey .. ":waiting-children"
272
+ if rcall("ZSCORE", parentWaitingChildrenKey, parentId) then
273
+ rcall("ZREM", parentWaitingChildrenKey, parentId)
274
+ moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
269
275
  end
276
+ end
277
+ end
278
+ local function moveParentToWaitIfNoPendingDependencies(parentQueueKey, parentDependenciesKey, parentKey,
279
+ parentId, timestamp)
280
+ local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
281
+ if doNotHavePendingDependencies then
282
+ moveParentToWaitIfNeeded(parentQueueKey, parentKey, parentId, timestamp)
283
+ end
270
284
  end
271
285
  local function updateParentDepsIfNeeded(parentKey, parentQueueKey, parentDependenciesKey,
272
286
  parentId, jobIdKey, returnvalue, timestamp )
273
287
  local processedSet = parentKey .. ":processed"
274
288
  rcall("HSET", processedSet, jobIdKey, returnvalue)
275
- moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
289
+ moveParentToWaitIfNoPendingDependencies(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
276
290
  end
277
291
  local function updateExistingJobsParent(parentKey, parent, parentData,
278
292
  parentDependenciesKey, completedKey,
@@ -1 +1 @@
1
- {"version":3,"file":"addPrioritizedJob-8.js","sourceRoot":"","sources":["../../../src/scripts/addPrioritizedJob-8.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Vf,CAAC;AACF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,mBAAmB;IACzB,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
1
+ {"version":3,"file":"addPrioritizedJob-8.js","sourceRoot":"","sources":["../../../src/scripts/addPrioritizedJob-8.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4Wf,CAAC;AACF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,mBAAmB;IACzB,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
@@ -136,12 +136,19 @@ end
136
136
  Validate and move or add dependencies to parent.
137
137
  ]]
138
138
  -- Includes
139
+ --[[
140
+ Validate and move parent to a wait status (waiting, delayed or prioritized)
141
+ if no pending dependencies.
142
+ ]]
143
+ -- Includes
139
144
  --[[
140
145
  Validate and move parent to a wait status (waiting, delayed or prioritized) if needed.
141
146
  ]]
147
+ -- Includes
142
148
  --[[
143
- Validate and move parent to a wait status (wait, prioritized or delayed)
149
+ Move parent to a wait status (wait, prioritized or delayed)
144
150
  ]]
151
+ -- Includes
145
152
  --[[
146
153
  Add delay marker if needed.
147
154
  ]]
@@ -200,52 +207,59 @@ local function isQueuePausedOrMaxed(queueMetaKey, activeKey)
200
207
  return false
201
208
  end
202
209
  local function moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
203
- local isParentWaitingChildren = rcall("ZREM", parentQueueKey .. ":waiting-children", parentId)
204
- if isParentWaitingChildren > 0 then
205
- local parentWaitKey = parentQueueKey .. ":wait"
206
- local parentPausedKey = parentQueueKey .. ":paused"
207
- local parentActiveKey = parentQueueKey .. ":active"
208
- local parentMetaKey = parentQueueKey .. ":meta"
209
- local parentMarkerKey = parentQueueKey .. ":marker"
210
- local jobAttributes = rcall("HMGET", parentKey, "priority", "delay")
211
- local priority = tonumber(jobAttributes[1]) or 0
212
- local delay = tonumber(jobAttributes[2]) or 0
213
- -- ignore dependencies if any left
214
- rcall("HSET", parentKey, "igdp", 1)
215
- if delay > 0 then
216
- local delayedTimestamp = tonumber(timestamp) + delay
217
- local score = delayedTimestamp * 0x1000
218
- local parentDelayedKey = parentQueueKey .. ":delayed"
219
- rcall("ZADD", parentDelayedKey, score, parentId)
220
- rcall("XADD", parentQueueKey .. ":events", "*", "event", "delayed", "jobId", parentId, "delay",
221
- delayedTimestamp)
222
- addDelayMarkerIfNeeded(parentMarkerKey, parentDelayedKey)
210
+ local parentWaitKey = parentQueueKey .. ":wait"
211
+ local parentPausedKey = parentQueueKey .. ":paused"
212
+ local parentActiveKey = parentQueueKey .. ":active"
213
+ local parentMetaKey = parentQueueKey .. ":meta"
214
+ local parentMarkerKey = parentQueueKey .. ":marker"
215
+ local jobAttributes = rcall("HMGET", parentKey, "priority", "delay")
216
+ local priority = tonumber(jobAttributes[1]) or 0
217
+ local delay = tonumber(jobAttributes[2]) or 0
218
+ -- ignore dependencies if any left
219
+ rcall("HSET", parentKey, "igdp", 1)
220
+ if delay > 0 then
221
+ local delayedTimestamp = tonumber(timestamp) + delay
222
+ local score = delayedTimestamp * 0x1000
223
+ local parentDelayedKey = parentQueueKey .. ":delayed"
224
+ rcall("ZADD", parentDelayedKey, score, parentId)
225
+ rcall("XADD", parentQueueKey .. ":events", "*", "event", "delayed", "jobId", parentId, "delay",
226
+ delayedTimestamp)
227
+ addDelayMarkerIfNeeded(parentMarkerKey, parentDelayedKey)
228
+ else
229
+ if priority == 0 then
230
+ local parentTarget, isParentPausedOrMaxed = getTargetQueueList(parentMetaKey, parentActiveKey,
231
+ parentWaitKey, parentPausedKey)
232
+ addJobInTargetList(parentTarget, parentMarkerKey, "RPUSH", isParentPausedOrMaxed, parentId)
223
233
  else
224
- if priority == 0 then
225
- local parentTarget, isParentPausedOrMaxed = getTargetQueueList(parentMetaKey, parentActiveKey,
226
- parentWaitKey, parentPausedKey)
227
- addJobInTargetList(parentTarget, parentMarkerKey, "RPUSH", isParentPausedOrMaxed, parentId)
228
- else
229
- local isPausedOrMaxed = isQueuePausedOrMaxed(parentMetaKey, parentActiveKey)
230
- addJobWithPriority(parentMarkerKey, parentQueueKey .. ":prioritized", priority, parentId,
231
- parentQueueKey .. ":pc", isPausedOrMaxed)
232
- end
233
- rcall("XADD", parentQueueKey .. ":events", "*", "event", "waiting", "jobId", parentId, "prev",
234
- "waiting-children")
234
+ local isPausedOrMaxed = isQueuePausedOrMaxed(parentMetaKey, parentActiveKey)
235
+ addJobWithPriority(parentMarkerKey, parentQueueKey .. ":prioritized", priority, parentId,
236
+ parentQueueKey .. ":pc", isPausedOrMaxed)
235
237
  end
238
+ rcall("XADD", parentQueueKey .. ":events", "*", "event", "waiting", "jobId", parentId, "prev",
239
+ "waiting-children")
236
240
  end
237
241
  end
238
- local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
239
- local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
240
- if doNotHavePendingDependencies then
241
- moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
242
+ local function moveParentToWaitIfNeeded(parentQueueKey, parentKey, parentId, timestamp)
243
+ if rcall("EXISTS", parentKey) == 1 then
244
+ local parentWaitingChildrenKey = parentQueueKey .. ":waiting-children"
245
+ if rcall("ZSCORE", parentWaitingChildrenKey, parentId) then
246
+ rcall("ZREM", parentWaitingChildrenKey, parentId)
247
+ moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
242
248
  end
249
+ end
250
+ end
251
+ local function moveParentToWaitIfNoPendingDependencies(parentQueueKey, parentDependenciesKey, parentKey,
252
+ parentId, timestamp)
253
+ local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
254
+ if doNotHavePendingDependencies then
255
+ moveParentToWaitIfNeeded(parentQueueKey, parentKey, parentId, timestamp)
256
+ end
243
257
  end
244
258
  local function updateParentDepsIfNeeded(parentKey, parentQueueKey, parentDependenciesKey,
245
259
  parentId, jobIdKey, returnvalue, timestamp )
246
260
  local processedSet = parentKey .. ":processed"
247
261
  rcall("HSET", processedSet, jobIdKey, returnvalue)
248
- moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
262
+ moveParentToWaitIfNoPendingDependencies(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
249
263
  end
250
264
  local function updateExistingJobsParent(parentKey, parent, parentData,
251
265
  parentDependenciesKey, completedKey,
@@ -1 +1 @@
1
- {"version":3,"file":"addStandardJob-8.js","sourceRoot":"","sources":["../../../src/scripts/addStandardJob-8.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkWf,CAAC;AACF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,gBAAgB;IACtB,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
1
+ {"version":3,"file":"addStandardJob-8.js","sourceRoot":"","sources":["../../../src/scripts/addStandardJob-8.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgXf,CAAC;AACF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,gBAAgB;IACtB,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
@@ -75,12 +75,19 @@ end
75
75
  Function to recursively move from waitingChildren to failed.
76
76
  ]]
77
77
  -- Includes
78
+ --[[
79
+ Validate and move parent to a wait status (waiting, delayed or prioritized)
80
+ if no pending dependencies.
81
+ ]]
82
+ -- Includes
78
83
  --[[
79
84
  Validate and move parent to a wait status (waiting, delayed or prioritized) if needed.
80
85
  ]]
86
+ -- Includes
81
87
  --[[
82
- Validate and move parent to a wait status (wait, prioritized or delayed)
88
+ Move parent to a wait status (wait, prioritized or delayed)
83
89
  ]]
90
+ -- Includes
84
91
  --[[
85
92
  Add delay marker if needed.
86
93
  ]]
@@ -139,46 +146,53 @@ local function isQueuePausedOrMaxed(queueMetaKey, activeKey)
139
146
  return false
140
147
  end
141
148
  local function moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
142
- local isParentWaitingChildren = rcall("ZREM", parentQueueKey .. ":waiting-children", parentId)
143
- if isParentWaitingChildren > 0 then
144
- local parentWaitKey = parentQueueKey .. ":wait"
145
- local parentPausedKey = parentQueueKey .. ":paused"
146
- local parentActiveKey = parentQueueKey .. ":active"
147
- local parentMetaKey = parentQueueKey .. ":meta"
148
- local parentMarkerKey = parentQueueKey .. ":marker"
149
- local jobAttributes = rcall("HMGET", parentKey, "priority", "delay")
150
- local priority = tonumber(jobAttributes[1]) or 0
151
- local delay = tonumber(jobAttributes[2]) or 0
152
- -- ignore dependencies if any left
153
- rcall("HSET", parentKey, "igdp", 1)
154
- if delay > 0 then
155
- local delayedTimestamp = tonumber(timestamp) + delay
156
- local score = delayedTimestamp * 0x1000
157
- local parentDelayedKey = parentQueueKey .. ":delayed"
158
- rcall("ZADD", parentDelayedKey, score, parentId)
159
- rcall("XADD", parentQueueKey .. ":events", "*", "event", "delayed", "jobId", parentId, "delay",
160
- delayedTimestamp)
161
- addDelayMarkerIfNeeded(parentMarkerKey, parentDelayedKey)
149
+ local parentWaitKey = parentQueueKey .. ":wait"
150
+ local parentPausedKey = parentQueueKey .. ":paused"
151
+ local parentActiveKey = parentQueueKey .. ":active"
152
+ local parentMetaKey = parentQueueKey .. ":meta"
153
+ local parentMarkerKey = parentQueueKey .. ":marker"
154
+ local jobAttributes = rcall("HMGET", parentKey, "priority", "delay")
155
+ local priority = tonumber(jobAttributes[1]) or 0
156
+ local delay = tonumber(jobAttributes[2]) or 0
157
+ -- ignore dependencies if any left
158
+ rcall("HSET", parentKey, "igdp", 1)
159
+ if delay > 0 then
160
+ local delayedTimestamp = tonumber(timestamp) + delay
161
+ local score = delayedTimestamp * 0x1000
162
+ local parentDelayedKey = parentQueueKey .. ":delayed"
163
+ rcall("ZADD", parentDelayedKey, score, parentId)
164
+ rcall("XADD", parentQueueKey .. ":events", "*", "event", "delayed", "jobId", parentId, "delay",
165
+ delayedTimestamp)
166
+ addDelayMarkerIfNeeded(parentMarkerKey, parentDelayedKey)
167
+ else
168
+ if priority == 0 then
169
+ local parentTarget, isParentPausedOrMaxed = getTargetQueueList(parentMetaKey, parentActiveKey,
170
+ parentWaitKey, parentPausedKey)
171
+ addJobInTargetList(parentTarget, parentMarkerKey, "RPUSH", isParentPausedOrMaxed, parentId)
162
172
  else
163
- if priority == 0 then
164
- local parentTarget, isParentPausedOrMaxed = getTargetQueueList(parentMetaKey, parentActiveKey,
165
- parentWaitKey, parentPausedKey)
166
- addJobInTargetList(parentTarget, parentMarkerKey, "RPUSH", isParentPausedOrMaxed, parentId)
167
- else
168
- local isPausedOrMaxed = isQueuePausedOrMaxed(parentMetaKey, parentActiveKey)
169
- addJobWithPriority(parentMarkerKey, parentQueueKey .. ":prioritized", priority, parentId,
170
- parentQueueKey .. ":pc", isPausedOrMaxed)
171
- end
172
- rcall("XADD", parentQueueKey .. ":events", "*", "event", "waiting", "jobId", parentId, "prev",
173
- "waiting-children")
173
+ local isPausedOrMaxed = isQueuePausedOrMaxed(parentMetaKey, parentActiveKey)
174
+ addJobWithPriority(parentMarkerKey, parentQueueKey .. ":prioritized", priority, parentId,
175
+ parentQueueKey .. ":pc", isPausedOrMaxed)
174
176
  end
177
+ rcall("XADD", parentQueueKey .. ":events", "*", "event", "waiting", "jobId", parentId, "prev",
178
+ "waiting-children")
175
179
  end
176
180
  end
177
- local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
178
- local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
179
- if doNotHavePendingDependencies then
180
- moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
181
+ local function moveParentToWaitIfNeeded(parentQueueKey, parentKey, parentId, timestamp)
182
+ if rcall("EXISTS", parentKey) == 1 then
183
+ local parentWaitingChildrenKey = parentQueueKey .. ":waiting-children"
184
+ if rcall("ZSCORE", parentWaitingChildrenKey, parentId) then
185
+ rcall("ZREM", parentWaitingChildrenKey, parentId)
186
+ moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
181
187
  end
188
+ end
189
+ end
190
+ local function moveParentToWaitIfNoPendingDependencies(parentQueueKey, parentDependenciesKey, parentKey,
191
+ parentId, timestamp)
192
+ local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
193
+ if doNotHavePendingDependencies then
194
+ moveParentToWaitIfNeeded(parentQueueKey, parentKey, parentId, timestamp)
195
+ end
182
196
  end
183
197
  --[[
184
198
  Function to remove deduplication key if needed.
@@ -369,38 +383,27 @@ moveParentToFailedIfNeeded = function (parentQueueKey, parentKey, parentId, jobI
369
383
  local parentWaitingChildrenKey = parentQueueKey .. ":waiting-children"
370
384
  local parentDelayedKey = parentQueueKey .. ":delayed"
371
385
  local parentPrioritizedKey = parentQueueKey .. ":prioritized"
372
- local parentWaitingChildrenOrDelayedOrPrioritizedKey
386
+ local parentWaitingChildrenOrDelayedKey
373
387
  local prevState
374
388
  if rcall("ZSCORE", parentWaitingChildrenKey, parentId) then
375
- parentWaitingChildrenOrDelayedOrPrioritizedKey = parentWaitingChildrenKey
389
+ parentWaitingChildrenOrDelayedKey = parentWaitingChildrenKey
376
390
  prevState = "waiting-children"
377
391
  elseif rcall("ZSCORE", parentDelayedKey, parentId) then
378
- parentWaitingChildrenOrDelayedOrPrioritizedKey = parentDelayedKey
392
+ parentWaitingChildrenOrDelayedKey = parentDelayedKey
379
393
  prevState = "delayed"
380
- elseif rcall("ZSCORE", parentPrioritizedKey, parentId) then
381
- parentWaitingChildrenOrDelayedOrPrioritizedKey = parentPrioritizedKey
382
- prevState = "prioritized"
394
+ rcall("HSET", parentKey, "delay", 0)
383
395
  end
384
- if parentWaitingChildrenOrDelayedOrPrioritizedKey then
385
- rcall("ZREM", parentWaitingChildrenOrDelayedOrPrioritizedKey, parentId)
396
+ if parentWaitingChildrenOrDelayedKey then
397
+ rcall("ZREM", parentWaitingChildrenOrDelayedKey, parentId)
386
398
  local parentQueuePrefix = parentQueueKey .. ":"
387
399
  local parentFailedKey = parentQueueKey .. ":failed"
388
- rcall("ZADD", parentFailedKey, timestamp, parentId)
389
- local failedReason = "child " .. jobIdKey .. " failed"
390
- rcall("HSET", parentKey, "failedReason", failedReason, "finishedOn", timestamp)
391
- rcall("XADD", parentQueueKey .. ":events", "*", "event", "failed", "jobId", parentId, "failedReason",
392
- failedReason, "prev", prevState)
393
- local jobAttributes = rcall("HMGET", parentKey, "parent", "deid", "opts")
394
- removeDeduplicationKeyIfNeeded(parentQueueKey .. ":", jobAttributes[2])
395
- moveChildFromDependenciesIfNeeded(jobAttributes[1], parentKey, failedReason, timestamp)
396
- local parentRawOpts = jobAttributes[3]
397
- local parentOpts = cjson.decode(parentRawOpts)
398
- removeJobsOnFail(parentQueuePrefix, parentFailedKey, parentId, parentOpts, timestamp)
400
+ local deferredFailure = "child " .. jobIdKey .. " failed"
401
+ rcall("HSET", parentKey, "defa", deferredFailure)
402
+ moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
399
403
  else
400
- local grandParentKey = rcall("HGET", parentKey, "parentKey")
401
- if grandParentKey then
402
- local grandParentUnsuccesssfulSet = grandParentKey .. ":unsuccessful"
403
- rcall("ZADD", grandParentUnsuccesssfulSet, timestamp, parentKey)
404
+ if not rcall("ZSCORE", parentQueueKey .. ":failed", parentId) then
405
+ local deferredFailure = "child " .. jobIdKey .. " failed"
406
+ rcall("HSET", parentKey, "defa", deferredFailure)
404
407
  end
405
408
  end
406
409
  end
@@ -426,11 +429,11 @@ moveChildFromDependenciesIfNeeded = function (rawParentData, childKey, failedRea
426
429
  if rcall("SREM", parentDependenciesChildrenKey, childKey) == 1 then
427
430
  local parentFailedChildrenKey = parentKey .. ":failed"
428
431
  rcall("HSET", parentFailedChildrenKey, childKey, failedReason)
429
- moveParentToWait(parentData['queueKey'], parentKey, parentData['id'], timestamp)
432
+ moveParentToWaitIfNeeded(parentData['queueKey'], parentKey, parentData['id'], timestamp)
430
433
  end
431
434
  elseif parentData['idof'] or parentData['rdof'] then
432
435
  if rcall("SREM", parentDependenciesChildrenKey, childKey) == 1 then
433
- moveParentToWaitIfNeeded(parentData['queueKey'], parentDependenciesChildrenKey,
436
+ moveParentToWaitIfNoPendingDependencies(parentData['queueKey'], parentDependenciesChildrenKey,
434
437
  parentKey, parentData['id'], timestamp)
435
438
  if parentData['idof'] then
436
439
  local parentFailedChildrenKey = parentKey .. ":failed"
@@ -1 +1 @@
1
- {"version":3,"file":"moveStalledJobsToWait-9.js","sourceRoot":"","sources":["../../../src/scripts/moveStalledJobsToWait-9.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6hBf,CAAC;AACF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,uBAAuB;IAC7B,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
1
+ {"version":3,"file":"moveStalledJobsToWait-9.js","sourceRoot":"","sources":["../../../src/scripts/moveStalledJobsToWait-9.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgiBf,CAAC;AACF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,uBAAuB;IAC7B,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}