alphatheta-connect 0.18.0 → 0.19.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.
- package/lib/cli.js +0 -0
- package/lib/index.js +1 -12
- package/lib/index.js.map +1 -1
- package/lib/remotedb/fields.d.ts +6 -6
- package/package.json +1 -1
- package/lib/localdb/onelibrary/adapter.d.ts +0 -110
- package/lib/localdb/onelibrary/connection.d.ts +0 -8
- package/lib/localdb/onelibrary/encryption.d.ts +0 -10
- package/lib/localdb/onelibrary/types.d.ts +0 -67
- package/lib/localdb/onelibrary-schema.d.ts +0 -250
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","mappings":"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A;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,mBAAmB;AACzC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,6BAA6B;AACnD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB,SAAS;AAC/B;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,kBAAkB;AACxC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,kBAAkB;AACxC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AACD;AACA,CAAC;;;;;;;;;;;ACznCD;;AAEA;AACA,MAAM,IAA0C;AAChD,IAAI,iCAAO,CAAC,mFAA4B,CAAC,oCAAE,OAAO;AAAA;AAAA;AAAA,kGAAC;AACnD,IAAI,KAAK;AAAA,EAIN;AACH,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,KAAK,EAAE;AAAA,EAEV;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,mDAAmD;AACnD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oHAAoH;AAC5I;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,oDAAoD;AACpD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,CAAC;AACD;AACA,CAAC;;;;;;;;;;;;;ACrpDD;;;;GAIG;;;AAWH,+FAAyF;AAAjF,uIAAgB;AAAE,yIAAiB;AAAE,uIAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACf7D,yJAAsD;AACtD,6DAA2E;AAK3E,gFAAwC;AAExC;;GAEG;AACH,IAAY,KAWX;AAXD,WAAY,KAAK;IACf,0BAAiB;IACjB,wBAAe;IACf,wBAAe;IACf,wBAAe;IACf,wBAAe;IACf,oBAAW;IACX,4BAAmB;IACnB,8BAAqB;IACrB,yCAAgC;IAChC,wBAAe;AACjB,CAAC,EAXW,KAAK,qBAAL,KAAK,QAWhB;AAED,MAAM,cAAc,GAAG;IACrB,SAAS;IACT,QAAQ;IACR,gBAAgB;IAChB,SAAS;IACT,UAAU;IACV,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,KAAK;CACN,CAAC;AAEF,MAAM,qBAAqB,GAA2B;IACpD,cAAc,EAAE,QAAQ;IACxB,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,QAAQ;CACnB,CAAC;AAEF;;;;;GAKG;AACH,MAAa,WAAW;IAOtB;QANS,SAAI,GAAiB,KAAK,CAAC;QAEpC,oCAAwB;QACxB,iCAAa,IAAI,GAAG,EAA6B,EAAC;QAClD,qCAAiB,KAAK,EAAC;QAGrB,2BAAI,qBAAS,6CAAO,EAAC,UAAU,CAAC,OAAC;QACjC,2BAAI,yBAAM,CAAC,IAAI,CAAC,2BAAc,GAAE,CAAC,CAAC;IACpC,CAAC;IAED,KAAK;QACH,2BAAI,8BAAW,CAAC,KAAK,EAAE,CAAC;QACxB,2BAAI,yBAAM,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,IAAI,CAAC,2BAAI,kCAAe,EAAE,CAAC;YACzB,2BAAI,yBAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACrC,2BAAI,8BAAkB,IAAI,OAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,IAAI,2BAAI,kCAAe,EAAE,CAAC;YACxB,2BAAI,yBAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1B,2BAAI,8BAAkB,KAAK,OAAC;QAC9B,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,KAAY,EAAE,MAA2B;QACpD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAM,MAAM,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,MAAM;aACtB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACd,IAAI,EAAE;aACN,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,MAAM,QAAQ,GAAG,GAAG,KAAK,IAAI,UAAU,EAAE,CAAC;QAE1C,6DAA6D;QAC7D,IAAI,IAAI,GAAG,2BAAI,8BAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,sBAAS,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAI,GAAG,2BAAI,yBAAM,CAAC,OAAO,CAAC,eAAe,KAAK,KAAK,OAAO,aAAa,KAAK,GAAG,CAAC,CAAC;YACjF,2BAAI,8BAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;QAED,8BAA8B;QAC9B,MAAM,IAAI,GAAG,sBAAS,EAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CACrC,KAAK,YAAY,IAAI;YACnB,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE;YACrB,CAAC,CAAC,OAAO,KAAK,KAAK,SAAS;gBAC1B,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBACf,CAAC,CAAC,KAAK,CACZ,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,EAAU;;QAClB,MAAM,GAAG,GAAoC,2BAAI,yBAAM;aACpD,OAAO,CAAW,iBAAiB,KAAK,CAAC,KAAK,eAAe,CAAC;aAC9D,GAAG,CAAC,EAAE,CAAC,CAAC;QAEX,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QAED,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,oBAAO,EAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,sBAAS,EAAC,CAAC,CAAC,CAA4B,CAAC;QAEjF,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;QACzB,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;QAC5B,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC;QAE3B,wCAAwC;QACxC,QAAQ,CAAC,eAAe,GAAG,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC;QACtD,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAE5C,kCAAkC;QAClC,QAAQ,CAAC,WAAW,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAkB,CAAC,CAAC;QAC7D,QAAQ,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAgB,CAAC,CAAC;QAEzD,gCAAgC;QAChC,MAAM,KAAK,GAAG,QAAe,CAAC;QAE9B,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,GAAG,QAAQ,IAAI,CAAC;YAE/B,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;YACzB,MAAM,KAAK,GAAG,sBAAS,EAAC,2BAAqB,CAAC,QAAQ,CAAC,mCAAI,QAAQ,CAAC,CAAC;YAErE,2BAA2B;YAC3B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC;YACrB,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;YAEvB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBAChB,SAAS;YACX,CAAC;YAED,MAAM,YAAY,GAAwB,2BAAI,yBAAM;iBACjD,OAAO,CAAW,iBAAiB,KAAK,eAAe,CAAC;iBACxD,GAAG,CAAC,EAAE,CAAC,CAAC;YAEX,KAAK,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC;QACjC,CAAC;QAED,OAAO,KAAc,CAAC;IACxB,CAAC;IAED;;;;;;;;OAQG;IACH,YAAY,CAAC,UAAmB;QAC9B,MAAM,eAAe,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,eAAe,CAAC;QAEtF,kDAAkD;QAClD,MAAM,YAAY,GAA+B,2BAAI,yBAAM;aACxD,OAAO,CAAW,iBAAiB,KAAK,CAAC,QAAQ,UAAU,eAAe,EAAE,CAAC;aAC7E,GAAG,CAAC,UAAU,CAAC,CAAC;QAEnB,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,sBAAS,EACpC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,oBAAO,EAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,sBAAS,EAAC,CAAC,CAAC,CAAa,CAAC,EACzE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAChB,CAAC;QAEF,MAAM,SAAS,GAA+B,2BAAI,yBAAM;aACrD,OAAO,CAAW,iBAAiB,KAAK,CAAC,aAAa,wBAAwB,CAAC;aAC/E,GAAG,CAAC,UAAU,CAAC,CAAC;QAEnB,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAChC,GAAG,CAAC,EAAE,CAAC,oBAAO,EAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,sBAAS,EAAC,CAAC,CAAC,CAAoC,CAC/E,CAAC;QAEF,OAAO,EAAC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAC,CAAC;IAC5C,CAAC;CACF;AA5JD,kCA4JC;;;;;;;;;;;;;;AC7MD;;;;;GAKG;;;AAWH,+FAA4D;AAApD,wHAAe;AAAE,0GAAQ;;;;;;;;;;;;;;ACGjC,oCAMC;AAKD,wCAcC;AAKD,wCAEC;AAKD,4CAyCC;AAKD,8CAgFC;AAKD,kDAIC;AAKD,4DAKC;AAKD,0DAKC;AAKD,0CAMC;AA9ND,uFAAmD;AAcnD,kGAA2D;AAE3D;;GAEG;AACH,SAAgB,YAAY,CAAC,IAAS;IACpC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC;QACzC,MAAM,EAAE,IAAI,CAAC,IAAI;QACjB,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,GAAG;QACrB,KAAK,EAAE,IAAI,CAAC,UAAU;KACvB,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,IAAS;IACtC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE;QACvC,gEAAgE;QAEhE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,KAAK,CAAC,IAAqB,CAAC;QACzE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QAClC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QAEnC,wEAAwE;QACxE,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC;QAEvC,OAAO,4BAAgB,EAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,IAAS;IACtC,OAAO,sCAAqB,EAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,IAAS;IACxC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE;;QACvC,MAAM,GAAG,GAAgB;YACvB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,CAAC;QAEF,sCAAsC;QACtC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACrD,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,CAAC;QAED,uCAAuC;QACvC,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,CAAC;QAED,gCAAgC;QAChC,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YACzD,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;YAChC,GAAG,CAAC,QAAQ,GAAG;gBACb,CAAC,EAAE,WAAK,CAAC,QAAQ,mCAAI,CAAC;gBACtB,CAAC,EAAE,WAAK,CAAC,UAAU,mCAAI,CAAC;gBACxB,CAAC,EAAE,WAAK,CAAC,SAAS,mCAAI,CAAC;aACxB,CAAC;QACJ,CAAC;QAED,yBAAyB;QACzB,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAC1C,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,CAAC;QAED,4CAA4C;QAC5C,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;YACjE,GAAG,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;YACxC,GAAG,CAAC,eAAe,GAAG,WAAK,CAAC,eAAe,mCAAI,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,IAAS;;IACzC,MAAM,OAAO,GAA2C;QACtD,CAAC,EAAE,MAAM;QACT,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,KAAK;KACT,CAAC;IAEF,MAAM,OAAO,GAA0C;QACrD,CAAC,EAAE,SAAS;QACZ,CAAC,EAAE,MAAM;QACT,CAAC,EAAE,SAAS;QACZ,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,QAAQ;QACX,CAAC,EAAE,MAAM;QACT,CAAC,EAAE,OAAO;QACV,CAAC,EAAE,QAAQ;QACX,CAAC,EAAE,QAAQ;KACZ,CAAC;IAEF,qCAAqC;IACrC,MAAM,aAAa,GAA2D;QAC5E,IAAI,EAAE;YACJ,CAAC,EAAE,OAAO;YACV,CAAC,EAAE,IAAI;YACP,CAAC,EAAE,MAAM;YACT,CAAC,EAAE,QAAQ;YACX,CAAC,EAAE,OAAO;SACX;QACD,GAAG,EAAE;YACH,CAAC,EAAE,OAAO;YACV,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,QAAQ;YACX,CAAC,EAAE,QAAQ;YACX,EAAE,EAAE,OAAO;SACZ;QACD,GAAG,EAAE;YACH,CAAC,EAAE,OAAO;YACV,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,QAAQ;YACX,CAAC,EAAE,QAAQ;YACX,EAAE,EAAE,OAAO;SACZ;KACF,CAAC;IAEF,MAAM,IAAI,GAAG,aAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,mCAAI,MAAM,CAAC;IAC/C,MAAM,IAAI,GAAG,aAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,mCAAI,SAAS,CAAC;IAErD,MAAM,OAAO,GAAa,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE;;QAC7D,MAAM,MAAM,GAAW;YACrB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,UAAU,EAAE,mBAAa,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAI,SAAS;SACzD,CAAC;QAEF,qCAAqC;QACrC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YACzB,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QACnC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;QAC1B,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,IAAS;IAC3C,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;KAClC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,wBAAwB,CAAC,IAAS;IAChD,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU;QAChC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;KACrC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB,CAAC,IAAS;IAC/C,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU;QAChC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;KACrC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,IAAS;IACvC,OAAO;QACL,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY;QACpC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY;QACpC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa;KACvC,CAAC;AACJ,CAAC;;;;;;;;;;;;;;;ACzLD,kCA2DC;AAKD,wCASC;AAKD,kDASC;AAKD,gDAOC;AArHD,MAAM,UAAU,GAAG,CAAC,IAAU,EAAE,EAAE,CAChC,IAAI,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAEpE;;;GAGG;AACI,MAAM,kBAAkB,GAC7B,GAA8B,EAAE,CAChC,CAAC,GAAQ,EAAE,EAAE;;IACX,QAAC;QACC,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,SAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,mCAAI,EAAE;KAC/B,CAAM;CAAA,CAAC;AANC,0BAAkB,sBAMnB;AAEZ;;GAEG;AACH,SAAgB,WAAW,CAAC,QAAa;IACvC,MAAM,WAAW,GAAuB,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAEvE,MAAM,KAAK,GAA4B;QACrC,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI;QAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,GAAG;QAC3B,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI;QACnC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI;QACnC,eAAe,EAAE,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI;QAC5D,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI;QAClD,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI;QACrC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI;QACrC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI;QAC3C,WAAW,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjE,SAAS,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7D,oCAAoC;QACpC,EAAE;QACF,8EAA8E;QAC9E,4DAA4D;QAC5D,EAAE;QACF,6EAA6E;QAC7E,EAAE;QACF,wCAAwC;QACxC,EAAE;QACF,0EAA0E;QAC1E,sCAAsC;QACtC,WAAW,EAAE,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;QAE9D,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,IAAI;QACrC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,IAAI;QACnC,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB,IAAI,IAAI;QACnD,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,IAAI;QACrC,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,IAAI;QACvC,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,IAAI;QACjC,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,IAAI;QACjC,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,IAAI;QACjC,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,IAAI;QACjC,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,IAAI;QAE7B,yEAAyE;QACzE,yEAAyE;QACzE,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,IAAI;KACjB,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,WAAgB;IAC7C,MAAM,QAAQ,GAAa;QACzB,EAAE,EAAE,WAAW,CAAC,EAAE;QAClB,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QAChC,QAAQ,EAAE,WAAW,CAAC,WAAW,KAAK,CAAC;QACvC,QAAQ,EAAE,WAAW,CAAC,QAAQ,IAAI,IAAI;KACvC,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,gBAAqB;IACvD,MAAM,KAAK,GAAoC;QAC7C,EAAE,EAAE,gBAAgB,CAAC,EAAE;QACvB,SAAS,EAAE,gBAAgB,CAAC,UAAU;QACtC,UAAU,EAAE,gBAAgB,CAAC,UAAU;QACvC,OAAO,EAAE,gBAAgB,CAAC,OAAO;KAClC,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,UAAe;IAChD,MAAM,GAAG,GAAY;QACnB,EAAE,EAAE,UAAU,CAAC,EAAE;QACjB,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;KAChC,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxID,kFAA2C;AAE3C,uJAAgE;AAGhE,2GAAiD;AAEjD,kHAA8D;AAG9D;;;GAGG;AACH,MAAa,iBAAiB;IAI5B,YAAY,EAAC,GAAG,EAAE,UAAU,EAA6C;QAHzE,yCAAkB;QAClB,gDAAmD;QAGjD,2BAAI,0BAAQ,GAAG,OAAC;QAChB,2BAAI,iCAAe,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAC;IAChD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,OAAe,EAAE,IAAW;QAC/C,MAAM,EAAE,GAAG,IAAI;YACb,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAC,EAAE,EAAE,gBAAgB,EAAC,CAAC;YACzC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAC,IAAI,EAAE,gBAAgB,EAAC,CAAC,CAAC;QAEzD,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,EAAC,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,EAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAC,EAAC,CAAC,CAAC;QAClF,MAAM,MAAM,GAAG,IAAI,4BAAY,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,EAAE,GAAG,IAAI,2BAAY,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,CAAC,MAAM,EAAE,CAAC;QAEjB,MAAM,SAAS,GAAG,EAAE,CAAC,UAAU,CAAC,EAAC,EAAE,EAAE,WAAW,EAAC,CAAC,CAAC;QACnD,MAAM,OAAO,CAAC,GAAG,CACf,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CACvE,CAAC;QACF,SAAS,CAAC,MAAM,EAAE,CAAC;QAEnB,EAAE,CAAC,MAAM,EAAE,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB,CAAC,KAAU,EAAE,IAAU;QAC3C,MAAM,SAAS,GAAG,0BAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,YAAY,GAAG,kCAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEnD,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,EAAC,EAAE,EAAE,kBAAkB,EAAE,WAAW,EAAE,SAAS,EAAC,CAAC,CAAC;QAE7E,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,KAAK,IAAI,CAAC,CAAC,uCAAuC;YAClD,UAAU,EAAE,CAAC;QACf,CAAC;QAED,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEhC,oDAAoD;QACpD,2BAAI,8BAAK,CAAC,gBAAgB,EAAE,CAAC;QAE7B,IAAI,CAAC;YACH,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;gBACjC,2BAAI,8BAAK,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBAC1C,UAAU,EAAE,CAAC;gBAEb,kEAAkE;gBAClE,IAAI,UAAU,GAAG,GAAG,KAAK,CAAC,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;oBACxD,2BAAI,qCAAY,MAAhB,IAAI,EAAa,EAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAC,CAAC,CAAC;oBAC9E,yDAAyD;oBACzD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,2BAAI,8BAAK,CAAC,MAAM,EAAE,CAAC;QACrB,CAAC;QAED,EAAE,CAAC,MAAM,EAAE,CAAC;IACd,CAAC;CACF;AA9ED,8CA8EC;;AAED;;;GAGG;AACH,QAAQ,CAAC,CAAC,SAAS,CAAC,KAAU;IAC5B,MAAM,EAAC,SAAS,EAAE,QAAQ,EAAC,GAAG,KAAK,CAAC;IAEpC,IAAI,OAAO,GAAG,SAAS,CAAC;IACxB,GAAG,CAAC;QACF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAE1B,2EAA2E;QAC3E,0EAA0E;QAC1E,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;QAExB,sDAAsD;QACtD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS;aACxB,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;aAC/B,IAAI,EAAE;aACN,MAAM,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAErC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,GAAG,CAAC,IAAI,CAAC;QACjB,CAAC;IACH,CAAC,QAAQ,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE;AAC5C,CAAC;;;;;;;;;;;;;;;;;AC9ED,0CAGC;AAKD,4BA2EC;AAhID,kFAA2C;AAG3C,0JAAkE;AAElE,4GAUwB;AACxB,gGAA6C;AAW7C,MAAM,EAAC,WAAW,EAAC,GAAG,4BAAa,CAAC;AAapC;;;;GAIG;AACI,KAAK,UAAU,eAAe,CAAC,EAAC,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,EAAmB;IACjF,MAAM,QAAQ,GAAG,IAAI,4BAAiB,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,QAAQ,CAC5B,KAAiC,EACjC,IAAO,EACP,YAA0B;IAE1B,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IAE1C,MAAM,MAAM,GAAG,IAAI,4BAAY,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAI,4BAAa,CAAC,MAAM,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAG,EAAqB,CAAC;IACrC,MAAM,SAAS,GAAG,MAAyB,CAAC;IAC5C,MAAM,SAAS,GAAG,MAAyB,CAAC;IAC5C,MAAM,SAAS,GAAG,MAAyB,CAAC;IAE5C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;YACvB,KAAK,WAAW,CAAC,SAAS;gBACxB,SAAS,CAAC,QAAQ,GAAG,+BAAY,EAAC,OAAO,CAAC,CAAC;gBAC3C,MAAM;YAER,KAAK,WAAW,CAAC,IAAI;gBACnB,SAAS,CAAC,WAAW,GAAG,iCAAc,EAAC,OAAO,CAAC,CAAC;gBAChD,MAAM;YAER,KAAK,WAAW,CAAC,MAAM;gBACrB,SAAS,CAAC,YAAY,GAAG,mCAAgB,EAAC,OAAO,CAAC,CAAC;gBACnD,MAAM;YAER,KAAK,WAAW,CAAC,YAAY;gBAC3B,SAAS,CAAC,eAAe,GAAG,sCAAmB,EAAC,OAAO,CAAC,CAAC;gBACzD,MAAM;YAER,KAAK,WAAW,CAAC,SAAS;gBACxB,SAAS,CAAC,YAAY,GAAG,sCAAmB,EAAC,OAAO,CAAC,CAAC;gBACtD,MAAM;YAER,KAAK,WAAW,CAAC,WAAW;gBAC1B,SAAS,CAAC,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC7D,MAAM;YAER,KAAK,WAAW,CAAC,kBAAkB;gBACjC,SAAS,CAAC,oBAAoB,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACnE,MAAM;YAER,KAAK,WAAW,CAAC,iBAAiB;gBAChC,SAAS,CAAC,UAAU,GAAG,iCAAc,EAAC,OAAO,CAAC,CAAC;gBAC/C,MAAM;YAER,KAAK,WAAW,CAAC,cAAc;gBAC7B,SAAS,CAAC,aAAa,GAAG,oCAAiB,EAAC,OAAO,CAAC,CAAC;gBACrD,MAAM;YAER,KAAK,WAAW,CAAC,wBAAwB;gBACvC,SAAS,CAAC,oBAAoB,GAAG,2CAAwB,EAAC,OAAO,CAAC,CAAC;gBACnE,MAAM;YAER,KAAK,WAAW,CAAC,uBAAuB;gBACtC,SAAS,CAAC,mBAAmB,GAAG,0CAAuB,EAAC,OAAO,CAAC,CAAC;gBACjE,MAAM;YAER,KAAK,WAAW,CAAC,YAAY;gBAC3B,SAAS,CAAC,WAAW,GAAG,kCAAe,EAAC,OAAO,CAAC,CAAC;gBACjD,MAAM;YAER,4DAA4D;YAC5D,oDAAoD;YACpD,KAAK,WAAW,CAAC,GAAG,CAAC;YACrB,KAAK,WAAW,CAAC,IAAI;gBACnB,MAAM;QACV,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;;;;;;;;;;;;;;;;;;AC/HD,uJAAgE;AAChE,iFAAsC;AAEtC,qHAM2B;AAE3B,MAAM,EAAC,QAAQ,EAAC,GAAG,2BAAY,CAAC;AAEhC;;GAEG;AACU,iBAAS,GAA0B;IAC9C,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAK,CAAC,KAAK;IAC9B,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAK,CAAC,MAAM;IAChC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAK,CAAC,KAAK;IAC9B,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAK,CAAC,KAAK;IAC9B,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAK,CAAC,KAAK;IAC9B,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAK,CAAC,KAAK;IAC9B,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAK,CAAC,GAAG;IAC1B,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAK,CAAC,OAAO;IACjC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,WAAK,CAAC,QAAQ;IACxC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,WAAK,CAAC,aAAa;CACjD,CAAC;AAEF;;;GAGG;AACU,yBAAiB,GAAsC;IAClE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,6BAAW;IAC9B,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,wCAAkB,GAAU;IAChD,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,wCAAkB,GAAS;IAC9C,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,wCAAkB,GAAS;IAC9C,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,wCAAkB,GAAS;IAC9C,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,wCAAkB,GAAS;IAC9C,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,wCAAkB,GAAO;IAC1C,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,oCAAkB;IACtC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,gCAAc;IACxC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,qCAAmB;IAEhD,kCAAkC;CACnC,CAAC;;;;;;;;;;;;;;;AC/CF,uEAA4B;AAErB,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC;kBAClB,WAAK,CAAC,MAAM;;;;kBAIZ,WAAK,CAAC,KAAK;;;;kBAIX,WAAK,CAAC,KAAK;;;;kBAIX,WAAK,CAAC,KAAK;;;;kBAIX,WAAK,CAAC,KAAK;;;;kBAIX,WAAK,CAAC,GAAG;;;;kBAIT,WAAK,CAAC,OAAO;;;;kBAIb,WAAK,CAAC,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAsCX,WAAK,CAAC,QAAQ;;;;;;kBAMd,WAAK,CAAC,aAAa;;;;;;wDAMmB,WAAK,CAAC,KAAK;wDACX,WAAK,CAAC,KAAK;wDACX,WAAK,CAAC,KAAK;wDACX,WAAK,CAAC,KAAK;wDACX,WAAK,CAAC,KAAK;wDACX,WAAK,CAAC,KAAK;wDACX,WAAK,CAAC,KAAK;wDACX,WAAK,CAAC,KAAK;wDACX,WAAK,CAAC,KAAK;wDACX,WAAK,CAAC,KAAK;wDACX,WAAK,CAAC,QAAQ;wDACd,WAAK,CAAC,aAAa;wDACnB,WAAK,CAAC,aAAa;CAC1E,CAAC;AA5FW,sBAAc,kBA4FzB;;;;;;;;;;;;;;;AC5FF;;GAEG;AACI,MAAM,gBAAgB,GAAG,CAC9B,KAAc,EACd,MAAe,EACf,MAAc,EACd,MAAc,EACd,MAA4B,EACT,EAAE,CACrB,MAAM,KAAK,KAAK;IACd,CAAC,CAAC,MAAM;QACN,CAAC,CAAC,EAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAC;QAC5C,CAAC,CAAC,EAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAC;IACrC,CAAC,CAAC,MAAM;QACN,CAAC,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAC;QAChC,CAAC,CAAC,KAAK;YACL,CAAC,CAAC,EAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAC;YAC7B,CAAC,CAAC,IAAI,CAAC;AAfF,wBAAgB,oBAed;;;;;;;;;;;;;;;ACPF,kBAAU,GAAW;IAChC,KAAK,KAAI,CAAC;IACV,KAAK,KAAI,CAAC;IACV,IAAI,KAAI,CAAC;IACT,IAAI,KAAI,CAAC;IACT,KAAK,KAAI,CAAC;CACX,CAAC;;;;;;;;;;;;;;ACFF,kDAIC;AAQD,sEAEC;AAyBD,8DAuBC;AA/ED,2FAAuE;AAEvE,qEAAgD;AAEhD,wFAAqD;AAIrD;;;;;;;;GAQG;AACI,KAAK,UAAU,mBAAmB,CACvC,MAAkB;IAElB,OAAO,sCAAe,EAAC,MAAM,CAAC,CAAC;AACjC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,6BAA6B,CAAC,SAAiB;IAC7D,OAAO,2CAAoB,EAAC,SAAS,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACI,KAAK,UAAU,yBAAyB,CAC7C,MAAc,EACd,IAAkB,EAClB,QAAgB;;IAEhB,4CAA4C;IAC5C,MAAM,SAAS,GAAG,oBAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,0CAAE,WAAW,EAAE,mCAAI,EAAE,CAAC;IACjE,IAAI,CAAC,2CAAoB,EAAC,SAAS,CAAC,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,qBAAW,EAAC,EAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAC,CAAC,CAAC;QACnE,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,gCAAmB,EAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1E,OAAO,sCAAe,EAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,kEAAkE;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7ED,6DAAoC;AAEpC,uEAA6D;AAC7D,6EAAuC;AAEvC,+EAA8C;AA2C9C,MAAM,aAAa,GAAoB;IACrC,IAAI,EAAE,qBAAa,CAAC,WAAW;IAC/B,eAAe,EAAE,EAAE;IACnB,qBAAqB,EAAE,CAAC;IACxB,kBAAkB,EAAE,GAAG;IACvB,cAAc,EAAE,IAAI;CACrB,CAAC;AA2BF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAa,kBAAkB;IA2C7B,YAAY,MAAiC;QA1C7C;;WAEG;QACH,sCAAoB,IAAI,qBAAY,EAAE,EAAC;QACvC;;WAEG;QACH,wCAAa,IAAI,GAAG,EAA6B,EAAC;QAClD;;WAEG;QACH,4CAAiB,IAAI,GAAG,EAAoB,EAAC;QAC7C;;;WAGG;QACH,+CAAoB,IAAI,GAAG,EAAoB,EAAC;QAChD;;WAEG;QACH,0CAAe,IAAI,GAAG,EAAY,EAAC;QACnC;;;;;;WAMG;QACH,iDAAsB,IAAI,GAAG,EAAoB,EAAC;QAClD;;WAEG;QACH,0CAAe,KAAK,EAAC;QACrB;;WAEG;QACH,sDAA8B;QAC9B;;WAEG;QACH,6CAAyB;QAazB,sCAAsC;QACtC,OAAE,GAAkB,2BAAI,mCAAS,CAAC,WAAW,CAAC,IAAI,CAAC,2BAAI,mCAAS,CAAC,CAAC;QAClE,QAAG,GAAmB,2BAAI,mCAAS,CAAC,cAAc,CAAC,IAAI,CAAC,2BAAI,mCAAS,CAAC,CAAC;QACvE,SAAI,GAAoB,2BAAI,mCAAS,CAAC,IAAI,CAAC,IAAI,CAAC,2BAAI,mCAAS,CAAC,CAAC;QAC/D,uBAAkB,GAAG,CAAC,KAA6B,EAAE,EAAE,CACrD,2BAAI,mCAAS,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAE1C;;;WAGG;QACH,oCAAS,CAAC,KAAsB,EAAE,EAAE,CAClC,2BAAI,kCAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAC;QAErD;;;WAGG;QACH,4CAAiB,CAAC,KAAsB,EAAE,EAAE;YAC1C,MAAM,EAAC,QAAQ,EAAC,GAAG,KAAK,CAAC;YAEzB,IAAI,CAAC,2BAAI,iCAAO,MAAX,IAAI,EAAQ,KAAK,CAAC,IAAI,CAAC,qBAAS,EAAC,KAAK,CAAC,EAAE,CAAC;gBAC7C,OAAO;YACT,CAAC;YAED,IAAI,2BAAI,uCAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpC,OAAO;YACT,CAAC;YAED,0EAA0E;YAC1E,0EAA0E;YAC1E,2EAA2E;YAC3E,0EAA0E;YAC1E,sEAAsE;YACtE,IAAI,2BAAI,8CAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC7D,OAAO;YACT,CAAC;YAED,IAAI,CAAC,2BAAI,uCAAa,EAAE,CAAC;gBACvB,2BAAI,mCAAgB,IAAI,OAAC;gBACzB,2BAAI,mCAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACnC,CAAC;YAED,IAAI,2BAAI,2CAAiB,EAAE,CAAC;gBAC1B,2BAAI,2CAAiB,MAArB,IAAI,CAAmB,CAAC;YAC1B,CAAC;YAED,2BAAI,uCAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAChC,2BAAI,8CAAoB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAEtD,2BAAI,mCAAS,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC,EAAC;QAEF;;;WAGG;QACH,gDAAqB,GAAG,EAAE;;YACxB,MAAM,gBAAgB,GAAG,OAAC,GAAG,2BAAI,yCAAe,CAAC,OAAO,EAAE,CAAC;iBACxD,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC/B,QAAQ;gBACR,SAAS;gBACT,KAAK,EAAE,2BAAI,qCAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;aACrC,CAAC,CAAC;iBACF,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,2BAAI,uCAAa,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;iBAC/C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,qBAAS,EAAC,CAAC,CAAC,KAAK,CAAC,CAAC;iBAC1C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;iBACzC,GAAG,EAAE,0CAAE,QAAQ,CAAC;YAEnB,sCAAsC;YACtC,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBACnC,2BAAI,sCAAY,MAAhB,IAAI,CAAc,CAAC;gBACnB,OAAO;YACT,CAAC;YAED,yEAAyE;YACzE,MAAM,eAAe,GAAG,2BAAI,qCAAW,CAAC,GAAG,CAAC,gBAAgB,CAAE,CAAC;YAC/D,2BAAI,yCAAe,MAAnB,IAAI,EAAgB,eAAe,CAAC,CAAC;QACvC,CAAC,EAAC;QAEF,gDAAqB,CAAC,EAAC,QAAQ,EAAkB,EAAE,EAAE;YACnD,2BAAI,4CAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACxC,2BAAI,yCAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACrC,2BAAI,uCAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAEnC,2BAAI,6CAAmB,MAAvB,IAAI,CAAqB,CAAC;YAC1B,2BAAI,mCAAS,CAAC,IAAI,CAAC,SAAS,EAAE,EAAC,QAAQ,EAAC,CAAC,CAAC;QAC5C,CAAC,EAAC;QAEF,yCAAc,KAAK,IAAI,EAAE;YACvB,4EAA4E;YAC5E,yEAAyE;YACzE,mDAAmD;YACnD,IAAI,CAAC,2BAAI,uCAAa,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,wDAAwD;YACxD,IAAI,CAAC,GAAG,2BAAI,qCAAW,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,qBAAS,EAAC,CAAC,CAAC,IAAI,2BAAI,iCAAO,MAAX,IAAI,EAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5E,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,IAAI,OAAO,CAAU,OAAO,CAAC,EAAE;gBACrD,MAAM,UAAU,GAAG,UAAU,CAC3B,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EACnB,2BAAI,kCAAQ,CAAC,eAAe,GAAG,IAAI,CACpC,CAAC;gBACF,2BAAI,uCAAoB,GAAG,EAAE;oBAC3B,YAAY,CAAC,UAAU,CAAC,CAAC;oBACzB,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC,OAAC;YACJ,CAAC,CAAC,CAAC;YAEH,2BAAI,uCAAoB,SAAS,OAAC;YAElC,IAAI,CAAC,SAAS,IAAI,CAAC,2BAAI,uCAAa,EAAE,CAAC;gBACrC,OAAO;YACT,CAAC;YAED,2BAAI,mCAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC,EAAC;QAEF;;;;WAIG;QACH,+CAAoB,CAAC,KAAsB,EAAE,EAAE;YAC7C,MAAM,mBAAmB,GAAG,CAAC,GAAG,2BAAI,qCAAW,CAAC,MAAM,EAAE,CAAC;iBACtD,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC;iBAC5D,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,2BAAI,iCAAO,MAAX,IAAI,EAAQ,UAAU,CAAC,IAAI,qBAAS,EAAC,UAAU,CAAC,CAAC,CAAC;YAExE,IAAI,mBAAmB,EAAE,CAAC;gBACxB,OAAO;YACT,CAAC;YAED,2BAAI,yCAAe,MAAnB,IAAI,EAAgB,KAAK,CAAC,CAAC;QAC7B,CAAC,EAAC;QAEF;;;;WAIG;QACH,4CAAiB,CAAC,EAAC,QAAQ,EAAkB,EAAE,EAAE;YAC/C,2BAAI,4CAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACnD,CAAC,EAAC;QAEF;;;WAGG;QACH,oDAAyB,CAAC,SAA0B,EAAE,KAAsB,EAAE,EAAE;YAC9E,MAAM,EAAC,QAAQ,EAAC,GAAG,KAAK,CAAC;YAEzB,MAAM,iBAAiB,GACrB,2BAAI,kCAAQ,CAAC,IAAI,KAAK,qBAAa,CAAC,aAAa,IAAI,KAAK,CAAC,QAAQ,CAAC;YAEtE,MAAM,UAAU,GAAG,qBAAS,EAAC,KAAK,CAAC,CAAC;YACpC,MAAM,UAAU,GAAG,qBAAS,EAAC,SAAS,CAAC,CAAC;YAExC,MAAM,YAAY,GAAG,UAAU,IAAI,CAAC,UAAU,CAAC;YAE/C,wEAAwE;YACxE,SAAS;YACT,IAAI,2BAAI,4CAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,UAAU,IAAI,2BAAI,iCAAO,MAAX,IAAI,EAAQ,KAAK,CAAC,EAAE,CAAC;gBAC7E,2BAAI,4CAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACxC,OAAO;YACT,CAAC;YAED,IAAI,YAAY,IAAI,iBAAiB,EAAE,CAAC;gBACtC,2BAAI,yCAAe,MAAnB,IAAI,EAAgB,KAAK,CAAC,CAAC;YAC7B,CAAC;YAED,IAAI,YAAY,EAAE,CAAC;gBACjB,2BAAI,yCAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC9C,2BAAI,4CAAkB,MAAtB,IAAI,EAAmB,KAAK,CAAC,CAAC;gBAC9B,OAAO;YACT,CAAC;YAED,IAAI,UAAU,IAAI,sBAAU,EAAC,KAAK,CAAC,EAAE,CAAC;gBACpC,2BAAI,6CAAmB,MAAvB,IAAI,EAAoB,KAAK,CAAC,CAAC;gBAC/B,OAAO;YACT,CAAC;YAED,IAAI,UAAU,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC9B,2BAAI,yCAAe,MAAnB,IAAI,EAAgB,KAAK,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC,EAAC;QAEF,gDAAqB,CAAC,KAAsB,EAAE,EAAE;YAC9C,MAAM,EAAC,QAAQ,EAAC,GAAG,KAAK,CAAC;YAEzB,iEAAiE;YACjE,2BAAI,4CAAkB,MAAtB,IAAI,EAAmB,KAAK,CAAC,CAAC;YAE9B,IAAI,CAAC,2BAAI,uCAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrC,OAAO;YACT,CAAC;YAED,IAAI,CAAC,2BAAI,iCAAO,MAAX,IAAI,EAAQ,KAAK,CAAC,EAAE,CAAC;gBACxB,2BAAI,yCAAe,MAAnB,IAAI,EAAgB,KAAK,CAAC,CAAC;gBAC3B,OAAO;YACT,CAAC;YAED,2BAA2B;YAC3B,2BAAI,4CAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC,EAAC;QAzNA,2BAAI,8BAAW,EAAC,GAAG,aAAa,EAAE,GAAG,MAAM,EAAC,OAAC;IAC/C,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,MAAiC;QACzC,2BAAI,8BAAW,EAAC,GAAG,2BAAI,kCAAQ,EAAE,GAAG,MAAM,EAAC,OAAC;IAC9C,CAAC;IAmND;;OAEG;IACH,WAAW,CAAC,KAAsB;QAChC,MAAM,EAAC,QAAQ,EAAE,SAAS,EAAC,GAAG,KAAK,CAAC;QAEpC,MAAM,SAAS,GAAG,2BAAI,qCAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChD,2BAAI,qCAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAErC,wEAAwE;QACxE,2EAA2E;QAC3E,sEAAsE;QACtE,IAAI,SAAS,KAAK,SAAS,IAAI,2BAAI,iCAAO,MAAX,IAAI,EAAQ,KAAK,CAAC,IAAI,qBAAS,EAAC,KAAK,CAAC,EAAE,CAAC;YACtE,2BAAI,yCAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAC9C,2BAAI,4CAAkB,MAAtB,IAAI,EAAmB,KAAK,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,uDAAuD;QACvD,IAAI,SAAS,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACnD,2BAAI,iDAAuB,MAA3B,IAAI,EAAwB,SAAS,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,SAAS,IAAI,2BAAI,iCAAO,MAAX,IAAI,EAAQ,SAAS,CAAC,KAAK,2BAAI,iCAAO,MAAX,IAAI,EAAQ,KAAK,CAAC,EAAE,CAAC;YAC/D,2BAAI,6CAAmB,MAAvB,IAAI,EAAoB,KAAK,CAAC,CAAC;QACjC,CAAC;QAED,kCAAkC;QAClC,IACE,2BAAI,kCAAQ,CAAC,IAAI,KAAK,qBAAa,CAAC,aAAa;YACjD,UAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,QAAQ,MAAK,KAAK;YAC7B,KAAK,CAAC,QAAQ,EACd,CAAC;YACD,2BAAI,yCAAe,MAAnB,IAAI,EAAgB,KAAK,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,2EAA2E;QAC3E,4BAA4B;QAC5B,MAAM,SAAS,GAAG,2BAAI,yCAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,gBAAgB,GACpB,2BAAI,kCAAQ,CAAC,kBAAkB;YAC/B,wBAAY,EAAC,KAAK,CAAC,QAAS,EAAE,KAAK,CAAC,WAAW,CAAC;YAChD,IAAI,CAAC;QAEP,IACE,2BAAI,kCAAQ,CAAC,IAAI,KAAK,qBAAa,CAAC,WAAW;YAC/C,SAAS,KAAK,SAAS;YACvB,gBAAgB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAC1C,CAAC;YACD,2BAAI,yCAAe,MAAnB,IAAI,EAAgB,KAAK,CAAC,CAAC;QAC7B,CAAC;QAED,yEAAyE;QACzE,0CAA0C;QAC1C,MAAM,SAAS,GAAG,2BAAI,4CAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,gBAAgB,GACpB,2BAAI,kCAAQ,CAAC,qBAAqB;YAClC,wBAAY,EAAC,KAAK,CAAC,QAAS,EAAE,KAAK,CAAC,WAAW,CAAC;YAChD,IAAI,CAAC;QAEP,IAAI,SAAS,KAAK,SAAS,IAAI,gBAAgB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;YAC1E,2BAAI,6CAAmB,MAAvB,IAAI,EAAoB,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,gBAAgB;QACd,2BAAI,6CAAmB,MAAvB,IAAI,CAAqB,CAAC;IAC5B,CAAC;CACF;AAhVD,gDAgVC;;;;;;;;;;;;;;;;ACtbD,uEAAoC;AAEpC,MAAM,aAAa,GAAG,CAAC,iBAAS,CAAC,SAAS,CAAC,OAAO,EAAE,iBAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAEjF,MAAM,cAAc,GAAG;IACrB,iBAAS,CAAC,SAAS,CAAC,IAAI;IACxB,iBAAS,CAAC,SAAS,CAAC,KAAK;IACzB,iBAAS,CAAC,SAAS,CAAC,OAAO;CAC5B,CAAC;AAEF;;GAEG;AACI,MAAM,SAAS,GAAG,CAAC,CAAkB,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAAxE,iBAAS,aAA+D;AAErF;;GAEG;AACI,MAAM,UAAU,GAAG,CAAC,CAAkB,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAA1E,kBAAU,cAAgE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC0HvF,kCA8CC;AA1LD,6DAAkC;AAClC,2EAAoC;AAGpC,mFAAqF;AACrF,oGAAkC;AAClC,qFAA8B;AAC9B,oGAAwC;AACxC,0EAAmD;AACnD,oGAAwC;AAExC,yFAAiD;AACjD,uGAA0C;AAC1C,iGAAuC;AACvC,+GAAkD;AAClD,uEAA+C;AAC/C,6EAA+C;AAC/C,2GAAiD;AACjD,+FAA+C;AAC/C,6EAAgD;AAChD,4FAAwD;AAExD,MAAM,gBAAgB,GACpB,4EAA4E,CAAC;AAgH/E;;;;GAIG;AACI,KAAK,UAAU,WAAW,CAAC,MAAsB;IACtD,SAAS,CAAC,MAAM,CAAC,cAAc,EAAE,uBAAU,GAAE,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,SAAS,CAAC,gBAAgB,CAAC,EAAC,IAAI,EAAE,aAAa,EAAC,CAAC,CAAC;IAE7D,mDAAmD;IACnD,MAAM,cAAc,GAAG,eAAK,CAAC,YAAY,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IAE3E,oDAAoD;IACpD,MAAM,UAAU,GAAG,eAAK,CAAC,YAAY,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IAEvE,2CAA2C;IAC3C,MAAM,YAAY,GAAG,eAAK,CAAC,YAAY,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IAEzE,IAAI,CAAC;QACH,MAAM,iBAAO,EAAC,cAAc,EAAE,yBAAa,EAAE,SAAS,CAAC,CAAC;QACxD,MAAM,iBAAO,EAAC,UAAU,EAAE,qBAAS,EAAE,SAAS,CAAC,CAAC;QAChD,MAAM,iBAAO,EAAC,YAAY,EAAE,uBAAW,EAAE,SAAS,CAAC,CAAC;QAEpD,0EAA0E;QAC1E,gCAAgC;QAChC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAChC,EAAE,CAAC,SAAS,CAAC,sBAAU,CAAC,WAAW,CAAC,CAAC;QACrC,EAAE,CAAC,MAAM,EAAE,CAAC;QAEZ,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,iBAAa,CAAC,cAAc,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,IAAI,gBAAa,CAAC,YAAY,CAAC,CAAC;IACtD,MAAM,eAAe,GAAG,IAAI,kBAAe,CAAC,UAAU,CAAC,CAAC;IAExD,EAAE,CAAC,MAAM,EAAE,CAAC;IAEZ,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC;QACjC,MAAM;QACN,cAAc;QACd,UAAU;QACV,YAAY;QACZ,aAAa;QACb,aAAa;QACb,eAAe;KAChB,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAa,cAAc;IAezB;;OAEG;IACH,YAAY,EACV,MAAM,EACN,cAAc,EACd,UAAU,EACV,YAAY,EACZ,aAAa,EACb,aAAa,EACb,eAAe,GACD;;QAzBhB,gCAAuB,oBAAY,CAAC,MAAM,EAAC;QAE3C,iDAAwB;QACxB,6CAAoB;QACpB,+CAAsB;QACtB,gDAA8B;QAC9B,gDAA8B;QAC9B,kDAAkC;QAClC,yCAAgB;QAEhB,yCAA8B;QAC9B,6CAAsC;QACtC,4CAAsC;QAcpC,2BAAI,0BAAW,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,IAAI,OAAC;QAC9B,2BAAI,0BAAW,YAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,mCAAI,mBAAU,OAAC;QAE5C,2BAAI,kCAAmB,cAAc,OAAC;QACtC,2BAAI,8BAAe,UAAU,OAAC;QAC9B,2BAAI,gCAAiB,YAAY,OAAC;QAClC,2BAAI,iCAAkB,aAAa,OAAC;QACpC,2BAAI,iCAAkB,aAAa,OAAC;QACpC,2BAAI,mCAAoB,eAAe,OAAC;QAExC,2BAAI,8BAAe,IAAI,OAAC;QACxB,2BAAI,6BAAc,IAAI,OAAC;QAEvB,uDAAuD;QACvD,2BAAI,yBAAU,oBAAY,CAAC,MAAM,OAAC;IACpC,CAAC;IAED;;;;;OAKG;IACH,SAAS,CAAC,MAA8B;QACtC,2BAAI,0BAAW,EAAC,GAAG,2BAAI,8BAAQ,EAAE,GAAG,MAAM,EAAkB,OAAC;QAC7D,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,2BAAI,0BAAW,MAAM,CAAC,MAAM,OAAC;QAC/B,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,mBAAmB;QACvB,MAAM,EAAE,GAAG,SAAS,CAAC,gBAAgB,CAAC,EAAC,IAAI,EAAE,eAAe,EAAC,CAAC,CAAC;QAC/D,iDAAiD;QACjD,MAAM,WAAW,GAAG,MAAM,IAAI,OAAO,CAAS,OAAO,CAAC,EAAE,CACtD,2BAAI,qCAAe,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAC/C,CAAC;QACF,MAAM,KAAK,GAAG,gCAAoB,EAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAEnD,yEAAyE;QACzE,kBAAkB;QAClB,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QAC1C,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QACjD,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,CAAC,CAAC;QAExC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,EAAE,CAAC,SAAS,CAAC,sBAAU,CAAC,aAAa,CAAC,CAAC;YACvC,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YACjC,EAAE,CAAC,MAAM,EAAE,CAAC;YAEZ,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QAED,2BAAI,0BAAW,EAAC,GAAG,2BAAI,8BAAQ,EAAE,MAAM,EAAE,2BAAe,EAAE,KAAK,EAAC,OAAC;QACjE,EAAE,CAAC,MAAM,EAAE,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACH,OAAO;;QACL,IAAI,2BAAI,8BAAQ,KAAK,IAAI,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,EAAE,GAAG,SAAS,CAAC,gBAAgB,CAAC,EAAC,IAAI,EAAE,SAAS,EAAC,CAAC,CAAC;QAEzD,oDAAoD;QACpD,MAAM,IAAI,GAAG,8BAAa,EACxB,2BAAI,8BAAQ,CAAC,KAAK,EAClB,2BAAI,8BAAQ,CAAC,MAAM,EACnB,2BAAI,8BAAQ,CAAC,QAAQ,CACtB,CAAC;QAEF,oDAAoD;QACpD,IAAI,2BAAI,8BAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACxC,2BAAI,qCAAe,CAAC,WAAW,CAAC,EAAC,QAAQ,EAAE,2BAAI,8BAAQ,CAAC,QAAQ,EAAC,CAAC,CAAC;QACrE,CAAC;QAED,mBAAmB;QACnB,MAAM,SAAS,GAAG,IAAI,sBAAS,CAC7B,IAAI,EACJ,2BAAI,sCAAgB,EACpB,IAAI,CAAC,aAAa,EAClB,2BAAI,8BAAQ,CAAC,KAAK,EAClB,iCAAI,8BAAQ,CAAC,WAAW,mCAAI,KAAK,EACjC,iCAAI,8BAAQ,CAAC,mBAAmB,mCAAI,KAAK,EACzC,2BAAI,8BAAQ,CACb,CAAC;QACF,SAAS,CAAC,KAAK,EAAE,CAAC;QAElB,oCAAoC;QACpC,MAAM,QAAQ,GAAG,IAAI,kBAAc,CAAC,2BAAI,qCAAe,EAAE,IAAI,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,IAAI,iBAAa,CAC/B,IAAI,EACJ,2BAAI,qCAAe,EACnB,2BAAI,qCAAe,EACnB,iCAAI,8BAAQ,CAAC,kBAAkB,mCAAI,MAAM,CAC1C,CAAC;QAEF,0BAA0B;QAC1B,MAAM,QAAQ,GAAG,IAAI,YAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,2BAAI,qCAAe,CAAC,CAAC;QAEtE,4BAA4B;QAC5B,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,2BAAI,kCAAY,EAAE,IAAI,CAAC,CAAC;QAEpD,2BAAI,yBAAU,oBAAY,CAAC,SAAS,OAAC;QACrC,2BAAI,8BAAe,EAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAC,OAAC;QAErE,EAAE,CAAC,MAAM,EAAE,CAAC;IACd,CAAC;IAED;;OAEG;IACH,UAAU;;QACR,IAAI,2BAAI,8BAAQ,KAAK,IAAI,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC;QAED,0BAA0B;QAC1B,iCAAI,kCAAY,0CAAE,SAAS,CAAC,IAAI,EAAE,CAAC;QAEnC,yDAAyD;QACzD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACzD,UAAI,CAAC,QAAQ,0CAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAC5C,UAAI,CAAC,OAAO,0CAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,OAAO,OAAO,CAAC,GAAG,CAAC;YACjB,kBAAQ,EAAC,2BAAI,sCAAgB,CAAC;YAC9B,kBAAQ,EAAC,2BAAI,oCAAc,CAAC;YAC5B,kBAAQ,EAAC,2BAAI,kCAAY,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,IAAI,KAAK;QACP,OAAO,2BAAI,6BAAO,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAI,YAAY;QACd,OAAO,2BAAI,8BAAQ,KAAK,IAAI,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACH,WAAW;QACT,OAAO,2BAAI,6BAAO,KAAK,oBAAY,CAAC,SAAS,CAAC;IAChD,CAAC;IAED;;;OAGG;IACH,IAAI,aAAa;QACf,OAAO,2BAAI,qCAAe,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,IAAI,aAAa;QACf,uEAAuE;QACvE,6EAA6E;QAC7E,sDAAsD;QACtD,OAAO,2BAAI,6BAAO,KAAK,oBAAY,CAAC,SAAS,CAAC,CAAC,CAAC,2BAAI,qCAAe,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7E,CAAC;IAED;;;;;;;OAOG;IACH,IAAI,eAAe;QACjB,OAAO,2BAAI,6BAAO,KAAK,oBAAY,CAAC,SAAS,CAAC,CAAC,CAAC,2BAAI,uCAAiB,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,CAAC;IAED;;;OAGG;IACH,IAAI,OAAO;;QACT,OAAO,uCAAI,kCAAY,0CAAE,OAAO,mCAAI,IAAI,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACH,IAAI,EAAE;;QACJ,OAAO,uCAAI,kCAAY,0CAAE,QAAQ,mCAAI,IAAI,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACH,IAAI,OAAO;;QACT,OAAO,uCAAI,kCAAY,0CAAE,OAAO,mCAAI,IAAI,CAAC;IAC3C,CAAC;IAED;;;;;;;;;OASG;IACH,IAAI,QAAQ;;QACV,OAAO,uCAAI,kCAAY,0CAAE,QAAQ,mCAAI,IAAI,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACH,IAAI,YAAY;;QACd,OAAO,uCAAI,kCAAY,0CAAE,SAAS,CAAC,KAAK,mCAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAChE,CAAC;IAED;;;OAGG;IACH,IAAI,SAAS;QACX,IAAI,2BAAI,kCAAY,KAAK,IAAI,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,2EAA2E;QAC3E,4CAA4C;QAC5C,IAAI,2BAAI,iCAAW,KAAK,IAAI,EAAE,CAAC;YAC7B,2BAAI,6BAAc,IAAI,8BAAkB,EAAE,OAAC;YAC3C,2BAAI,qCAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,WAAC,wCAAI,iCAAW,0CAAE,WAAW,CAAC,CAAC,CAAC,IAAC,CAAC;QACzE,CAAC;QAED,OAAO,2BAAI,iCAAW,CAAC;IACzB,CAAC;CACF;AAlTD,wCAkTC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3bD,4CAWC;AAaD,wCAuBC;AAqBD,wCAIC;AAkID,wCA2DC;AAKD,kCAuCC;AAUD,8BA8CC;AAKD,4CAGC;AAKD,wDAMC;AA/aD,uEAAkE;AAClE,6EAAsC;AAEtC,2GAAiD;AAEjD,kFAUoB;AAGpB,mEAA6D;AAC7D,mEAAiC;AAajC;;GAEG;AACH,MAAM,gBAAgB,GAAG;IACvB,CAAC,iBAAS,CAAC,GAAG,CAAC,EAAE,KAAK;IACtB,CAAC,iBAAS,CAAC,EAAE,CAAC,EAAE,KAAK;CACb,CAAC;AAOX;;;;;GAKG;AACH,SAAgB,gBAAgB,CAC9B,QAAgB;IAEhB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACvD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,SAAS,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG;QACxC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;KACtC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,cAAc,CAC5B,IAAkB,EAClB,QAAgB;IAEhB,IAAI,IAAI,KAAK,iBAAS,CAAC,EAAE,EAAE,CAAC;QAC1B,sEAAsE;QACtE,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,gEAAgE;QAChE,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,SAAS,EAAE,GAAG;gBACd,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;aAC3B,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO;QACL,SAAS,EAAE,gBAAgB,CAAC,IAAqC,CAAC;QAClE,OAAO,EAAE,QAAQ;KAClB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,IAAI,WAAW,GAAgB,EAAE,CAAC;AAElC;;;;GAIG;AACH,MAAM,YAAY,GAAG,IAAI,GAAG,EAAqB,CAAC;AAElD;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,MAAc;IAC3C,OAAO,MAAM,CAAC,IAAI,KAAK,kBAAU,CAAC,SAAS;QACzC,CAAC,CAAC,iCAAsB;QACxB,CAAC,CAAC,gCAAqB,CAAC;AAC5B,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,UAAU,CAAC,MAAc;IACtC,MAAM,EAAC,OAAO,EAAC,GAAG,MAAM,CAAC,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAE5C,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACxD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,6DAA6D;IAC7D,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,mBAAa,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAE3C,MAAM,WAAW,GAAG,MAAM,gCAAiB,EACzC,IAAI,EACJ;QACE,EAAE,EAAE,WAAK,CAAC,OAAO;QACjB,OAAO,EAAE,WAAK,CAAC,OAAO;KACvB,EACD,WAAW,CACZ,CAAC;IAEF,MAAM,SAAS,GAAG,MAAM,gCAAiB,EACvC,IAAI,EACJ;QACE,EAAE,EAAE,SAAG,CAAC,OAAO;QACf,OAAO,EAAE,SAAG,CAAC,OAAO;KACrB,EACD,WAAW,CACZ,CAAC;IAEF,MAAM,GAAG,GAAG,EAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAC,CAAC;IAC3C,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAE/B,OAAO,GAAG,CAAC;AACb,CAAC;AASD;;;;GAIG;AACH,MAAM,eAAe,GAAG,IAAI,GAAG,EAA+B,CAAC;AAE/D;;;;;;;GAOG;AACH,KAAK,UAAU,aAAa,CAAC,EAC3B,MAAM,EACN,SAAS,EACT,WAAW,EACX,IAAI,GACiB;;IACrB,MAAM,EAAE,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,CAAC,EAAC,EAAE,EAAE,eAAe,EAAC,CAAC,CAAC;IAEnD,MAAM,EAAC,OAAO,EAAC,GAAG,MAAM,CAAC,EAAE,CAAC;IAE5B,MAAM,gBAAgB,GAAG,qBAAe,CAAC,GAAG,CAAC,OAAO,CAAC,mCAAI,IAAI,GAAG,EAAkB,CAAC;IACnF,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAEzD,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,yBAAU,EAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC;IAEnE,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,8BAAe,EAAC,WAAW,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;IAExE,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAC5C,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAE/C,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,MAAM,EAAE,CAAC;IAEb,OAAO,UAAU,CAAC;AACpB,CAAC;AAWD,MAAM,kBAAkB,GAAG,CAAC,IAAe,EAAE,QAAkB,EAAE,EAAE,CACjE,IAAI,KAAK,CAAC,aAAa,IAAI,+BAA+B,QAAQ,EAAE,CAAC,CAAC;AAWxE;;;GAGG;AACI,KAAK,UAAU,cAAc,CAAC,EACnC,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,MAAM,EACN,IAAI,GACkB;IACtB,MAAM,EAAE,GAAG,IAAI;QACb,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAC,EAAE,EAAE,gBAAgB,EAAC,CAAC;QACzC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAC,IAAI,EAAE,gBAAgB,EAAC,CAAC,CAAC;IAEzD,MAAM,EAAC,SAAS,EAAE,OAAO,EAAC,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxD,MAAM,EAAC,WAAW,EAAE,SAAS,EAAC,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,EAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAC,CAAC,CAAC;IAEnF,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,QAAQ,GAAoB,IAAI,CAAC;IAErC,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,yBAAU,EAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,EAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAC,CAAC,CAAC;QAEtF,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;YAC3B,MAAM,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,QAAQ,GAAG,MAAM,yBAAU,EAAC,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC;IAEpE,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QACtB,EAAE,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,6BAAsB,EACvC,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,EAAE,CACH,CAAC;IAEF,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzB,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,uBAAW,EAAC,IAAI,CAAC,CAAC,CAAC;IACtC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACnC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACnC,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtC,EAAE,CAAC,MAAM,EAAE,CAAC;IAEZ,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,WAAW,CAAC,EAChC,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,IAAI,GAC+C;IACnD,MAAM,EAAE,GAAG,IAAI;QACb,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAC,EAAE,EAAE,aAAa,EAAC,CAAC;QACtC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAC,IAAI,EAAE,aAAa,EAAC,CAAC,CAAC;IAEtD,MAAM,EAAC,SAAS,EAAE,OAAO,EAAC,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxD,MAAM,EAAC,WAAW,EAAE,SAAS,EAAC,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,EAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAC,CAAC,CAAC;IAEnF,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,QAAkB,CAAC;IAEvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,yBAAU,EAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,EAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAC,CAAC,CAAC;QAEtF,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;YAC3B,MAAM,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,QAAQ,GAAG,MAAM,yBAAU,EAAC,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzB,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,uBAAW,EAAC,IAAI,CAAC,CAAC,CAAC;IACtC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClC,EAAE,CAAC,MAAM,EAAE,CAAC;IAEZ,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,SAAS,CAAC,EAC9B,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,UAAU,EACV,IAAI,EACJ,SAAS,GACQ;IACjB,MAAM,EAAE,GAAG,IAAI;QACb,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAC,EAAE,EAAE,WAAW,EAAC,CAAC;QACpC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAC,IAAI,EAAE,WAAW,EAAC,CAAC,CAAC;IAEpD,MAAM,EAAC,SAAS,EAAE,OAAO,EAAC,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxD,MAAM,EAAC,WAAW,EAAE,SAAS,EAAC,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,EAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAC,CAAC,CAAC;IAEnF,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,6EAA6E;IAC7E,uDAAuD;IACvD,IAAI,QAAQ,GAAoB,IAAI,CAAC;IAErC,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,yBAAU,EAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,EAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAC,CAAC,CAAC;QAEnF,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,MAAM,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,+CAA+C;QAC/C,QAAQ,GAAG,MAAM,yBAAU,EAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,wBAAa,EAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;IAEjF,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzB,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,uBAAW,EAAC,IAAI,CAAC,CAAC,CAAC;IACtC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClC,EAAE,CAAC,MAAM,EAAE,CAAC;IAEZ,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,MAAc;IAC7C,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IACvC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,MAAmB;IACxD,WAAW,GAAG,MAAM,CAAC;IAErB,KAAK,MAAM,MAAM,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;IACnC,CAAC;AACH,CAAC;;;;;;;;;;;;;;;AChZD,8CAuBC;AA6BD,gCAqBC;AAKD,0CAoBC;AAMD,gCA+BC;AAKD,gCA2BC;AAMD,8BAmDC;AAMD,wCAiDC;AApTD,mEAAgD;AAChD,yEAA0C;AAC1C,mEAA0C;AAG1C;;GAEG;AACH,MAAM,SAAS,GAAG,IAAI,CAAC;AAOvB;;GAEG;AACU,6BAAqB,GAAG,GAAG,CAAC;AAEzC;;;GAGG;AACU,8BAAsB,GAAG,KAAK,CAAC;AAE5C;;GAEG;AACI,KAAK,UAAU,iBAAiB,CACrC,IAAmB,EACnB,OAAgB,EAChB,cAAsB,6BAAqB;IAE3C,MAAM,WAAW,GAAG,IAAI,aAAO,CAAC,OAAO,CAAC;QACtC,OAAO,EAAE,OAAO,CAAC,EAAE;QACnB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,QAAQ,EAAE,EAAE,EAAE,eAAe;QAC7B,IAAI,EAAE,CAAC;KACR,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC;QAC3B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,aAAO,CAAC,OAAO;QACxB,OAAO,EAAE,aAAO,CAAC,OAAO;QACxB,SAAS,EAAE,aAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,KAAK;QAC5C,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE;KAC1B,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAEhC,OAAO,IAAI,gBAAU,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACjE,CAAC;AA0BD;;GAEG;AACI,KAAK,UAAU,UAAU,CAAC,IAAgB,EAAE,IAAW;IAC5D,MAAM,EAAE,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,CAAC,EAAC,EAAE,EAAE,YAAY,EAAC,CAAC,CAAC;IAEhD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC;QAC3B,SAAS,EAAE,WAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK;QACzC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;KACtB,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,WAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,6BAAiB,EAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC;QAC5D,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE;QAC9B,MAAM,EAAE,6BAAiB,EAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;KAC/E,CAAC,CAAC,CAAC;IAEJ,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,MAAM,EAAE,CAAC;IAEb,OAAO,OAAmB,CAAC;AAC7B,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,eAAe,CACnC,IAAgB,EAChB,EAAC,UAAU,EAAS,EACpB,IAAW;IAEX,MAAM,EAAE,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,CAAC,EAAC,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAC,UAAU,EAAC,EAAC,CAAC,CAAC;IAEzE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC;QAC3B,SAAS,EAAE,WAAK,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK;QACxC,IAAI,EAAE,IAAI,WAAK,CAAC,YAAY,CAAC,EAAC,UAAU,EAAC,CAAC,CAAC,KAAK,EAAE;KACnD,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,WAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAED,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,MAAM,EAAE,CAAC;IAEb,OAAO,cAAc,CAAC,OAAO,EAAY,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,UAAU,CAC9B,IAAgB,EAChB,MAAc,EACd,QAAgB,EAChB,IAAW;IAEX,MAAM,EAAE,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,CAAC,EAAC,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAC,CAAC,CAAC;IAEvE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC;QAC3B,SAAS,EAAE,SAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK;QACvC,IAAI,EAAE,IAAI,SAAG,CAAC,eAAe,CAAC,EAAC,MAAM,EAAE,QAAQ,EAAC,CAAC,CAAC,KAAK,EAAE;KAC1D,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,SAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,QAAQ,CAAC,GAAG,EAAE,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC;IAC/C,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,CAAC;IAEnD,MAAM,IAAI,GAAa;QACrB,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,UAAU;QAClB,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE;QACvB,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI;KAC7B,CAAC;IAEF,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,MAAM,EAAE,CAAC;IAEb,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,UAAU,CAC9B,IAAgB,EAChB,UAAkB,EAClB,QAAgB,EAChB,IAAW;IAEX,MAAM,EAAE,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,CAAC,EAAC,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAC,CAAC,CAAC;IAEvE,wEAAwE;IACxE,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEzD,IAAI,MAAM,GAAW,UAAU,CAAC;IAChC,IAAI,IAAc,CAAC;IAEnB,OAAO,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,EAAG,CAAC;QACpC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QAE9D,IAAI,GAAG,QAAQ,CAAC;QAChB,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,MAAM,EAAE,CAAC;IAEb,4EAA4E;IAC5E,aAAa;IACb,OAAO,IAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,SAAS,CAC7B,IAAgB,EAChB,IAAc,EACd,UAA8C,EAC9C,IAAW,EACX,QAAiB;IAEjB,QAAQ,GAAG,QAAQ,IAAI,SAAS,CAAC;IACjC,IAAI,QAAQ,GAAG,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,qDAAqD,QAAQ,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,EAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAC,GAAG,IAAI,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEhC,MAAM,EAAE,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,CAAC;QAC1B,EAAE,EAAE,UAAU;QACd,WAAW,EAAE,IAAI;QACjB,IAAI,EAAE,EAAC,IAAI,EAAC;KACb,CAAC,CAAC;IAEH,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,OAAO,SAAS,GAAG,IAAI,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,IAAI,SAAG,CAAC,QAAQ,CAAC;YAChC,MAAM;YACN,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,QAAQ;YACf,UAAU,EAAE,CAAC;SACd,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC;YAC3B,SAAS,EAAE,SAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK;YACrC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE;SACvB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,SAAG,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,QAAQ,CAAC,GAAG,EAAE,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,iCAAiC,SAAS,MAAM,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC;QAEzC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC5B,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC;QAE3B,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAG,EAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAC,CAAC,CAAC;IAC/C,CAAC;IAED,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,MAAM,EAAE,CAAC;IAEb,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,cAAc,CAClC,IAAgB,EAChB,IAAc,EACd,MAAc,EACd,MAAc,EACd,IAAW;IAEX,MAAM,EAAC,MAAM,EAAE,IAAI,EAAC,GAAG,IAAI,CAAC;IAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAElC,MAAM,EAAE,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,CAAC;QAC1B,EAAE,EAAE,eAAe;QACnB,WAAW,EAAE,IAAI;QACjB,IAAI,EAAE,EAAC,MAAM,EAAE,MAAM,EAAC;KACvB,CAAC,CAAC;IAEH,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,OAAO,SAAS,GAAG,MAAM,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,IAAI,SAAG,CAAC,QAAQ,CAAC;YAChC,MAAM;YACN,MAAM,EAAE,MAAM,GAAG,SAAS;YAC1B,KAAK,EAAE,SAAS;YAChB,UAAU,EAAE,CAAC;SACd,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC;YAC3B,SAAS,EAAE,SAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK;YACrC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE;SACvB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,SAAG,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,QAAQ,CAAC,GAAG,EAAE,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,GAAG,SAAS,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC;QACzC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM;QACR,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC5B,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,MAAM,EAAE,CAAC;IAEb,OAAO,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjE,CAAC;;;;;;;;;;;;;;;;;;ACtTD,4EAAkC;AAClC,mGAAyC;AACzC,wFAAsD;AAGtD,2EAAoC;AAEpC,6EAAyD;AAEzD,mEAA0B;AAE1B;;;GAGG;AACH,MAAM,cAAc,GAAG,UAAU,CAAC;AAElC,MAAM,cAAc,GAAG,IAAI,SAAG,CAAC,QAAQ,CAAC;IACtC,KAAK,EAAE,cAAc;IACrB,IAAI,EAAE,EAAE;IACR,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,EAAE;CACT,CAAC,CAAC;AAuBH;;;GAGG;AACH,MAAa,aAAa;IAOxB,YAAY,OAAe,EAAE,WAAyB;QAFtD,QAAG,GAAG,CAAC,CAAC;QASR,yEAAyE;QACzE,4CAA4C;QAC5C,cAAS,GAAG,IAAI,CAAC;QARf,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,EAAE,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,eAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,GAAG,IAAI,mBAAK,EAAE,CAAC;IAC3B,CAAC;IAMD,YAAY,CAAC,EAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAwB;QACrE,MAAM,IAAI,GAAG,IAAI,SAAG,CAAC,IAAI,CAAC;YACxB,MAAM,EAAE,CAAC;YACT,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE;SAC7B,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,SAAG,CAAC,IAAI,CAAC;YAC5B,MAAM,EAAE,CAAC;YACT,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;SACtB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,IAAI,SAAG,CAAC,OAAO,CAAC;YAC9B,UAAU,EAAE,SAAG,CAAC,OAAO;YACvB,cAAc,EAAE,OAAO;YACvB,OAAO;YACP,SAAS;YACT,IAAI;YACJ,QAAQ;YACR,IAAI;SACL,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,SAAG,CAAC,MAAM,CAAC;YAC5B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,SAAG,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;SACtC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,GAAG,IAAI,EAAU;QACjC,IAAI,CAAC,GAAG,EAAE,CAAC;QAEX,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAEzC,sCAAsC;QACtC,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;YAC7B,MAAM,iBAAO,EAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7E,OAAO,iBAAO,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC,CAAC;QAEF,MAAM,EAAC,kBAAkB,EAAE,GAAG,WAAW,EAAC,GAAG,IAAI,CAAC,WAAW,CAAC;QAE9D,uEAAuE;QACvE,iDAAiD;QACjD,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,6BAAO,EAAC,WAAW,EAAE,EAAE,kBAAkB,aAAlB,kBAAkB,cAAlB,kBAAkB,GAAI,IAAI,CAAC,CAAC;QAEpF,kFAAkF;QAClF,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAC5B,2BAAY,EAAC,WAAW,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;YACtC,IAAI,CAAC;gBACH,OAAO,MAAM,kBAAkB,EAAE,CAAC;YACpC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,8BAAY,EAAE,CAAC;oBAChC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACb,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,CAAC;gBACZ,CAAC;YACH,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC,CAAC;QAEL,gEAAgE;QAChE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;QAE7D,0BAA0B;QAC1B,MAAM,MAAM,GAAG,SAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAExC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC5C,IAAI,OAAO,CAAC,GAAG,EAAE,KAAK,UAAU,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,GAAG,EAAE,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,EAAY,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,kBAAQ,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;CACF;AA3GD,sCA2GC;AAID;;;;GAIG;AACH,MAAa,UAAU;IAMrB,YAAY,IAAmB,EAAE,OAAe,EAAE,OAAe,EAAE,IAAY;QAC7E,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,IAAoB;QACvB,MAAM,EAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAC,GAAG,IAAI,CAAC;QACtC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,EAAC,CAAC,CAAC;IAC3D,CAAC;IAED,UAAU;QACR,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IACzB,CAAC;CACF;AArBD,gCAqBC;;;;;;;;;;;;;;;AC3LD;;GAEG;AACI,MAAM,iBAAiB,GAAG,CAAC,IAAS,EAAO,EAAE,CAAC;IACnD,IAAI;IACJ,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,6BAAiB,EAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;CACvD,CAAC;AAHW,yBAAiB,qBAG5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNF,sEAA8B;AAE9B;;GAEG;AACH,SAAS,gBAAgB,CAAC,MAAc;IACtC,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC;IAC7B,OAAO,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,EAAO,EAAE,OAAe;IAC3C,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,EAAE,CAAC,MAAM,IAAI,OAAO,CAAC;IACvB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,EAAO,EAAE,MAAc;IACxC,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC;IACvB,EAAE,CAAC,MAAM,IAAI,MAAM,CAAC;IACpB,IAAI,EAAE,CAAC,OAAO,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG;IACjB,IAAI,CAAC,EAAO;QACV,2CAA2C;QAC3C,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC;QACzC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACnB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;QACD,uEAAuE;QACvE,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC;QACvB,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC;QACvB,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,KAAU,EAAE,EAAO;QACvB,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,CAAC,KAAU;QAChB,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,aAAa;IACjB,IAAI,CAAC,EAAO;QACV,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAErC,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAEzB,OAAO,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,KAAU,EAAE,EAAO;QACvB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC3C,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC/B,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,KAAU;QAChB,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;IACnC,CAAC;CACF;AAED;;;GAGG;AACU,WAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,GAAQ,EAAE,EAAE;IACzC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAExB,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE;QACtB,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,CAAC;KACZ,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE;QACzB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,CAAC;KACV,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE;QACvB,OAAO,EAAE,CAAC;QACV,kBAAkB,EAAE,CAAC;QACrB,eAAe,EAAE,CAAC;QAClB,kBAAkB,EAAE,CAAC;QACrB,gBAAgB,EAAE,CAAC;QACnB,WAAW,EAAE,CAAC;KACf,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE;QACvB,QAAQ,EAAE,CAAC;QACX,SAAS,EAAE,CAAC;KACb,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE;QACrB,EAAE,EAAE,CAAC;QACL,cAAc,EAAE,CAAC;QACjB,kBAAkB,EAAE,CAAC;QACrB,eAAe,EAAE,CAAC;QAClB,oBAAoB,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;QACV,eAAe,EAAE,CAAC;QAClB,MAAM,EAAE,CAAC;KACV,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE;QACrB,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;KACvC,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE;QACjB,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;KAC7B,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE;QACpB,CAAC,YAAY,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QAC1B,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC,gBAAgB,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC,MAAM,EAAE,UAAU,CAAC;KACrB,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE;QACzB,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;KACrB,CAAC,CAAC;IAEH,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE;QACxB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC;QACpC,UAAU,EAAE,GAAG,CAAC,IAAI,EAAE;QACtB,QAAQ,EAAE;YACR,CAAC,SAAS,EAAE,SAAS,CAAC;YACtB,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;SACvC;QACD,IAAI,EAAE;YACJ,OAAO,EAAE,UAAU;YACnB,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC;SAC5C;KACF,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,kBAAkB,EAAE;QAC7B,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;KACzC,CAAC,CAAC;IAEH,GAAG,CAAC,KAAK,CAAC,kBAAkB,EAAE;QAC5B,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC;QACpC,QAAQ,EAAE;YACR,CAAC,UAAU,EAAE,UAAU,CAAC;YACxB,CAAC,WAAW,EAAE,WAAW,CAAC;SAC3B;QACD,IAAI,EAAE;YACJ,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC;YACpC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC;SACpC;KACF,CAAC,CAAC;IAEH,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE;QACpB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC;QACtC,QAAQ,EAAE;YACR,CAAC,UAAU,EAAE,UAAU,CAAC;YACxB,CAAC,QAAQ,EAAE,QAAQ,CAAC;SACrB;QACD,IAAI,EAAE;YACJ,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC;YACxC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE;SACnB;KACF,CAAC,CAAC;IAEH,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE;QACnB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;QACnC,QAAQ,EAAE;YACR,CAAC,SAAS,EAAE,SAAS,CAAC;YACtB,CAAC,UAAU,EAAE,UAAU,CAAC;SACzB;QACD,IAAI,EAAE;YACJ,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;YAC9B,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC;SACjC;KACF,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE;QACnB,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;KACnC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH;;GAEG;AACU,eAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,GAAQ,EAAE,EAAE;IAC7C,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAExB,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE;QACpB,OAAO,EAAE,CAAC;KACX,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE;QACpB,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;KACrB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH;;GAEG;AACU,aAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,GAAQ,EAAE,EAAE;IAC3C,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAExB,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE;QACpB,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;KACV,CAAC,CAAC;IAEH,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC,CAAC;IACzC,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE1C,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjE,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE;QACnB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;KAC3C,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE;QACvB,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5C,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;KAC/C,CAAC,CAAC;IAEH,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE;QACpB,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE;QACpB,UAAU,EAAE,GAAG,CAAC,IAAI,EAAE;QACtB,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC1B,IAAI,EAAE;YACJ,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC;SAClC;KACF,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrF,CAAC,CAAC,CAAC;AAEH;;GAEG;AACU,WAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,GAAQ,EAAE,EAAE;IACzC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAExB,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE;QACpB,MAAM,EAAE,CAAC;QACT,IAAI,EAAE,CAAC;KACR,CAAC,CAAC;IAEH,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,aAAa,EAAE,CAAC,CAAC;IAC7C,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAE5C,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE;QACnB,IAAI,EAAE,CAAC;QACP,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,CAAC;QACZ,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;KACR,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE;QACtB,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;KACzB,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE;QAC3B,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAChC,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAClC,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAClC,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;KACnC,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,iBAAiB,EAAE;QAC5B,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACpC,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;KACrC,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,yBAAyB,EAAE;QACpC,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACpC,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;KAC7C,CAAC,CAAC;IAEH,GAAG,CAAC,KAAK,CAAC,qBAAqB,EAAE;QAC/B,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE;QACpB,UAAU,EAAE,GAAG,CAAC,IAAI,EAAE;QACtB,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC1B,IAAI,EAAE;YACJ,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,yBAAyB,CAAC;SAC/C;KACF,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE;QACrB,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACpC,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC,YAAY,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;KAC3B,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE;QACrB,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC5C,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;KAChC,CAAC,CAAC;IAEH,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE;QACxB,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE;QACpB,UAAU,EAAE,GAAG,CAAC,IAAI,EAAE;QACtB,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC1B,IAAI,EAAE;YACJ,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC;SAChC;KACF,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;;;;;;;;;;;;;ACrWH;;;GAGG;;AAyEH,0DAGC;AAgCD,kEA+BC;AA6LD,sDAWC;AASD,0DA0BC;AApXD,kFAAuC;AACvC,iDAAgE;AAEhE;;;GAGG;AACH,MAAM,uBAAuB,GAAG;IAC9B,UAAU,EAAE,4BAA4B;IACxC,UAAU,EAAE,aAAa;IACzB,UAAU,EAAE,aAAa;IACzB,UAAU,EAAE,aAAa;IACzB,UAAU,EAAE,yCAAyC;CACtD,CAAC;AAEF;;GAEG;AACH,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,aAAa,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IACxC,OAAO,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAClF,CAAC;AAED;;;GAGG;AACH,SAAS,MAAM,CAAC,IAA0B;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAa,CAAC;IAClC,OAAO,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,CAAC,CAAC;AAC3C,CAAC;AAiBD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,SAAgB,uBAAuB;IACrC,MAAM,OAAO,GAAG,2BAA2B,EAAE,CAAC;IAC9C,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,SAAgB,2BAA2B;IACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,OAAO,GAA0B,EAAE,CAAC;IAC1C,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,sCAAsC;IACtC,IAAI,aAAa,GAA0B,EAAE,CAAC;IAE9C,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,aAAa,GAAG,gCAAgC,EAAE,CAAC;IACrD,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,aAAa,GAAG,kCAAkC,EAAE,CAAC;IACvD,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,4DAA4D;IAC5D,MAAM,kBAAkB,GAAG,4BAA4B,EAAE,CAAC;IAE1D,KAAK,MAAM,KAAK,IAAI,kBAAkB,EAAE,CAAC;QACvC,4DAA4D;QAC5D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,SAAS,gCAAgC;IACvC,IAAI,CAAC;QACH,sDAAsD;QACtD,MAAM,WAAW,GAAG,4BAAQ,EAC1B,2EAA2E,EAC3E,EAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAC,CAClC,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACtD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,kEAAkE;QAClE,MAAM,kBAAkB,GAAG,4BAAQ,EAAC,oCAAoC,EAAE;YACxE,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,4CAA4C;QAC5C,UAAU;QACV,gCAAgC;QAChC,eAAe;QACf,sCAAsC;QACtC,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,gBAAgB,GAAuC,EAAE,CAAC;QAEhE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACzE,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;gBAE1D,IAAI,WAAW,IAAI,QAAQ,EAAE,CAAC;oBAC5B,gBAAgB,CAAC,IAAI,CAAC;wBACpB,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;wBACpB,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;qBACjB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,4DAA4D;QAC5D,MAAM,UAAU,GAAG,0BAAiB,GAAE,CAAC;QACvC,MAAM,OAAO,GAA0B,EAAE,CAAC;QAE1C,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,SAAS;YACX,CAAC;YAED,sBAAsB;YACtB,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEzC,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,GAAG,EAAE,QAAQ,CAAC,GAAG;oBACjB,IAAI,EAAE,SAAS,CAAC,OAAO;oBACvB,IAAI,EAAE,SAAS;oBACf,cAAc,EAAE,KAAK;iBACtB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,wDAAwD;gBACxD,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,UAAU,EAAE,CAAC;oBACf,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,QAAQ,CAAC,IAAI;wBACnB,GAAG,EAAE,QAAQ,CAAC,GAAG;wBACjB,IAAI,EAAE,UAAU;wBAChB,cAAc,EAAE,KAAK;qBACtB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,kCAAkC;;IACzC,IAAI,CAAC;QACH,8DAA8D;QAC9D,iEAAiE;QACjE,MAAM,SAAS,GAAG;;;;;;KAMjB,CAAC;QAEF,MAAM,MAAM,GAAG,4BAAQ,EAAC,wBAAwB,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE;YAChF,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAEpE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,UAAU,GAAG,0BAAiB,GAAE,CAAC;QACvC,MAAM,OAAO,GAA0B,EAAE,CAAC;QAE1C,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;YAClC,wEAAwE;YACxE,8BAA8B;YAC9B,MAAM,SAAS,GAAG,aAAO,CAAC,UAAU,0CAAE,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;YACvE,IAAI,KAAK,GAAG,KAAK,CAAC;YAElB,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACjE,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,SAAS;gBACX,CAAC;gBAED,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;oBAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,SAAS,EAAE,CAAC;wBACzC,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBAE1C,OAAO,CAAC,IAAI,CAAC;4BACX,IAAI,EAAE,SAAS;4BACf,GAAG,EAAE,IAAI,CAAC,GAAG;4BACb,IAAI,EAAE,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,OAAO;4BACxB,IAAI,EAAE,SAAS,IAAI,IAAI;4BACvB,cAAc,EAAE,KAAK;yBACtB,CAAC,CAAC;wBACH,KAAK,GAAG,IAAI,CAAC;wBACb,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM;gBACR,CAAC;YACH,CAAC;YAED,0CAA0C;YAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC3C,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAEzC,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,OAAO,CAAC,IAAI;wBAClB,GAAG,EAAE,OAAO,CAAC,UAAU;wBACvB,IAAI,EAAE,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,OAAO;wBACxB,IAAI,EAAE,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC;wBAC/B,cAAc,EAAE,KAAK;qBACtB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,qBAAqB,CAAC,MAAc;IAClD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oEAAoE;IACpE,4BAA4B;IAC5B,gDAAgD;IAChD,iDAAiD;IACjD,gEAAgE;IAChE,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,uBAAuB,CAAC,aAAqB;IAC3D,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAClE,MAAM,SAAS,GAAG,4BAAQ,EAAC,SAAS,EAAE,EAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC;YAEzE,MAAM,GAAG,GAAa,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,iFAAiF;gBACjF,sEAAsE;gBACtE,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;oBACjC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;oBACvD,IAAI,OAAO,EAAE,CAAC;wBACZ,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;oBACvB,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,SAAS,uBAAuB;IAC9B,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4C,CAAC;IAEnE,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAClE,MAAM,SAAS,GAAG,4BAAQ,EAAC,SAAS,EAAE,EAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC;YACzE,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,iFAAiF;gBACjF,sEAAsE;gBACtE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;gBACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;gBAClD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBAE5C,IAAI,OAAO,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;oBACtC,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;oBACxB,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;wBACzB,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;wBAChC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;wBAC5C,OAAO,CAAC,IAAI,CAAC,EAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAC,CAAC,CAAC;wBACpC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;oBACjC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACxC,sBAAsB;YACtB,MAAM,SAAS,GAAG,4BAAQ,EAAC,QAAQ,EAAE,EAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC;YACxE,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEpC,IAAI,gBAAgB,GAAG,EAAE,CAAC;YAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,qDAAqD;gBACrD,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;gBACzE,IAAI,gBAAgB,EAAE,CAAC;oBACrB,gBAAgB,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;oBACvC,SAAS;gBACX,CAAC;gBAED,uDAAuD;gBACvD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;gBACtE,IAAI,UAAU,IAAI,gBAAgB,EAAE,CAAC;oBACnC,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;oBAC7C,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;wBACzB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;wBACnD,OAAO,CAAC,IAAI,CAAC,EAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,EAAC,CAAC,CAAC;wBACvC,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;oBACxC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,4BAA4B;IACnC,MAAM,iBAAiB,GAAG,uBAAuB,EAAE,CAAC;IAEpD,IAAI,iBAAiB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,UAAU,GAAG,0BAAiB,GAAE,CAAC;IACvC,MAAM,OAAO,GAA0B,EAAE,CAAC;IAE1C,mDAAmD;IACnD,KAAK,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,iBAAiB,EAAE,CAAC;QACxD,6DAA6D;QAC7D,iDAAiD;QACjD,IAAI,aAAa,GAAG,YAAY,CAAC;QACjC,IAAI,SAAS,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;QAEzC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,qDAAqD;YACrD,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzD,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,SAAS;gBACX,CAAC;gBACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;wBAClD,aAAa,GAAG,MAAM,CAAC;wBACvB,SAAS,GAAG,KAAK,CAAC;wBAClB,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS;QACX,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,aAAa;YACnB,GAAG,EAAE,SAAS,CAAC,GAAG;YAClB,IAAI,EAAE,SAAS,CAAC,OAAO;YACvB,IAAI,EAAE,SAAS;YACf,cAAc,EAAE,UAAU;YAC1B,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrfD,6EAAiC;AAGjC,6DAAoC;AAEpC,mFAA6C;AAC7C,uEAAuD;AAIvD;;;;;;GAMG;AACH,SAAS,wBAAwB,CAAC,MAAc,EAAE,IAAgB;IAChE,+BAA+B;IAC/B,IAAI,MAAM,CAAC,OAAO,CAAC,0BAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wDAAwD;IACxD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,yDAAyD;IACzD,MAAM,IAAI,GAAG,MAAM;SAChB,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC;SACtB,QAAQ,EAAE;SACV,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEtB,yDAAyD;IACzD,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;IAE3C,IAAI,QAAgB,CAAC;IACrB,IAAI,UAAsB,CAAC;IAC3B,IAAI,OAAmB,CAAC;IACxB,IAAI,QAAqB,CAAC;IAE1B,IAAI,aAAa,EAAE,CAAC;QAClB,yCAAyC;QACzC,oBAAoB;QACpB,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAExB,mEAAmE;QACnE,6EAA6E;QAC7E,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YACnC,UAAU,GAAG,kBAAU,CAAC,GAAG,CAAC;QAC9B,CAAC;aAAM,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;YAC3B,UAAU,GAAG,kBAAU,CAAC,SAAS,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,kBAAU,CAAC,KAAK,CAAC;QAChC,CAAC;QAED,gCAAgC;QAChC,OAAO,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAE5E,4DAA4D;QAC5D,QAAQ,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;SAAM,CAAC;QACN,kBAAkB;QAClB,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACxB,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,OAAO,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACvD,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,OAAO;QACL,IAAI;QACJ,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,UAAU;QAChB,OAAO;QACP,EAAE,EAAE,QAAQ;KACb,CAAC;AACJ,CAAC;AAYD,MAAM,aAAa,GAAqB;IACtC,aAAa,EAAE,KAAK;CACrB,CAAC;AAEF;;;GAGG;AACH,MAAM,eAAe,GAAG,IAAI,CAAC;AAuB7B;;;;;;GAMG;AACH,MAAa,oBAAoB;IAoB/B,YAAY,OAAoB,EAAE,MAAe;QAnBjD,+CAA0B;QAC1B;;WAEG;QACH,wCAAW,IAAI,GAAG,EAAoB,EAAC;QACvC;;;WAGG;QACH,+CAAkB,IAAI,GAAG,EAA4B,EAAC;QACtD;;WAEG;QACH,wCAAoB,IAAI,qBAAY,EAAE,EAAC;QACvC;;WAEG;QACH,gDAAsB;QAUtB,sCAAsC;QACtC,OAAE,GAAkB,2BAAI,qCAAS,CAAC,WAAW,CAAC,IAAI,CAAC,2BAAI,qCAAS,CAAC,CAAC;QAClE,QAAG,GAAmB,2BAAI,qCAAS,CAAC,cAAc,CAAC,IAAI,CAAC,2BAAI,qCAAS,CAAC,CAAC;QACvE,SAAI,GAAoB,2BAAI,qCAAS,CAAC,IAAI,CAAC,IAAI,CAAC,2BAAI,qCAAS,CAAC,CAAC;QAyD/D,+CAAkB,CAAC,OAAe,EAAE,IAAgB,EAAE,EAAE;YACtD,IAAI,MAAM,CAAC;YACX,IAAI,CAAC;gBACH,MAAM,GAAG,wBAAwB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;gBAC3B,OAAO;YACT,CAAC;YAED,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,OAAO;YACT,CAAC;YAED,mCAAmC;YACnC,IAAI,CAAC,2BAAI,qCAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;gBAClC,2BAAI,qCAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;gBACrC,2BAAI,qCAAS,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAC1C,CAAC;YAED,2BAAI,qCAAS,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAExC,mCAAmC;YACnC,MAAM,aAAa,GAAG,2BAAI,4CAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1D,IAAI,aAAa,EAAE,CAAC;gBAClB,YAAY,CAAC,aAAa,CAAC,CAAC;YAC9B,CAAC;YAED,MAAM,OAAO,GAAG,2BAAI,oCAAQ,CAAC,aAAa,CAAC;YAC3C,MAAM,UAAU,GAAG,UAAU,CAAC,2BAAI,8CAAkB,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACvE,2BAAI,4CAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAClD,CAAC,EAAC;QAEF,iDAAoB,CAAC,aAAqB,EAAE,EAAE;YAC5C,2BAAI,qCAAS,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YACvC,2BAAI,4CAAgB,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAE9C,2BAAI,qCAAS,CAAC,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;QACpD,CAAC,EAAC;QAxGA,2BAAI,gCAAW,EAAC,GAAG,aAAa,EAAE,GAAG,MAAM,EAAC,OAAC;QAC7C,2BAAI,iCAAY,OAAO,OAAC;QAExB,oDAAoD;QACpD,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,2BAAI,4CAAuB,CAAC,CAAC;IACtD,CAAC;IAOD;;OAEG;IACH,IAAI,OAAO;QACT,OAAO,2BAAI,qCAAS,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB,CAAC,EAAY,EAAE,UAAkB,eAAe;QACpE,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE5C,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,cAAc,CAAC;QACxB,CAAC;QAED,IAAI,OAA+C,CAAC;QAEpD,sCAAsC;QACtC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAS,OAAO,CAAC,EAAE;YAClD,OAAO,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;YAClE,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAChC,aAAa;YACb,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;SAC3D,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,OAAQ,CAAC,CAAC;QAEhC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,MAAc;QACxB,2BAAI,gCAAW,EAAC,GAAG,2BAAI,oCAAQ,EAAE,GAAG,MAAM,EAAC,OAAC;IAC9C,CAAC;IAED;;OAEG;IACH,IAAI;QACF,2BAAI,qCAAS,CAAC,GAAG,CAAC,UAAU,EAAE,2BAAI,4CAAuB,CAAC,CAAC;QAE3D,qBAAqB;QACrB,KAAK,MAAM,OAAO,IAAI,2BAAI,4CAAgB,CAAC,MAAM,EAAE,EAAE,CAAC;YACpD,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QACD,2BAAI,4CAAgB,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;CAwCF;AA9HD,oDA8HC;;AAED,qBAAe,oBAAoB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpBpC,gDAIC;AAeD,wCA6BC;AA3RD,iDAAgE;AAGhE,yFAAiD;AAEjD,mFAA+C;AAC/C,mFAA+C;AAC/C,kGAA2C;AAC3C,sFAAkD;AAClD,sFAAiD;AACjD,gFAA8C;AAE9C,0FAKsB;AAHpB,qJAA2B;AAC3B,6IAAuB;AACvB,6IAAuB;AAEzB,iFAA+C;AAAvC,oIAAoB;AAC5B,iFAA+C;AAAvC,oIAAoB;AAC5B,gGAA0E;AAAtD,uHAAW;AAC/B,oFAAkD;AAA1C,yIAAsB;AAC9B,oFAAiD;AAAzC,uIAAqB;AAC7B,8EAA8C;AAAtC,mIAAoB;AA6B5B;;;;;;;;;;;;;;GAcG;AACH,MAAa,qBAAqB;IAShC,YAAY,MAA4B;;QARxC,iDAAsB;QACtB,uDAAqC;QACrC,uDAAqC;QACrC,yDAAyC;QACzC,iDAA+B;QAC/B,0CAA0C,IAAI,EAAC;QAC/C,2CAAwC,IAAI,EAAC;QAG3C,2BAAI,kCAAY,IAAI,0BAAW,CAAC;YAC9B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC,OAAC;QAEH,+EAA+E;QAC/E,2BAAI,wCAAkB,IAAI,8BAAoB,CAC5C,2BAAI,sCAAS,EACb,MAAM,CAAC,aAAa,KAAK,SAAS;YAChC,CAAC,CAAC,EAAC,aAAa,EAAE,MAAM,CAAC,aAAa,EAAC;YACvC,CAAC,CAAC,SAAS,CACd,OAAC;QAEF,2BAAI,wCAAkB,IAAI,6BAAoB,CAAC,2BAAI,sCAAS,CAAC,OAAC;QAC9D,2BAAI,0CAAoB,IAAI,iCAAsB,CAAC,2BAAI,sCAAS,CAAC,OAAC;QAClE,2BAAI,kCAAY,IAAI,8BAAoB,CACtC,2BAAI,4CAAe,EACnB,2BAAI,4CAAe,EACnB,YAAM,CAAC,kBAAkB,mCAAI,MAAM,CACpC,OAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,2BAAI,sCAAS,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAI;;QACF,2BAAI,4CAAe,CAAC,IAAI,EAAE,CAAC;QAC3B,2BAAI,4CAAe,CAAC,IAAI,EAAE,CAAC;QAC3B,2BAAI,8CAAiB,CAAC,IAAI,EAAE,CAAC;QAC7B,2BAAI,sCAAS,CAAC,IAAI,EAAE,CAAC;QACrB,iCAAI,uCAAU,0CAAE,IAAI,EAAE,CAAC;QACvB,2BAAI,sCAAS,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,IAAI,WAAW;QACb,OAAO,2BAAI,sCAAS,CAAC,WAAW,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,IAAI,aAAa;QACf,OAAO,2BAAI,sCAAS,CAAC,aAAa,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,IAAI,OAAO;QACT,OAAO,2BAAI,sCAAS,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,IAAI,aAAa;QACf,OAAO,2BAAI,4CAAe,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,IAAI,aAAa;QACf,OAAO,2BAAI,4CAAe,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,IAAI,eAAe;QACjB,OAAO,2BAAI,8CAAiB,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,IAAI,OAAO;QACT,OAAO,2BAAI,sCAAS,CAAC;IACvB,CAAC;IAED;;;;;;;;;OASG;IACH,IAAI,QAAQ;QACV,IAAI,2BAAI,uCAAU,KAAK,IAAI,EAAE,CAAC;YAC5B,2BAAI,mCAAa,IAAI,gCAAqB,CAAC,2BAAI,4CAAe,CAAC,OAAC;QAClE,CAAC;QACD,OAAO,2BAAI,uCAAU,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,IAAI,SAAS;QACX,IAAI,2BAAI,wCAAW,KAAK,IAAI,EAAE,CAAC;YAC7B,2BAAI,oCAAc,IAAI,8BAAkB,EAAE,OAAC;YAC3C,2BAAI,4CAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,WAAC,wCAAI,wCAAW,0CAAE,WAAW,CAAC,CAAC,CAAC,IAAC,CAAC;QACzE,CAAC;QACD,OAAO,2BAAI,wCAAW,CAAC;IACzB,CAAC;CACF;AArID,sDAqIC;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,SAAgB,kBAAkB,CAAC,MAA4B;IAC7D,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAClD,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAgB,cAAc;IAK5B,MAAM,UAAU,GAAG,0BAAiB,GAAE,CAAC;IACvC,MAAM,MAAM,GAAiE,EAAE,CAAC;IAEhF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,KAA+B,EAAE,CAAC;YACnD,6CAA6C;YAC7C,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7C,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI;oBACJ,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,gEAAgE;oBAChE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC;wBAC9C,CAAC,CAAC,0BAA0B;wBAC5B,CAAC,CAAC,SAAS;iBACd,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3RD,4EAAkC;AAGlC,6DAAkC;AAClC,6DAAoC;AACpC,6DAAyB;AACzB,6DAAyB;AACzB,mEAA6B;AAE7B,mFAAmE;AAEnE,sGAAyD;AACzD,iFAA4C;AAC5C,mGAAyE;AACzE,uEAAiD;AACjD,uEAOmB;AACnB,6EAAsC;AACtC,2GAAiD;AAqDjD;;;GAGG;AACH,MAAM,UAAU,GAAG,CAAC,IAAmB,EAAE,EAAE;IACzC,MAAM,MAAM,GAAG;QACb,IAAI,CAAC,QAAQ;QACb,IAAI,CAAC,IAAI;QACT,IAAI,CAAC,IAAI;QACT,IAAI,CAAC,SAAS;QACd,IAAI,CAAC,UAAU;QACf,IAAI,CAAC,UAAU;QACf,IAAI,CAAC,WAAW;KACjB,CAAC;IAEF,OAAO,uBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAa,oBAAoB;IAe/B,YACE,aAAmC,EACnC,aAAmC,EACnC,aAAiC,MAAM;QAjBzC,sDAAqC;QACrC,sDAAqC;QACrC,wCAAoB,IAAI,qBAAY,EAAE,EAAC;QACvC,0CAAa,IAAI,GAAG,EAAiB,EAAC;QACtC,oCAAuB,EAAE,EAAC;QAC1B;;WAEG;QACH,2CAAc,IAAI,GAAG,EAAyB,EAAC;QAC/C;;WAEG;QACH,2CAAkC,MAAM,EAAC;QA6BzC,sCAAsC;QACtC,OAAE,GAAkB,2BAAI,qCAAS,CAAC,WAAW,CAAC,IAAI,CAAC,2BAAI,qCAAS,CAAC,CAAC;QAClE,QAAG,GAAmB,2BAAI,qCAAS,CAAC,cAAc,CAAC,IAAI,CAAC,2BAAI,qCAAS,CAAC,CAAC;QACvE,SAAI,GAAoB,2BAAI,qCAAS,CAAC,IAAI,CAAC,IAAI,CAAC,2BAAI,qCAAS,CAAC,CAAC;QA+C/D,gDAAmB,CAAC,IAAmB,EAAE,EAAE;YACzC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5C,2BAAI,wCAAY,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC,EAAC;QAEF,oDAAuB,CAAC,MAAc,EAAE,EAAE;YACxC,MAAM,EAAE,GAAG,2BAAI,iCAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;YACjE,IAAI,EAAE,EAAE,CAAC;gBACP,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;oBAChB,IAAI,CAAC;wBACH,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;oBAC7B,CAAC;oBAAC,MAAM,CAAC;wBACP,wBAAwB;oBAC1B,CAAC;gBACH,CAAC;YACH,CAAC;YACD,2BAAI,6BAAQ,2BAAI,iCAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,CAAC,OAAC;YAEpE,qCAAqC;YACrC,KAAK,MAAM,GAAG,IAAI,2BAAI,wCAAY,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC1C,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;oBACpC,2BAAI,wCAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC,EAAC;QAEF;;WAEG;QACH,sDAAyB,KAAK,EAC5B,MAAc,EACd,IAAkB,EAClB,QAAgB,EAChB,EAA2B,EACV,EAAE;YACnB,MAAM,YAAY,GAChB,OAAO,CAAC,QAAQ,KAAK,OAAO;gBAC1B,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC5B,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC;YAEjC,IAAI,CAAC;gBACH,OAAO,MAAM,mBAAS,EAAC;oBACrB,MAAM;oBACN,IAAI;oBACJ,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;oBACrB,IAAI,EAAE,EAAE;oBACR,UAAU,EAAE,QAAQ,CAAC,EAAE,CACrB,2BAAI,qCAAS,CAAC,IAAI,CAAC,eAAe,EAAE,EAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAC,CAAC;iBAChE,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,mBAAS,EAAC;oBACf,MAAM;oBACN,IAAI;oBACJ,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;oBACrB,IAAI,EAAE,EAAE;oBACR,UAAU,EAAE,QAAQ,CAAC,EAAE,CACrB,2BAAI,qCAAS,CAAC,IAAI,CAAC,eAAe,EAAE,EAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAC,CAAC;iBAChE,CAAC,CAAC;YACL,CAAC;QACH,CAAC,EAAC;QAEF;;WAEG;QACH,kDAAqB,KAAK,EACxB,MAAc,EACd,IAAkB,EAClB,EAA2B,EACqC,EAAE;YAClE,MAAM,cAAc,GAAG,oCAAoC,CAAC;YAE5D,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,2BAAI,mDAAuB,MAA3B,IAAI,EAAwB,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;gBAEnF,MAAM,OAAO,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CACxB,OAAO,EACP,sBAAsB,MAAM,CAAC,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,KAAK,CAC3D,CAAC;gBACF,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAEnC,MAAM,OAAO,GAAG,IAAI,8BAAiB,CAAC,QAAQ,CAAC,CAAC;gBAChD,OAAO,EAAC,OAAO,EAAE,QAAQ,EAAC,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC,EAAC;QAEF;;WAEG;QACH,gDAAmB,KAAK,EACtB,MAAc,EACd,IAAkB,EAClB,EAA2B,EACL,EAAE;YACxB,MAAM,OAAO,GAAG,8BAA8B,CAAC;YAC/C,MAAM,OAAO,GAAG,MAAM,2BAAI,mDAAuB,MAA3B,IAAI,EAAwB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YAE7E,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,EAAC,EAAE,EAAE,eAAe,EAAC,CAAC,CAAC;YACxD,MAAM,GAAG,GAAG,IAAI,iBAAW,EAAE,CAAC;YAC9B,UAAU,CAAC,MAAM,EAAE,CAAC;YAEpB,MAAM,+BAAe,EAAC;gBACpB,GAAG;gBACH,OAAO;gBACP,IAAI,EAAE,EAAE;gBACR,UAAU,EAAE,QAAQ,CAAC,EAAE,CACrB,2BAAI,qCAAS,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAC,CAAC;aACpE,CAAC,CAAC;YAEH,OAAO,GAAG,CAAC;QACb,CAAC,EAAC;QAEF,gDAAmB,KAAK,EAAE,MAAc,EAAE,IAAkB,EAAE,KAAoB,EAAE,EAAE;YACpF,MAAM,EAAE,GAAG,SAAS,CAAC,gBAAgB,CAAC,EAAC,IAAI,EAAE,iBAAiB,EAAC,CAAC,CAAC;YAEjE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,uBAAW,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3C,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrD,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,2BAAI,wCAAY,CAAC,CAAC;YAE1C,IAAI,OAAwB,CAAC;YAC7B,IAAI,QAA4B,CAAC;YAEjC,IAAI,2BAAI,wCAAY,KAAK,KAAK,EAAE,CAAC;gBAC/B,OAAO,GAAG,MAAM,2BAAI,6CAAiB,MAArB,IAAI,EAAkB,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;gBACxD,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC7B,CAAC;iBAAM,IAAI,2BAAI,wCAAY,KAAK,YAAY,EAAE,CAAC;gBAC7C,MAAM,gBAAgB,GAAG,MAAM,2BAAI,+CAAmB,MAAvB,IAAI,EAAoB,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;gBACzE,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACtB,MAAM,IAAI,KAAK,CACb,wEAAwE,CACzE,CAAC;gBACJ,CAAC;gBACD,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC;gBACnC,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC;gBACrC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,+CAA+C;gBAC/C,MAAM,gBAAgB,GAAG,MAAM,2BAAI,+CAAmB,MAAvB,IAAI,EAAoB,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;gBAEzE,IAAI,gBAAgB,EAAE,CAAC;oBACrB,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC;oBACnC,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC;oBACrC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;gBACpC,CAAC;qBAAM,CAAC;oBACN,OAAO,GAAG,MAAM,2BAAI,6CAAiB,MAArB,IAAI,EAAkB,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;oBACxD,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YAED,2BAAI,qCAAS,CAAC,IAAI,CAAC,eAAe,EAAE,EAAC,MAAM,EAAE,IAAI,EAAC,CAAC,CAAC;YAEpD,MAAM,EAAE,GAAiB,EAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAC,CAAC;YAC3E,2BAAI,iCAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEnB,EAAE,CAAC,MAAM,EAAE,CAAC;YAEZ,OAAO,EAAE,CAAC;QACZ,CAAC,EAAC;QAxOA,2BAAI,uCAAkB,aAAa,OAAC;QACpC,2BAAI,uCAAkB,aAAa,OAAC;QACpC,2BAAI,oCAAe,UAAU,OAAC;QAE9B,aAAa,CAAC,EAAE,CAAC,cAAc,EAAE,2BAAI,iDAAqB,CAAC,CAAC;QAC5D,aAAa,CAAC,EAAE,CAAC,WAAW,EAAE,2BAAI,6CAAiB,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACZ,OAAO,2BAAI,wCAAY,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,IAAI,UAAU,CAAC,KAAyB;QACtC,2BAAI,oCAAe,KAAK,OAAC;IAC3B,CAAC;IAOD;;;OAGG;IACH,cAAc,CAAC,QAAkB,EAAE,IAAkB;QACnD,MAAM,GAAG,GAAG,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC;QAClC,OAAO,2BAAI,wCAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,KAAK,CAAC,IAAI,CAAC,2BAAI,wCAAY,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,MAAc;QAChC,2BAAI,iDAAqB,MAAzB,IAAI,EAAsB,MAAM,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,IAAI;QACF,2BAAI,2CAAe,CAAC,GAAG,CAAC,cAAc,EAAE,2BAAI,iDAAqB,CAAC,CAAC;QACnE,2BAAI,2CAAe,CAAC,GAAG,CAAC,WAAW,EAAE,2BAAI,6CAAiB,CAAC,CAAC;QAE5D,yDAAyD;QACzD,KAAK,MAAM,EAAE,IAAI,2BAAI,iCAAK,EAAE,CAAC;YAC3B,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;gBAChB,IAAI,CAAC;oBACH,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;gBAC7B,CAAC;gBAAC,MAAM,CAAC;oBACP,wBAAwB;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;QACD,2BAAI,6BAAQ,EAAE,OAAC;QACf,2BAAI,wCAAY,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAoKD;;;;;;;;;;OAUG;IACH,GAAG,CAAC,QAAkB,EAAE,IAAkB;QACxC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,2BAAI,2CAAe,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEzD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QACtD,CAAC;QAED,oDAAoD;QACpD,kEAAkE;QAClE,mCAAmC;QACnC,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,YAAY,CAChB,MAAc,EACd,IAAkB,EAClB,KAAoB;;QAEpB,MAAM,OAAO,GAAG,GAAG,MAAM,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;QACvC,MAAM,IAAI,GACR,iCAAI,uCAAW,CAAC,GAAG,CAAC,OAAO,CAAC,mCAC5B,2BAAI,uCAAW,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,mBAAK,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;QAE1D,IACE,MAAM,CAAC,IAAI,KAAK,kBAAU,CAAC,GAAG;YAC9B,MAAM,CAAC,EAAE,GAAG,6BAAiB;YAC7B,MAAM,CAAC,EAAE,GAAG,6BAAiB,EAC7B,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,KAAK,CAAC,UAAU,KAAK,iBAAS,CAAC,EAAE,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAE7B,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE;YACtC,MAAM,MAAM,GAAG,2BAAI,iCAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAClD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,OAAO,2BAAI,6CAAiB,MAArB,IAAI,EAAkB,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,CAAC,OAAO,CAAC;IACpB,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,eAAe,CAAC,MAAc,EAAE,IAAkB;;QACtD,MAAM,OAAO,GAAG,GAAG,MAAM,CAAC,EAAE,IAAI,IAAI,UAAU,CAAC;QAC/C,MAAM,IAAI,GACR,iCAAI,uCAAW,CAAC,GAAG,CAAC,OAAO,CAAC,mCAC5B,2BAAI,uCAAW,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,mBAAK,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;QAE1D,IACE,MAAM,CAAC,IAAI,KAAK,kBAAU,CAAC,GAAG;YAC9B,MAAM,CAAC,EAAE,GAAG,6BAAiB;YAC7B,MAAM,CAAC,EAAE,GAAG,6BAAiB,EAC7B,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,kEAAkE;QAClE,MAAM,UAAU,GAAG,2BAAI,iCAAK,CAAC,IAAI,CAC/B,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAChE,CAAC;QACF,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,UAAU,CAAC,OAAO,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE;gBACtC,iCAAiC;gBACjC,MAAM,MAAM,GAAG,2BAAI,iCAAK,CAAC,IAAI,CAC3B,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAChE,CAAC;gBACF,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,MAAM,CAAC;gBAChB,CAAC;gBAED,gEAAgE;gBAChE,2CAA2C;gBAC3C,MAAM,cAAc,GAAkB;oBACpC,QAAQ,EAAE,MAAM,CAAC,EAAE;oBACnB,IAAI;oBACJ,IAAI,EAAE,eAAe;oBACrB,KAAK,EAAE,CAAC;oBACR,WAAW,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;oBACxB,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;oBACpB,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;oBACrB,UAAU,EAAE,iBAAS,CAAC,EAAE;oBACxB,UAAU,EAAE,CAAC;oBACb,aAAa,EAAE,CAAC;oBAChB,WAAW,EAAE,KAAK;iBACnB,CAAC;gBAEF,OAAO,2BAAI,6CAAiB,MAArB,IAAI,EAAkB,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;YAC7D,CAAC,CAAC,CAAC;YAEH,OAAO,EAAE,CAAC,OAAO,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,MAAM,UAAU,GAAG,CAAC,GAAG,2BAAI,2CAAe,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAClC,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,IAAI,KAAK,kBAAU,CAAC,GAAG;YAC9B,MAAM,CAAC,EAAE,IAAI,6BAAiB;YAC9B,MAAM,CAAC,EAAE,IAAI,6BAAiB,CACjC,CAAC;QAEF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CACtC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,iBAAS,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,iBAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CACrF,CAAC;QAEF,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;CACF;AA/ZD,oDA+ZC;;AAED,qBAAe,oBAAoB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzgBpC,6DAAoC;AACpC,iDAAqC;AAErC,mFAAoE;AAuGpE;;;;;;;;;GASG;AACH,MAAa,WAAW;IAOtB,YAAY,MAAyB;;QANrC,+BAAoB,IAAI,qBAAY,EAAE,EAAC;QACvC,2BAA2B,IAAI,EAAC;QAChC,sCAAgB;QAChB,qCAAe;QACf,+BAAW,KAAK,EAAC;QAOjB,sCAAsC;QACtC,OAAE,GAAkB,2BAAI,4BAAS,CAAC,WAAW,CAAC,IAAI,CAAC,2BAAI,4BAAS,CAAC,CAAC;QAClE,QAAG,GAAmB,2BAAI,4BAAS,CAAC,cAAc,CAAC,IAAI,CAAC,2BAAI,4BAAS,CAAC,CAAC;QACvE,SAAI,GAAoB,2BAAI,4BAAS,CAAC,IAAI,CAAC,IAAI,CAAC,2BAAI,4BAAS,CAAC,CAAC;QAP7D,2BAAI,sBAAU,MAAM,CAAC,KAAK,OAAC;QAC3B,2BAAI,uBAAW,MAAM,CAAC,KAAK,CAAC,YAAM,CAAC,UAAU,mCAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,OAAC,CAAC,eAAe;IACrF,CAAC;IAOD;;;OAGG;IACH,KAAK;QACH,IAAI,2BAAI,4BAAS,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,yEAAyE;QACzE,IAAI,GAAc,CAAC;QACnB,IAAI,CAAC;YACH,iEAAiE;YACjE,GAAG,GAAG,mBAAO,CAAC,gBAAK,CAAc,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,iDAAiD;gBAC/C,oCAAoC;gBACpC,kEAAkE,CACrE,CAAC;QACJ,CAAC;QAED,MAAM,EAAC,GAAG,EAAE,QAAQ,EAAC,GAAG,GAAG,CAAC;QAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAEnC,2BAAI,oBAAQ,IAAI,GAAG,EAAE,OAAC;QAEtB,0EAA0E;QAC1E,sEAAsE;QACtE,IAAI,UAAU,GAAG,2BAAI,0BAAO,CAAC;QAC7B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACzE,MAAM,QAAQ,GAAG,uBAAuB,CAAC,2BAAI,0BAAO,EAAE,GAAG,CAAC,CAAC;YAC3D,IAAI,QAAQ,EAAE,CAAC;gBACb,UAAU,GAAG,QAAQ,CAAC;YACxB,CAAC;QACH,CAAC;QAED,uCAAuC;QACvC,MAAM,MAAM,GAAG,iBAAiB,yBAAa,YAAY,qBAAS,YAAY,uBAAW,GAAG,CAAC;QAE7F,IAAI,CAAC;YACH,2BAAI,wBAAK,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,2BAAI,2BAAQ,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,6BAA6B,2BAAI,0BAAO,cAAc,UAAU,wBAAwB;gBACtF,kEAAkE;gBAClE,mBAAmB,GAAG,EAAE,CAC3B,CAAC;QACJ,CAAC;QAED,oDAAoD;QACpD,IAAI,OAAO,2BAAI,wBAAK,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;YAChD,2BAAI,wBAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;QAED,2BAAI,wBAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAc,EAAE,SAAkB,EAAE,EAAE;YAC5D,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YAED,IAAI,CAAC;gBACH,wBAAwB;gBACxB,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,2BAAI,2BAAQ,CAAC,CAAC;gBAClD,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACnD,OAAO;gBACT,CAAC;gBAED,oBAAoB;gBACpB,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,2BAAI,2BAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC/D,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;oBAC/C,OAAO;gBACT,CAAC;gBAED,mBAAmB;gBACnB,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,2BAAI,2BAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC9D,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;gBACvC,MAAM,gBAAgB,GAAG,SAAS,CAAC,MAAM,CAAC;gBAC1C,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,wBAAwB;gBAEzE,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;oBACvB,OAAO;gBACT,CAAC;gBAED,oEAAoE;gBACpE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBAC5C,2BAAI,2BAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,aAAa,CAAC,CAAC;gBAElF,iFAAiF;gBACjF,MAAM,IAAI,GAAe;oBACvB,OAAO;oBACP,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO;iBAC/B,CAAC;gBAEF,wDAAwD;gBACxD,QAAQ,OAAO,EAAE,CAAC;oBAChB,KAAK,yBAAa;wBAChB,2BAAI,4BAAS,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;wBAC9C,MAAM;oBACR,KAAK,qBAAS;wBACZ,2BAAI,4BAAS,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;wBAC1C,MAAM;oBACR,KAAK,uBAAW;wBACd,2BAAI,4BAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;wBAC5C,MAAM;gBACV,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,2BAAI,4BAAS,CAAC,IAAI,CAAC,OAAO,EAAE,GAAY,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,2BAAI,wBAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;YACnC,2BAAI,4BAAS,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,2BAAI,wBAAY,IAAI,OAAC;IACvB,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,2BAAI,wBAAK,EAAE,CAAC;YACd,2BAAI,wBAAK,CAAC,KAAK,EAAE,CAAC;YAClB,2BAAI,oBAAQ,IAAI,OAAC;QACnB,CAAC;QACD,2BAAI,wBAAY,KAAK,OAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAI,WAAW;QACb,OAAO,2BAAI,4BAAS,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,IAAI,aAAa;QACf,OAAO,2BAAI,0BAAO,CAAC;IACrB,CAAC;CACF;AA9JD,kCA8JC;;AAED;;;;;;;GAOG;AACH,SAAS,uBAAuB,CAAC,SAAiB,EAAE,GAAmB;IACrE,6DAA6D;IAC7D,MAAM,cAAc,GAAG,0BAAiB,GAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,SAAS;SACN,MAAM,CAAC,CAAC,CAAC,EAAE,CAAE,CAAC,CAAC,MAAc,KAAK,MAAM,IAAK,CAAC,CAAC,MAAc,KAAK,CAAC,CAAC;SACpE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CACvB,CAAC;IAEF,IAAI,iBAAiB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,yEAAyE;IACzE,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;IACpC,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,SAAS;QACX,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,IAAI,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,OAAO,MAAM,CAAC,IAAI,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qBAAe,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9T3B,6DAAoC;AAEpC,qFAAoD;AAepD;;;;;;;GAOG;AACH,MAAa,sBAAsB;IAIjC,YAAY,OAAoB;QAHhC,0CAAoB,IAAI,qBAAY,EAAE,EAAC;QACvC,kDAAsB;QAOtB,sCAAsC;QACtC,OAAE,GAAkB,2BAAI,uCAAS,CAAC,WAAW,CAAC,IAAI,CAAC,2BAAI,uCAAS,CAAC,CAAC;QAClE,QAAG,GAAmB,2BAAI,uCAAS,CAAC,cAAc,CAAC,IAAI,CAAC,2BAAI,uCAAS,CAAC,CAAC;QACvE,SAAI,GAAoB,2BAAI,uCAAS,CAAC,IAAI,CAAC,IAAI,CAAC,2BAAI,uCAAS,CAAC,CAAC;QAS/D,iDAAkB,CAAC,OAAe,EAAE,KAAiB,EAAE,EAAE;YACvD,MAAM,QAAQ,GAAG,8BAAkB,EAAC,OAAO,CAAC,CAAC;YAE7C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,2BAAI,uCAAS,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC,EAAC;QAtBA,2BAAI,mCAAY,OAAO,OAAC;QACxB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,2BAAI,8CAAuB,CAAC,CAAC;IAClD,CAAC;IAOD;;OAEG;IACH,IAAI;QACF,2BAAI,uCAAS,CAAC,GAAG,CAAC,MAAM,EAAE,2BAAI,8CAAuB,CAAC,CAAC;IACzD,CAAC;CASF;AA5BD,wDA4BC;;AAED,qBAAe,sBAAsB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzDtC,4EAAkC;AAClC,sGAA2C;AAE3C,oDAA2B;AAE3B,sFAA2E;AAC3E,qGAAkE;AAClE,4FAAsD;AACtD,qGAA6C;AAC7C,yGAAuD;AAEvD,2GAAiD;AAIjD;;;GAGG;AACH,KAAK,UAAU,qBAAqB,CAAC,QAAgB;IACnD,MAAM,IAAI,GAAG,IAAI,wBAAa,CAAC,IAAI,YAAM,EAAE,CAAC,CAAC;IAC7C,MAAM,IAAI,CAAC,OAAO,CAAC,sCAA0B,EAAE,QAAQ,CAAC,CAAC;IAEzD,qEAAqE;IACrE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACvB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QAC3B,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC;QACzC,IAAI;KACL,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAE/B,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IAErB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAa,qBAAqB;IAahC,YAAY,aAAmC,EAAE,eAAe,GAAG,CAAC;QAZpE,uDAAqC;QACrC,yDAAyB;QAEzB;;WAEG;QACH,6CAAe,IAAI,GAAG,EAAwB,EAAC;QAC/C;;WAEG;QACH,6CAAe,IAAI,GAAG,EAAmB,EAAC;QAGxC,2BAAI,wCAAkB,aAAa,OAAC;QACpC,2BAAI,0CAAoB,eAAe,OAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,MAAc;QAClC,MAAM,EAAE,GAAG,SAAS,CAAC,gBAAgB,CAAC;YACpC,IAAI,EAAE,wBAAwB;YAC9B,IAAI,EAAE,EAAC,MAAM,EAAC;SACf,CAAC,CAAC;QAEH,MAAM,EAAC,EAAE,EAAC,GAAG,MAAM,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,IAAI,wBAAa,CAAC,IAAI,YAAM,EAAE,CAAC,CAAC;QAC/C,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;QAEzC,gEAAgE;QAChE,MAAM,QAAQ,GAAG,IAAI,eAAM,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEpC,sEAAsE;QACtE,MAAM,IAAI,GAAG,MAAM,sBAAS,EAAC,MAAM,EAAE,eAAM,CAAC,IAAI,CAAC,CAAC;QAElD,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,gDAAgD,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,uDAAuD;QACvD,MAAM,KAAK,GAAG,IAAI,iBAAO,CAAC;YACxB,aAAa,EAAE,UAAU;YACzB,IAAI,EAAE,mBAAW,CAAC,SAAS;YAC3B,IAAI,EAAE,CAAC,IAAI,eAAM,CAAC,2BAAI,8CAAiB,CAAC,CAAC;SAC1C,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,iBAAO,CAAC,UAAU,CAAC,MAAM,EAAE,mBAAW,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAEvE,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAW,CAAC,OAAO,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,0CAA0C,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,2BAAI,0CAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,qBAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACjE,EAAE,CAAC,MAAM,EAAE,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CAAC,MAAc;QACvC,MAAM,IAAI,GAAG,2BAAI,0CAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE9C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,SAAS,CAAC,gBAAgB,CAAC;gBACpC,IAAI,EAAE,6BAA6B;gBACnC,IAAI,EAAE,EAAC,MAAM,EAAC;aACf,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC;gBAC1B,aAAa,EAAE,UAAU;gBACzB,IAAI,EAAE,mBAAW,CAAC,UAAU;gBAC5B,IAAI,EAAE,EAAE;aACT,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACrC,EAAE,CAAC,MAAM,EAAE,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,2BAAI,0CAAa,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,GAAG,CAAC,QAAkB;;QAC1B,MAAM,MAAM,GAAG,2BAAI,4CAAe,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GACR,iCAAI,0CAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,mCAChC,2BAAI,0CAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,mBAAK,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAE,CAAC;QAEhE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAEzC,IAAI,IAAI,GAAG,2BAAI,0CAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;gBACnC,IAAI,GAAG,2BAAI,0CAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACzC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;gBACd,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QAED,WAAW,EAAE,CAAC;QAEd,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,uDAAuD;QACvD,MAAM,iBAAiB,GAAW;YAChC,EAAE,EAAE,2BAAI,8CAAiB;YACzB,IAAI,EAAE,oBAAoB;YAC1B,IAAI,EAAE,IAAI,EAAE,WAAW;YACvB,OAAO,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3C,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,0CAA0C;SAC1D,CAAC;QAEF,OAAO,IAAI,yBAAc,CAAC,IAAI,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAC3D,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,gBAAgB,CACpB,QAAkB,EAClB,SAAoB,EACpB,SAAoB,EACpB,OAAe;QAEf,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,eAAe,GAAG;YACtB,SAAS;YACT,SAAS;YACT,UAAU,EAAE,qBAAU,CAAC,IAAI;SAC5B,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;gBAC7B,eAAe;gBACf,KAAK,EAAE,gBAAK,CAAC,WAAW;gBACxB,IAAI,EAAE,EAAC,OAAO,EAAC;aAChB,CAAC,CAAC;YAEH,mEAAmE;YACnE,IAAI,CAAC;gBACH,KAAK,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;oBAChC,eAAe;oBACf,KAAK,EAAE,gBAAK,CAAC,YAAY;oBACzB,IAAI,EAAE,EAAC,OAAO,EAAC;iBAChB,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,mDAAmD;YACrD,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,6CAA6C;YAC7C,2BAAI,0CAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACnC,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,uBAAuB,CAC3B,QAAkB,EAClB,SAAoB,EACpB,SAAoB,EACpB,OAAe;QAEf,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,eAAe,GAAG;YACtB,SAAS;YACT,SAAS;YACT,UAAU,EAAE,qBAAU,CAAC,IAAI;SAC5B,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;gBAC7B,eAAe;gBACf,KAAK,EAAE,gBAAK,CAAC,kBAAkB;gBAC/B,IAAI,EAAE,EAAC,OAAO,EAAC;aAChB,CAAC,CAAC;YAEH,8CAA8C;YAC9C,IAAI,CAAC;gBACH,KAAK,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;oBAChC,eAAe;oBACf,KAAK,EAAE,gBAAK,CAAC,YAAY;oBACzB,IAAI,EAAE,EAAC,OAAO,EAAC;iBAChB,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,0DAA0D;YAC5D,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,2BAAI,0CAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACnC,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI;QACF,KAAK,MAAM,IAAI,IAAI,2BAAI,0CAAa,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;QACD,2BAAI,0CAAa,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;CACF;AA/PD,sDA+PC;;AAED,qBAAe,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxTrC,6DAAoC;AAEpC,qFAAwF;AAsBxF;;;;;;;;;GASG;AACH,MAAa,oBAAoB;IAI/B,YAAY,OAAoB;QAHhC,wCAAoB,IAAI,qBAAY,EAAE,EAAC;QACvC,gDAAsB;QAOtB,sCAAsC;QACtC,OAAE,GAAkB,2BAAI,qCAAS,CAAC,WAAW,CAAC,IAAI,CAAC,2BAAI,qCAAS,CAAC,CAAC;QAClE,QAAG,GAAmB,2BAAI,qCAAS,CAAC,cAAc,CAAC,IAAI,CAAC,2BAAI,qCAAS,CAAC,CAAC;QACvE,SAAI,GAAoB,2BAAI,qCAAS,CAAC,IAAI,CAAC,IAAI,CAAC,2BAAI,qCAAS,CAAC,CAAC;QAS/D,6CAAgB,CAAC,OAAe,EAAE,KAAiB,EAAE,EAAE;YACrD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,4BAAgB,EAAC,OAAO,CAAC,CAAC;gBAEzC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,OAAO,2BAAI,qCAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC9C,CAAC;gBAED,oDAAoD;gBACpD,MAAM,SAAS,GAAG,+BAAmB,EAAC,OAAO,CAAC,CAAC;gBAE/C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;oBAC5B,OAAO,2BAAI,qCAAS,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;gBACpD,CAAC;gBAED,2DAA2D;gBAC3D,MAAM,KAAK,GAAG,2BAAe,EAAC,OAAO,CAAC,CAAC;gBAEvC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,OAAO,2BAAI,qCAAS,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;YAC7B,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC,EAAC;QA1CA,2BAAI,iCAAY,OAAO,OAAC;QACxB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,2BAAI,0CAAqB,CAAC,CAAC;IAClD,CAAC;IAOD;;OAEG;IACH,IAAI;QACF,2BAAI,qCAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,2BAAI,0CAAqB,CAAC,CAAC;IACzD,CAAC;CA6BF;AAhDD,oDAgDC;;AAED,qBAAe,oBAAoB,CAAC;;;;;;;;;;;;;;;ACtFpC;;GAEG;AACU,sBAAc,GAAG,UAAU,CAAC;AAEzC;;GAEG;AACU,kCAA0B,GAAG,KAAK,CAAC;;;;;;;;;;;;;;;;;;;ACoNhD,8BAyBC;AAnPD,MAAM,SAAS,GAAG,IAAI,CAAC;AAEvB;;GAEG;AACH,IAAY,SAMX;AAND,WAAY,SAAS;IACnB,4CAAY;IACZ,8CAAa;IACb,8CAAa;IACb,8CAAa;IACb,8CAAa;AACf,CAAC,EANW,SAAS,yBAAT,SAAS,QAMpB;AAED,MAAsB,SAAS;CA6B9B;AA7BD,8BA6BC;AA2BD,MAAM,aAAa,GAAG,MAAM,CAAC,WAAW,CACtC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACjD,CAAC;AAEF,MAAM,gBAAgB,GAAG;IACvB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,WAAW,CAAC;IACjD,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,cAAc,CAAC;IACxD,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,cAAc,CAAC;CAChD,CAAC;AAEX,SAAS,WAAW,CAAC,KAAsB,EAAE,IAAqB;IAChE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEjC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAe,EAAE,SAAiB,EAAE,YAAqB;IACnF,4DAA4D;IAC5D,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,CAAC,aAAa,CAAC,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAE3D,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAE3B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,eAAe,GAAG,CAAC,IAAqB,EAAE,EAAE;;IAChD,MAAM,MAAM,SAAG,KAAM,SAAQ,SAAS;YAMpC,YAAY,KAAsB;gBAChC,KAAK,EAAE,CAAC;gBACR,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBAChD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;gBACjB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;YACtB,CAAC;YAED,IAAI,MAAM;gBACR,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3C,CAAC;SACF;;QAfQ,OAAI,GAAG,IAAK;QACZ,cAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE;WAchD,CAAC;IAEF,yEAAyE;IACzE,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,EAAC,CAAC,CAAC;IAEpE,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF;;GAEG;AACU,aAAK,GAAG,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAEtD;;GAEG;AACU,cAAM,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAExD;;GAEG;AACU,cAAM,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAExD;;GAEG;AACH,MAAa,MAAO,SAAQ,SAAS;IASnC,YAAY,KAAsB;QAChC,KAAK,EAAE,CAAC;QACR,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,SAAS,EAAE,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;YAC/D,OAAO;QACT,CAAC;QAED,iEAAiE;QACjE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC1E,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;IACpB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,kBAAkB,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/E,CAAC;;AAxBH,wBAyBC;AAxBQ,WAAI,GAAG,SAAS,CAAC,MAAe,CAAC;AAExC,4EAA4E;AAC5E,+CAA+C;AACxC,kBAAW,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAsBtD;;GAEG;AACH,MAAa,MAAO,SAAQ,SAAS;IAMnC,YAAY,KAAa;QACvB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;IACjC,CAAC;IAED,IAAI,MAAM;QACR,OAAO,kBAAkB,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;;AAbH,wBAcC;AAbQ,WAAI,GAAG,SAAS,CAAC,MAAe,CAAC;AACjC,kBAAW,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC;AAchD,MAAM,QAAQ,GAAG;IACf,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,aAAK;IACxB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,cAAM;IAC1B,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,cAAM;IAC1B,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM;IAC1B,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM;CAClB,CAAC;AAEX;;;;;GAKG;AACH,KAAK,UAAU,IAAI,CAAC,MAA4B,EAAE,KAAa;IAC7D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEtC,IAAI,IAAI,YAAY,MAAM,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,SAAS,CAG7B,MAA4B,EAAE,MAAS;IACvC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAc,CAAC,CAAC;IAEjD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,YAAY,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,YAAY,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,aAAqB,CAAC;IAE1B,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC1C,aAAa,GAAG,KAAK,CAAC,WAAW,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,yEAAyE;QACzE,gBAAgB;QAChB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACzC,aAAa,GAAG,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,IAAI,GAAG,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAEvF,OAAO,IAAI,KAAK,CAAC,IAAI,CAAM,CAAC;AAC9B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9LD,oCAEC;AAzDD,4EAAkC;AAElC,sGAA2C;AAE3C,oDAA2B;AAK3B,2GAAiD;AAEjD,8FAA+E;AAC/E,0FAAuD;AACvD,iFAA2C;AAC3C,0FAAkC;AAClC,oFAAoE;AAIpE;;;GAGG;AACH,IAAY,UAEX;AAFD,WAAY,UAAU;IACpB,2CAAW;AACb,CAAC,EAFW,UAAU,0BAAV,UAAU,QAErB;AAuBY,aAAK,GAAG,eAAO,CAAC;AAE7B,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,aAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEtF;;GAEG;AACH,SAAgB,YAAY,CAAC,KAAY;IACvC,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAqBD;;;GAGG;AACH,KAAK,UAAU,qBAAqB,CAAC,QAAqB;IACxD,MAAM,IAAI,GAAG,IAAI,wBAAa,CAAC,IAAI,YAAM,EAAE,CAAC,CAAC;IAC7C,MAAM,IAAI,CAAC,OAAO,CAAC,sCAA0B,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAEjE,sEAAsE;IACtE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACvB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QAC3B,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC;QACzC,IAAI;KACL,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAE/B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAa,UAAU;IAOrB,YAAY,MAAc,EAAE,MAA6B;QANzD,qCAA+B;QAC/B,2BAAQ,CAAC,EAAC;QACV,2BAAQ,IAAI,mBAAK,EAAE,EAAC;QAKlB,2BAAI,sBAAW,MAAM,OAAC;QACtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAgB,EAAE,IAAU;;QAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YACzB,EAAE,EAAE,cAAc;YAClB,WAAW,EAAE,0BAAc,EAAC,OAAO,CAAC,IAAI,CAAC;SAC1C,CAAC,CAAC;QAEH,OAAO,CAAC,aAAa,GAAG,gDAAE,wDAAU,EAAZ,IAAY,QAAC;QACrC,MAAM,2BAAI,0BAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzC,EAAE,CAAC,MAAM,EAAE,CAAC;IACd,CAAC;IAED,WAAW,CAAqB,MAAS,EAAE,IAAU;QACnD,OAAO,2BAAI,wBAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,iBAAO,CAAC,UAAU,CAAC,2BAAI,0BAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IACvF,CAAC;IAED,KAAK;QACH,2BAAI,0BAAQ,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC;CACF;AA9BD,gCA8BC;;AAED,MAAa,cAAc;IAKzB,YAAY,IAAgB,EAAE,IAAW,EAAE,UAAkB;QAJ7D,uCAAkB;QAClB,6CAAoB;QACpB,uCAAa;QAGX,2BAAI,wBAAS,IAAI,OAAC;QAClB,2BAAI,wBAAS,IAAI,OAAC;QAClB,2BAAI,8BAAe,UAAU,OAAC;IAChC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAkB,IAAkB;QAC7C,MAAM,EAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,EAAC,GAAG,IAAI,CAAC;QAClD,MAAM,IAAI,GAAG,2BAAI,4BAAM,CAAC;QAExB,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE3C,MAAM,EAAE,GAAG,IAAI;YACb,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAC,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAC,CAAC;YAC9D,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAC,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAC,CAAC,CAAC;QAE9E,MAAM,gBAAgB,GAAqB;YACzC,GAAG,eAAe;YAClB,UAAU,EAAE,2BAAI,kCAAY;YAC5B,YAAY,EAAE,2BAAI,4BAAM,CAAC,MAAM;SAChC,CAAC;QAEF,+EAA+E;QAC/E,+EAA+E;QAC/E,QAAQ;QACR,MAAM,OAAO,GAAG,IAAW,CAAC;QAE5B,MAAM,OAAO,GAAG,uBAAa,CAAC,KAAK,CAAC,CAAC;QAErC,MAAM,WAAW,GAAG,MAAM,2BAAI,4BAAM,CAAC,OAAO,EAAE,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,EAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAC,CAAC,CAAC;YAClF,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,QAAmC,CAAC;QAC7C,CAAC;gBAAS,CAAC;YACT,WAAW,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;CACF;AA9CD,wCA8CC;;AAED;;GAEG;AACH,MAAqB,cAAc;IAajC,YAAY,aAA4B,EAAE,UAAkB;QAZ5D,6CAAoB;QACpB,gDAA8B;QAE9B;;WAEG;QACH,sCAAe,IAAI,GAAG,EAAwB,EAAC;QAC/C;;WAEG;QACH,sCAAe,IAAI,GAAG,EAAmB,EAAC;QAO1C;;WAEG;QACH,oBAAe,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;YACzC,MAAM,EAAE,GAAG,SAAS,CAAC,gBAAgB,CAAC,EAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAC,MAAM,EAAC,EAAC,CAAC,CAAC;YAEjF,MAAM,EAAC,EAAE,EAAC,GAAG,MAAM,CAAC;YAEpB,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,EAAE,CAAC,CAAC;YAE/C,MAAM,MAAM,GAAG,IAAI,wBAAa,CAAC,IAAI,YAAM,EAAE,CAAC,CAAC;YAE/C,sDAAsD;YACrD,MAAM,CAAC,MAAiB,CAAC,UAAU,CAAC,KAAM,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;gBAC5C,MAAM,CAAC,MAAiB,CAAC,OAAO,CAC/B,IAAI,KAAK,CAAC,0BAA0B,EAAE,CAAC,OAAO,IAAI,MAAM,YAAY,CAAC,CACtE,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;YAEzC,gEAAgE;YAChE,MAAM,QAAQ,GAAG,IAAI,eAAM,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAEpC,sEAAsE;YACtE,wCAAwC;YACxC,MAAM,IAAI,GAAG,MAAM,sBAAS,EAAC,MAAM,EAAE,eAAM,CAAC,IAAI,CAAC,CAAC;YAElD,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,gDAAgD,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAChF,CAAC;YAED,wDAAwD;YACxD,MAAM,KAAK,GAAG,IAAI,iBAAO,CAAC;gBACxB,aAAa,EAAE,UAAU;gBACzB,IAAI,EAAE,mBAAW,CAAC,SAAS;gBAC3B,IAAI,EAAE,CAAC,IAAI,eAAM,CAAC,2BAAI,kCAAY,CAAC,EAAE,CAAC,CAAC;aACxC,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,iBAAO,CAAC,UAAU,CAAC,MAAM,EAAE,mBAAW,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAEvE,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAW,CAAC,OAAO,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,0CAA0C,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YACzE,CAAC;YAED,0EAA0E;YAC1E,oEAAoE;YACnE,MAAM,CAAC,MAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAExC,2BAAI,mCAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YACjE,EAAE,CAAC,MAAM,EAAE,CAAC;QACd,CAAC,CAAC;QAEF;;WAEG;QACH,yBAAoB,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;YAC9C,MAAM,EAAE,GAAG,SAAS,CAAC,gBAAgB,CAAC,EAAC,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,EAAC,MAAM,EAAC,EAAC,CAAC,CAAC;YAEtF,MAAM,IAAI,GAAG,2BAAI,mCAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAE9C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC;gBAC1B,aAAa,EAAE,UAAU;gBACzB,IAAI,EAAE,mBAAW,CAAC,UAAU;gBAC5B,IAAI,EAAE,EAAE;aACT,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAErC,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,2BAAI,mCAAa,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACpC,EAAE,CAAC,MAAM,EAAE,CAAC;QACd,CAAC,CAAC;QAnFA,2BAAI,iCAAkB,aAAa,OAAC;QACpC,2BAAI,8BAAe,UAAU,OAAC;IAChC,CAAC;IAmFD;;;;;;;OAOG;IACH,KAAK,CAAC,GAAG,CAAC,QAAkB;;QAC1B,MAAM,MAAM,GAAG,2BAAI,qCAAe,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GACR,iCAAI,mCAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,mCAChC,2BAAI,mCAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,mBAAK,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAE,CAAC;QAEhE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAEzC,IAAI,CAAC;YACH,IAAI,IAAI,GAAG,2BAAI,mCAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC3C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YACrC,CAAC;YAED,IAAI,GAAG,2BAAI,mCAAa,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;YAExC,kEAAkE;YAClE,8DAA8D;YAE9D,OAAO,IAAI,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,2BAAI,kCAAY,CAAC,CAAC;QAC1D,CAAC;gBAAS,CAAC;YACT,WAAW,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;CACF;;qBAvIoB,cAAc;;;;;;;;;;;;;;;ACjMnC,+FAAsE;AAGtE,qGAAsD;AACtD,4FAQ6B;AAC7B,kHAAgE;AAChE,yGAAiF;AAEjF;;;;;;GAMG;AACH,IAAK,YAIJ;AAJD,WAAK,YAAY;IACf,mDAAa;IACb,mDAAa;IACb,mDAAa;AACf,CAAC,EAJI,YAAY,KAAZ,YAAY,QAIhB;AAED;;GAEG;AACH,MAAM,SAAS,GAAG,EAAE,CAAC;AAErB,MAAM,YAAY,GAAG;IACnB,CAAC,kBAAS,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,MAAM;IACvC,CAAC,kBAAS,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,MAAM;IACvC,CAAC,kBAAS,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,MAAM;IAEvC,2EAA2E;IAC3E,+EAA+E;IAC/E,kCAAkC;IAClC,CAAC,kBAAS,CAAC,KAAK,CAAC,EAAE,IAAI;IACvB,CAAC,kBAAS,CAAC,MAAM,CAAC,EAAE,IAAI;CACzB,CAAC;AAEF,MAAM,YAAY,GAAG;IACnB,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,kBAAS,CAAC,MAAM;IACvC,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,kBAAS,CAAC,MAAM;IACvC,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,kBAAS,CAAC,MAAM;CACxC,CAAC;AAWF;;GAEG;AACH,MAAa,OAAO;IAClB;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,UAAU,CACrB,MAA4B,EAC5B,MAAS,EACT,IAAU;;QAEV,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YACzB,EAAE,EAAE,gBAAgB;YACpB,WAAW,EAAE,0BAAc,EAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,uBAAuB;QACvB,MAAM,WAAW,GAAG,MAAM,sBAAS,EAAC,MAAM,EAAE,kBAAS,CAAC,MAAM,CAAC,CAAC;QAE9D,IAAI,WAAW,CAAC,KAAK,KAAK,0BAAc,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QAED,0BAA0B;QAC1B,MAAM,IAAI,GAAG,MAAM,sBAAS,EAAC,MAAM,EAAE,kBAAS,CAAC,MAAM,CAAC,CAAC;QAEvD,wBAAwB;QACxB,MAAM,WAAW,GAAG,MAAM,sBAAS,EAAC,MAAM,EAAE,kBAAS,CAAC,MAAM,CAAC,CAAC;QAE9D,0BAA0B;QAC1B,MAAM,QAAQ,GAAG,MAAM,sBAAS,EAAC,MAAM,EAAE,kBAAS,CAAC,KAAK,CAAC,CAAC;QAE1D,yBAAyB;QACzB,MAAM,OAAO,GAAG,MAAM,sBAAS,EAAC,MAAM,EAAE,kBAAS,CAAC,MAAM,CAAC,CAAC;QAE1D,kCAAkC;QAClC,MAAM,IAAI,GAAY,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAEhD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;YACxC,wEAAwE;YACxE,uEAAuE;YACvE,gBAAgB;YAChB,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,MAAM,IAAI,WAAI,CAAC,CAAC,GAAG,CAAC,CAAC,0CAAE,KAAK,MAAK,CAAC,EAAE,CAAC;gBACzE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,eAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtC,SAAS;YACX,CAAC;YAED,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,sBAAS,EAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAiB,CAAC,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,WAAW,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAE9C,EAAE,CAAC,SAAS,CAAC,sBAAU,CAAC,kBAAkB,CAAC,CAAC;YAC5C,EAAE,CAAC,MAAM,EAAE,CAAC;YAEZ,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,WAAW,MAAM,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,EAAE,CAAC,MAAM,EAAE,CAAC;QAEZ,OAAO,IAAI,OAAO,CAAC;YACjB,aAAa,EAAE,IAAI,CAAC,KAAK;YACzB,IAAI,EAAE,WAAW,CAAC,KAAU;YAC5B,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAUD,YAAY,EAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAa;QACjD,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,IAAI,MAAM;;QACR,sDAAsD;QACtD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEtE,yEAAyE;QACzE,sEAAsE;QACtE,wEAAwE;QACxE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAU,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;YACtD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAEjC,MAAM,aAAa,GACjB,GAAG,CAAC,WAAW,CAAC,IAAI,KAAK,kBAAS,CAAC,MAAM;gBACzC,CAAC,KAAK,CAAC;gBACP,OAAO,CAAC,WAAW,CAAC,IAAI,KAAK,kBAAS,CAAC,MAAM;gBAC7C,OAAO,CAAC,KAAK,KAAK,CAAC,CAAC;YAEtB,OAAO,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,MAAM,GAAG;YACb,IAAI,eAAM,CAAC,0BAAc,CAAC;YAC1B,IAAI,eAAM,CAAC,UAAI,CAAC,aAAa,mCAAI,CAAC,CAAC;YACnC,IAAI,eAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YACrB,IAAI,cAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YAC3B,IAAI,eAAM,CAAC,OAAO,CAAC;YACnB,GAAG,IAAI;SACR,CAAC;QAEF,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;IAED;;;;OAIG;IACH,IAAI,IAAI;QACN,MAAM,IAAI,GAAG,IAAI,CAAC,IAAuB,CAAC;QAE1C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,CAAC;QAED,OAAO,4BAAiB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAY,CAAC;IACvD,CAAC;CACF;AAlID,0BAkIC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClMD,2GAAiD;AAIjD;;GAEG;AACH,IAAY,QAsEX;AAtED,WAAY,QAAQ;IAClB,uCAAa;IACb,2CAAe;IACf,mDAAmB;IACnB,uCAAa;IACb,mDAAmB;IACnB,yCAAc;IACd,2CAAe;IACf,+CAAiB;IACjB,4CAAe;IACf,gDAAiB;IACjB,0CAAc;IACd,0CAAc;IACd,sCAAY;IACZ,8CAAgB;IAChB,wCAAa;IACb,8CAAgB;IAChB,8DAAwB;IACxB,4DAAuB;IACvB,8CAAgB;IAChB,kDAAkB;IAClB,kDAAkB;IAClB,kDAAkB;IAElB,kDAAkB;IAClB,kDAAkB;IAClB,gDAAiB;IACjB,sDAAoB;IACpB,sDAAoB;IACpB,oDAAmB;IACnB,kDAAkB;IAClB,kDAAkB;IAClB,sDAAoB;IAEpB,mDAAkB;IAClB,qDAAmB;IACnB,mDAAkB;IAClB,mDAAkB;IAClB,yDAAqB;IACrB,+CAAgB;IAChB,qDAAmB;IACnB,iDAAiB;IACjB,uDAAoB;IACpB,mDAAkB;IAClB,yDAAqB;IACrB,+CAAgB;IAChB,mDAAkB;IAClB,qDAAmB;IACnB,qDAAmB;IACnB,iDAAiB;IACjB,+CAAgB;IAChB,yDAAqB;IACrB,uDAAoB;IACpB,+CAAgB;IAEhB,+DAAwB;IACxB,gEAAwB;IACxB,kEAAyB;IACzB,kEAAyB;IACzB,8DAAuB;IACvB,4DAAsB;IACtB,gEAAwB;IACxB,4DAAsB;IACtB,oEAA0B;IAC1B,gEAAwB;IACxB,oEAA0B;IAC1B,mFAAiC;IACjC,qEAA0B;IAC1B,6EAA8B;IAC9B,iFAAgC;AAClC,CAAC,EAtEW,QAAQ,wBAAR,QAAQ,QAsEnB;AAoBD;;;GAGG;AACH,MAAM,YAAY,GAAG,CAAC,IAAc,EAAE,EAAE,CAAC,CAAC;IACxC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK;IACvB,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK;IACrB,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK;IACrB,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK;IACrB,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK;IACnB,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK;CACzB,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,SAAS,GAAG,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IAClC,EAAE,EAAE,CAAC,CAAC,MAAM;IACZ,IAAI,EAAE,CAAC,CAAC,MAAM;CACf,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,aAAa,GAAG;IACpB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,EAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAC,CAAC;IACpD,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;QACvC,EAAE,EAAE,CAAC,CAAC,MAAM;QACZ,KAAK,EAAE,CAAC,CAAC,MAAM;QACf,SAAS,EAAE,CAAC,CAAC,SAAS;KACvB,CAAC;IACF,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS;IAChC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS;IAC5B,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS;IAC3B,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS;IAC3B,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS;IACzB,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS;IACpC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS;IAC7B,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,EAAC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAC,CAAC;IAC1D,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,EAAC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAC,CAAC;IAC1D,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAC,CAAC;IAC5D,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,EAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAC,CAAC;IACxD,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,EAAC,GAAG,EAAE,CAAC,CAAC,MAAM,GAAG,GAAG,EAAC,CAAC;IAC1D,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,EAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAC,CAAC;IAC5D,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,IAAI;IAC3C,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,IAAI;IAE3C,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS;IAC/B,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS;IAC/B,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS;IAC9B,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS;IACjC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS;IACjC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS;IAChC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS;IAC/B,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS;IAC/B,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS;IAEjC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS;IAC5B,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS;IAE9B,4CAA4C;IAC5C,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IAEnC,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IAC3C,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IAC3C,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IAC3C,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;CACvD,CAAC;AAeF;;;GAGG;AACI,MAAM,YAAY,GAAG,CAAC,IAAa,EAAE,EAAE;IAC5C,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAgB,CAAC,CAAC;IAChD,MAAM,EAAC,IAAI,EAAC,GAAG,QAAQ,CAAC;IAExB,IAAI,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAEtC,4EAA4E;IAC5E,oBAAoB;IACpB,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,WAAW,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;QAEzB,SAAS,CAAC,cAAc,CACtB,gDAAgD,IAAI,EAAE,EACtD,SAAS,CAAC,QAAQ,CAAC,KAAK,CACzB,CAAC;IACJ,CAAC;IAED,OAAO,EAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAoB,CAAC;AAC7D,CAAC,CAAC;AAlBW,oBAAY,gBAkBvB;;;;;;;;;;;;;;;AC5OF,uFAAmD;AAEnD,sGAAuD;AACvD,yGAAoD;AASpD,kGAK8B;AAE9B;;GAEG;AACH,MAAM,aAAa,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,IAAI,CAAC;AAE/C;;;GAGG;AACH,MAAM,cAAc,GAAG,CAAC,IAAa,EAAE,EAAE,CAAC,CAAC;IACzC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAe;CACxC,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,cAAc,GAAG,CAAC,IAAa,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAe,CAAC;AAElE;;GAEG;AACH,MAAM,eAAe,GAAG,CAAC,IAAa,EAAY,EAAE;IAClD,MAAM,cAAc,GAAG,IAAI,CAAC;IAC5B,MAAM,IAAI,GAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAgB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAI7D,OAAO,gCAAe,EAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC3D,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,CAAC,CAAC;QACzC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,GAAG;QAC5C,KAAK,EAAE,IAAI,CAAC,UAAU,CAAU;KACjC,CAAC,CAAC,CAAC;AACN,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,sBAAsB,GAAG,CAAC,IAAa,EAAmB,EAAE;IAChE,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAe,CAAC;IAErC,wEAAwE;IACxE,MAAM,gBAAgB,GAAG,GAAG,CAAC;IAE7B,OAAO,gCAAe,EAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAChE,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC;QACxB,SAAS,EAAE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC;KACpC,CAAC,CAAC,CAAC;AACN,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,uBAAuB,GAAG,CAAC,IAAa,EAAoB,EAAE;IAClE,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAe,CAAC;IAErC,uEAAuE;IACvE,2EAA2E;IAC3E,yEAAyE;IACzE,oBAAoB;IACpB,EAAE;IACF,iCAAiC;IACjC,iCAAiC;IACjC,MAAM,aAAa,GAAG,UAAU,CAAC,CAAC,kBAAkB;IACpD,MAAM,UAAU,GAAM,UAAU,CAAC,CAAC,kBAAkB;IAEpD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,EAAE,+BAAc,EAAC,CAAC,EAAE,UAAU,CAAC;QACrC,SAAS,EAAE,6BAAY,EAAC,CAAC,EAAE,aAAa,CAAC;KAC1C,CAAC,CAAC,CAAC;AACN,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,iBAAiB,GAAG,CAAC,IAAa,EAAc,EAAE;IACtD,2CAA2C;IAC3C,MAAM,cAAc,GAAG,IAAI,CAAC;IAC5B,MAAM,IAAI,GAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAgB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAE7D,yEAAyE;IACzE,iDAAiD;IAEjD,OAAO,sCAAqB,EAAC,IAAI,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,kBAAkB,GAAG,CAAC,IAAa,EAAgB,EAAE;IACzD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAe,CAAC;IAErC,OAAO,gCAAe,EAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;SACtC,GAAG,CAAC,UAAU,CAAC,EAAE;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC;QAExD,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,KAAK,CAAC,CAAC,CAAkB,CAAC;QAEnE,MAAM,cAAc,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,cAAc,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC;QAEjE,yEAAyE;QACzE,+CAA+C;QAC/C,MAAM,MAAM,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;QAC7C,MAAM,MAAM,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;QAE7C,OAAO,4BAAgB,EAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,qBAAqB,GAAG,CAAC,IAAa,EAAgB,EAAE;IAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAe,CAAC;IACrC,MAAM,OAAO,GAAG,EAAE,CAAC;IAEnB,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,GAAI,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;QAClD,MAAM,IAAI,MAAM,CAAC;IACnB,CAAC;IAED,OAAO,OAAO;SACX,GAAG,CAAC,KAAK,CAAC,EAAE;QACX,oBAAoB;QACpB,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,qEAAqE;QACrE,+CAA+C;QAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,KAAK,CAAC,CAAC,CAAkB,CAAC;QACnE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;QAChC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;QAEjC,MAAM,cAAc,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,cAAc,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC;QAEjE,yEAAyE;QACzE,+CAA+C;QAC/C,MAAM,MAAM,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;QAC7C,MAAM,MAAM,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;QAE7C,MAAM,UAAU,GAAG,4BAAgB,EAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAE3E,2EAA2E;QAC3E,wCAAwC;QACxC,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC1B,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,MAAM,eAAe,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,KAAK;aAChB,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,eAAe,CAAC;aACnC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aACZ,QAAQ,CAAC,SAAS,CAAC,CAAC;QAEvB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,GAAG,eAAe,GAAG,IAAI,CAAC,CAAC;QAEnD,OAAO,EAAC,GAAG,UAAU,EAAE,KAAK,EAAE,KAAK,EAAC,CAAC;IACvC,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AAChD,CAAC,CAAC;AAEW,yBAAiB,GAAG;IAC/B,CAAC,gBAAQ,CAAC,OAAO,CAAC,EAAE,cAAc;IAClC,CAAC,gBAAQ,CAAC,KAAK,CAAC,EAAE,aAAa;IAC/B,CAAC,gBAAQ,CAAC,UAAU,CAAC,EAAE,aAAa;IACpC,CAAC,gBAAQ,CAAC,UAAU,CAAC,EAAE,aAAa;IAEpC,CAAC,gBAAQ,CAAC,QAAQ,CAAC,EAAE,mBAAY;IACjC,CAAC,gBAAQ,CAAC,OAAO,CAAC,EAAE,cAAc;IAClC,CAAC,gBAAQ,CAAC,QAAQ,CAAC,EAAE,eAAe;IACpC,CAAC,gBAAQ,CAAC,UAAU,CAAC,EAAE,kBAAkB;IACzC,CAAC,gBAAQ,CAAC,eAAe,CAAC,EAAE,sBAAsB;IAClD,CAAC,gBAAQ,CAAC,gBAAgB,CAAC,EAAE,uBAAuB;IACpD,CAAC,gBAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB;IACxC,CAAC,gBAAQ,CAAC,cAAc,CAAC,EAAE,qBAAqB;CACxC,CAAC;;;;;;;;;;;;;;;AChFX,wCAEC;AA3HD;;GAEG;AACH,IAAY,cAIX;AAJD,WAAY,cAAc;IACxB,6DAAkB;IAClB,iEAAmB;IACnB,mEAAmB;AACrB,CAAC,EAJW,cAAc,8BAAd,cAAc,QAIzB;AAED;;GAEG;AACH,IAAY,WA2CX;AA3CD,WAAY,WAAW;IACrB,wDAAiB;IACjB,0DAAkB;IAClB,4DAAmB;IACnB,0DAAkB;IAClB,0DAAkB;IAClB,sDAAgB;IAChB,4DAAmB;IACnB,wDAAiB;IACjB,0DAAkB;IAClB,0DAAkB;IAClB,wDAAiB;IACjB,8DAAoB;IACpB,8DAAoB;IACpB,gEAAqB;IACrB,sDAAgB;IAChB,4EAA2B;IAC3B,8DAAoB;IACpB,gEAAqB;IACrB,4EAA2B;IAC3B,4EAA2B;IAC3B,0EAA0B;IAC1B,4EAA2B;IAC3B,0EAA0B;IAC1B,4EAA2B;IAC3B,0EAA0B;IAC1B,wEAAyB;IACzB,8EAA4B;IAC5B,4EAA2B;IAC3B,4FAAmC;IACnC,8EAA4B;IAC5B,4FAAmC;IACnC,4FAAmC;IACnC,8FAAoC;IACpC,0FAAkC;IAClC,4FAAmC;IACnC,0EAA0B;IAC1B,4GAA2C;IAC3C,8FAAoC;IACpC,sGAAwC;IACxC,sGAAwC;IACxC,4DAAmB;IACnB,4DAAmB;AACrB,CAAC,EA3CW,WAAW,2BAAX,WAAW,QA2CtB;AAED;;GAEG;AACH,IAAY,WAWX;AAXD,WAAY,WAAW;IACrB,8DAAoB;IACpB,4DAAmB;IACnB,4EAA2B;IAC3B,gEAAqB;IACrB,4EAA2B;IAC3B,oEAAuB;IACvB,8DAAoB;IACpB,+EAA4B;IAC5B,2EAA0B;IAC1B,mEAAsB;AACxB,CAAC,EAXW,WAAW,2BAAX,WAAW,QAWtB;AAED;;GAEG;AACH,IAAY,QAaX;AAbD,WAAY,QAAQ;IAClB,iDAAgB;IAChB,6CAAc;IACd,iDAAgB;IAChB,mDAAiB;IACjB,uDAAmB;IACnB,uDAAmB;IACnB,mDAAiB;IACjB,uDAAmB;IACnB,iEAAwB;IACxB,mEAAyB;IACzB,+DAAuB;IACvB,uDAAmB;AACrB,CAAC,EAbW,QAAQ,wBAAR,QAAQ,QAanB;AAOY,eAAO,GAAG;IACrB,GAAG,cAAc;IACjB,GAAG,WAAW;IACd,GAAG,WAAW;CACN,CAAC;AAOE,mBAAW,GAAG;IACzB,GAAG,cAAc;IACjB,GAAG,WAAW;IACd,GAAG,WAAW;IACd,GAAG,QAAQ;CACH,CAAC;AAEX,MAAM,kBAAkB,GAAG,MAAM,CAAC,WAAW,CAC3C,MAAM,CAAC,OAAO,CAAC,mBAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACnD,CAAC;AAEF;;GAEG;AACH,SAAgB,cAAc,CAAC,IAAiB;IAC9C,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;;;;;;;;;;;;;;;ACxHD,2FAAqD;AACrD,8FAAkD;AAClD,iFAAwC;AACxC,0FAAkC;AAClC,8EAAoE;AA0BpE;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,IAAoB;;IAC7C,MAAM,EAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAC,GAAG,IAAI,CAAC;IAClD,MAAM,EAAC,OAAO,EAAC,GAAG,IAAI,CAAC;IAEvB,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC;QAC1B,IAAI,EAAE,eAAO,CAAC,WAAW;QACzB,IAAI,EAAE,CAAC,+BAAmB,EAAC,gBAAgB,CAAC,EAAE,IAAI,eAAM,CAAC,OAAO,CAAC,CAAC;KACnE,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAsB5D,MAAM,KAAK,GAAG,uBAAW,EACvB,IAAI,EACJ,gBAAgB,EAChB,IAAI,CAAC,IAAI,CAAC,cAAc,EACxB,IAAI,CACL,CAAC;IAEF,wEAAwE;IACxE,4CAA4C;IAC5C,MAAM,UAAU,GAA+B,EAAS,CAAC;IACzD,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC/B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAW,CAAC;IACtC,CAAC;IAED,0DAA0D;IAC1D,6EAA6E;IAC7E,MAAM,KAAK,GAAmB;QAC5B,EAAE,EAAE,sBAAU,CAAC,eAAQ,CAAC,UAAU,CAAC,0CAAE,EAAE,mCAAI,CAAC;QAC5C,KAAK,EAAE,sBAAU,CAAC,eAAQ,CAAC,UAAU,CAAC,0CAAE,KAAK,mCAAI,EAAE;QACnD,QAAQ,EAAE,sBAAU,CAAC,eAAQ,CAAC,QAAQ,CAAC,0CAAE,QAAQ,mCAAI,CAAC;QACtD,KAAK,EAAE,sBAAU,CAAC,eAAQ,CAAC,KAAK,CAAC,0CAAE,GAAG,mCAAI,CAAC;QAC3C,OAAO,EAAE,sBAAU,CAAC,eAAQ,CAAC,OAAO,CAAC,0CAAE,OAAO,mCAAI,EAAE;QACpD,MAAM,EAAE,sBAAU,CAAC,eAAQ,CAAC,MAAM,CAAC,0CAAE,MAAM,mCAAI,CAAC;QAChD,IAAI,EAAE,gBAAU,aAAV,UAAU,uBAAV,UAAU,CAAG,eAAQ,CAAC,IAAI,CAAC,0CAAE,IAAI;QACvC,OAAO,EAAE,gBAAU,aAAV,UAAU,uBAAV,UAAU,CAAG,eAAQ,CAAC,OAAO,CAAC,0CAAE,OAAO;QAEhD,OAAO,EAAE,EAAC,EAAE,EAAE,sBAAU,CAAC,eAAQ,CAAC,UAAU,CAAC,0CAAE,SAAS,mCAAI,CAAC,EAAC;QAC9D,KAAK,EAAE,gBAAU,CAAC,eAAQ,CAAC,UAAU,CAAC,mCAAI,IAAI;QAC9C,MAAM,EAAE,gBAAU,CAAC,eAAQ,CAAC,MAAM,CAAC,mCAAI,IAAI;QAC3C,KAAK,EAAE,gBAAU,CAAC,eAAQ,CAAC,KAAK,CAAC,mCAAI,IAAI;QACzC,GAAG,EAAE,gBAAU,CAAC,eAAQ,CAAC,GAAG,CAAC,mCAAI,IAAI;QACrC,KAAK,EAAE,2BAAS,EAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,mCAAI,IAAI;QACnD,KAAK,EAAE,gBAAU,CAAC,eAAQ,CAAC,KAAK,CAAC,mCAAI,IAAI;QACzC,OAAO,EAAE,gBAAU,aAAV,UAAU,uBAAV,UAAU,CAAG,eAAQ,CAAC,OAAO,CAAC,mCAAI,IAAI;QAC/C,cAAc,EAAE,gBAAU,aAAV,UAAU,uBAAV,UAAU,CAAG,eAAQ,CAAC,cAAc,CAAC,mCAAI,IAAI;QAC7D,QAAQ,EAAE,IAAI;QAEd,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QAEZ,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,IAAI;KACjB,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAAC,IAAoB;IACpD,MAAM,EAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAC,GAAG,IAAI,CAAC;IAClD,MAAM,EAAC,OAAO,EAAC,GAAG,IAAI,CAAC;IAEvB,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC;QAC1B,IAAI,EAAE,eAAO,CAAC,kBAAkB;QAChC,IAAI,EAAE,CAAC,+BAAmB,EAAC,gBAAgB,CAAC,EAAE,IAAI,eAAM,CAAC,OAAO,CAAC,CAAC;KACnE,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAe5D,MAAM,KAAK,GAAG,uBAAW,EACvB,IAAI,EACJ,gBAAgB,EAChB,IAAI,CAAC,IAAI,CAAC,cAAc,EACxB,IAAI,CACL,CAAC;IAEF,wEAAwE;IACxE,4CAA4C;IAC5C,MAAM,SAAS,GAAsC,EAAS,CAAC;IAC/D,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC/B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAW,CAAC;IACrC,CAAC;IAED,yDAAyD;IACzD,MAAM,KAAK,GAAmB;QAC5B,EAAE,EAAE,SAAS,CAAC,eAAQ,CAAC,UAAU,CAAC,CAAC,EAAE;QACrC,KAAK,EAAE,SAAS,CAAC,eAAQ,CAAC,UAAU,CAAC,CAAC,KAAK;QAC3C,QAAQ,EAAE,SAAS,CAAC,eAAQ,CAAC,QAAQ,CAAC,CAAC,QAAQ;QAC/C,KAAK,EAAE,SAAS,CAAC,eAAQ,CAAC,KAAK,CAAC,CAAC,GAAG;QACpC,OAAO,EAAE,SAAS,CAAC,eAAQ,CAAC,OAAO,CAAC,CAAC,OAAO;QAC5C,MAAM,EAAE,SAAS,CAAC,eAAQ,CAAC,MAAM,CAAC,CAAC,MAAM;QACzC,OAAO,EAAE,SAAS,CAAC,eAAQ,CAAC,OAAO,CAAC,CAAC,OAAO;QAE5C,OAAO,EAAE,EAAC,EAAE,EAAE,SAAS,CAAC,eAAQ,CAAC,UAAU,CAAC,CAAC,SAAS,EAAC;QACvD,KAAK,EAAE,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAG,eAAQ,CAAC,UAAU,CAAC;QACvC,MAAM,EAAE,SAAS,CAAC,eAAQ,CAAC,MAAM,CAAC;QAClC,KAAK,EAAE,SAAS,CAAC,eAAQ,CAAC,KAAK,CAAC;QAChC,KAAK,EAAE,qBAAS,EAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAE;QAE3C,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QAEZ,GAAG,EAAE,IAAI;QACT,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,IAAI;QACb,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAE,IAAI;QAEd,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,IAAI;KACjB,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,IAAsC;IAC9D,MAAM,EAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAC,GAAG,IAAI,CAAC;IAClD,MAAM,EAAC,SAAS,EAAC,GAAG,IAAI,CAAC;IAEzB,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC;QAC1B,IAAI,EAAE,eAAO,CAAC,UAAU;QACxB,IAAI,EAAE,CAAC,+BAAmB,EAAC,gBAAgB,CAAC,EAAE,IAAI,eAAM,CAAC,SAAS,CAAC,CAAC;KACrE,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAE3D,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,IAAoB;IAC7C,MAAM,EAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAC,GAAG,IAAI,CAAC;IAClD,MAAM,EAAC,OAAO,EAAC,GAAG,IAAI,CAAC;IAEvB,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC;QAC1B,IAAI,EAAE,eAAO,CAAC,WAAW;QACzB,IAAI,EAAE,CAAC,+BAAmB,EAAC,gBAAgB,CAAC,EAAE,IAAI,eAAM,CAAC,OAAO,CAAC,CAAC;KACnE,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAE7D,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAAC,IAAoB;IACpD,MAAM,EAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAC,GAAG,IAAI,CAAC;IAClD,MAAM,EAAC,OAAO,EAAC,GAAG,IAAI,CAAC;IAEvB,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC;QAC1B,IAAI,EAAE,eAAO,CAAC,kBAAkB;QAChC,IAAI,EAAE;YACJ,+BAAmB,EAAC,gBAAgB,CAAC;YACrC,IAAI,eAAM,CAAC,CAAC,CAAC;YACb,IAAI,eAAM,CAAC,OAAO,CAAC;YACnB,IAAI,eAAM,CAAC,CAAC,CAAC;YACb,IAAI,eAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC5B;KACF,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAE/E,OAAO,eAAe,CAAC,IAAI,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAAC,IAAoB;IACrD,MAAM,EAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAC,GAAG,IAAI,CAAC;IAClD,MAAM,EAAC,OAAO,EAAC,GAAG,IAAI,CAAC;IAEvB,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC;QAC1B,IAAI,EAAE,eAAO,CAAC,mBAAmB;QACjC,IAAI,EAAE,CAAC,+BAAmB,EAAC,gBAAgB,CAAC,EAAE,IAAI,eAAM,CAAC,OAAO,CAAC,EAAE,IAAI,eAAM,CAAC,CAAC,CAAC,CAAC;KAClF,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAEjF,OAAO,gBAAgB,CAAC,IAAI,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAAC,IAAoB;IAC/C,MAAM,EAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAC,GAAG,IAAI,CAAC;IAClD,MAAM,EAAC,OAAO,EAAC,GAAG,IAAI,CAAC;IAEvB,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC;QAC1B,IAAI,EAAE,eAAO,CAAC,aAAa;QAC3B,IAAI,EAAE;YACJ,+BAAmB,EAAC,gBAAgB,CAAC;YACrC,IAAI,eAAM,CAAC,OAAO,CAAC;YACnB,IAAI,eAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,CAAC;YAC9C,IAAI,eAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,CAAC;SAChD;KACF,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAErE,OAAO,UAAU,CAAC,IAAI,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAAC,IAAoB;IAChD,MAAM,EAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAC,GAAG,IAAI,CAAC;IAClD,MAAM,EAAC,OAAO,EAAC,GAAG,IAAI,CAAC;IAEvB,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC;QAC1B,IAAI,EAAE,eAAO,CAAC,cAAc;QAC5B,IAAI,EAAE,CAAC,+BAAmB,EAAC,gBAAgB,CAAC,EAAE,IAAI,eAAM,CAAC,OAAO,CAAC,CAAC;KACnE,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAEtE,OAAO,WAAW,CAAC,IAAI,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAAC,IAAoB;IACnD,MAAM,EAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAC,GAAG,IAAI,CAAC;IAClD,MAAM,EAAC,OAAO,EAAC,GAAG,IAAI,CAAC;IAEvB,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC;QAC1B,IAAI,EAAE,eAAO,CAAC,iBAAiB;QAC/B,IAAI,EAAE,CAAC,+BAAmB,EAAC,gBAAgB,CAAC,EAAE,IAAI,eAAM,CAAC,OAAO,CAAC,EAAE,IAAI,eAAM,CAAC,CAAC,CAAC,CAAC;KAClF,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IAE7E,OAAO,cAAc,CAAC,IAAI,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CAAC,IAAoB;IAC9C,MAAM,EAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAC,GAAG,IAAI,CAAC;IAClD,MAAM,EAAC,OAAO,EAAC,GAAG,IAAI,CAAC;IAEvB,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC;QAC1B,IAAI,EAAE,eAAO,CAAC,YAAY;QAC1B,IAAI,EAAE,CAAC,+BAAmB,EAAC,gBAAgB,CAAC,EAAE,IAAI,eAAM,CAAC,OAAO,CAAC,CAAC;KACnE,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAU5D,MAAM,KAAK,GAAG,uBAAW,EACvB,IAAI,EACJ,gBAAgB,EAChB,IAAI,CAAC,IAAI,CAAC,cAAc,EACxB,IAAI,CACL,CAAC;IAEF,MAAM,SAAS,GAAgC,EAAS,CAAC;IACzD,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC/B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAW,CAAC;IACrC,CAAC;IAED,OAAO,SAAS,CAAC,eAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;AACvC,CAAC;AAcD;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,IAAuB;IAChD,MAAM,EAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAC,GAAG,IAAI,CAAC;IAElD,0EAA0E;IAC1E,yCAAyC;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC;IAEjC,4CAA4C;IAC5C,MAAM,IAAI,GAAG,IAAI,eAAM,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,GAAG,IAAI,eAAM,CAAC,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,CAAC,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,eAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAE9D,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC;QAC1B,IAAI,EAAE,eAAO,CAAC,YAAY;QAC1B,IAAI,EAAE,CAAC,+BAAmB,EAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,CAAC;KAClE,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAI5D,MAAM,KAAK,GAAG,uBAAW,EACvB,IAAI,EACJ,gBAAgB,EAChB,IAAI,CAAC,IAAI,CAAC,cAAc,EACxB,IAAI,CACL,CAAC;IAEF,MAAM,aAAa,GAAmC,EAAE,CAAC;IACzD,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC/B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,OAAO,GAAyB,aAA8C;SACjF,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,eAAQ,CAAC,MAAM,CAAC;SAC7C,GAAG,CAAC,CAAC,EAAC,EAAE,EAAE,IAAI,EAAC,EAAE,EAAE,CAAC,CAAC,EAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAC,CAAC,CAAC,CAAC;IAE/D,MAAM,SAAS,GAAyB,aAAgD;SACrF,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,eAAQ,CAAC,QAAQ,CAAC;SAC/C,GAAG,CAAC,CAAC,EAAC,EAAE,EAAE,IAAI,EAAC,EAAE,EAAE,CAAC,CAAC,EAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAC,CAAC,CAAC,CAAC;IAEhE,MAAM,YAAY,GAAI,aAAkD,CAAC,MAAM,CAC7E,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,eAAQ,CAAC,UAAU,CAC1C,CAAC;IAEF,OAAO,EAAC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAC,CAAC;AAC5C,CAAC;AAEY,qBAAa,GAAG;IAC3B,CAAC,eAAO,CAAC,WAAW,CAAC,EAAE,WAAW;IAClC,CAAC,eAAO,CAAC,UAAU,CAAC,EAAE,UAAU;IAChC,CAAC,eAAO,CAAC,kBAAkB,CAAC,EAAE,kBAAkB;IAChD,CAAC,eAAO,CAAC,YAAY,CAAC,EAAE,YAAY;IACpC,CAAC,eAAO,CAAC,kBAAkB,CAAC,EAAE,kBAAkB;IAChD,CAAC,eAAO,CAAC,cAAc,CAAC,EAAE,cAAc;IACxC,CAAC,eAAO,CAAC,WAAW,CAAC,EAAE,WAAW;IAClC,CAAC,eAAO,CAAC,mBAAmB,CAAC,EAAE,mBAAmB;IAClD,CAAC,eAAO,CAAC,iBAAiB,CAAC,EAAE,iBAAiB;IAC9C,CAAC,eAAO,CAAC,aAAa,CAAC,EAAE,aAAa;IACtC,CAAC,eAAO,CAAC,YAAY,CAAC,EAAE,WAAW;IAEnC,6DAA6D;CAC9D,CAAC;;;;;;;;;;;;;;;AChZF,kCAiCC;AA3ED,2FAA+C;AAC/C,8FAA4C;AAC5C,iFAAgC;AAChC,0FAAkC;AAGlC;;;GAGG;AACH,MAAM,KAAK,GAAG,EAAE,CAAC;AAEV,MAAM,mBAAmB,GAAG,CAAC,EAClC,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,GACQ,EAAE,EAAE,CACrB,IAAI,eAAM,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAN5D,2BAAmB,uBAMyC;AAElE,MAAM,iBAAiB,GAAG,CAC/B,UAA4B,EAC5B,MAAc,EACd,KAAa,EACb,KAAa,EACb,EAAE,CACF,IAAI,iBAAO,CAAC;IACV,IAAI,EAAE,mBAAW,CAAC,UAAU;IAC5B,IAAI,EAAE;QACJ,+BAAmB,EAAC,UAAU,CAAC;QAC/B,IAAI,eAAM,CAAC,MAAM,CAAC;QAClB,IAAI,eAAM,CAAC,KAAK,CAAC;QACjB,IAAI,eAAM,CAAC,CAAC,CAAC;QACb,IAAI,eAAM,CAAC,KAAK,CAAC;QACjB,IAAI,eAAM,CAAC,IAAI,CAAC;KACjB;CACF,CAAC,CAAC;AAhBQ,yBAAiB,qBAgBzB;AAEL;;;GAGG;AACI,KAAK,SAAS,CAAC,CAAC,WAAW,CAChC,IAAgB,EAChB,UAA4B,EAC5B,KAAa,EACb,IAAU;IAEV,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,OAAO,SAAS,GAAG,KAAK,EAAE,CAAC;QACzB,gCAAgC;QAChC,IAAI,SAAS,GAAG,KAAK,KAAK,CAAC,EAAE,CAAC;YAC5B,qEAAqE;YACrE,yEAAyE;YACzE,iCAAiC;YACjC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,6BAAiB,EAAC,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAEvE,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACvC,MAAM,IAAI,CAAC,WAAW,CAAC,mBAAW,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACvD,CAAC;QAED,0EAA0E;QAC1E,kEAAkE;QAClE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,mBAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEhE,MAAM,IAAI,CAAC,IAAgB,CAAC;QAC5B,SAAS,EAAE,CAAC;QAEZ,+DAA+D;QAC/D,IAAI,SAAS,GAAG,KAAK,KAAK,CAAC,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;YACnD,MAAM,IAAI,CAAC,WAAW,CAAC,mBAAW,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,MAAM,GAAG;IACb,eAAQ,CAAC,SAAS;IAClB,eAAQ,CAAC,SAAS;IAClB,eAAQ,CAAC,QAAQ;IACjB,eAAQ,CAAC,WAAW;IACpB,eAAQ,CAAC,WAAW;IACpB,eAAQ,CAAC,UAAU;IACnB,eAAQ,CAAC,SAAS;IAClB,eAAQ,CAAC,SAAS;IAClB,eAAQ,CAAC,WAAW;CACZ,CAAC;AAEX,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;AAIjC;;GAEG;AACI,MAAM,SAAS,GAAG,CAAC,KAA6B,EAAE,EAAE,CACzD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAW,CAAC,CAAC,CAAC,GAAG,EAAsB,CAAC;AADpE,iBAAS,aAC2D;;;;;;;;;;;;;;;;;;;;;;;;;;ACnGjF,4EAAkC;AAIlC,6DAAoC;AAEpC,mFAA0C;AAE1C,6EAAsC;AAEtC,4EAA6C;AAC7C,4EAA+E;AAqB/E;;GAEG;AACH,MAAM,aAAa;IAWjB;;OAEG;IACH,YAAY,YAAoB;QAbhC,8CAAsB;QACtB;;WAEG;QACH,iCAAoB,IAAI,qBAAY,EAAE,EAAC;QACvC;;WAEG;QACH,4CAAsB,IAAI,mBAAK,EAAE,EAAC;QAUlC,sCAAsC;QACtC,OAAE,GAAkB,2BAAI,8BAAS,CAAC,WAAW,CAAC,IAAI,CAAC,2BAAI,8BAAS,CAAC,CAAC;QAClE,QAAG,GAAmB,2BAAI,8BAAS,CAAC,cAAc,CAAC,IAAI,CAAC,2BAAI,8BAAS,CAAC,CAAC;QACvE,SAAI,GAAoB,2BAAI,8BAAS,CAAC,IAAI,CAAC,IAAI,CAAC,2BAAI,8BAAS,CAAC,CAAC;QAE/D,sCAAgB,CAAC,OAAe,EAAE,EAAE;YAClC,MAAM,MAAM,GAAG,4BAAgB,EAAC,OAAO,CAAC,CAAC;YAEzC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,2BAAI,8BAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC9C,CAAC;YAED,oDAAoD;YACpD,MAAM,SAAS,GAAG,+BAAmB,EAAC,OAAO,CAAC,CAAC;YAE/C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,OAAO,2BAAI,8BAAS,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YACpD,CAAC;YAED,2DAA2D;YAC3D,MAAM,KAAK,GAAG,2BAAe,EAAC,OAAO,CAAC,CAAC;YAEvC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,2BAAI,8BAAS,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC5C,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC,EAAC;QA/BA,2BAAI,+BAAiB,YAAY,OAAC;QAClC,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,2BAAI,mCAAc,CAAC,CAAC;IACjD,CAAC;IA+BD;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,OAAyB;QAC5C,MAAM,OAAO,GAAG,gCAAoB,EAAC,OAAO,CAAC,CAAC;QAE9C,MAAM,KAAK,GAAG,MAAM,2BAAI,yCAAoB,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YACnE,MAAM,iBAAO,EAAC,2BAAI,mCAAc,EAAE,OAAO,EAAE,uBAAW,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YAEnF,OAAO,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACpD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC9B,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;oBAC/B,MAAM,CACJ,IAAI,KAAK,CACP,uDAAuD,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,CAC3E,CACF,CAAC;gBACJ,CAAC,EAAE,KAAK,CAAC,CAAC;gBAEV,MAAM,OAAO,GAAG,CAAC,IAAmB,EAAE,EAAE;oBACtC,kDAAkD;oBAClD,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC;wBACtE,YAAY,CAAC,OAAO,CAAC,CAAC;wBACtB,OAAO,CAAC,IAAI,CAAC,CAAC;oBAChB,CAAC;yBAAM,CAAC;wBACN,iCAAiC;wBACjC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC,CAAC;gBAEF,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC;IACf,CAAC;CACF;;AAED,qBAAe,aAAa,CAAC;;;;;;;;;;;;;;;ACzH7B,mFAA6C;AAE7C,6EAAoC;AAkBpC;;;GAGG;AACI,MAAM,oBAAoB,GAAG,CAAC,EAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAU,EAAE,EAAE,CAC1E,UAAU,CAAC,IAAI,CAAC;IACd,GAAG,0BAAc;IACjB,GAAG,CAAC,IAAI,CAAC;IACT,GAAG,qBAAS,EAAC,UAAU,CAAC;IACxB,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;IACf,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;IAClB,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;IACf,GAAG,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE;IAC1B,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;IAChC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;CAC5B,CAAC,CAAC;AAXQ,4BAAoB,wBAW5B;;;;;;;;;;;;;;;;;;;;AChCL,6DAAoC;AAIpC,4EAA2C;AAY3C;;;;;GAKG;AACH,MAAM,eAAe;IAMnB;;OAEG;IACH,YAAY,UAAkB;QAR9B;;WAEG;QACH,mCAAoB,IAAI,qBAAY,EAAE,EAAC;QASvC,sCAAsC;QACtC,OAAE,GAAkB,2BAAI,gCAAS,CAAC,WAAW,CAAC,IAAI,CAAC,2BAAI,gCAAS,CAAC,CAAC;QAClE,QAAG,GAAmB,2BAAI,gCAAS,CAAC,cAAc,CAAC,IAAI,CAAC,2BAAI,gCAAS,CAAC,CAAC;QACvE,SAAI,GAAoB,2BAAI,gCAAS,CAAC,IAAI,CAAC,IAAI,CAAC,2BAAI,gCAAS,CAAC,CAAC;QAE/D,0CAAkB,CAAC,OAAe,EAAE,EAAE;YACpC,MAAM,QAAQ,GAAG,8BAAkB,EAAC,OAAO,CAAC,CAAC;YAE7C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,2BAAI,gCAAS,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC,EAAC;QAdA,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,2BAAI,uCAAgB,CAAC,CAAC;IACjD,CAAC;CAcF;;AAED,qBAAe,eAAe,CAAC;;;;;;;;;;;;;;;AClD/B;;GAEG;AACH,IAAY,UAKX;AALD,WAAY,UAAU;IACpB,6CAAc;IACd,4CAAa;IACb,gDAAe;IACf,kDAAgB;AAClB,CAAC,EALW,UAAU,0BAAV,UAAU,QAKrB;AAED;;GAEG;AACH,IAAY,SAYX;AAZD,WAAY,SAAS;IACnB,2CAAY;IACZ,+CAAc;IACd,+CAAc;IACd,+CAAc;IACd,6CAAa;IACb,yCAAW;IACX,2CAAY;IACZ,uDAAkB;IAClB,mDAAgB;IAChB,kDAAe;IACf,4CAAY;AACd,CAAC,EAZW,SAAS,yBAAT,SAAS,QAYpB;;;;;;;;;;;;;;ACpBD,4CA2CC;AAED,kDA+CC;AAsBD,gDAsCC;AAWD,0CAiDC;AA3ND,mFAA6C;AAC7C,uEAAmD;AAEnD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;AACtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;AACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;AAEpC,SAAgB,gBAAgB,CAAC,MAAc;IAC7C,IAAI,MAAM,CAAC,OAAO,CAAC,0BAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IAED,qEAAqE;IACrE,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,mCAAmC;IACnC,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC;IAE5D,wCAAwC;IACxC,MAAM,gBAAgB,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAE9E,oCAAoC;IACpC,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;IAEpD,MAAM,MAAM,GAAoB;QAC9B,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC;QAClC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC;QAC3B,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC;QACvB,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,iBAAS,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;QAC1D,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,iBAAS,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;QACxD,QAAQ,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,iBAAS,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC;QAC5D,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAC/B,QAAQ;QACR,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;QACpD,cAAc,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;QACvD,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC;QAC3B,aAAa;QACb,IAAI;QACJ,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC;KACrC,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,mBAAmB,CAAC,MAAc;IAChD,IAAI,MAAM,CAAC,OAAO,CAAC,0BAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM;SAChB,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC;SACtB,QAAQ,EAAE;SACV,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEtB,MAAM,WAAW,GAAG,IAAI,IAAI,CAC1B,MAAM;SACH,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC;SACtB,QAAQ,EAAE;SACV,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CACtB,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAE1B,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,aAAa,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAE/C,MAAM,IAAI,GAAkB;QAC1B,QAAQ;QACR,IAAI;QACJ,IAAI;QACJ,KAAK;QACL,WAAW;QACX,SAAS;QACT,UAAU;QACV,UAAU;QACV,UAAU;QACV,aAAa;QACb,WAAW;KACZ,CAAC;IAEF,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAS,SAAS,CAAC,KAAa;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;IAC1D,MAAM,YAAY,GAAG,QAAQ,CAAC;IAE9B,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,GAAG,YAAY,CAAC,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC;IAE/D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,SAAgB,kBAAkB,CAAC,MAAc;IAC/C,IAAI,MAAM,CAAC,OAAO,CAAC,0BAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,oDAAoD;IACpD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,2CAA2C;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAE3C,mEAAmE;IACnE,oCAAoC;IACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,QAAQ,GAAG,IAAI,CAAC;IAE9B,mDAAmD;IACnD,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC;IAEvD,MAAM,QAAQ,GAA4B;QACxC,QAAQ;QACR,WAAW;QACX,QAAQ;QACR,KAAK;QACL,GAAG;KACJ,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,eAAe,CAAC,MAAc;IAC5C,IAAI,MAAM,CAAC,OAAO,CAAC,0BAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAEvC,4DAA4D;IAC5D,IAAI,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;QACjE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG;YACf,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI;YACxB,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI;YACxB,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI;YACxB,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI;SACzB,CAAC;QAEF,MAAM,KAAK,GAA0B;YACnC,QAAQ;YACR,QAAQ;YACR,YAAY,EAAE,KAAK;SACpB,CAAC;QAEF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,4DAA4D;IAC5D,IAAI,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;QACjE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG;YACf,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI;YACxB,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI;YACxB,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI;YACxB,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI;YACxB,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI;YACxB,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI;SACzB,CAAC;QAEF,MAAM,KAAK,GAA0B;YACnC,QAAQ;YACR,QAAQ;YACR,YAAY,EAAE,IAAI;SACnB,CAAC;QAEF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvND,uGAA8C;AAyB9C;;GAEG;AACH,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,yCAAU;IACV,6CAAY;IACZ,qDAAgB;AAClB,CAAC,EAJW,UAAU,0BAAV,UAAU,QAIrB;AAsED,IAAY,UAUX;AAVD,WAAY,UAAU;IACpB,iDAAc;IACd,2CAAW;IACX,yCAAU;IACV,+CAAa;IACb,+CAAa;IACb,6CAAY;IACZ,2CAAW;IACX,2CAAW;IACX,+CAAa;AACf,CAAC,EAVW,UAAU,0BAAV,UAAU,QAUrB;AAED;;GAEG;AACH,IAAY,SAWX;AAXD,WAAY,SAAS;IACnB,2CAAY;IACZ,qCAAS;IACT,qCAAS;IACT,uCAAU;IACV,qCAAS;IACT,mDAAgB;IAChB,uEAA0B;IAC1B,mDAAgB;IAChB,mDAAgB;IAChB,iDAAe;AACjB,CAAC,EAXW,SAAS,yBAAT,SAAS,QAWpB;AAED;;GAEG;AACH,IAAY,SAMX;AAND,WAAY,SAAS;IACnB,yCAAW;IACX,qCAAS;IACT,qDAAiB;IACjB,+CAAc;IACd,mDAAgB;AAClB,CAAC,EANW,SAAS,yBAAT,SAAS,QAMpB;AA8FD;;GAEG;AACH,+FAA0D;AAAlD,uHAAQ;AAAE,+HAAY;AAyL9B,IAAY,YAoBX;AApBD,WAAY,YAAY;IACtB;;;OAGG;IACH,qDAAO;IACP;;;OAGG;IACH,mDAAM;IACN;;OAEG;IACH,yDAAS;IACT;;;OAGG;IACH,mDAAM;AACR,CAAC,EApBW,YAAY,4BAAZ,YAAY,QAoBvB;AAED;;;GAGG;AACH,IAAY,aA+BX;AA/BD,WAAY,aAAa;IACvB;;;;;;;;;;;;;;;;;;OAkBG;IACH,+DAAW;IACX;;;;OAIG;IACH,uEAAe;IACf;;OAEG;IACH,mEAAa;AACf,CAAC,EA/BW,aAAa,6BAAb,aAAa,QA+BxB;;;;;;;;;;;;;;;ACheD;;GAEG;AACI,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,IAAY,EAAU,EAAE,CAClE,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;AAD7B,sBAAc,kBACe;AAE1C;;GAEG;AACI,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,IAAY,EAAU,EAAE,CAChE,0BAAc,EAAC,GAAG,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;AADvB,oBAAY,gBACW;AAEpC;;GAEG;AACI,MAAM,eAAe,GAAG,CAAC,UAAkB,EAAE,WAAmB,EAAE,EAAE,CACzE,IAAI,KAAK,CAAC,UAAU,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC;AADnE,uBAAe,mBACoD;AAEhF;;GAEG;AACI,MAAM,qBAAqB,GAAG,CAAC,IAAY,EAAc,EAAE;IAChE,sDAAsD;IACtD,EAAE;IACF,0DAA0D;IAC1D,0DAA0D;IAC1D,MAAM,OAAO,GAAM,KAAmB,CAAC,CAAC,kBAAkB;IAC1D,MAAM,SAAS,GAAI,IAAmB,CAAC,CAAC,kBAAkB;IAC1D,MAAM,QAAQ,GAAK,GAAmB,CAAC,CAAC,kBAAkB;IAC1D,MAAM,UAAU,GAAG,GAAmB,CAAC,CAAC,kBAAkB;IAE1D,MAAM,EAAE,GAAG,oBAAY,CAAC;IAExB,OAAO,2BAAe,EAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;SACtC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;SAChD,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACT,MAAM,EAAE,0BAAc,EAAC,CAAC,EAAE,UAAU,CAAC;QACrC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;KAC3D,CAAC,CAAC,CAAC;AACR,CAAC,CAAC;AAlBW,6BAAqB,yBAkBhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChCF,8BAKC;AAQD,oDA0BC;AAUD,kDAEC;AAKD,oCAGC;AASD,kCAEC;AASD,4CAEC;AA1FD,6EAAiC;AAEjC,iDAAqF;AAErF,uEAAuD;AAEvD;;GAEG;AACH,SAAgB,SAAS,CAAC,MAAc;IACtC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAChC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAE5C,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,MAAmB;IACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,0BAAiB,GAAE,CAAC,CAAC,MAAM,CACzD,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CACpB,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,GAAG,CAAC,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EACtE,EAAkD,CACnD,CAAC;IAEF,IAAI,YAAY,GAAuD,IAAI,CAAC;IAC5E,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,EAAC,QAAQ,EAAE,IAAI,EAAC,GAAG,KAAK,CAAC;QAE/B,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YACzD,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAExC,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,UAAU,GAAG,aAAa,EAAE,CAAC;YACzE,YAAY,GAAG,KAAK,CAAC;YACrB,aAAa,GAAG,SAAS,CAAC,UAAU,CAAC;QACvC,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,mBAAmB,CAAC,KAA+B;;IACjE,OAAO,IAAI,EAAE,CAAC,QAAQ,CAAC,WAAK,CAAC,IAAI,mCAAI,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC;AAC3E,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,GAAW,EAAE,KAAa;IACrD,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;IAC7C,OAAO,CAAC,GAAG,GAAG,CAAC;AACjB,CAAC;AAED,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAClC,MAAM,CAAC,OAAO,CAAC,iBAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAC/D,CAAC;AAEF;;GAEG;AACH,SAAgB,WAAW,CAAC,IAAe;IACzC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,CACvC,MAAM,CAAC,OAAO,CAAC,iBAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAC/D,CAAC;AAEF;;GAEG;AACH,SAAgB,gBAAgB,CAAC,IAAe;IAC9C,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;;;;;;;;;;;;;AC1FD;;GAEG;;;AAkFH,oBAEC;AAKD,4CAEC;AAKD,4CAEC;AAKD,wCAEC;AAKD,wBAEC;AA9GD;;GAEG;AACI,MAAM,kBAAkB,GAAG,GAAY,EAAE,CAAC,KAAK,CAAC;AAA1C,0BAAkB,sBAAwB;AAEvD;;GAEG;AACU,kBAAU,GAAG;IACxB,EAAE,EAAE,IAAI;IACR,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,SAAS;IAClB,eAAe,EAAE,kBAAkB;IACnC,gBAAgB,EAAE,mBAAmB;IACrC,QAAQ,EAAE,WAAW;IACrB,aAAa,EAAE,gBAAgB;IAC/B,gBAAgB,EAAE,mBAAmB;IACrC,iBAAiB,EAAE,oBAAoB;IACvC,kBAAkB,EAAE,qBAAqB;IACzC,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,cAAc;IAC1B,aAAa,EAAE,eAAe;IAC9B,aAAa,EAAE,gBAAgB;IAC/B,WAAW,EAAE,aAAa;IAC1B,QAAQ,EAAE,WAAW;IACrB,eAAe,EAAE,iBAAiB;CAC1B,CAAC;AA2BX;;GAEG;AACH,MAAM,QAAQ,GAAkB;IAC9B,UAAU,CAAC,QAAsB;QAC/B,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,IAAY,EAAE,MAAe;QACnC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,CAAC,IAAY,EAAE,MAAc;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,SAAS,CAAC,OAAuB;QAC/B,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,GAAG;QACD,oBAAoB;IACtB,CAAC;IACD,MAAM;QACJ,oBAAoB;IACtB,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,SAAgB,IAAI,CAAC,QAAkB;IACrC,oBAAoB;AACtB,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,QAAqB;IACpD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,UAAmB,EAAE,KAAe;IACnE,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,QAAgB,EAAE,MAAgB;IAC/D,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAgB,MAAM,CAAC,IAAY,EAAE,MAAc;IACjD,oBAAoB;AACtB,CAAC;AAED;;GAEG;AACU,gBAAQ,GAAG;IACtB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;CACN,CAAC;;;;;;;;;;;;;;AClHX,0BAcC;AAKD,0BAEC;AAmBD,0BAqBC;AAKD,4BASC;AA3ED,SAAgB,OAAO,CAAC,IAAY,EAAE,IAAU,EAAE,IAAU;IAC1D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;YAC1B,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI,OAAO,CAAS,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AACvE,CAAC;AAmBD,SAAgB,OAAO,CACrB,IAAY,EACZ,IAAS,EACT,IAAS,EACT,IAAS,EACT,IAAU,EACV,IAAU;IAEV,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CACpD,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAClC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,QAAQ,CAAC,IAAY;IACnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7CD,4CA4CC;AAMD,gDAwCC;AApID,6EAAiC;AAKjC,mFAOuB;AAEvB,0EAAmD;AACnD,uEAAuD;AACvD,6EAAyD;AAEzD;;;;;;GAMG;AACI,MAAM,aAAa,GAAG,CAC3B,KAA+B,EAC/B,EAAY,EACZ,OAAe,4BAAgB,EACvB,EAAE,CAAC,CAAC;IACZ,EAAE;IACF,IAAI;IACJ,IAAI,EAAE,kBAAU,CAAC,GAAG;IACpB,EAAE,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;IAClC,OAAO,EAAE,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;CACxE,CAAC,CAAC;AAVU,qBAAa,iBAUvB;AAEH;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,MAAc;IAC7C,2EAA2E;IAC3E,oEAAoE;IACpE,6DAA6D;IAC7D,uEAAuE;IACvE,8CAA8C;IAC9C,EAAE;IACF,kBAAkB;IAClB,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC;QACvB,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EA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","sources":["webpack://alphatheta-connect/./src/artwork/index.ts","webpack://alphatheta-connect/./src/artwork/parsers/aiff.ts","webpack://alphatheta-connect/./src/artwork/parsers/flac.ts","webpack://alphatheta-connect/./src/artwork/parsers/id3.ts","webpack://alphatheta-connect/./src/artwork/parsers/index.ts","webpack://alphatheta-connect/./src/artwork/parsers/mp4.ts","webpack://alphatheta-connect/./src/artwork/parsers/utils.ts","webpack://alphatheta-connect/./src/artwork/reader.ts","webpack://alphatheta-connect/./src/artwork/types.ts","webpack://alphatheta-connect/./src/constants.ts","webpack://alphatheta-connect/./src/control/index.ts","webpack://alphatheta-connect/./src/db/getArtworkFromFile.ts","webpack://alphatheta-connect/./src/db/getArtworkThumbnail.ts","webpack://alphatheta-connect/./src/db/getFile.ts","webpack://alphatheta-connect/./src/db/getMetadata.ts","webpack://alphatheta-connect/./src/db/getPlaylist.ts","webpack://alphatheta-connect/./src/db/getTrackAnalysis.ts","webpack://alphatheta-connect/./src/db/getWaveforms.ts","webpack://alphatheta-connect/./src/db/index.ts","webpack://alphatheta-connect/./src/db/utils.ts","webpack://alphatheta-connect/./src/devices/index.ts","webpack://alphatheta-connect/./src/devices/utils.ts","webpack://alphatheta-connect/./src/entities.ts","webpack://alphatheta-connect/./src/index.ts","webpack://alphatheta-connect/./src/localdb/index.ts","webpack://alphatheta-connect/./src/localdb/kaitai/rekordbox_anlz.ksy","webpack://alphatheta-connect/./src/localdb/kaitai/rekordbox_pdb.ksy","webpack://alphatheta-connect/./src/localdb/onelibrary.ts","webpack://alphatheta-connect/./src/localdb/orm.ts","webpack://alphatheta-connect/./src/localdb/rekordbox.ts","webpack://alphatheta-connect/./src/localdb/rekordbox/anlz-parsers.ts","webpack://alphatheta-connect/./src/localdb/rekordbox/entity-creators.ts","webpack://alphatheta-connect/./src/localdb/rekordbox/hydrator.ts","webpack://alphatheta-connect/./src/localdb/rekordbox/index.ts","webpack://alphatheta-connect/./src/localdb/rekordbox/table-mappings.ts","webpack://alphatheta-connect/./src/localdb/schema.ts","webpack://alphatheta-connect/./src/localdb/utils.ts","webpack://alphatheta-connect/./src/logger.ts","webpack://alphatheta-connect/./src/metadata.ts","webpack://alphatheta-connect/./src/mixstatus/index.ts","webpack://alphatheta-connect/./src/mixstatus/utils.ts","webpack://alphatheta-connect/./src/network.ts","webpack://alphatheta-connect/./src/nfs/index.ts","webpack://alphatheta-connect/./src/nfs/programs.ts","webpack://alphatheta-connect/./src/nfs/rpc.ts","webpack://alphatheta-connect/./src/nfs/utils.ts","webpack://alphatheta-connect/./src/nfs/xdr.ts","webpack://alphatheta-connect/./src/passive/alphatheta.ts","webpack://alphatheta-connect/./src/passive/devices.ts","webpack://alphatheta-connect/./src/passive/index.ts","webpack://alphatheta-connect/./src/passive/localdb.ts","webpack://alphatheta-connect/./src/passive/pcap-adapter.ts","webpack://alphatheta-connect/./src/passive/position.ts","webpack://alphatheta-connect/./src/passive/remotedb.ts","webpack://alphatheta-connect/./src/passive/status.ts","webpack://alphatheta-connect/./src/remotedb/constants.ts","webpack://alphatheta-connect/./src/remotedb/fields.ts","webpack://alphatheta-connect/./src/remotedb/index.ts","webpack://alphatheta-connect/./src/remotedb/message/index.ts","webpack://alphatheta-connect/./src/remotedb/message/item.ts","webpack://alphatheta-connect/./src/remotedb/message/response.ts","webpack://alphatheta-connect/./src/remotedb/message/types.ts","webpack://alphatheta-connect/./src/remotedb/queries.ts","webpack://alphatheta-connect/./src/remotedb/utils.ts","webpack://alphatheta-connect/./src/status/index.ts","webpack://alphatheta-connect/./src/status/media.ts","webpack://alphatheta-connect/./src/status/position.ts","webpack://alphatheta-connect/./src/status/types.ts","webpack://alphatheta-connect/./src/status/utils.ts","webpack://alphatheta-connect/./src/types.ts","webpack://alphatheta-connect/./src/utils/converters.ts","webpack://alphatheta-connect/./src/utils/index.ts","webpack://alphatheta-connect/./src/utils/telemetry.ts","webpack://alphatheta-connect/./src/utils/udp.ts","webpack://alphatheta-connect/./src/virtualcdj/index.ts","webpack://alphatheta-connect/external commonjs \"async-mutex\"","webpack://alphatheta-connect/external commonjs \"better-sqlite3-multiple-ciphers\"","webpack://alphatheta-connect/external commonjs \"cap\"","webpack://alphatheta-connect/external node-commonjs \"child_process\"","webpack://alphatheta-connect/external node-commonjs \"crypto\"","webpack://alphatheta-connect/external node-commonjs \"dgram\"","webpack://alphatheta-connect/external commonjs \"events\"","webpack://alphatheta-connect/external node-commonjs \"fs\"","webpack://alphatheta-connect/external commonjs \"ip-address\"","webpack://alphatheta-connect/external commonjs \"js-xdr\"","webpack://alphatheta-connect/external commonjs \"kaitai-struct\"","webpack://alphatheta-connect/external commonjs \"kaitai-struct/KaitaiStream\"","webpack://alphatheta-connect/external commonjs \"lodash\"","webpack://alphatheta-connect/external commonjs \"metadata-connect\"","webpack://alphatheta-connect/external node-commonjs \"net\"","webpack://alphatheta-connect/external commonjs \"onelibrary-connect\"","webpack://alphatheta-connect/external node-commonjs \"os\"","webpack://alphatheta-connect/external node-commonjs \"path\"","webpack://alphatheta-connect/external commonjs \"promise-retry\"","webpack://alphatheta-connect/external commonjs \"promise-socket\"","webpack://alphatheta-connect/external commonjs \"promise-timeout\"","webpack://alphatheta-connect/webpack/bootstrap","webpack://alphatheta-connect/webpack/before-startup","webpack://alphatheta-connect/webpack/startup","webpack://alphatheta-connect/webpack/after-startup"],"sourcesContent":["import {type Logger, noopLogger} from 'src/logger';\nimport {getFileInfo, NfsMediaSlot} from 'src/nfs';\nimport {Device} from 'src/types';\n\nimport {\n extractFromAiff,\n extractFromFlac,\n extractFromMp3,\n extractFromMp4,\n} from './parsers';\nimport {createNfsFileReader} from './reader';\nimport {ExtractedArtwork, FileReader} from './types';\n\nexport {\n createBufferReader,\n createNfsFileReader,\n createNfsFileReaderWithInfo,\n} from './reader';\nexport type {ExtractedArtwork, FileReader} from './types';\nexport {PictureType} from './types';\n\nconst SUPPORTED_EXTENSIONS = new Set(['mp3', 'm4a', 'mp4', 'aac', 'flac', 'aiff', 'aif']);\n\nexport function isArtworkExtractionSupported(extension: string): boolean {\n return SUPPORTED_EXTENSIONS.has(extension.toLowerCase());\n}\n\nexport async function extractArtwork(\n reader: FileReader\n): Promise<ExtractedArtwork | null> {\n const ext = reader.extension.toLowerCase();\n\n switch (ext) {\n case 'mp3':\n return extractFromMp3(reader);\n case 'm4a':\n case 'mp4':\n case 'aac':\n return extractFromMp4(reader);\n case 'flac':\n return extractFromFlac(reader);\n case 'aiff':\n case 'aif':\n return extractFromAiff(reader);\n default: {\n const mp3Result = await extractFromMp3(reader);\n if (mp3Result) {\n return mp3Result;\n }\n return extractFromMp4(reader);\n }\n }\n}\n\nexport async function extractArtworkFromDevice(\n device: Device,\n slot: NfsMediaSlot,\n filePath: string,\n logger: Logger = noopLogger\n): Promise<ExtractedArtwork | null> {\n logger.debug(\n `[artwork-nfs] getFileInfo: device=${device.ip.address}, slot=${slot}, path=${filePath}`\n );\n const fileInfo = await getFileInfo({device, slot, path: filePath});\n logger.debug(`[artwork-nfs] File found: ${fileInfo.size} bytes`);\n const reader = createNfsFileReader(device, slot, filePath, fileInfo.size);\n const result = await extractArtwork(reader);\n logger.debug(\n `[artwork-nfs] extractArtwork result: ${result ? `${result.mimeType} (${result.data.length}b)` : 'null'}`\n );\n return result;\n}\n","import {ExtractedArtwork, FileReader} from '../types';\nimport {extractFromMp3} from './id3';\nimport {createBufferReader} from '../reader';\n\nexport async function extractFromAiff(reader: FileReader): Promise<ExtractedArtwork | null> {\n const header = await reader.read(0, 12);\n if (header.length < 12 || header.toString('ascii', 0, 4) !== 'FORM') return null;\n\n const formType = header.toString('ascii', 8, 12);\n if (formType !== 'AIFF' && formType !== 'AIFC') return null;\n\n const formSize = header.readUInt32BE(4);\n const fileEnd = Math.min(8 + formSize, reader.size);\n\n let offset = 12;\n\n while (offset + 8 < fileEnd) {\n const chunkHeader = await reader.read(offset, 8);\n if (chunkHeader.length < 8) break;\n\n const chunkId = chunkHeader.toString('ascii', 0, 4);\n const chunkSize = chunkHeader.readUInt32BE(4);\n\n if (chunkSize <= 0 || offset + 8 + chunkSize > fileEnd) break;\n\n if (chunkId === 'ID3 ' || chunkId === 'id3 ') {\n const id3Data = await reader.read(offset + 8, chunkSize);\n const id3Reader = createBufferReader(id3Data, 'mp3');\n return extractFromMp3(id3Reader);\n }\n\n offset += 8 + chunkSize + (chunkSize % 2);\n }\n\n return null;\n}\n","import {ExtractedArtwork, FileReader, PictureType} from '../types';\nimport {normalizeMimeType} from './utils';\n\nconst enum MetadataBlockType {\n STREAMINFO = 0,\n PICTURE = 6,\n}\n\nfunction parsePictureBlock(data: Buffer): ExtractedArtwork | null {\n if (data.length < 32) return null;\n\n let offset = 0;\n\n const pictureType = data.readUInt32BE(offset) as PictureType;\n offset += 4;\n\n const mimeLength = data.readUInt32BE(offset);\n offset += 4;\n\n if (offset + mimeLength > data.length) return null;\n\n const mimeType = data.toString('utf8', offset, offset + mimeLength);\n offset += mimeLength;\n\n const descLength = data.readUInt32BE(offset);\n offset += 4 + descLength;\n\n if (offset + 16 > data.length) return null;\n\n const width = data.readUInt32BE(offset);\n offset += 4;\n\n const height = data.readUInt32BE(offset);\n offset += 4 + 8; // Skip depth and colors\n\n const imageLength = data.readUInt32BE(offset);\n offset += 4;\n\n if (offset + imageLength > data.length) return null;\n\n const imageData = data.subarray(offset, offset + imageLength);\n if (imageData.length === 0) return null;\n\n return {\n data: imageData,\n mimeType: normalizeMimeType(mimeType),\n width: width > 0 ? width : undefined,\n height: height > 0 ? height : undefined,\n pictureType,\n };\n}\n\nexport async function extractFromFlac(reader: FileReader): Promise<ExtractedArtwork | null> {\n const signature = await reader.read(0, 4);\n if (signature.toString('ascii') !== 'fLaC') return null;\n\n let offset = 4;\n let isLastBlock = false;\n\n let frontCover: ExtractedArtwork | null = null;\n let anyArtwork: ExtractedArtwork | null = null;\n\n while (!isLastBlock && offset < reader.size) {\n const blockHeader = await reader.read(offset, 4);\n if (blockHeader.length < 4) break;\n\n isLastBlock = (blockHeader[0] & 0x80) !== 0;\n const blockType = blockHeader[0] & 0x7f;\n const blockLength = (blockHeader[1] << 16) | (blockHeader[2] << 8) | blockHeader[3];\n\n if (blockLength <= 0 || offset + 4 + blockLength > reader.size) break;\n\n if (blockType === MetadataBlockType.PICTURE) {\n const pictureData = await reader.read(offset + 4, blockLength);\n const artwork = parsePictureBlock(pictureData);\n\n if (artwork) {\n if (artwork.pictureType === PictureType.FrontCover) frontCover = artwork;\n else if (!anyArtwork) anyArtwork = artwork;\n }\n }\n\n offset += 4 + blockLength;\n }\n\n return frontCover ?? anyArtwork;\n}\n","import {ExtractedArtwork, FileReader, PictureType} from '../types';\nimport {detectImageType} from './utils';\n\nfunction readSyncsafe(buffer: Buffer, offset: number = 0): number {\n return (\n ((buffer[offset] & 0x7f) << 21) |\n ((buffer[offset + 1] & 0x7f) << 14) |\n ((buffer[offset + 2] & 0x7f) << 7) |\n (buffer[offset + 3] & 0x7f)\n );\n}\n\nfunction readNullTerminatedString(\n buffer: Buffer,\n offset: number,\n encoding: 'latin1' | 'utf8' | 'utf16le' | 'utf16be'\n): {value: string; bytesConsumed: number} {\n const isUtf16 = encoding === 'utf16le' || encoding === 'utf16be';\n let end = offset;\n\n if (isUtf16) {\n while (end < buffer.length - 1) {\n if (buffer[end] === 0 && buffer[end + 1] === 0) break;\n end += 2;\n }\n } else {\n while (end < buffer.length && buffer[end] !== 0) end++;\n }\n\n let value: string;\n if (encoding === 'utf16be') {\n const swapped = Buffer.alloc(end - offset);\n for (let i = 0; i < end - offset; i += 2) {\n swapped[i] = buffer[offset + i + 1];\n swapped[i + 1] = buffer[offset + i];\n }\n value = swapped.toString('utf16le');\n } else {\n value = buffer.toString(encoding === 'utf16le' ? 'utf16le' : encoding, offset, end);\n }\n\n return {value, bytesConsumed: end - offset + (isUtf16 ? 2 : 1)};\n}\n\nfunction getTextEncoding(encodingByte: number): 'latin1' | 'utf8' | 'utf16le' | 'utf16be' {\n switch (encodingByte) {\n case 0: return 'latin1';\n case 1: return 'utf16le';\n case 2: return 'utf16be';\n case 3: return 'utf8';\n default: return 'latin1';\n }\n}\n\nfunction parseApicFrame(data: Buffer): ExtractedArtwork | null {\n if (data.length < 4) return null;\n\n let offset = 0;\n const encodingByte = data[offset++];\n let encoding = getTextEncoding(encodingByte);\n\n if (encodingByte === 1 && data.length > offset + 2) {\n const bom = data.readUInt16BE(offset);\n if (bom === 0xfeff) encoding = 'utf16be';\n else if (bom === 0xfffe) encoding = 'utf16le';\n }\n\n const mimeResult = readNullTerminatedString(data, offset, 'latin1');\n const mimeType = mimeResult.value;\n offset += mimeResult.bytesConsumed;\n\n if (offset >= data.length) return null;\n\n const pictureType = data[offset++] as PictureType;\n if (offset >= data.length) return null;\n\n const descResult = readNullTerminatedString(data, offset, encoding);\n offset += descResult.bytesConsumed;\n\n if (offset >= data.length) return null;\n\n const imageData = data.subarray(offset);\n if (imageData.length === 0) return null;\n\n const detectedType = detectImageType(imageData);\n const finalMimeType = detectedType ?? (mimeType.includes('png') ? 'image/png' : 'image/jpeg');\n\n return {data: imageData, mimeType: finalMimeType, pictureType};\n}\n\nexport async function extractFromMp3(reader: FileReader): Promise<ExtractedArtwork | null> {\n const header = await reader.read(0, 10);\n if (header.length < 10 || header.toString('ascii', 0, 3) !== 'ID3') return null;\n\n const majorVersion = header[3];\n const flags = header[5];\n const tagSize = readSyncsafe(header, 6);\n\n let extendedHeaderSize = 0;\n if (flags & 0x40) {\n const extHeader = await reader.read(10, 4);\n extendedHeaderSize = majorVersion === 4 ? readSyncsafe(extHeader, 0) : extHeader.readUInt32BE(0);\n }\n\n const tagData = await reader.read(10 + extendedHeaderSize, tagSize - extendedHeaderSize);\n\n let offset = 0;\n const frameHeaderSize = majorVersion >= 3 ? 10 : 6;\n\n let frontCover: ExtractedArtwork | null = null;\n let anyArtwork: ExtractedArtwork | null = null;\n\n while (offset < tagData.length - frameHeaderSize) {\n if (tagData[offset] === 0) break;\n\n let frameId: string;\n let frameSize: number;\n\n if (majorVersion >= 3) {\n frameId = tagData.toString('ascii', offset, offset + 4);\n frameSize = majorVersion === 4 ? readSyncsafe(tagData, offset + 4) : tagData.readUInt32BE(offset + 4);\n } else {\n frameId = tagData.toString('ascii', offset, offset + 3);\n frameSize = (tagData[offset + 3] << 16) | (tagData[offset + 4] << 8) | tagData[offset + 5];\n }\n\n if (frameSize <= 0 || frameSize > tagData.length - offset) break;\n\n const frameIdNormalized = majorVersion >= 3 ? frameId : frameId === 'PIC' ? 'APIC' : frameId;\n\n if (frameIdNormalized === 'APIC') {\n const frameData = tagData.subarray(offset + frameHeaderSize, offset + frameHeaderSize + frameSize);\n const artwork = parseApicFrame(frameData);\n\n if (artwork) {\n if (artwork.pictureType === PictureType.FrontCover) frontCover = artwork;\n else if (!anyArtwork) anyArtwork = artwork;\n }\n }\n\n offset += frameHeaderSize + frameSize;\n }\n\n return frontCover ?? anyArtwork;\n}\n","export {extractFromMp3} from './id3';\nexport {extractFromMp4} from './mp4';\nexport {extractFromFlac} from './flac';\nexport {extractFromAiff} from './aiff';\nexport {detectImageType, normalizeMimeType} from './utils';\n","import {ExtractedArtwork, FileReader, PictureType} from '../types';\nimport {detectImageType} from './utils';\n\ninterface AtomHeader {\n size: number;\n type: string;\n headerSize: number;\n}\n\nasync function readAtomHeader(reader: FileReader, offset: number): Promise<AtomHeader | null> {\n if (offset + 8 > reader.size) return null;\n\n const header = await reader.read(offset, 8);\n const size = header.readUInt32BE(0);\n const type = header.toString('ascii', 4, 8);\n\n if (size === 1) {\n if (offset + 16 > reader.size) return null;\n const extHeader = await reader.read(offset + 8, 8);\n const extSize = Number(extHeader.readBigUInt64BE(0));\n return {size: extSize, type, headerSize: 16};\n }\n\n if (size === 0) return {size: reader.size - offset, type, headerSize: 8};\n\n return {size, type, headerSize: 8};\n}\n\nasync function findAtom(\n reader: FileReader,\n startOffset: number,\n endOffset: number,\n targetType: string\n): Promise<{dataOffset: number; dataSize: number} | null> {\n let offset = startOffset;\n\n while (offset < endOffset) {\n const header = await readAtomHeader(reader, offset);\n if (!header || header.size <= 0) break;\n\n if (header.type === targetType) {\n return {dataOffset: offset + header.headerSize, dataSize: header.size - header.headerSize};\n }\n\n offset += header.size;\n }\n\n return null;\n}\n\nasync function findMoovAtom(reader: FileReader): Promise<{dataOffset: number; dataSize: number} | null> {\n return findAtom(reader, 0, reader.size, 'moov');\n}\n\nasync function findCoverArtData(\n reader: FileReader,\n moovOffset: number,\n moovSize: number\n): Promise<Buffer | null> {\n const udta = await findAtom(reader, moovOffset, moovOffset + moovSize, 'udta');\n if (!udta) return null;\n\n const meta = await findAtom(reader, udta.dataOffset, udta.dataOffset + udta.dataSize, 'meta');\n if (!meta) return null;\n\n const metaDataStart = meta.dataOffset + 4;\n const metaDataEnd = meta.dataOffset + meta.dataSize;\n\n const ilst = await findAtom(reader, metaDataStart, metaDataEnd, 'ilst');\n if (!ilst) return null;\n\n const covr = await findAtom(reader, ilst.dataOffset, ilst.dataOffset + ilst.dataSize, 'covr');\n if (!covr) return null;\n\n const data = await findAtom(reader, covr.dataOffset, covr.dataOffset + covr.dataSize, 'data');\n if (!data || data.dataSize < 8) return null;\n\n return reader.read(data.dataOffset + 8, data.dataSize - 8);\n}\n\nexport async function extractFromMp4(reader: FileReader): Promise<ExtractedArtwork | null> {\n const ftypHeader = await reader.read(0, 8);\n if (ftypHeader.length < 8 || ftypHeader.toString('ascii', 4, 8) !== 'ftyp') return null;\n\n const moov = await findMoovAtom(reader);\n if (!moov) return null;\n\n const imageData = await findCoverArtData(reader, moov.dataOffset, moov.dataSize);\n if (!imageData || imageData.length === 0) return null;\n\n const mimeType = detectImageType(imageData) ?? 'image/jpeg';\n\n return {data: imageData, mimeType, pictureType: PictureType.FrontCover};\n}\n","import {ExtractedArtwork} from '../types';\n\nexport function detectImageType(\n data: Buffer\n): 'image/jpeg' | 'image/png' | 'image/gif' | null {\n if (data.length < 4) return null;\n if (data[0] === 0xff && data[1] === 0xd8 && data[2] === 0xff) return 'image/jpeg';\n if (data[0] === 0x89 && data.toString('ascii', 1, 4) === 'PNG') return 'image/png';\n if (data.toString('ascii', 0, 3) === 'GIF') return 'image/gif';\n return null;\n}\n\nexport function normalizeMimeType(mimeType: string): ExtractedArtwork['mimeType'] {\n const lower = mimeType.toLowerCase();\n if (lower.includes('png')) return 'image/png';\n if (lower.includes('gif')) return 'image/gif';\n return 'image/jpeg';\n}\n","import {fetchFileRange, getFileInfo, NfsMediaSlot} from 'src/nfs';\nimport {Device} from 'src/types';\n\nimport {FileReader} from './types';\n\n/**\n * Create a FileReader backed by NFS that reads from a device's media slot.\n */\nexport function createNfsFileReader(\n device: Device,\n slot: NfsMediaSlot,\n path: string,\n fileSize: number\n): FileReader {\n const extension = path.split('.').pop()?.toLowerCase() ?? '';\n\n return {\n size: fileSize,\n extension,\n read: (offset: number, length: number): Promise<Buffer> =>\n fetchFileRange({device, slot, path, offset, length}),\n };\n}\n\n/**\n * Create a FileReader backed by NFS, automatically fetching file size.\n */\nexport async function createNfsFileReaderWithInfo(\n device: Device,\n slot: NfsMediaSlot,\n path: string\n): Promise<FileReader> {\n const fileInfo = await getFileInfo({device, slot, path});\n return createNfsFileReader(device, slot, path, fileInfo.size);\n}\n\n/**\n * Create a FileReader from a Buffer (for testing).\n */\nexport function createBufferReader(buffer: Buffer, extension: string): FileReader {\n return {\n size: buffer.length,\n extension,\n read: (offset: number, length: number): Promise<Buffer> => {\n const end = Math.min(offset + length, buffer.length);\n return Promise.resolve(buffer.subarray(offset, end));\n },\n };\n}\n","/**\n * Extracted artwork from an audio file\n */\nexport interface ExtractedArtwork {\n data: Buffer;\n mimeType: 'image/jpeg' | 'image/png' | 'image/gif';\n width?: number;\n height?: number;\n pictureType?: PictureType;\n}\n\n/**\n * Standard picture types from ID3v2 / FLAC specs\n */\nexport enum PictureType {\n Other = 0,\n FileIcon32x32 = 1,\n OtherFileIcon = 2,\n FrontCover = 3,\n BackCover = 4,\n LeafletPage = 5,\n Media = 6,\n LeadArtist = 7,\n Artist = 8,\n Conductor = 9,\n Band = 10,\n Composer = 11,\n Lyricist = 12,\n RecordingLocation = 13,\n DuringRecording = 14,\n DuringPerformance = 15,\n MovieScreenCapture = 16,\n BrightColoredFish = 17,\n Illustration = 18,\n BandLogotype = 19,\n PublisherLogotype = 20,\n}\n\n/**\n * Interface for reading file data at arbitrary offsets.\n */\nexport interface FileReader {\n readonly size: number;\n readonly extension: string;\n read(offset: number, length: number): Promise<Buffer>;\n}\n","/**\n * The default virtual CDJ ID to use.\n *\n * This particular ID is out of the 1-6 range, thus will not be able to request\n * metadata via the remotedb for CDJs.\n */\nexport const DEFAULT_VCDJ_ID = 0x07;\n\n/**\n * The port on which devices on the prolink network announce themselves.\n */\nexport const ANNOUNCE_PORT = 50000;\n\n/**\n * The port on which devices on the prolink network send beat timing information.\n */\nexport const BEAT_PORT = 50001;\n\n/**\n * The port on which devices on the prolink network announce themselves.\n */\nexport const STATUS_PORT = 50002;\n\n/**\n * The amount of time in ms between sending each announcement packet.\n */\nexport const ANNOUNCE_INTERVAL = 1500;\n\n/**\n * The interval in ms between startup stage packets (0x0a, 0x00, 0x02, 0x04).\n */\nexport const STARTUP_STAGE_INTERVAL = 300;\n\n// prettier-ignore\n/**\n * All UDP packets on the PRO DJ LINK network start with this magic header.\n */\nexport const PROLINK_HEADER = Uint8Array.of(\n 0x51, 0x73, 0x70, 0x74, 0x31,\n 0x57, 0x6d, 0x4a, 0x4f, 0x4c\n);\n\n/**\n * VirtualCDJName is the name given to the Virtual CDJ device.\n */\nexport const VIRTUAL_CDJ_NAME = 'ProLink-Connect';\n\n/**\n * VirtualCDJFirmware is a string indicating the firmware version reported with\n * status packets.\n */\nexport const VIRTUAL_CDJ_FIRMWARE = '3.20';\n\n/**\n * CDJs use device IDs 1-6. Devices outside this range (e.g. Stagehand at 154)\n * should not be queried for media slots or databases as they may crash.\n */\nexport const MIN_CDJ_DEVICE_ID = 1;\nexport const MAX_CDJ_DEVICE_ID = 6;\n","import {Socket} from 'dgram';\n\nimport {BEAT_PORT, PROLINK_HEADER} from 'src/constants';\nimport {CDJStatus, Device} from 'src/types';\nimport {buildName} from 'src/utils';\nimport {udpSend} from 'src/utils/udp';\n\ninterface Options {\n hostDevice: Device;\n device: Device;\n playState: CDJStatus.PlayState.Cued | CDJStatus.PlayState.Playing;\n}\n\nconst STATE_MAP = {\n [CDJStatus.PlayState.Cued]: 0x01,\n [CDJStatus.PlayState.Playing]: 0x00,\n};\n\n/**\n * Generates the packet used to control the playstate of CDJs\n */\nexport const makePlaystatePacket = ({hostDevice, device, playState}: Options) =>\n Uint8Array.from([\n ...PROLINK_HEADER,\n ...[0x02],\n ...buildName(hostDevice),\n ...[0x01, 0x00],\n ...[hostDevice.id],\n ...[0x00, 0x04],\n ...new Array(4)\n .fill(0x00)\n .map((_, i) => (i === device.id ? STATE_MAP[playState] : 0)),\n ]);\n\nexport default class Control {\n #hostDevice: Device;\n /**\n * The socket used to send control packets\n */\n #beatSocket: Socket;\n\n constructor(beatSocket: Socket, hostDevice: Device) {\n this.#beatSocket = beatSocket;\n this.#hostDevice = hostDevice;\n }\n\n /**\n * Start or stop a CDJ on the network\n */\n async setPlayState(device: Device, playState: Options['playState']) {\n const packet = makePlaystatePacket({hostDevice: this.#hostDevice, device, playState});\n await udpSend(this.#beatSocket, packet, BEAT_PORT, device.ip.address);\n }\n}\n","import {extractArtworkFromDevice, isArtworkExtractionSupported} from 'src/artwork';\nimport {Track} from 'src/entities';\nimport {type Logger, noopLogger} from 'src/logger';\nimport {NfsMediaSlot} from 'src/nfs';\nimport {Device, DeviceID, MediaSlot} from 'src/types';\nimport {getSlotName} from 'src/utils';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\nimport * as Telemetry from 'src/utils/telemetry';\n\nexport interface Options {\n deviceId: DeviceID;\n trackSlot: MediaSlot;\n track: Track;\n span?: Span;\n logger?: Logger;\n}\n\n/**\n * Extract artwork directly from an audio file via NFS.\n */\nexport async function viaFileExtraction(\n device: Device,\n opts: Options\n): Promise<Buffer | null> {\n const {trackSlot, track, span} = opts;\n const logger = opts.logger ?? noopLogger;\n\n if (\n trackSlot !== MediaSlot.USB &&\n trackSlot !== MediaSlot.SD &&\n trackSlot !== MediaSlot.RB\n ) {\n logger.debug(\n `[artwork-nfs] Skipping: unsupported slot ${getSlotName(trackSlot)} (device ${device.name})`\n );\n return null;\n }\n\n const slot = trackSlot as NfsMediaSlot;\n\n if (!track.filePath) {\n logger.debug('[artwork-nfs] Skipping: no filePath on track');\n return null;\n }\n\n const extension = track.filePath.split('.').pop()?.toLowerCase() ?? '';\n if (!isArtworkExtractionSupported(extension)) {\n logger.debug(\n `[artwork-nfs] Skipping: unsupported extension \".${extension}\" (${track.filePath})`\n );\n return null;\n }\n\n logger.debug(\n `[artwork-nfs] Extracting from ${track.filePath} (slot=${getSlotName(trackSlot)}, device=${device.name} @ ${device.ip.address})`\n );\n\n const tx = span\n ? span.startChild({op: 'getArtworkFromFile'})\n : Telemetry.startTransaction({name: 'getArtworkFromFile'});\n\n try {\n const artwork = await extractArtworkFromDevice(device, slot, track.filePath, logger);\n\n if (!artwork) {\n logger.debug('[artwork-nfs] No embedded artwork found in file');\n tx.setData('result', 'no_artwork');\n tx.finish();\n return null;\n }\n\n logger.debug(\n `[artwork-nfs] Success: ${artwork.mimeType} (${artwork.data.length} bytes)`\n );\n tx.setData('result', 'success');\n tx.setData('mimeType', artwork.mimeType);\n tx.setData('size', artwork.data.length);\n tx.finish();\n\n return artwork.data;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.warn(`[artwork-nfs] NFS extraction failed: ${msg}`);\n tx.setData('result', 'error');\n tx.finish();\n Telemetry.captureException(error);\n return null;\n }\n}\n","import {Track} from 'src/entities';\nimport LocalDatabase from 'src/localdb';\nimport {fetchFile} from 'src/nfs';\nimport RemoteDatabase, {MenuTarget, Query} from 'src/remotedb';\nimport {Device, DeviceID, MediaSlot, TrackType} from 'src/types';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\nimport * as Telemetry from 'src/utils/telemetry';\n\nexport interface Options {\n /**\n * The device to query the track artwork off of\n */\n deviceId: DeviceID;\n /**\n * The media slot the track is present in\n */\n trackSlot: MediaSlot;\n /**\n * The type of track we are querying artwork for\n */\n trackType: TrackType;\n /**\n * The track to lookup artwork for\n */\n track: Track;\n /**\n * The Sentry transaction span\n */\n span?: Span;\n}\n\nexport async function viaRemote(remote: RemoteDatabase, opts: Required<Options>) {\n const {deviceId, trackSlot, trackType, track, span} = opts;\n\n const conn = await remote.get(deviceId);\n if (conn === null) {\n return null;\n }\n\n if (track.artwork === null) {\n return null;\n }\n\n const queryDescriptor = {\n trackSlot,\n trackType,\n menuTarget: MenuTarget.Main,\n };\n\n return conn.query({\n queryDescriptor,\n query: Query.GetArtwork,\n args: {artworkId: track.artwork.id},\n span,\n });\n}\n\nexport async function viaLocal(\n local: LocalDatabase,\n device: Device,\n opts: Required<Options>\n) {\n const {deviceId, trackSlot, track} = opts;\n\n if (trackSlot !== MediaSlot.USB && trackSlot !== MediaSlot.SD) {\n throw new Error('Expected USB or SD slot for remote database query');\n }\n\n const conn = await local.get(deviceId, trackSlot);\n if (conn === null) {\n return null;\n }\n\n if (track.artwork === null || track.artwork.path === undefined) {\n return null;\n }\n\n try {\n return fetchFile({device, slot: trackSlot, path: track.artwork.path});\n } catch (error) {\n Telemetry.captureException(error);\n return null;\n }\n}\n","import {Track} from 'src/entities';\nimport LocalDatabase from 'src/localdb';\nimport {type Logger, noopLogger} from 'src/logger';\nimport {fetchFile} from 'src/nfs';\nimport RemoteDatabase from 'src/remotedb';\nimport {Device, DeviceID, MediaSlot, TrackType} from 'src/types';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\nimport * as Telemetry from 'src/utils/telemetry';\n\nexport interface Options {\n /**\n * The device to query the file off of\n */\n deviceId: DeviceID;\n /**\n * The media slot the track is present in\n */\n trackSlot: MediaSlot;\n /**\n * The type of track we are querying file for\n */\n trackType: TrackType;\n /**\n * The track to get track for\n */\n track: Track;\n /**\n * The Sentry transaction span\n */\n span?: Span;\n /**\n * Logger instance for diagnostic output\n */\n logger?: Logger;\n}\n\nconst CHUNK_SIZE = 8192; // Maximum allowed XDR read size\n\nexport function viaRemote(\n _remote: RemoteDatabase,\n _device: Device,\n _opts: Options\n): null {\n const logger = _opts.logger ?? noopLogger;\n logger.error('Getting a file from Rekordbox via ProDJ-Link is not yet supported.');\n return null;\n\n // const conn = await remote.get(deviceId);\n // if (conn === null) {\n // return null;\n // }\n\n // if (track.artwork === null) {\n // return null;\n // }\n\n // const queryDescriptor = {\n // trackSlot,\n // trackType,\n // menuTarget: MenuTarget.Main,\n // };\n\n // return conn.query({\n // queryDescriptor,\n // query: Query.GetArtwork,\n // args: {artworkId: track.artwork.id},\n // span,\n // });\n}\n\nexport async function viaLocal(local: LocalDatabase, device: Device, opts: Options) {\n const {deviceId, trackSlot, track} = opts;\n const logger = opts.logger ?? noopLogger;\n\n if (trackSlot !== MediaSlot.USB && trackSlot !== MediaSlot.SD) {\n throw new Error('Expected USB or SD or RB slot for remote database query');\n }\n\n const conn = await local.get(deviceId, trackSlot);\n if (conn === null) {\n return null;\n }\n\n try {\n return fetchFile({\n device,\n slot: trackSlot,\n path: track.filePath,\n onProgress: progress => {\n logger.trace('%d %d', progress.read, progress.total);\n },\n chunkSize: CHUNK_SIZE,\n });\n } catch (error) {\n Telemetry.captureException(error);\n return null;\n }\n}\n","import {Track} from 'src/entities';\nimport LocalDatabase from 'src/localdb';\nimport {loadAnlz} from 'src/localdb/rekordbox';\nimport RemoteDatabase, {MenuTarget, Query} from 'src/remotedb';\nimport {Device, DeviceID, MediaSlot, TrackType} from 'src/types';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\n\nimport {anlzLoader} from './utils';\n\nexport interface Options {\n /**\n * The device to query the track metadata from\n */\n deviceId: DeviceID;\n /**\n * The media slot the track is present in\n */\n trackSlot: MediaSlot;\n /**\n * The type of track we are querying for\n */\n trackType: TrackType;\n /**\n * The track id to retrieve metadata for\n */\n trackId: number;\n /**\n * The Sentry transaction span\n */\n span?: Span;\n}\n\nexport async function viaRemote(remote: RemoteDatabase, opts: Required<Options>) {\n const {deviceId, trackSlot, trackType, trackId, span} = opts;\n\n const conn = await remote.get(deviceId);\n if (conn === null) {\n return null;\n }\n\n const queryDescriptor = {\n trackSlot,\n trackType,\n menuTarget: MenuTarget.Main,\n };\n\n const isUnanalyzed =\n trackType === TrackType.Unanalyzed || trackType === TrackType.AudioCD;\n const isStreaming = trackType === TrackType.Streaming;\n const skipLocalFileLookups = isUnanalyzed || isStreaming;\n\n // Unanalyzed tracks use GetGenericMetadata (reads ID3 tags from the audio file).\n // Streaming tracks (Beatport) use the regular GetMetadata query.\n const track = await conn.query({\n queryDescriptor,\n query: isUnanalyzed ? Query.GetGenericMetadata : Query.GetMetadata,\n args: {trackId},\n span,\n });\n\n // Try to get file path — for streaming tracks this returns the Beatport track ID\n // (e.g. \"/26883657.m4a\") which we use for Beatport API lookups\n try {\n track.filePath = await conn.query({\n queryDescriptor,\n query: Query.GetTrackInfo,\n args: {trackId},\n span,\n });\n } catch (err) {\n if (!skipLocalFileLookups) {\n throw err;\n }\n }\n\n // Beat grid is only available for analyzed local tracks\n if (!skipLocalFileLookups) {\n track.beatGrid = await conn.query({\n queryDescriptor,\n query: Query.GetBeatGrid,\n args: {trackId},\n span,\n });\n }\n\n return track;\n}\n\nexport async function viaLocal(\n local: LocalDatabase,\n device: Device,\n opts: Required<Options>\n) {\n const {deviceId, trackSlot, trackId} = opts;\n\n if (trackSlot !== MediaSlot.USB && trackSlot !== MediaSlot.SD) {\n throw new Error('Expected USB or SD slot for local database query');\n }\n\n const adapter = await local.get(deviceId, trackSlot);\n if (adapter === null) {\n return null;\n }\n\n const dbTrack = adapter.findTrack(trackId);\n\n if (dbTrack === null) {\n return null;\n }\n\n const anlz = await loadAnlz(dbTrack, 'DAT', anlzLoader({device, slot: trackSlot}));\n\n const track: Track = {\n ...dbTrack,\n beatGrid: anlz.beatGrid,\n waveformHd: null,\n };\n\n return track;\n}\n","import {Playlist} from 'src/entities';\nimport LocalDatabase from 'src/localdb';\nimport RemoteDatabase, {MenuTarget, Query} from 'src/remotedb';\nimport {DeviceID, MediaSlot, PlaylistContents, TrackType} from 'src/types';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\n\nexport interface Options {\n /**\n * The playlist or folder to query the entries of. This may be left as\n * undefined to retrieve the root playlist.\n */\n playlist?: Playlist;\n /**\n * The device to query the track metadata from\n */\n deviceId: DeviceID;\n /**\n * The media slot the track is present in\n */\n mediaSlot: MediaSlot;\n /**\n * The Sentry transaction span\n */\n span?: Span;\n}\n\nexport async function viaRemote(remote: RemoteDatabase, opts: Options) {\n const {playlist, deviceId, mediaSlot, span} = opts;\n\n const conn = await remote.get(deviceId);\n if (conn === null) {\n return null;\n }\n\n const queryDescriptor = {\n trackSlot: mediaSlot,\n trackType: TrackType.RB,\n menuTarget: MenuTarget.Main,\n };\n\n const id = playlist?.id;\n const isFolderRequest = playlist?.isFolder ?? true;\n\n const {folders, playlists, trackEntries} = await conn.query({\n queryDescriptor,\n query: Query.MenuPlaylist,\n args: {id, isFolderRequest},\n span,\n });\n\n const iterateTracks = async function* () {\n for (const entry of trackEntries) {\n if (!conn) {\n break;\n }\n\n yield conn.query({\n queryDescriptor,\n query: Query.GetMetadata,\n args: {trackId: entry.id},\n span,\n });\n }\n };\n\n const tracks = {[Symbol.asyncIterator]: iterateTracks};\n const totalTracks = trackEntries.length;\n\n return {folders, playlists, tracks, totalTracks} as PlaylistContents;\n}\n\nexport async function viaLocal(local: LocalDatabase, opts: Options) {\n const {playlist, deviceId, mediaSlot} = opts;\n\n if (mediaSlot !== MediaSlot.USB && mediaSlot !== MediaSlot.SD) {\n throw new Error('Expected USB or SD slot for local database query');\n }\n\n const orm = await local.get(deviceId, mediaSlot);\n if (orm === null) {\n return null;\n }\n\n const {folders, playlists, trackEntries} = orm.findPlaylist(playlist?.id);\n\n const iterateTracks = async function* () {\n for (const entry of trackEntries) {\n if (!orm) {\n break;\n }\n yield orm.findTrack(entry.id);\n }\n };\n\n const tracks = {[Symbol.asyncIterator]: iterateTracks};\n const totalTracks = trackEntries.length;\n\n return {folders, playlists, tracks, totalTracks} as PlaylistContents;\n}\n","import {Track} from 'src/entities';\nimport LocalDatabase from 'src/localdb';\nimport {loadAnlz} from 'src/localdb/rekordbox';\nimport {\n Device,\n DeviceID,\n ExtendedCue,\n MediaSlot,\n SongStructure,\n TrackType,\n VocalConfig,\n Waveform3BandDetail,\n Waveform3BandPreview,\n WaveformHD,\n} from 'src/types';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\n\nimport {anlzLoader} from './utils';\n\nexport interface TrackAnalysis {\n /** Extended cues with colors and comments (PCO2 tag) */\n extendedCues: ExtendedCue[] | null;\n /** Song structure / phrase analysis (PSSI tag) */\n songStructure: SongStructure | null;\n /** Color waveform preview (PWV4 tag) */\n waveformColorPreview: Uint8Array | undefined;\n /** HD waveform data (PWV5 tag) */\n waveformHd: WaveformHD | null;\n /** 3-band color waveform preview (PWV6 tag from .2EX) */\n waveform3BandPreview: Waveform3BandPreview | null;\n /** 3-band color detail waveform (PWV7 tag from .2EX) */\n waveform3BandDetail: Waveform3BandDetail | null;\n /** Vocal detection config (PWVC tag from .2EX) */\n vocalConfig: VocalConfig | null;\n}\n\nexport interface Options {\n deviceId: DeviceID;\n trackSlot: MediaSlot;\n trackType: TrackType;\n track: Track;\n span?: Span;\n}\n\nexport async function viaLocal(\n local: LocalDatabase,\n device: Device,\n opts: Required<Options>\n): Promise<TrackAnalysis | null> {\n const {deviceId, trackSlot, track} = opts;\n\n if (trackSlot !== MediaSlot.USB && trackSlot !== MediaSlot.SD) {\n throw new Error('Expected USB or SD slot for local database query');\n }\n\n const conn = await local.get(deviceId, trackSlot);\n if (conn === null) {\n return null;\n }\n\n const resolver = anlzLoader({device, slot: trackSlot});\n const [extResult, twoxResult] = await Promise.all([\n loadAnlz(track, 'EXT', resolver),\n loadAnlz(track, '2EX', resolver).catch(() => null),\n ]);\n\n return {\n extendedCues: extResult.extendedCues,\n songStructure: extResult.songStructure,\n waveformColorPreview: extResult.waveformColorPreview ?? undefined,\n waveformHd: extResult.waveformHd,\n waveform3BandPreview: twoxResult?.waveform3BandPreview ?? null,\n waveform3BandDetail: twoxResult?.waveform3BandDetail ?? null,\n vocalConfig: twoxResult?.vocalConfig ?? null,\n };\n}\n","import {Track} from 'src/entities';\nimport LocalDatabase from 'src/localdb';\nimport {loadAnlz} from 'src/localdb/rekordbox';\nimport RemoteDatabase, {MenuTarget, Query} from 'src/remotedb';\nimport {\n Device,\n DeviceID,\n MediaSlot,\n TrackType,\n WaveformDetailed,\n WaveformPreview,\n Waveforms,\n} from 'src/types';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\n\nimport {anlzLoader} from './utils';\n\nexport interface Options {\n /**\n * The device to query the track waveforms off of\n */\n deviceId: DeviceID;\n /**\n * The media slot the track is present in\n */\n trackSlot: MediaSlot;\n /**\n * The type of track we are querying waveforms for\n */\n trackType: TrackType;\n /**\n * The track to lookup waveforms for\n */\n track: Track;\n /**\n * The Sentry transaction span\n */\n span?: Span;\n}\n\nexport async function viaRemote(remote: RemoteDatabase, opts: Required<Options>) {\n const {deviceId, trackSlot, trackType, track, span} = opts;\n\n const conn = await remote.get(deviceId);\n if (conn === null) {\n return null;\n }\n\n const queryDescriptor = {\n trackSlot,\n trackType,\n menuTarget: MenuTarget.Main,\n };\n\n const waveformHd = await conn.query({\n queryDescriptor,\n query: Query.GetWaveformHD,\n args: {trackId: track.id},\n span,\n });\n\n const isStreaming = trackType === TrackType.Streaming;\n\n if (!isStreaming) {\n return {waveformHd} as Waveforms;\n }\n\n // Streaming tracks (e.g. Beatport LINK) have no local ANLZ file but the CDJ\n // serves waveform preview and detailed via remotedb.\n const [waveformPreview, waveformDetailed] = await Promise.all([\n conn.query({\n queryDescriptor,\n query: Query.GetWaveformPreview,\n args: {trackId: track.id},\n span,\n }) as Promise<WaveformPreview>,\n conn.query({\n queryDescriptor,\n query: Query.GetWaveformDetailed,\n args: {trackId: track.id},\n span,\n }) as Promise<WaveformDetailed>,\n ]);\n\n return {waveformHd, waveformPreview, waveformDetailed} as Waveforms;\n}\n\nexport async function viaLocal(\n local: LocalDatabase,\n device: Device,\n opts: Required<Options>\n) {\n const {deviceId, trackSlot, track} = opts;\n\n if (trackSlot !== MediaSlot.USB && trackSlot !== MediaSlot.SD) {\n throw new Error('Expected USB or SD slot for remote database query');\n }\n\n const conn = await local.get(deviceId, trackSlot);\n if (conn === null) {\n return null;\n }\n\n const anlz = await loadAnlz(track, 'EXT', anlzLoader({device, slot: trackSlot}));\n\n return {\n waveformHd: anlz.waveformHd,\n waveformColorPreview: anlz.waveformColorPreview ?? undefined,\n } as Waveforms;\n}\n","import DeviceManager from 'src/devices';\nimport {Track} from 'src/entities';\nimport LocalDatabase from 'src/localdb';\nimport {DatabaseType} from 'src/localdb/database-adapter';\nimport RemoteDatabase from 'src/remotedb';\nimport {\n Device,\n DeviceType,\n MediaSlot,\n PlaylistContents,\n TrackType,\n Waveforms,\n} from 'src/types';\nimport {getSlotName, getTrackTypeName} from 'src/utils';\nimport * as Telemetry from 'src/utils/telemetry';\nimport {SpanStatus} from 'src/utils/telemetry';\n\nimport * as GetArtworkFromFile from './getArtworkFromFile';\nimport * as GetArtworkThumbnail from './getArtworkThumbnail';\nimport * as GetFile from './getFile';\nimport * as GetMetadata from './getMetadata';\nimport * as GetPlaylist from './getPlaylist';\nimport * as GetTrackAnalysis from './getTrackAnalysis';\nimport * as GetWaveforms from './getWaveforms';\n\nenum LookupStrategy {\n Remote,\n Local,\n NoneAvailable,\n}\n\n/**\n * A Database is the central service used to query devices on the prolink\n * network for information from their databases.\n */\nclass Database {\n #deviceManager: DeviceManager;\n /**\n * The local database service, used when querying media devices connected\n * directly to CDJs containing a rekordbox formatted database.\n */\n #localDatabase: LocalDatabase;\n /**\n * The remote database service, used when querying the Rekordbox software or a\n * CDJ with an unanalyzed media device connected (when possible).\n */\n #remoteDatabase: RemoteDatabase;\n\n constructor(\n local: LocalDatabase,\n remote: RemoteDatabase,\n deviceManager: DeviceManager\n ) {\n this.#localDatabase = local;\n this.#remoteDatabase = remote;\n this.#deviceManager = deviceManager;\n }\n\n #getTrackLookupStrategy = (device: Device, type: TrackType) => {\n const isUnanalyzed = type === TrackType.AudioCD || type === TrackType.Unanalyzed;\n const isStreaming = type === TrackType.Streaming;\n\n // Unanalyzed and streaming tracks on CDJs must use RemoteDB\n // (streaming services like Beatport have no local database)\n if (device.type === DeviceType.CDJ && (isUnanalyzed || isStreaming)) {\n return LookupStrategy.Remote;\n }\n\n return device.type === DeviceType.Rekordbox\n ? LookupStrategy.Remote\n : device.type === DeviceType.CDJ && type === TrackType.RB\n ? LookupStrategy.Local\n : LookupStrategy.NoneAvailable;\n };\n\n #getMediaLookupStrategy = (device: Device, slot: MediaSlot) =>\n device.type === DeviceType.Rekordbox && slot === MediaSlot.RB\n ? LookupStrategy.Remote\n : device.type === DeviceType.Rekordbox\n ? LookupStrategy.NoneAvailable\n : LookupStrategy.Local;\n /**\n * Get the database type (oneLibrary or pdb) for a loaded device slot.\n * Returns null if the slot uses remote database or no database is loaded.\n */\n getDatabaseType(\n deviceId: number,\n slot: MediaSlot.USB | MediaSlot.SD\n ): DatabaseType | null {\n return this.#localDatabase.getDatabaseType(deviceId, slot);\n }\n\n /**\n * Retrieve metadata for a track on a specific device slot.\n */\n async getMetadata(opts: GetMetadata.Options) {\n const {deviceId, trackType, trackSlot, span} = opts;\n\n const tx = span\n ? span.startChild({op: 'dbGetMetadata'})\n : Telemetry.startTransaction({name: 'dbGetMetadata'});\n\n tx.setTag('deviceId', deviceId.toString());\n tx.setTag('trackType', getTrackTypeName(trackType));\n tx.setTag('trackSlot', getSlotName(trackSlot));\n\n const callOpts = {...opts, span: tx};\n\n const device = await this.#deviceManager.getDeviceEnsured(deviceId);\n if (device === null) {\n return null;\n }\n\n const strategy = this.#getTrackLookupStrategy(device, trackType);\n let track: Track | null = null;\n\n if (strategy === LookupStrategy.Remote) {\n track = await GetMetadata.viaRemote(this.#remoteDatabase, callOpts);\n }\n\n if (strategy === LookupStrategy.Local) {\n track = await GetMetadata.viaLocal(this.#localDatabase, device, callOpts);\n }\n\n if (strategy === LookupStrategy.NoneAvailable) {\n tx.setStatus(SpanStatus.Unavailable);\n }\n\n tx.finish();\n\n return track;\n }\n\n /**\n * Retrieves the file off a specific device slot.\n */\n async getFile(opts: GetArtworkThumbnail.Options) {\n const {deviceId, trackType, trackSlot, span} = opts;\n\n const tx = span\n ? span.startChild({op: 'dbGetFile'})\n : Telemetry.startTransaction({name: 'dbGetFile'});\n\n tx.setTag('deviceId', deviceId.toString());\n tx.setTag('trackType', getTrackTypeName(trackType));\n tx.setTag('trackSlot', getSlotName(trackSlot));\n\n const callOpts = {...opts, span: tx};\n\n const device = await this.#deviceManager.getDeviceEnsured(deviceId);\n if (device === null) {\n return null;\n }\n\n const strategy = this.#getTrackLookupStrategy(device, trackType);\n let artwork: Buffer | null = null;\n\n if (strategy === LookupStrategy.Remote) {\n artwork = await GetFile.viaRemote(this.#remoteDatabase, device, callOpts);\n }\n\n if (strategy === LookupStrategy.Local) {\n artwork = await GetFile.viaLocal(this.#localDatabase, device, callOpts);\n }\n\n if (strategy === LookupStrategy.NoneAvailable) {\n tx.setStatus(SpanStatus.Unavailable);\n }\n\n tx.finish();\n\n return artwork;\n }\n\n /**\n * Retrieves the low-resolution artwork thumbnail from the rekordbox database.\n *\n * This returns the pre-generated thumbnail stored in the rekordbox database,\n * which is typically small (around 80x80 pixels).\n *\n * For full-resolution artwork extracted from the audio file, use getArtwork().\n */\n async getArtworkThumbnail(opts: GetArtworkThumbnail.Options) {\n const {deviceId, trackType, trackSlot, span} = opts;\n\n const tx = span\n ? span.startChild({op: 'dbGetArtwork'})\n : Telemetry.startTransaction({name: 'dbGetArtwork'});\n\n tx.setTag('deviceId', deviceId.toString());\n tx.setTag('trackType', getTrackTypeName(trackType));\n tx.setTag('trackSlot', getSlotName(trackSlot));\n\n const callOpts = {...opts, span: tx};\n\n const device = await this.#deviceManager.getDeviceEnsured(deviceId);\n if (device === null) {\n return null;\n }\n\n const strategy = this.#getTrackLookupStrategy(device, trackType);\n let artwork: Buffer | null = null;\n\n if (strategy === LookupStrategy.Remote) {\n artwork = await GetArtworkThumbnail.viaRemote(this.#remoteDatabase, callOpts);\n }\n\n if (strategy === LookupStrategy.Local) {\n artwork = await GetArtworkThumbnail.viaLocal(this.#localDatabase, device, callOpts);\n }\n\n if (strategy === LookupStrategy.NoneAvailable) {\n tx.setStatus(SpanStatus.Unavailable);\n }\n\n tx.finish();\n\n return artwork;\n }\n\n /**\n * Retrieves artwork for a track by extracting it from the audio file via NFS.\n *\n * This is the primary method for getting artwork. It reads embedded artwork\n * from the audio file (ID3 tags for MP3, metadata atoms for M4A, PICTURE\n * blocks for FLAC, etc.) using partial file reads to minimize data transfer.\n *\n * For low-resolution thumbnails from the rekordbox database, use\n * getArtworkThumbnail() instead.\n */\n async getArtwork(opts: GetArtworkFromFile.Options) {\n const {deviceId, trackSlot, span} = opts;\n\n const tx = span\n ? span.startChild({op: 'dbGetArtwork'})\n : Telemetry.startTransaction({name: 'dbGetArtwork'});\n\n tx.setTag('deviceId', deviceId.toString());\n tx.setTag('trackSlot', getSlotName(trackSlot));\n\n const callOpts = {...opts, span: tx};\n\n const device = await this.#deviceManager.getDeviceEnsured(deviceId);\n if (device === null) {\n tx.setStatus(SpanStatus.NotFound);\n tx.finish();\n return null;\n }\n\n const artwork = await GetArtworkFromFile.viaFileExtraction(device, callOpts);\n\n tx.finish();\n\n return artwork;\n }\n\n /**\n * Retrieves the waveforms for a track on a specific device slot.\n */\n async getWaveforms(opts: GetArtworkThumbnail.Options) {\n const {deviceId, trackType, trackSlot, span} = opts;\n\n const tx = span\n ? span.startChild({op: 'dbGetWaveforms'})\n : Telemetry.startTransaction({name: 'dbGetWaveforms'});\n\n tx.setTag('deviceId', deviceId.toString());\n tx.setTag('trackType', getTrackTypeName(trackType));\n tx.setTag('trackSlot', getSlotName(trackSlot));\n\n const callOpts = {...opts, span: tx};\n\n const device = await this.#deviceManager.getDeviceEnsured(deviceId);\n if (device === null) {\n return null;\n }\n\n const strategy = this.#getTrackLookupStrategy(device, trackType);\n let waveforms: Waveforms | null = null;\n\n if (strategy === LookupStrategy.Remote) {\n waveforms = await GetWaveforms.viaRemote(this.#remoteDatabase, callOpts);\n }\n\n if (strategy === LookupStrategy.Local) {\n waveforms = await GetWaveforms.viaLocal(this.#localDatabase, device, callOpts);\n }\n\n if (strategy === LookupStrategy.NoneAvailable) {\n tx.setStatus(SpanStatus.Unavailable);\n }\n\n tx.finish();\n\n return waveforms;\n }\n\n /**\n * Retrieves all analysis data from the EXT file for a track.\n * Returns extended cues, song structure, waveform color preview, and HD waveform.\n */\n async getTrackAnalysis(opts: GetTrackAnalysis.Options) {\n const {deviceId, trackType, trackSlot, span} = opts;\n\n const tx = span\n ? span.startChild({op: 'dbGetTrackAnalysis'})\n : Telemetry.startTransaction({name: 'dbGetTrackAnalysis'});\n\n tx.setTag('deviceId', deviceId.toString());\n tx.setTag('trackType', getTrackTypeName(trackType));\n tx.setTag('trackSlot', getSlotName(trackSlot));\n\n const callOpts = {...opts, span: tx};\n\n const device = await this.#deviceManager.getDeviceEnsured(deviceId);\n if (device === null) {\n tx.finish();\n return null;\n }\n\n const strategy = this.#getTrackLookupStrategy(device, trackType);\n let analysis: GetTrackAnalysis.TrackAnalysis | null = null;\n\n if (strategy === LookupStrategy.Local) {\n analysis = await GetTrackAnalysis.viaLocal(this.#localDatabase, device, callOpts);\n }\n\n if (strategy === LookupStrategy.NoneAvailable || strategy === LookupStrategy.Remote) {\n tx.setStatus(SpanStatus.Unavailable);\n }\n\n tx.finish();\n\n return analysis;\n }\n\n /**\n * Retrieve folders, playlists, and tracks within the playlist tree. The id\n * may be left undefined to query the root of the playlist tree.\n *\n * NOTE: You will never receive a track list and playlists or folders at the\n * same time. But the API is simpler to combine the lookup for these.\n */\n async getPlaylist(opts: GetPlaylist.Options) {\n const {deviceId, mediaSlot, span} = opts;\n\n const tx = span\n ? span.startChild({op: 'dbGetPlaylist'})\n : Telemetry.startTransaction({name: 'dbGetPlaylist'});\n\n tx.setTag('deviceId', deviceId.toString());\n tx.setTag('mediaSlot', getSlotName(mediaSlot));\n\n const callOpts = {...opts, span: tx};\n\n const device = await this.#deviceManager.getDeviceEnsured(deviceId);\n if (device === null) {\n return null;\n }\n\n const strategy = this.#getMediaLookupStrategy(device, mediaSlot);\n let contents: PlaylistContents | null = null;\n\n if (strategy === LookupStrategy.Remote) {\n contents = await GetPlaylist.viaRemote(this.#remoteDatabase, callOpts);\n }\n\n if (strategy === LookupStrategy.Local) {\n contents = await GetPlaylist.viaLocal(this.#localDatabase, callOpts);\n }\n\n if (strategy === LookupStrategy.NoneAvailable) {\n tx.setStatus(SpanStatus.Unavailable);\n }\n\n tx.finish();\n\n return contents;\n }\n}\n\nexport default Database;\n","import {fetchFile} from 'src/nfs';\nimport {Device, MediaSlot} from 'src/types';\n\ninterface AnlzLoaderOpts {\n device: Device;\n slot: MediaSlot.RB | MediaSlot.USB | MediaSlot.SD;\n}\n\nexport function anlzLoader(opts: AnlzLoaderOpts) {\n return (path: string) => fetchFile({...opts, path});\n}\n","import StrictEventEmitter from 'strict-event-emitter-types';\n\nimport {Socket} from 'dgram';\nimport {EventEmitter} from 'events';\n\nimport {VIRTUAL_CDJ_NAME} from 'src/constants';\nimport {Device, DeviceID} from 'src/types';\n\nimport {deviceFromPacket} from './utils';\n\ninterface Config {\n /**\n * Time in milliseconds after which a device is considered to have\n * disconnected if it has not broadcast an announcement.\n *\n * @default 10000 ms\n */\n deviceTimeout?: number;\n /**\n * The name of the virtual CDJ to filter out from device announcements.\n * This prevents our own device from appearing in the device list.\n *\n * @default VIRTUAL_CDJ_NAME constant\n */\n vcdjName?: string;\n}\n\nconst defaultConfig: Required<Config> = {\n deviceTimeout: 10000,\n vcdjName: VIRTUAL_CDJ_NAME,\n};\n\n/**\n * The upper bound in milliseconds to wait when looking for a device to be on\n * the network when using the `getDeviceEnsured` method.\n */\nconst ENSURED_TIMEOUT = 2000;\n\n/**\n * The configuration object that may be passed to reconfigure the manager\n */\ntype ConfigEditable = Omit<Config, 'announceSocket'>;\n\n/**\n * The interface the device manager event emitter should follow\n */\ninterface DeviceEvents {\n /**\n * Fired when a new device becomes available on the network\n */\n connected: (device: Device) => void;\n /**\n * Fired when a device has not announced itself on the network for the\n * specified timeout.\n */\n disconnected: (device: Device) => void;\n /**\n * Fired every time the device announces itself on the network\n */\n announced: (device: Device) => void;\n}\n\ntype Emitter = StrictEventEmitter<EventEmitter, DeviceEvents>;\n\n/**\n * The device manager is responsible for tracking devices that appear on the\n * prolink network, providing an API to react to devices livecycle events as\n * they connect and disconnect form the network.\n */\nclass DeviceManager {\n /**\n * Device manager configuration\n */\n #config: Required<Config>;\n /**\n * The map of all active devices currently available on the network.\n */\n #devices = new Map<DeviceID, Device>();\n /**\n * Tracks device timeout handlers, as devices announce themselves these\n * timeouts will be updated.\n */\n #deviceTimeouts = new Map<DeviceID, NodeJS.Timeout>();\n /**\n * The EventEmitter which will be used to trigger device lifecycle events\n */\n #emitter: Emitter = new EventEmitter();\n\n constructor(announceSocket: Socket, config?: Config) {\n this.#config = {...defaultConfig, ...config};\n\n // Begin listening for device announcements\n announceSocket.on('message', this.#handleAnnounce);\n }\n\n // Bind public event emitter interface\n on: Emitter['on'] = this.#emitter.addListener.bind(this.#emitter);\n off: Emitter['off'] = this.#emitter.removeListener.bind(this.#emitter);\n once: Emitter['once'] = this.#emitter.once.bind(this.#emitter);\n\n /**\n * Get active devices on the network.\n */\n get devices() {\n return this.#devices;\n }\n\n /**\n * Waits for a specific device ID to appear on the network, with a\n * configurable timeout, in which case it will resolve with null.\n */\n async getDeviceEnsured(id: DeviceID, timeout: number = ENSURED_TIMEOUT) {\n const existingDevice = this.devices.get(id);\n\n if (existingDevice !== undefined) {\n return existingDevice;\n }\n\n let handler: ((device: Device) => void) | undefined;\n\n // Wait for the device to be connected\n const devicePromise = new Promise<Device>(resolve => {\n handler = (device: Device) => device.id === id && resolve(device);\n this.on('connected', handler);\n });\n\n const device = await Promise.race([\n devicePromise,\n new Promise<null>(r => setTimeout(() => r(null), timeout)),\n ]);\n this.off('connected', handler!);\n\n return device;\n }\n\n reconfigure(config: ConfigEditable) {\n this.#config = {...this.#config, ...config};\n }\n\n #handleAnnounce = (message: Buffer) => {\n const device = deviceFromPacket(message);\n\n if (device === null) {\n return;\n }\n\n if (device.name === this.#config.vcdjName) {\n return;\n }\n\n // Device has not checked in before\n if (!this.#devices.has(device.id)) {\n this.#devices.set(device.id, device);\n this.#emitter.emit('connected', device);\n }\n\n this.#emitter.emit('announced', device);\n\n // Reset the device timeout handler\n const activeTimeout = this.#deviceTimeouts.get(device.id);\n if (activeTimeout) {\n clearTimeout(activeTimeout);\n }\n\n const timeout = this.#config.deviceTimeout;\n const newTimeout = setTimeout(this.#handleDisconnect, timeout, device);\n this.#deviceTimeouts.set(device.id, newTimeout);\n };\n\n #handleDisconnect = (removedDevice: Device) => {\n this.#devices.delete(removedDevice.id);\n this.#deviceTimeouts.delete(removedDevice.id);\n\n this.#emitter.emit('disconnected', removedDevice);\n };\n}\n\nexport default DeviceManager;\n","import * as ip from 'ip-address';\n\nimport {PROLINK_HEADER} from 'src/constants';\nimport {Device} from 'src/types';\n\n/**\n * Converts a announce packet to a device object.\n */\nexport function deviceFromPacket(packet: Buffer) {\n if (packet.indexOf(PROLINK_HEADER) !== 0) {\n throw new Error('Announce packet does not start with expected header');\n }\n\n if (packet[0x0a] !== 0x06) {\n return null;\n }\n\n const name = packet\n .slice(0x0c, 0x0c + 20)\n .toString()\n .replace(/\\0/g, '');\n\n const device: Device = {\n name,\n id: packet[0x24],\n type: packet[0x34],\n macAddr: new Uint8Array(packet.slice(0x26, 0x26 + 6)),\n ip: ip.Address4.fromInteger(packet.readUInt32BE(0x2c)),\n };\n\n return device;\n}\n","import type {BeatGrid, WaveformHD} from 'src/types';\nimport type {\n Track as OneLibraryTrack,\n CueAndLoop,\n} from 'onelibrary-connect';\n\n/**\n * Re-export entity types from onelibrary-connect.\n * These types represent what is stored in the rekordbox database.\n */\nexport {EntityFK} from 'onelibrary-connect';\nexport type {\n Album,\n Artist,\n Artwork,\n Color,\n Genre,\n Key,\n Label,\n Playlist,\n PlaylistEntry,\n} from 'onelibrary-connect';\n\n/**\n * Represents a track with both database fields and ANLZ analysis data.\n *\n * Extends the onelibrary-connect Track type with ANLZ-specific fields\n * that are populated from .DAT/.EXT analysis files on the CDJ.\n */\nexport type Track<withFKs extends import('onelibrary-connect').EntityFK = import('onelibrary-connect').EntityFK.WithRelations> =\n OneLibraryTrack<withFKs> & {\n /**\n * Embedded beat grid information (from ANLZ files)\n */\n beatGrid: BeatGrid | null;\n\n /**\n * Embedded HD Waveform information (from ANLZ files)\n */\n waveformHd: WaveformHD | null;\n };\n","export * from './entities';\nexport * from './mixstatus';\nexport * from './network';\nexport {default as PositionEmitter} from './status/position';\n\n// Passive mode (pcap-based monitoring without announcing a VCDJ)\nexport * from './passive';\n\n// Artwork extraction\nexport {\n extractArtwork,\n extractArtworkFromDevice,\n isArtworkExtractionSupported,\n PictureType,\n} from './artwork';\nexport type {ExtractedArtwork, FileReader as ArtworkFileReader} from './artwork';\n\n// Full metadata extraction (title, artist, album, BPM, key, genre, artwork)\nexport {\n extractFullMetadata,\n extractMetadataFromDevice,\n isMetadataExtractionSupported,\n} from './metadata';\nexport type {ExtractedMetadata} from './metadata';\n\n// ANLZ file loading (for analysis data: beat grid, cues, phrases, waveforms)\nexport {loadAnlz} from './localdb/rekordbox';\nexport {fetchFile} from './nfs';\nexport type {AnlzResolver, AnlzResponse, AnlzResponse2EX, AnlzResponseDAT, AnlzResponseEXT} from './localdb/rekordbox';\n\n// Database adapters (re-exported from onelibrary-connect)\nexport type {\n DatabaseAdapter,\n DatabasePreference,\n DatabaseType,\n PlaylistQueryResult,\n} from 'onelibrary-connect';\nexport {OneLibraryAdapter} from 'onelibrary-connect';\n\n// OneLibrary schema types (re-exported from onelibrary-connect)\nexport type {\n Category,\n DeviceProperty,\n HistorySession,\n HotCueBankList,\n MenuItem,\n MyTag,\n SortOption,\n} from 'onelibrary-connect';\n\n// Logger interface for pluggable logging\nexport {noopLogger} from './logger';\nexport type {Logger} from './logger';\n\n// Types are exported last to avoid overwriting values with type-only exports\nexport * from './types';\n","import {Mutex} from 'async-mutex';\nimport {\n type DatabaseAdapter,\n type DatabasePreference,\n type DatabaseType,\n OneLibraryAdapter,\n} from 'onelibrary-connect';\nimport StrictEventEmitter from 'strict-event-emitter-types';\n\nimport {createHash} from 'crypto';\nimport {EventEmitter} from 'events';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\n\nimport {MAX_CDJ_DEVICE_ID, MIN_CDJ_DEVICE_ID} from 'src/constants';\nimport DeviceManager from 'src/devices';\nimport {fetchFile, FetchProgress} from 'src/nfs';\nimport StatusEmitter from 'src/status';\nimport {\n Device,\n DeviceID,\n DeviceType,\n MediaSlot,\n MediaSlotInfo,\n TrackType,\n} from 'src/types';\nimport {getSlotName} from 'src/utils';\nimport * as Telemetry from 'src/utils/telemetry';\n\nimport {MetadataORM} from './orm';\nimport {hydrateDatabase, HydrationProgress} from './rekordbox';\n\n/**\n * Rekordbox databases will only exist within these two slots\n */\ntype DatabaseSlot = MediaSlot.USB | MediaSlot.SD;\n\ninterface CommonProgressOpts {\n /**\n * The device progress is being reported for\n */\n device: Device;\n /**\n * The media slot progress is being reported for\n */\n slot: MediaSlot;\n}\n\ntype DownloadProgressOpts = CommonProgressOpts & {\n /**\n * The current progress of the fetch\n */\n progress: FetchProgress;\n};\n\ntype HydrationProgressOpts = CommonProgressOpts & {\n /**\n * The current progress of the database hydration\n */\n progress: HydrationProgress;\n};\n\ntype HydrationDoneOpts = CommonProgressOpts;\n\n/**\n * Events that may be triggered by the LocalDatabase emitter\n */\ninterface DatabaseEvents {\n /**\n * Triggered when we are fetching a database from a CDJ\n */\n fetchProgress: (opts: DownloadProgressOpts) => void;\n /**\n * Triggered when we are hydrating a rekordbox database into the in-memory\n * sqlite database.\n */\n hydrationProgress: (opts: HydrationProgressOpts) => void;\n /**\n * Triggered when the database has been fully hydrated.\n *\n * There is a period of time between hydrationProgress reporting 100% copletion,\n * and the database being flushed, so it may be useful to wait for this event\n * before considering the database to be fully hydrated.\n */\n hydrationDone: (opts: HydrationDoneOpts) => void;\n}\n\ntype Emitter = StrictEventEmitter<EventEmitter, DatabaseEvents>;\n\ninterface DatabaseItem {\n /**\n * The uniquity identifier of the database\n */\n id: string;\n /**\n * The media device plugged into the device\n */\n media: MediaSlotInfo;\n /**\n * The database adapter instance (MetadataORM or OneLibraryAdapter)\n */\n adapter: DatabaseAdapter;\n /**\n * Path to temp file (for OneLibrary), needs cleanup on close\n */\n tempFile?: string;\n}\n\n/**\n * Compute the identifier for media device in a CDJ. This is used to determine\n * if we have already hydrated the device or not into our local database.\n */\nconst getMediaId = (info: MediaSlotInfo) => {\n const inputs = [\n info.deviceId,\n info.slot,\n info.name,\n info.freeBytes,\n info.totalBytes,\n info.trackCount,\n info.createdDate,\n ];\n\n return createHash('sha256').update(inputs.join('.'), 'utf8').digest('hex');\n};\n\n/**\n * The local database is responsible for syncing the remote rekordbox databases\n * of media slots on a device into in-memory sqlite databases.\n *\n * This service will attempt to ensure the in-memory databases for each media\n * device that is connected to a CDJ is locally kept in sync. Fetching the\n * database for any media slot of it's not already cached.\n */\nclass LocalDatabase {\n #hostDevice: Device;\n #deviceManager: DeviceManager;\n #statusEmitter: StatusEmitter;\n /**\n * The EventEmitter that will report database events\n */\n #emitter: Emitter = new EventEmitter();\n /**\n * Locks for each device slot: ${device.id}-${slot}. Used when making track\n * requets.\n */\n #slotLocks = new Map<string, Mutex>();\n /**\n * The current available databases\n */\n #dbs: DatabaseItem[] = [];\n /**\n * Database format preference\n */\n #preference: DatabasePreference = 'auto';\n\n constructor(\n hostDevice: Device,\n deviceManager: DeviceManager,\n statusEmitter: StatusEmitter,\n preference: DatabasePreference = 'auto'\n ) {\n this.#hostDevice = hostDevice;\n this.#deviceManager = deviceManager;\n this.#statusEmitter = statusEmitter;\n this.#preference = preference;\n\n deviceManager.on('disconnected', this.#handleDeviceRemoved);\n }\n\n /**\n * Get the current database preference\n */\n get preference(): DatabasePreference {\n return this.#preference;\n }\n\n /**\n * Set the database preference. Only affects newly loaded databases.\n */\n set preference(value: DatabasePreference) {\n this.#preference = value;\n }\n\n // Bind public event emitter interface\n on: Emitter['on'] = this.#emitter.addListener.bind(this.#emitter);\n off: Emitter['off'] = this.#emitter.removeListener.bind(this.#emitter);\n once: Emitter['once'] = this.#emitter.once.bind(this.#emitter);\n\n /**\n * Disconnects the local database connection for the specified device\n */\n disconnectForDevice(device: Device) {\n this.#handleDeviceRemoved(device);\n }\n\n /**\n * Closes the database connection and removes the database entry when a\n * device is removed.\n */\n #handleDeviceRemoved = (device: Device) => {\n const db = this.#dbs.find(db => db.media.deviceId === device.id);\n if (db) {\n db.adapter.close();\n // Clean up temp file if it exists (OneLibrary databases)\n if (db.tempFile) {\n try {\n fs.unlinkSync(db.tempFile);\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n this.#dbs = this.#dbs.filter(db => db.media.deviceId !== device.id);\n };\n\n /**\n * Helper to fetch a file from device, trying both dotted and non-dotted paths\n */\n #fetchFileWithFallback = async (\n device: Device,\n slot: DatabaseSlot,\n basePath: string,\n tx: Telemetry.TelemetrySpan\n ): Promise<Buffer> => {\n const attemptOrder =\n process.platform === 'win32'\n ? [basePath, `.${basePath}`]\n : [`.${basePath}`, basePath];\n\n try {\n return await fetchFile({\n device,\n slot,\n path: attemptOrder[0],\n span: tx,\n onProgress: progress =>\n this.#emitter.emit('fetchProgress', {device, slot, progress}),\n });\n } catch {\n return fetchFile({\n device,\n slot,\n path: attemptOrder[1],\n span: tx,\n onProgress: progress =>\n this.#emitter.emit('fetchProgress', {device, slot, progress}),\n });\n }\n };\n\n /**\n * Try to load OneLibrary database (exportLibrary.db).\n * Returns the adapter and temp file path, or null if not available.\n */\n #tryLoadOneLibrary = async (\n device: Device,\n slot: DatabaseSlot,\n tx: Telemetry.TelemetrySpan\n ): Promise<{adapter: OneLibraryAdapter; tempFile: string} | null> => {\n const oneLibraryPath = 'PIONEER/rekordbox/exportLibrary.db';\n\n try {\n const dbData = await this.#fetchFileWithFallback(device, slot, oneLibraryPath, tx);\n\n // Write to temp file (OneLibrary requires file path for SQLCipher)\n const tempDir = os.tmpdir();\n const tempFile = path.join(\n tempDir,\n `prolink-onelibrary-${device.id}-${slot}-${Date.now()}.db`\n );\n fs.writeFileSync(tempFile, dbData);\n\n const adapter = new OneLibraryAdapter(tempFile);\n return {adapter, tempFile};\n } catch {\n // OneLibrary not available\n return null;\n }\n };\n\n /**\n * Load PDB database (export.pdb) and hydrate into MetadataORM.\n */\n #loadPdbDatabase = async (\n device: Device,\n slot: DatabaseSlot,\n tx: Telemetry.TelemetrySpan\n ): Promise<MetadataORM> => {\n const pdbPath = 'PIONEER/rekordbox/export.pdb';\n const pdbData = await this.#fetchFileWithFallback(device, slot, pdbPath, tx);\n\n const dbCreateTx = tx.startChild({op: 'setupDatabase'});\n const orm = new MetadataORM();\n dbCreateTx.finish();\n\n await hydrateDatabase({\n orm,\n pdbData,\n span: tx,\n onProgress: progress =>\n this.#emitter.emit('hydrationProgress', {device, slot, progress}),\n });\n\n return orm;\n };\n\n /**\n * Downloads and loads a database from a device.\n * Respects the database preference setting:\n * - 'auto': Try OneLibrary first, fall back to PDB\n * - 'oneLibrary': Only use OneLibrary\n * - 'pdb': Only use PDB\n */\n #hydrateDatabase = async (device: Device, slot: DatabaseSlot, media: MediaSlotInfo) => {\n const tx = Telemetry.startTransaction({name: 'hydrateDatabase'});\n\n tx.setTag('slot', getSlotName(media.slot));\n tx.setData('numTracks', media.trackCount.toString());\n tx.setTag('preference', this.#preference);\n\n let adapter: DatabaseAdapter;\n let tempFile: string | undefined;\n\n if (this.#preference === 'pdb') {\n // PDB only\n adapter = await this.#loadPdbDatabase(device, slot, tx);\n tx.setTag('dbType', 'pdb');\n } else if (this.#preference === 'oneLibrary') {\n // OneLibrary only\n const oneLibraryResult = await this.#tryLoadOneLibrary(device, slot, tx);\n if (!oneLibraryResult) {\n throw new Error(\n 'OneLibrary database not found and preference is set to oneLibrary only'\n );\n }\n adapter = oneLibraryResult.adapter;\n tempFile = oneLibraryResult.tempFile;\n tx.setTag('dbType', 'oneLibrary');\n } else {\n // Auto: Try OneLibrary first, fall back to PDB\n const oneLibraryResult = await this.#tryLoadOneLibrary(device, slot, tx);\n\n if (oneLibraryResult) {\n adapter = oneLibraryResult.adapter;\n tempFile = oneLibraryResult.tempFile;\n tx.setTag('dbType', 'oneLibrary');\n } else {\n adapter = await this.#loadPdbDatabase(device, slot, tx);\n tx.setTag('dbType', 'pdb');\n }\n }\n\n this.#emitter.emit('hydrationDone', {device, slot});\n\n const db: DatabaseItem = {adapter, media, id: getMediaId(media), tempFile};\n this.#dbs.push(db);\n\n tx.finish();\n\n return db;\n };\n\n /**\n * Gets the database adapter for the media metadata in the provided device slot.\n *\n * If the database has not already been loaded this will first fetch and load the\n * database, which may take some time depending on the size of the database.\n *\n * @returns null if no rekordbox media present\n */\n async get(deviceId: DeviceID, slot: DatabaseSlot): Promise<DatabaseAdapter | null> {\n const lockKey = `${deviceId}-${slot}`;\n const lock =\n this.#slotLocks.get(lockKey) ??\n this.#slotLocks.set(lockKey, new Mutex()).get(lockKey)!;\n\n const device = this.#deviceManager.devices.get(deviceId);\n if (device === undefined) {\n return null;\n }\n\n if (\n device.type !== DeviceType.CDJ ||\n device.id < MIN_CDJ_DEVICE_ID ||\n device.id > MAX_CDJ_DEVICE_ID\n ) {\n return null;\n }\n\n let media;\n try {\n media = await this.#statusEmitter.queryMediaSlot({\n hostDevice: this.#hostDevice,\n device,\n slot,\n });\n } catch {\n // Timeout or other error - treat as no media\n return null;\n }\n\n if (media.tracksType !== TrackType.RB) {\n return null;\n }\n\n const id = getMediaId(media);\n\n // Acquire a lock for this device slot that will not release until we've\n // guaranteed the existence of the database.\n const db = await lock.runExclusive(() => {\n const cached = this.#dbs.find(db => db.id === id);\n if (cached) {\n return cached;\n }\n return this.#hydrateDatabase(device, slot, media);\n });\n\n return db.adapter;\n }\n\n /**\n * Get the database type for an already-loaded device slot.\n * Returns null if no database is loaded for that device/slot.\n */\n getDatabaseType(deviceId: DeviceID, slot: DatabaseSlot): DatabaseType | null {\n const db = this.#dbs.find(\n db => db.media.deviceId === deviceId && db.media.slot === slot\n );\n return db?.adapter.type ?? null;\n }\n\n /**\n * Preload the databases for all connected devices.\n */\n async preload() {\n const allDevices = [...this.#deviceManager.devices.values()];\n const cdjDevices = allDevices.filter(\n device =>\n device.type === DeviceType.CDJ &&\n device.id >= MIN_CDJ_DEVICE_ID &&\n device.id <= MAX_CDJ_DEVICE_ID\n );\n\n if (cdjDevices.length === 0) {\n return;\n }\n\n const loaders = cdjDevices.map(device =>\n Promise.all([this.get(device.id, MediaSlot.USB), this.get(device.id, MediaSlot.SD)])\n );\n\n await Promise.all(loaders);\n }\n}\n\nexport default LocalDatabase;\n","// This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild\n\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define(['kaitai-struct/KaitaiStream'], factory);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = factory(require('kaitai-struct/KaitaiStream'));\n } else {\n root.RekordboxAnlz = factory(root.KaitaiStream);\n }\n}(this, function (KaitaiStream) {\n/**\n * These files are created by rekordbox when analyzing audio tracks\n * to facilitate DJ performance. They include waveforms, beat grids\n * (information about the precise time at which each beat occurs),\n * time indices to allow efficient seeking to specific positions\n * inside variable bit-rate audio streams, and lists of memory cues\n * and loop points. They are used by Pioneer professional DJ\n * equipment.\n * \n * The format has been reverse-engineered to facilitate sophisticated\n * integrations with light and laser shows, videos, and other musical\n * instruments, by supporting deep knowledge of what is playing and\n * what is coming next through monitoring the network communications\n * of the players.\n * @see {@link https://reverseengineering.stackexchange.com/questions/4311/help-reversing-a-edb-database-file-for-pioneers-rekordbox-software|Source}\n */\n\nvar RekordboxAnlz = (function() {\n RekordboxAnlz.CueEntryStatus = Object.freeze({\n DISABLED: 0,\n ENABLED: 1,\n\n 0: \"DISABLED\",\n 1: \"ENABLED\",\n });\n\n RekordboxAnlz.CueListType = Object.freeze({\n MEMORY_CUES: 0,\n HOT_CUES: 1,\n\n 0: \"MEMORY_CUES\",\n 1: \"HOT_CUES\",\n });\n\n RekordboxAnlz.MoodHighPhrase = Object.freeze({\n INTRO: 1,\n UP: 2,\n DOWN: 3,\n CHORUS: 5,\n OUTRO: 6,\n\n 1: \"INTRO\",\n 2: \"UP\",\n 3: \"DOWN\",\n 5: \"CHORUS\",\n 6: \"OUTRO\",\n });\n\n RekordboxAnlz.TrackBank = Object.freeze({\n DEFAULT: 0,\n COOL: 1,\n NATURAL: 2,\n HOT: 3,\n SUBTLE: 4,\n WARM: 5,\n VIVID: 6,\n CLUB_1: 7,\n CLUB_2: 8,\n\n 0: \"DEFAULT\",\n 1: \"COOL\",\n 2: \"NATURAL\",\n 3: \"HOT\",\n 4: \"SUBTLE\",\n 5: \"WARM\",\n 6: \"VIVID\",\n 7: \"CLUB_1\",\n 8: \"CLUB_2\",\n });\n\n RekordboxAnlz.CueEntryType = Object.freeze({\n MEMORY_CUE: 1,\n LOOP: 2,\n\n 1: \"MEMORY_CUE\",\n 2: \"LOOP\",\n });\n\n RekordboxAnlz.SectionTags = Object.freeze({\n CUES_2: 1346588466,\n CUES: 1346588482,\n PATH: 1347441736,\n BEAT_GRID: 1347507290,\n SONG_STRUCTURE: 1347638089,\n VBR: 1347830354,\n WAVE_PREVIEW: 1347895638,\n WAVE_TINY: 1347900978,\n WAVE_SCROLL: 1347900979,\n WAVE_COLOR_PREVIEW: 1347900980,\n WAVE_COLOR_SCROLL: 1347900981,\n WAVE_COLOR_3BAND_PREVIEW: 1347900982,\n WAVE_COLOR_3BAND_DETAIL: 1347900983,\n VOCAL_CONFIG: 1347900995,\n\n 1346588466: \"CUES_2\",\n 1346588482: \"CUES\",\n 1347441736: \"PATH\",\n 1347507290: \"BEAT_GRID\",\n 1347638089: \"SONG_STRUCTURE\",\n 1347830354: \"VBR\",\n 1347895638: \"WAVE_PREVIEW\",\n 1347900978: \"WAVE_TINY\",\n 1347900979: \"WAVE_SCROLL\",\n 1347900980: \"WAVE_COLOR_PREVIEW\",\n 1347900981: \"WAVE_COLOR_SCROLL\",\n 1347900982: \"WAVE_COLOR_3BAND_PREVIEW\",\n 1347900983: \"WAVE_COLOR_3BAND_DETAIL\",\n 1347900995: \"VOCAL_CONFIG\",\n });\n\n RekordboxAnlz.TrackMood = Object.freeze({\n HIGH: 1,\n MID: 2,\n LOW: 3,\n\n 1: \"HIGH\",\n 2: \"MID\",\n 3: \"LOW\",\n });\n\n RekordboxAnlz.MoodMidPhrase = Object.freeze({\n INTRO: 1,\n VERSE_1: 2,\n VERSE_2: 3,\n VERSE_3: 4,\n VERSE_4: 5,\n VERSE_5: 6,\n VERSE_6: 7,\n BRIDGE: 8,\n CHORUS: 9,\n OUTRO: 10,\n\n 1: \"INTRO\",\n 2: \"VERSE_1\",\n 3: \"VERSE_2\",\n 4: \"VERSE_3\",\n 5: \"VERSE_4\",\n 6: \"VERSE_5\",\n 7: \"VERSE_6\",\n 8: \"BRIDGE\",\n 9: \"CHORUS\",\n 10: \"OUTRO\",\n });\n\n RekordboxAnlz.MoodLowPhrase = Object.freeze({\n INTRO: 1,\n VERSE_1: 2,\n VERSE_1B: 3,\n VERSE_1C: 4,\n VERSE_2: 5,\n VERSE_2B: 6,\n VERSE_2C: 7,\n BRIDGE: 8,\n CHORUS: 9,\n OUTRO: 10,\n\n 1: \"INTRO\",\n 2: \"VERSE_1\",\n 3: \"VERSE_1B\",\n 4: \"VERSE_1C\",\n 5: \"VERSE_2\",\n 6: \"VERSE_2B\",\n 7: \"VERSE_2C\",\n 8: \"BRIDGE\",\n 9: \"CHORUS\",\n 10: \"OUTRO\",\n });\n\n function RekordboxAnlz(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n RekordboxAnlz.prototype._read = function() {\n this.magic = this._io.readBytes(4);\n if (!((KaitaiStream.byteArrayCompare(this.magic, [80, 77, 65, 73]) == 0))) {\n throw new KaitaiStream.ValidationNotEqualError([80, 77, 65, 73], this.magic, this._io, \"/seq/0\");\n }\n this.lenHeader = this._io.readU4be();\n this.lenFile = this._io.readU4be();\n this._unnamed3 = this._io.readBytes((this.lenHeader - this._io.pos));\n this.sections = [];\n var i = 0;\n while (!this._io.isEof()) {\n this.sections.push(new TaggedSection(this._io, this, this._root));\n i++;\n }\n }\n\n var PhraseMid = RekordboxAnlz.PhraseMid = (function() {\n function PhraseMid(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n PhraseMid.prototype._read = function() {\n this.id = this._io.readU2be();\n }\n\n return PhraseMid;\n })();\n\n /**\n * Stores the file path of the audio file to which this analysis\n * applies.\n */\n\n var PathTag = RekordboxAnlz.PathTag = (function() {\n function PathTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n PathTag.prototype._read = function() {\n this.lenPath = this._io.readU4be();\n if (this.lenPath > 1) {\n this.path = KaitaiStream.bytesToStr(this._io.readBytes((this.lenPath - 2)), \"utf-16be\");\n }\n }\n\n return PathTag;\n })();\n\n /**\n * A 3-band color waveform preview (PWV6, found in .2EX files).\n * Same resolution as PWV4 (typically 1200 entries) but with 3 bytes\n * per entry representing low, mid, and high frequency band amplitudes.\n * Layout is identical to wave_color_preview_tag (PWV4).\n * @see {@link https://djl-analysis.deepsymmetry.org/djl-analysis/track-metadata.html#color-3band-preview-waveform|Source}\n */\n\n var WaveColor3bandPreviewTag = RekordboxAnlz.WaveColor3bandPreviewTag = (function() {\n function WaveColor3bandPreviewTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n WaveColor3bandPreviewTag.prototype._read = function() {\n this.lenEntryBytes = this._io.readU4be();\n this.lenEntries = this._io.readU4be();\n this.entries = this._io.readBytes((this.lenEntries * this.lenEntryBytes));\n }\n\n /**\n * The size of each entry, in bytes. Always 3 (low, mid, high).\n */\n\n /**\n * The number of waveform data points. Typically 1200.\n */\n\n return WaveColor3bandPreviewTag;\n })();\n\n /**\n * Stores a waveform preview image suitable for display above\n * the touch strip for jumping to a track position.\n */\n\n var WavePreviewTag = RekordboxAnlz.WavePreviewTag = (function() {\n function WavePreviewTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n WavePreviewTag.prototype._read = function() {\n this.lenPreview = this._io.readU4be();\n this._unnamed1 = this._io.readU4be();\n if (this._parent.lenTag > this._parent.lenHeader) {\n this.data = this._io.readBytes(this.lenPreview);\n }\n }\n\n /**\n * The length, in bytes, of the preview data itself. This is\n * slightly redundant because it can be computed from the\n * length of the tag.\n */\n\n /**\n * The actual bytes of the waveform preview.\n */\n\n return WavePreviewTag;\n })();\n\n /**\n * Holds a list of all the beats found within the track, recording\n * their bar position, the time at which they occur, and the tempo\n * at that point.\n */\n\n var BeatGridTag = RekordboxAnlz.BeatGridTag = (function() {\n function BeatGridTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n BeatGridTag.prototype._read = function() {\n this._unnamed0 = this._io.readU4be();\n this._unnamed1 = this._io.readU4be();\n this.lenBeats = this._io.readU4be();\n this.beats = new Array(this.lenBeats);\n for (var i = 0; i < this.lenBeats; i++) {\n this.beats[i] = new BeatGridBeat(this._io, this, this._root);\n }\n }\n\n /**\n * The number of beat entries which follow.\n */\n\n /**\n * The entries of the beat grid.\n */\n\n return BeatGridTag;\n })();\n\n /**\n * Stores the rest of the song structure tag, which can only be\n * parsed after unmasking.\n */\n\n var SongStructureBody = RekordboxAnlz.SongStructureBody = (function() {\n function SongStructureBody(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n SongStructureBody.prototype._read = function() {\n this.mood = this._io.readU2be();\n this._unnamed1 = this._io.readBytes(6);\n this.endBeat = this._io.readU2be();\n this._unnamed3 = this._io.readBytes(2);\n this.bank = this._io.readU1();\n this._unnamed5 = this._io.readBytes(1);\n this.entries = new Array(this._parent.lenEntries);\n for (var i = 0; i < this._parent.lenEntries; i++) {\n this.entries[i] = new SongStructureEntry(this._io, this, this._root);\n }\n }\n\n /**\n * The mood which rekordbox assigns the track as a whole during phrase analysis.\n */\n\n /**\n * The beat number at which the last phrase ends. The track may\n * continue after the last phrase ends. If this is the case, it will\n * mostly be silence.\n */\n\n /**\n * The stylistic bank which can be assigned to the track in rekordbox Lighting mode.\n */\n\n return SongStructureBody;\n })();\n\n /**\n * A larger, colorful waveform preview image suitable for display\n * above the touch strip for jumping to a track position on newer\n * high-resolution players.\n */\n\n var WaveColorPreviewTag = RekordboxAnlz.WaveColorPreviewTag = (function() {\n function WaveColorPreviewTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n WaveColorPreviewTag.prototype._read = function() {\n this.lenEntryBytes = this._io.readU4be();\n this.lenEntries = this._io.readU4be();\n this._unnamed2 = this._io.readU4be();\n this.entries = this._io.readBytes((this.lenEntries * this.lenEntryBytes));\n }\n\n /**\n * The size of each entry, in bytes. Seems to always be 6.\n */\n\n /**\n * The number of waveform data points, each of which takes one\n * byte for each of six channels of information.\n */\n\n return WaveColorPreviewTag;\n })();\n\n /**\n * A 3-band color detail waveform (PWV7, found in .2EX files).\n * Higher resolution than PWV6. Each entry is 3 bytes (low, mid, high).\n * Layout is identical to wave_color_scroll_tag (PWV5).\n * @see {@link https://djl-analysis.deepsymmetry.org/djl-analysis/track-metadata.html#color-3band-detail-waveform|Source}\n */\n\n var WaveColor3bandDetailTag = RekordboxAnlz.WaveColor3bandDetailTag = (function() {\n function WaveColor3bandDetailTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n WaveColor3bandDetailTag.prototype._read = function() {\n this.lenEntryBytes = this._io.readU4be();\n this.lenEntries = this._io.readU4be();\n this._unnamed2 = this._io.readU4be();\n this.entries = this._io.readBytes((this.lenEntries * this.lenEntryBytes));\n }\n\n /**\n * The size of each entry, in bytes. Always 3 (low, mid, high).\n */\n\n /**\n * The number of columns of waveform data.\n */\n\n return WaveColor3bandDetailTag;\n })();\n\n /**\n * Vocal detection configuration (PWVC, found in .2EX files).\n * Contains threshold values used to classify frequency content\n * as vocal or non-vocal. Body is 8 bytes: unknown(2) + 3 thresholds(2 each).\n * Observed threshold ranges: low 80-114, mid 80-146, high 98-159.\n */\n\n var VocalConfigTag = RekordboxAnlz.VocalConfigTag = (function() {\n function VocalConfigTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n VocalConfigTag.prototype._read = function() {\n this._unnamed0 = this._io.readU2be();\n this.thresholdLow = this._io.readU2be();\n this.thresholdMid = this._io.readU2be();\n this.thresholdHigh = this._io.readU2be();\n }\n\n /**\n * Low frequency vocal detection threshold. Observed range: 80-114.\n */\n\n /**\n * Mid frequency vocal detection threshold. Observed range: 80-146.\n */\n\n /**\n * High frequency vocal detection threshold. Observed range: 98-159.\n */\n\n return VocalConfigTag;\n })();\n\n var PhraseHigh = RekordboxAnlz.PhraseHigh = (function() {\n function PhraseHigh(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n PhraseHigh.prototype._read = function() {\n this.id = this._io.readU2be();\n }\n\n return PhraseHigh;\n })();\n\n /**\n * A larger waveform image suitable for scrolling along as a track\n * plays.\n */\n\n var WaveScrollTag = RekordboxAnlz.WaveScrollTag = (function() {\n function WaveScrollTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n WaveScrollTag.prototype._read = function() {\n this.lenEntryBytes = this._io.readU4be();\n this.lenEntries = this._io.readU4be();\n this._unnamed2 = this._io.readU4be();\n this.entries = this._io.readBytes((this.lenEntries * this.lenEntryBytes));\n }\n\n /**\n * The size of each entry, in bytes. Seems to always be 1.\n */\n\n /**\n * The number of waveform data points, each of which takes one\n * byte.\n */\n\n return WaveScrollTag;\n })();\n\n /**\n * Stores the song structure, also known as phrases (intro, verse,\n * bridge, chorus, up, down, outro).\n */\n\n var SongStructureTag = RekordboxAnlz.SongStructureTag = (function() {\n function SongStructureTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n SongStructureTag.prototype._read = function() {\n this.lenEntryBytes = this._io.readU4be();\n this.lenEntries = this._io.readU2be();\n this._raw__raw_body = this._io.readBytesFull();\n this._raw_body = KaitaiStream.processXorMany(this._raw__raw_body, this.mask);\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new SongStructureBody(_io__raw_body, this, this._root);\n }\n Object.defineProperty(SongStructureTag.prototype, 'c', {\n get: function() {\n if (this._m_c !== undefined)\n return this._m_c;\n this._m_c = this.lenEntries;\n return this._m_c;\n }\n });\n Object.defineProperty(SongStructureTag.prototype, 'mask', {\n get: function() {\n if (this._m_mask !== undefined)\n return this._m_mask;\n this._m_mask = new Uint8Array([(203 + this.c), (225 + this.c), (238 + this.c), (250 + this.c), (229 + this.c), (238 + this.c), (173 + this.c), (238 + this.c), (233 + this.c), (210 + this.c), (233 + this.c), (235 + this.c), (225 + this.c), (233 + this.c), (243 + this.c), (232 + this.c), (233 + this.c), (244 + this.c), (225 + this.c)]);\n return this._m_mask;\n }\n });\n\n /**\n * The size of each entry, in bytes. Seems to always be 24.\n */\n\n /**\n * The number of phrases.\n */\n\n /**\n * The rest of the tag, which needs to be unmasked before it\n * can be parsed.\n */\n\n return SongStructureTag;\n })();\n\n /**\n * A cue extended list entry. Can either describe a memory cue or a\n * loop.\n */\n\n var CueExtendedEntry = RekordboxAnlz.CueExtendedEntry = (function() {\n function CueExtendedEntry(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n CueExtendedEntry.prototype._read = function() {\n this.magic = this._io.readBytes(4);\n if (!((KaitaiStream.byteArrayCompare(this.magic, [80, 67, 80, 50]) == 0))) {\n throw new KaitaiStream.ValidationNotEqualError([80, 67, 80, 50], this.magic, this._io, \"/types/cue_extended_entry/seq/0\");\n }\n this.lenHeader = this._io.readU4be();\n this.lenEntry = this._io.readU4be();\n this.hotCue = this._io.readU4be();\n this.type = this._io.readU1();\n this._unnamed5 = this._io.readBytes(3);\n this.time = this._io.readU4be();\n this.loopTime = this._io.readU4be();\n this.colorId = this._io.readU1();\n this._unnamed9 = this._io.readBytes(11);\n if (this.lenEntry > 43) {\n this.lenComment = this._io.readU4be();\n }\n if (this.lenEntry > 43) {\n this.comment = KaitaiStream.bytesToStr(this._io.readBytes(this.lenComment), \"utf-16be\");\n }\n if ((this.lenEntry - this.lenComment) > 44) {\n this.colorCode = this._io.readU1();\n }\n if ((this.lenEntry - this.lenComment) > 45) {\n this.colorRed = this._io.readU1();\n }\n if ((this.lenEntry - this.lenComment) > 46) {\n this.colorGreen = this._io.readU1();\n }\n if ((this.lenEntry - this.lenComment) > 47) {\n this.colorBlue = this._io.readU1();\n }\n if ((this.lenEntry - this.lenComment) > 48) {\n this._unnamed16 = this._io.readBytes(((this.lenEntry - 48) - this.lenComment));\n }\n }\n\n /**\n * Identifies this as an extended cue list entry (cue point).\n */\n\n /**\n * If zero, this is an ordinary memory cue, otherwise this a\n * hot cue with the specified number.\n */\n\n /**\n * Indicates whether this is a memory cue or a loop.\n */\n\n /**\n * The position, in milliseconds, at which the cue point lies\n * in the track.\n */\n\n /**\n * The position, in milliseconds, at which the player loops\n * back to the cue time if this is a loop.\n */\n\n /**\n * References a row in the colors table if this is a memory cue or loop\n * and has been assigned a color.\n */\n\n /**\n * The comment assigned to this cue by the DJ, if any, with a trailing NUL.\n */\n\n /**\n * A lookup value for a color table? We use this to index to the hot cue colors shown in rekordbox.\n */\n\n /**\n * The red component of the hot cue color to be displayed.\n */\n\n /**\n * The green component of the hot cue color to be displayed.\n */\n\n /**\n * The blue component of the hot cue color to be displayed.\n */\n\n return CueExtendedEntry;\n })();\n\n /**\n * Stores an index allowing rapid seeking to particular times\n * within a variable-bitrate audio file.\n */\n\n var VbrTag = RekordboxAnlz.VbrTag = (function() {\n function VbrTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n VbrTag.prototype._read = function() {\n this._unnamed0 = this._io.readU4be();\n this.index = new Array(400);\n for (var i = 0; i < 400; i++) {\n this.index[i] = this._io.readU4be();\n }\n }\n\n return VbrTag;\n })();\n\n /**\n * A song structure entry, represents a single phrase.\n */\n\n var SongStructureEntry = RekordboxAnlz.SongStructureEntry = (function() {\n function SongStructureEntry(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n SongStructureEntry.prototype._read = function() {\n this.phraseNumber = this._io.readU2be();\n this.beatNumber = this._io.readU2be();\n switch (this._parent.mood) {\n case RekordboxAnlz.TrackMood.HIGH:\n this.kind = new PhraseHigh(this._io, this, this._root);\n break;\n case RekordboxAnlz.TrackMood.MID:\n this.kind = new PhraseMid(this._io, this, this._root);\n break;\n case RekordboxAnlz.TrackMood.LOW:\n this.kind = new PhraseLow(this._io, this, this._root);\n break;\n default:\n this.kind = new UnknownTag(this._io, this, this._root);\n break;\n }\n this._unnamed3 = this._io.readBytes((this._parent._parent.lenEntryBytes - 9));\n this.fillIn = this._io.readU1();\n this.fillInBeatNumber = this._io.readU2be();\n }\n\n /**\n * The absolute number of the phrase, starting at one.\n */\n\n /**\n * The beat number at which the phrase starts.\n */\n\n /**\n * The kind of phrase as displayed in rekordbox.\n */\n\n /**\n * If nonzero, fill-in is present.\n */\n\n /**\n * The beat number at which fill-in starts.\n */\n\n return SongStructureEntry;\n })();\n\n /**\n * A cue list entry. Can either represent a memory cue or a loop.\n */\n\n var CueEntry = RekordboxAnlz.CueEntry = (function() {\n function CueEntry(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n CueEntry.prototype._read = function() {\n this.magic = this._io.readBytes(4);\n if (!((KaitaiStream.byteArrayCompare(this.magic, [80, 67, 80, 84]) == 0))) {\n throw new KaitaiStream.ValidationNotEqualError([80, 67, 80, 84], this.magic, this._io, \"/types/cue_entry/seq/0\");\n }\n this.lenHeader = this._io.readU4be();\n this.lenEntry = this._io.readU4be();\n this.hotCue = this._io.readU4be();\n this.status = this._io.readU4be();\n this._unnamed5 = this._io.readU4be();\n this.orderFirst = this._io.readU2be();\n this.orderLast = this._io.readU2be();\n this.type = this._io.readU1();\n this._unnamed9 = this._io.readBytes(3);\n this.time = this._io.readU4be();\n this.loopTime = this._io.readU4be();\n this._unnamed12 = this._io.readBytes(16);\n }\n\n /**\n * Identifies this as a cue list entry (cue point).\n */\n\n /**\n * If zero, this is an ordinary memory cue, otherwise this a\n * hot cue with the specified number.\n */\n\n /**\n * If zero, this entry should be ignored.\n */\n\n /**\n * @flesniak says: \"0xffff for first cue, 0,1,3 for next\"\n */\n\n /**\n * @flesniak says: \"1,2,3 for first, second, third cue, 0xffff for last\"\n */\n\n /**\n * Indicates whether this is a memory cue or a loop.\n */\n\n /**\n * The position, in milliseconds, at which the cue point lies\n * in the track.\n */\n\n /**\n * The position, in milliseconds, at which the player loops\n * back to the cue time if this is a loop.\n */\n\n return CueEntry;\n })();\n\n /**\n * Describes an individual beat in a beat grid.\n */\n\n var BeatGridBeat = RekordboxAnlz.BeatGridBeat = (function() {\n function BeatGridBeat(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n BeatGridBeat.prototype._read = function() {\n this.beatNumber = this._io.readU2be();\n this.tempo = this._io.readU2be();\n this.time = this._io.readU4be();\n }\n\n /**\n * The position of the beat within its musical bar, where beat 1\n * is the down beat.\n */\n\n /**\n * The tempo at the time of this beat, in beats per minute,\n * multiplied by 100.\n */\n\n /**\n * The time, in milliseconds, at which this beat occurs when\n * the track is played at normal (100%) pitch.\n */\n\n return BeatGridBeat;\n })();\n\n /**\n * A variation of cue_tag which was introduced with the nxs2 line,\n * and adds descriptive names. (Still comes in two forms, either\n * holding memory cues and loop points, or holding hot cues and\n * loop points.) Also includes hot cues D through H and color assignment.\n */\n\n var CueExtendedTag = RekordboxAnlz.CueExtendedTag = (function() {\n function CueExtendedTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n CueExtendedTag.prototype._read = function() {\n this.type = this._io.readU4be();\n this.lenCues = this._io.readU2be();\n this._unnamed2 = this._io.readBytes(2);\n this.cues = new Array(this.lenCues);\n for (var i = 0; i < this.lenCues; i++) {\n this.cues[i] = new CueExtendedEntry(this._io, this, this._root);\n }\n }\n\n /**\n * Identifies whether this tag stores ordinary or hot cues.\n */\n\n /**\n * The length of the cue comment list.\n */\n\n return CueExtendedTag;\n })();\n\n var PhraseLow = RekordboxAnlz.PhraseLow = (function() {\n function PhraseLow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n PhraseLow.prototype._read = function() {\n this.id = this._io.readU2be();\n }\n\n return PhraseLow;\n })();\n\n var UnknownTag = RekordboxAnlz.UnknownTag = (function() {\n function UnknownTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n UnknownTag.prototype._read = function() {\n }\n\n return UnknownTag;\n })();\n\n /**\n * A type-tagged file section, identified by a four-byte magic\n * sequence, with a header specifying its length, and whose payload\n * is determined by the type tag.\n */\n\n var TaggedSection = RekordboxAnlz.TaggedSection = (function() {\n function TaggedSection(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n TaggedSection.prototype._read = function() {\n this.fourcc = this._io.readS4be();\n this.lenHeader = this._io.readU4be();\n this.lenTag = this._io.readU4be();\n switch (this.fourcc) {\n case RekordboxAnlz.SectionTags.WAVE_COLOR_SCROLL:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new WaveColorScrollTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.WAVE_SCROLL:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new WaveScrollTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.VBR:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new VbrTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.CUES_2:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new CueExtendedTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.CUES:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new CueTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.SONG_STRUCTURE:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new SongStructureTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.BEAT_GRID:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new BeatGridTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.VOCAL_CONFIG:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new VocalConfigTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.WAVE_PREVIEW:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new WavePreviewTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.WAVE_COLOR_PREVIEW:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new WaveColorPreviewTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.PATH:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new PathTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.WAVE_TINY:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new WavePreviewTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.WAVE_COLOR_3BAND_DETAIL:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new WaveColor3bandDetailTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.WAVE_COLOR_3BAND_PREVIEW:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new WaveColor3bandPreviewTag(_io__raw_body, this, this._root);\n break;\n default:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new UnknownTag(_io__raw_body, this, this._root);\n break;\n }\n }\n\n /**\n * A tag value indicating what kind of section this is.\n */\n\n /**\n * The size, in bytes, of the header portion of the tag.\n */\n\n /**\n * The size, in bytes, of this entire tag, counting the header.\n */\n\n return TaggedSection;\n })();\n\n /**\n * A larger, colorful waveform image suitable for scrolling along\n * as a track plays on newer high-resolution hardware. Also\n * contains a higher-resolution blue/white waveform.\n */\n\n var WaveColorScrollTag = RekordboxAnlz.WaveColorScrollTag = (function() {\n function WaveColorScrollTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n WaveColorScrollTag.prototype._read = function() {\n this.lenEntryBytes = this._io.readU4be();\n this.lenEntries = this._io.readU4be();\n this._unnamed2 = this._io.readU4be();\n this.entries = this._io.readBytes((this.lenEntries * this.lenEntryBytes));\n }\n\n /**\n * The size of each entry, in bytes. Seems to always be 2.\n */\n\n /**\n * The number of columns of waveform data (this matches the\n * non-color waveform length.\n */\n\n return WaveColorScrollTag;\n })();\n\n /**\n * Stores either a list of ordinary memory cues and loop points, or\n * a list of hot cues and loop points.\n */\n\n var CueTag = RekordboxAnlz.CueTag = (function() {\n function CueTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n CueTag.prototype._read = function() {\n this.type = this._io.readU4be();\n this._unnamed1 = this._io.readBytes(2);\n this.lenCues = this._io.readU2be();\n this.memoryCount = this._io.readU4be();\n this.cues = new Array(this.lenCues);\n for (var i = 0; i < this.lenCues; i++) {\n this.cues[i] = new CueEntry(this._io, this, this._root);\n }\n }\n\n /**\n * Identifies whether this tag stores ordinary or hot cues.\n */\n\n /**\n * The length of the cue list.\n */\n\n /**\n * Unsure what this means.\n */\n\n return CueTag;\n })();\n\n /**\n * Identifies this as an analysis file.\n */\n\n /**\n * The number of bytes of this header section.\n */\n\n /**\n * The number of bytes in the entire file.\n */\n\n /**\n * The remainder of the file is a sequence of type-tagged sections,\n * identified by a four-byte magic sequence.\n */\n\n return RekordboxAnlz;\n})();\nreturn RekordboxAnlz;\n}));\n","// This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild\n\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define(['kaitai-struct/KaitaiStream'], factory);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = factory(require('kaitai-struct/KaitaiStream'));\n } else {\n root.RekordboxPdb = factory(root.KaitaiStream);\n }\n}(this, function (KaitaiStream) {\n/**\n * This is a relational database format designed to be efficiently used\n * by very low power devices (there were deployments on 16 bit devices\n * with 32K of RAM). Today you are most likely to encounter it within\n * the Pioneer Professional DJ ecosystem, because it is the format that\n * their rekordbox software uses to write USB and SD media which can be\n * mounted in DJ controllers and used to play and mix music.\n * \n * It has been reverse-engineered to facilitate sophisticated\n * integrations with light and laser shows, videos, and other musical\n * instruments, by supporting deep knowledge of what is playing and\n * what is coming next through monitoring the network communications of\n * the players.\n * \n * The file is divided into fixed-size blocks. The first block has a\n * header that establishes the block size, and lists the tables\n * available in the database, identifying their types and the index of\n * the first of the series of linked pages that make up that table.\n * \n * Each table is made up of a series of rows which may be spread across\n * any number of pages. The pages start with a header describing the\n * page and linking to the next page. The rest of the page is used as a\n * heap: rows are scattered around it, and located using an index\n * structure that builds backwards from the end of the page. Each row\n * of a given type has a fixed size structure which links to any\n * variable-sized strings by their offsets within the page.\n * \n * As changes are made to the table, some records may become unused,\n * and there may be gaps within the heap that are too small to be used\n * by other data. There is a bit map in the row index that identifies\n * which rows are actually present. Rows that are not present must be\n * ignored: they do not contain valid (or even necessarily well-formed)\n * data.\n * \n * The majority of the work in reverse-engineering this format was\n * performed by @henrybetts and @flesniak, for which I am hugely\n * grateful. @GreyCat helped me learn the intricacies (and best\n * practices) of Kaitai far faster than I would have managed on my own.\n * @see {@link https://github.com/Deep-Symmetry/crate-digger/blob/master/doc/Analysis.pdf|Source}\n */\n\nvar RekordboxPdb = (function() {\n RekordboxPdb.PageType = Object.freeze({\n TRACKS: 0,\n GENRES: 1,\n ARTISTS: 2,\n ALBUMS: 3,\n LABELS: 4,\n KEYS: 5,\n COLORS: 6,\n PLAYLIST_TREE: 7,\n PLAYLIST_ENTRIES: 8,\n UNKNOWN_9: 9,\n UNKNOWN_10: 10,\n UNKNOWN_11: 11,\n UNKNOWN_12: 12,\n ARTWORK: 13,\n UNKNOWN_14: 14,\n UNKNOWN_15: 15,\n COLUMNS: 16,\n UNKNOWN_17: 17,\n UNKNOWN_18: 18,\n HISTORY: 19,\n\n 0: \"TRACKS\",\n 1: \"GENRES\",\n 2: \"ARTISTS\",\n 3: \"ALBUMS\",\n 4: \"LABELS\",\n 5: \"KEYS\",\n 6: \"COLORS\",\n 7: \"PLAYLIST_TREE\",\n 8: \"PLAYLIST_ENTRIES\",\n 9: \"UNKNOWN_9\",\n 10: \"UNKNOWN_10\",\n 11: \"UNKNOWN_11\",\n 12: \"UNKNOWN_12\",\n 13: \"ARTWORK\",\n 14: \"UNKNOWN_14\",\n 15: \"UNKNOWN_15\",\n 16: \"COLUMNS\",\n 17: \"UNKNOWN_17\",\n 18: \"UNKNOWN_18\",\n 19: \"HISTORY\",\n });\n\n function RekordboxPdb(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n RekordboxPdb.prototype._read = function() {\n this._unnamed0 = this._io.readU4le();\n this.lenPage = this._io.readU4le();\n this.numTables = this._io.readU4le();\n this.nextUnusedPage = this._io.readU4le();\n this._unnamed4 = this._io.readU4le();\n this.sequence = this._io.readU4le();\n this.gap = this._io.readBytes(4);\n if (!((KaitaiStream.byteArrayCompare(this.gap, [0, 0, 0, 0]) == 0))) {\n throw new KaitaiStream.ValidationNotEqualError([0, 0, 0, 0], this.gap, this._io, \"/seq/6\");\n }\n this.tables = new Array(this.numTables);\n for (var i = 0; i < this.numTables; i++) {\n this.tables[i] = new Table(this._io, this, this._root);\n }\n }\n\n /**\n * A variable length string which can be stored in a variety of\n * different encodings.\n */\n\n var DeviceSqlString = RekordboxPdb.DeviceSqlString = (function() {\n function DeviceSqlString(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n DeviceSqlString.prototype._read = function() {\n this.lengthAndKind = this._io.readU1();\n switch (this.lengthAndKind) {\n case 64:\n this.body = new DeviceSqlLongAscii(this._io, this, this._root);\n break;\n case 144:\n this.body = new DeviceSqlLongUtf16le(this._io, this, this._root);\n break;\n default:\n this.body = new DeviceSqlShortAscii(this._io, this, this._root, this.lengthAndKind);\n break;\n }\n }\n\n /**\n * Mangled length of an ordinary ASCII string if odd, or a flag\n * indicating another encoding with a longer length value to\n * follow.\n */\n\n return DeviceSqlString;\n })();\n\n /**\n * A row that holds a playlist name, ID, indication of whether it\n * is an ordinary playlist or a folder of other playlists, a link\n * to its parent folder, and its sort order.\n */\n\n var PlaylistTreeRow = RekordboxPdb.PlaylistTreeRow = (function() {\n function PlaylistTreeRow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n PlaylistTreeRow.prototype._read = function() {\n this.parentId = this._io.readU4le();\n this._unnamed1 = this._io.readBytes(4);\n this.sortOrder = this._io.readU4le();\n this.id = this._io.readU4le();\n this.rawIsFolder = this._io.readU4le();\n this.name = new DeviceSqlString(this._io, this, this._root);\n }\n Object.defineProperty(PlaylistTreeRow.prototype, 'isFolder', {\n get: function() {\n if (this._m_isFolder !== undefined)\n return this._m_isFolder;\n this._m_isFolder = this.rawIsFolder != 0;\n return this._m_isFolder;\n }\n });\n\n /**\n * The ID of the `playlist_tree_row` in which this one can be\n * found, or `0` if this playlist exists at the root level.\n */\n\n /**\n * The order in which the entries of this playlist are sorted.\n */\n\n /**\n * The unique identifier by which this playlist or folder can\n * be requested and linked from other rows.\n */\n\n /**\n * Has a non-zero value if this is actually a folder rather\n * than a playlist.\n */\n\n /**\n * The variable-length string naming the playlist.\n */\n\n return PlaylistTreeRow;\n })();\n\n /**\n * A row that holds a color name and the associated ID.\n */\n\n var ColorRow = RekordboxPdb.ColorRow = (function() {\n function ColorRow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n ColorRow.prototype._read = function() {\n this._unnamed0 = this._io.readBytes(5);\n this.id = this._io.readU2le();\n this._unnamed2 = this._io.readU1();\n this.name = new DeviceSqlString(this._io, this, this._root);\n }\n\n /**\n * The unique identifier by which this color can be requested\n * and linked from other rows (such as tracks).\n */\n\n /**\n * The variable-length string naming the color.\n */\n\n return ColorRow;\n })();\n\n /**\n * An ASCII-encoded string up to 127 bytes long.\n */\n\n var DeviceSqlShortAscii = RekordboxPdb.DeviceSqlShortAscii = (function() {\n function DeviceSqlShortAscii(_io, _parent, _root, mangledLength) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n this.mangledLength = mangledLength;\n\n this._read();\n }\n DeviceSqlShortAscii.prototype._read = function() {\n if ( ((KaitaiStream.mod(this.mangledLength, 2) > 0) && (this.length >= 0)) ) {\n this.text = KaitaiStream.bytesToStr(this._io.readBytes(this.length), \"ascii\");\n }\n }\n\n /**\n * The un-mangled length of the string, in bytes.\n */\n Object.defineProperty(DeviceSqlShortAscii.prototype, 'length', {\n get: function() {\n if (this._m_length !== undefined)\n return this._m_length;\n this._m_length = (Math.floor((this.mangledLength - 1) / 2) - 1);\n return this._m_length;\n }\n });\n\n /**\n * The content of the string.\n */\n\n /**\n * Contains the actual length, incremented, doubled, and\n * incremented again. Go figure.\n */\n\n return DeviceSqlShortAscii;\n })();\n\n /**\n * A row that holds an album name and ID.\n */\n\n var AlbumRow = RekordboxPdb.AlbumRow = (function() {\n function AlbumRow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n AlbumRow.prototype._read = function() {\n this._unnamed0 = this._io.readU2le();\n this.indexShift = this._io.readU2le();\n this._unnamed2 = this._io.readU4le();\n this.artistId = this._io.readU4le();\n this.id = this._io.readU4le();\n this._unnamed5 = this._io.readU4le();\n this._unnamed6 = this._io.readU1();\n this.ofsName = this._io.readU1();\n }\n\n /**\n * The name of this album.\n */\n Object.defineProperty(AlbumRow.prototype, 'name', {\n get: function() {\n if (this._m_name !== undefined)\n return this._m_name;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsName));\n this._m_name = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_name;\n }\n });\n\n /**\n * Some kind of magic word? Usually 0x80, 0x00.\n */\n\n /**\n * TODO name from @flesniak, but what does it mean?\n */\n\n /**\n * Identifies the artist associated with the album.\n */\n\n /**\n * The unique identifier by which this album can be requested\n * and linked from other rows (such as tracks).\n */\n\n /**\n * @flesniak says: \"alwayx 0x03, maybe an unindexed empty string\"\n */\n\n /**\n * The location of the variable-length name string, relative to\n * the start of this row.\n */\n\n return AlbumRow;\n })();\n\n /**\n * A table page, consisting of a short header describing the\n * content of the page and linking to the next page, followed by a\n * heap in which row data is found. At the end of the page there is\n * an index which locates all rows present in the heap via their\n * offsets past the end of the page header.\n */\n\n var Page = RekordboxPdb.Page = (function() {\n function Page(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n Page.prototype._read = function() {\n this.gap = this._io.readBytes(4);\n if (!((KaitaiStream.byteArrayCompare(this.gap, [0, 0, 0, 0]) == 0))) {\n throw new KaitaiStream.ValidationNotEqualError([0, 0, 0, 0], this.gap, this._io, \"/types/page/seq/0\");\n }\n this.pageIndex = this._io.readU4le();\n this.type = this._io.readU4le();\n this.nextPage = new PageRef(this._io, this, this._root);\n this._unnamed4 = this._io.readU4le();\n this._unnamed5 = this._io.readBytes(4);\n this.numRowsSmall = this._io.readU1();\n this._unnamed7 = this._io.readU1();\n this._unnamed8 = this._io.readU1();\n this.pageFlags = this._io.readU1();\n this.freeSize = this._io.readU2le();\n this.usedSize = this._io.readU2le();\n this._unnamed12 = this._io.readU2le();\n this.numRowsLarge = this._io.readU2le();\n this._unnamed14 = this._io.readU2le();\n this._unnamed15 = this._io.readU2le();\n if (false) {\n this.heap = this._io.readBytesFull();\n }\n }\n\n /**\n * The number of rows on this page (controls the number of row\n * index entries there are, but some of those may not be marked\n * as present in the table due to deletion).\n */\n Object.defineProperty(Page.prototype, 'numRows', {\n get: function() {\n if (this._m_numRows !== undefined)\n return this._m_numRows;\n this._m_numRows = ( ((this.numRowsLarge > this.numRowsSmall) && (this.numRowsLarge != 8191)) ? this.numRowsLarge : this.numRowsSmall);\n return this._m_numRows;\n }\n });\n\n /**\n * The number of row groups that are present in the index. Each\n * group can hold up to sixteen rows. All but the final one\n * will hold sixteen rows.\n */\n Object.defineProperty(Page.prototype, 'numGroups', {\n get: function() {\n if (this._m_numGroups !== undefined)\n return this._m_numGroups;\n this._m_numGroups = (Math.floor((this.numRows - 1) / 16) + 1);\n return this._m_numGroups;\n }\n });\n\n /**\n * The actual row groups making up the row index. Each group\n * can hold up to sixteen rows. Non-data pages do not have\n * actual rows, and attempting to parse them can crash.\n */\n Object.defineProperty(Page.prototype, 'rowGroups', {\n get: function() {\n if (this._m_rowGroups !== undefined)\n return this._m_rowGroups;\n if (this.isDataPage) {\n this._m_rowGroups = new Array(this.numGroups);\n for (var i = 0; i < this.numGroups; i++) {\n this._m_rowGroups[i] = new RowGroup(this._io, this, this._root, i);\n }\n }\n return this._m_rowGroups;\n }\n });\n Object.defineProperty(Page.prototype, 'heapPos', {\n get: function() {\n if (this._m_heapPos !== undefined)\n return this._m_heapPos;\n this._m_heapPos = this._io.pos;\n return this._m_heapPos;\n }\n });\n Object.defineProperty(Page.prototype, 'isDataPage', {\n get: function() {\n if (this._m_isDataPage !== undefined)\n return this._m_isDataPage;\n this._m_isDataPage = (this.pageFlags & 64) == 0;\n return this._m_isDataPage;\n }\n });\n\n /**\n * Only exposed until\n * https://github.com/kaitai-io/kaitai_struct/issues/825 can be\n * fixed.\n */\n\n /**\n * Matches the index we used to look up the page, sanity check?\n */\n\n /**\n * Identifies the type of information stored in the rows of this page.\n */\n\n /**\n * Index of the next page containing this type of rows. Points past\n * the end of the file if there are no more.\n */\n\n /**\n * @flesniak said: \"sequence number (0->1: 8->13, 1->2: 22, 2->3: 27)\"\n */\n\n /**\n * Holds the value used for `num_rows` (see below) unless\n * `num_rows_large` is larger (but not equal to `0x1fff`). This\n * seems like some strange mechanism to deal with the fact that\n * lots of tiny entries, such as are found in the\n * `playlist_entries` table, are too big to count with a single\n * byte. But why not just always use `num_rows_large`, then?\n */\n\n /**\n * @flesniak said: \"a bitmask (1st track: 32)\"\n */\n\n /**\n * @flesniak said: \"often 0, sometimes larger, esp. for pages\n * with high real_entry_count (e.g. 12 for 101 entries)\"\n */\n\n /**\n * @flesniak said: \"strange pages: 0x44, 0x64; otherwise seen: 0x24, 0x34\"\n */\n\n /**\n * Unused space (in bytes) in the page heap, excluding the row\n * index at end of page.\n */\n\n /**\n * The number of bytes that are in use in the page heap.\n */\n\n /**\n * @flesniak said: \"(0->1: 2)\"\n */\n\n /**\n * Holds the value used for `num_rows` (as described above)\n * when that is too large to fit into `num_rows_small`, and\n * that situation seems to be indicated when this value is\n * larger than `num_rows_small`, but not equal to `0x1fff`.\n * This seems like some strange mechanism to deal with the fact\n * that lots of tiny entries, such as are found in the\n * `playlist_entries` table, are too big to count with a single\n * byte. But why not just always use this value, then?\n */\n\n /**\n * @flesniak said: \"1004 for strange blocks, 0 otherwise\"\n */\n\n /**\n * @flesniak said: \"always 0 except 1 for history pages, num\n * entries for strange pages?\"\n */\n\n return Page;\n })();\n\n /**\n * A group of row indices, which are built backwards from the end\n * of the page. Holds up to sixteen row offsets, along with a bit\n * mask that indicates whether each row is actually present in the\n * table.\n */\n\n var RowGroup = RekordboxPdb.RowGroup = (function() {\n function RowGroup(_io, _parent, _root, groupIndex) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n this.groupIndex = groupIndex;\n\n this._read();\n }\n RowGroup.prototype._read = function() {\n }\n\n /**\n * The starting point of this group of row indices.\n */\n Object.defineProperty(RowGroup.prototype, 'base', {\n get: function() {\n if (this._m_base !== undefined)\n return this._m_base;\n this._m_base = (this._root.lenPage - (this.groupIndex * 36));\n return this._m_base;\n }\n });\n\n /**\n * Each bit specifies whether a particular row is present. The\n * low order bit corresponds to the first row in this index,\n * whose offset immediately precedes these flag bits. The\n * second bit corresponds to the row whose offset precedes\n * that, and so on.\n */\n Object.defineProperty(RowGroup.prototype, 'rowPresentFlags', {\n get: function() {\n if (this._m_rowPresentFlags !== undefined)\n return this._m_rowPresentFlags;\n var _pos = this._io.pos;\n this._io.seek((this.base - 4));\n this._m_rowPresentFlags = this._io.readU2le();\n this._io.seek(_pos);\n return this._m_rowPresentFlags;\n }\n });\n\n /**\n * The row offsets in this group.\n */\n Object.defineProperty(RowGroup.prototype, 'rows', {\n get: function() {\n if (this._m_rows !== undefined)\n return this._m_rows;\n this._m_rows = new Array((this.groupIndex < (this._parent.numGroups - 1) ? 16 : (KaitaiStream.mod((this._parent.numRows - 1), 16) + 1)));\n for (var i = 0; i < (this.groupIndex < (this._parent.numGroups - 1) ? 16 : (KaitaiStream.mod((this._parent.numRows - 1), 16) + 1)); i++) {\n this._m_rows[i] = new RowRef(this._io, this, this._root, i);\n }\n return this._m_rows;\n }\n });\n\n /**\n * Identifies which group is being generated. They build backwards\n * from the end of the page.\n */\n\n return RowGroup;\n })();\n\n /**\n * A row that holds a genre name and the associated ID.\n */\n\n var GenreRow = RekordboxPdb.GenreRow = (function() {\n function GenreRow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n GenreRow.prototype._read = function() {\n this.id = this._io.readU4le();\n this.name = new DeviceSqlString(this._io, this, this._root);\n }\n\n /**\n * The unique identifier by which this genre can be requested\n * and linked from other rows (such as tracks).\n */\n\n /**\n * The variable-length string naming the genre.\n */\n\n return GenreRow;\n })();\n\n /**\n * A row that holds the path to an album art image file and the\n * associated artwork ID.\n */\n\n var ArtworkRow = RekordboxPdb.ArtworkRow = (function() {\n function ArtworkRow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n ArtworkRow.prototype._read = function() {\n this.id = this._io.readU4le();\n this.path = new DeviceSqlString(this._io, this, this._root);\n }\n\n /**\n * The unique identifier by which this art can be requested\n * and linked from other rows (such as tracks).\n */\n\n /**\n * The variable-length file path string at which the art file\n * can be found.\n */\n\n return ArtworkRow;\n })();\n\n /**\n * An ASCII-encoded string preceded by a two-byte length field.\n */\n\n var DeviceSqlLongAscii = RekordboxPdb.DeviceSqlLongAscii = (function() {\n function DeviceSqlLongAscii(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n DeviceSqlLongAscii.prototype._read = function() {\n this.length = this._io.readU2le();\n this.text = KaitaiStream.bytesToStr(this._io.readBytes(this.length), \"ascii\");\n }\n\n /**\n * Contains the length of the string in bytes.\n */\n\n /**\n * The content of the string.\n */\n\n return DeviceSqlLongAscii;\n })();\n\n /**\n * A row that holds an artist name and ID.\n */\n\n var ArtistRow = RekordboxPdb.ArtistRow = (function() {\n function ArtistRow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n ArtistRow.prototype._read = function() {\n this.subtype = this._io.readU2le();\n this.indexShift = this._io.readU2le();\n this.id = this._io.readU4le();\n this._unnamed3 = this._io.readU1();\n this.ofsNameNear = this._io.readU1();\n }\n\n /**\n * For names that might be further than 0xff bytes from the\n * start of this row, this holds a two-byte offset, and is\n * signalled by the subtype value.\n */\n Object.defineProperty(ArtistRow.prototype, 'ofsNameFar', {\n get: function() {\n if (this._m_ofsNameFar !== undefined)\n return this._m_ofsNameFar;\n if (this.subtype == 100) {\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + 10));\n this._m_ofsNameFar = this._io.readU2le();\n this._io.seek(_pos);\n }\n return this._m_ofsNameFar;\n }\n });\n\n /**\n * The name of this artist.\n */\n Object.defineProperty(ArtistRow.prototype, 'name', {\n get: function() {\n if (this._m_name !== undefined)\n return this._m_name;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + (this.subtype == 100 ? this.ofsNameFar : this.ofsNameNear)));\n this._m_name = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_name;\n }\n });\n\n /**\n * Usually 0x60, but 0x64 means we have a long name offset\n * embedded in the row.\n */\n\n /**\n * TODO name from @flesniak, but what does it mean?\n */\n\n /**\n * The unique identifier by which this artist can be requested\n * and linked from other rows (such as tracks).\n */\n\n /**\n * @flesniak says: \"always 0x03, maybe an unindexed empty string\"\n */\n\n /**\n * The location of the variable-length name string, relative to\n * the start of this row, unless subtype is 0x64.\n */\n\n return ArtistRow;\n })();\n\n /**\n * An index which points to a table page (its offset can be found\n * by multiplying the index by the `page_len` value in the file\n * header). This type allows the linked page to be lazy loaded.\n */\n\n var PageRef = RekordboxPdb.PageRef = (function() {\n function PageRef(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n PageRef.prototype._read = function() {\n this.index = this._io.readU4le();\n }\n\n /**\n * When referenced, loads the specified page and parses its\n * contents appropriately for the type of data it contains.\n */\n Object.defineProperty(PageRef.prototype, 'body', {\n get: function() {\n if (this._m_body !== undefined)\n return this._m_body;\n var io = this._root._io;\n var _pos = io.pos;\n io.seek((this._root.lenPage * this.index));\n this._raw__m_body = io.readBytes(this._root.lenPage);\n var _io__raw__m_body = new KaitaiStream(this._raw__m_body);\n this._m_body = new Page(_io__raw__m_body, this, this._root);\n io.seek(_pos);\n return this._m_body;\n }\n });\n\n /**\n * Identifies the desired page number.\n */\n\n return PageRef;\n })();\n\n /**\n * A row that describes a track that can be played, with many\n * details about the music, and links to other tables like artists,\n * albums, keys, etc.\n */\n\n var TrackRow = RekordboxPdb.TrackRow = (function() {\n function TrackRow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n TrackRow.prototype._read = function() {\n this._unnamed0 = this._io.readU2le();\n this.indexShift = this._io.readU2le();\n this.bitmask = this._io.readU4le();\n this.sampleRate = this._io.readU4le();\n this.composerId = this._io.readU4le();\n this.fileSize = this._io.readU4le();\n this._unnamed6 = this._io.readU4le();\n this._unnamed7 = this._io.readU2le();\n this._unnamed8 = this._io.readU2le();\n this.artworkId = this._io.readU4le();\n this.keyId = this._io.readU4le();\n this.originalArtistId = this._io.readU4le();\n this.labelId = this._io.readU4le();\n this.remixerId = this._io.readU4le();\n this.bitrate = this._io.readU4le();\n this.trackNumber = this._io.readU4le();\n this.tempo = this._io.readU4le();\n this.genreId = this._io.readU4le();\n this.albumId = this._io.readU4le();\n this.artistId = this._io.readU4le();\n this.id = this._io.readU4le();\n this.discNumber = this._io.readU2le();\n this.playCount = this._io.readU2le();\n this.year = this._io.readU2le();\n this.sampleDepth = this._io.readU2le();\n this.duration = this._io.readU2le();\n this._unnamed26 = this._io.readU2le();\n this.colorId = this._io.readU1();\n this.rating = this._io.readU1();\n this._unnamed29 = this._io.readU2le();\n this._unnamed30 = this._io.readU2le();\n this.ofsStrings = new Array(21);\n for (var i = 0; i < 21; i++) {\n this.ofsStrings[i] = this._io.readU2le();\n }\n }\n\n /**\n * A string of unknown purpose, usually empty.\n */\n Object.defineProperty(TrackRow.prototype, 'unknownString8', {\n get: function() {\n if (this._m_unknownString8 !== undefined)\n return this._m_unknownString8;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[18]));\n this._m_unknownString8 = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_unknownString8;\n }\n });\n\n /**\n * A string of unknown purpose, usually empty.\n */\n Object.defineProperty(TrackRow.prototype, 'unknownString6', {\n get: function() {\n if (this._m_unknownString6 !== undefined)\n return this._m_unknownString6;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[9]));\n this._m_unknownString6 = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_unknownString6;\n }\n });\n\n /**\n * A string containing the date this track was analyzed by rekordbox.\n */\n Object.defineProperty(TrackRow.prototype, 'analyzeDate', {\n get: function() {\n if (this._m_analyzeDate !== undefined)\n return this._m_analyzeDate;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[15]));\n this._m_analyzeDate = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_analyzeDate;\n }\n });\n\n /**\n * The file path of the track audio file.\n */\n Object.defineProperty(TrackRow.prototype, 'filePath', {\n get: function() {\n if (this._m_filePath !== undefined)\n return this._m_filePath;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[20]));\n this._m_filePath = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_filePath;\n }\n });\n\n /**\n * A string whose value is always either empty or \"ON\", and\n * which apparently for some insane reason is used, rather than\n * a single bit somewhere, to control whether hot-cues are\n * auto-loaded for the track.\n */\n Object.defineProperty(TrackRow.prototype, 'autoloadHotcues', {\n get: function() {\n if (this._m_autoloadHotcues !== undefined)\n return this._m_autoloadHotcues;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[7]));\n this._m_autoloadHotcues = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_autoloadHotcues;\n }\n });\n\n /**\n * A string containing the date this track was added to the collection.\n */\n Object.defineProperty(TrackRow.prototype, 'dateAdded', {\n get: function() {\n if (this._m_dateAdded !== undefined)\n return this._m_dateAdded;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[10]));\n this._m_dateAdded = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_dateAdded;\n }\n });\n\n /**\n * A string of unknown purpose; @flesniak said \"strange\n * strings, often zero length, sometimes low binary values\n * 0x01/0x02 as content\"\n */\n Object.defineProperty(TrackRow.prototype, 'unknownString3', {\n get: function() {\n if (this._m_unknownString3 !== undefined)\n return this._m_unknownString3;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[3]));\n this._m_unknownString3 = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_unknownString3;\n }\n });\n\n /**\n * A string of unknown purpose, which @flesnik named.\n */\n Object.defineProperty(TrackRow.prototype, 'texter', {\n get: function() {\n if (this._m_texter !== undefined)\n return this._m_texter;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[1]));\n this._m_texter = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_texter;\n }\n });\n\n /**\n * A string whose value is always either empty or \"ON\", and\n * which apparently for some insane reason is used, rather than\n * a single bit somewhere, to control whether the track\n * information is visible on Kuvo.\n */\n Object.defineProperty(TrackRow.prototype, 'kuvoPublic', {\n get: function() {\n if (this._m_kuvoPublic !== undefined)\n return this._m_kuvoPublic;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[6]));\n this._m_kuvoPublic = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_kuvoPublic;\n }\n });\n\n /**\n * A string naming the remix of the track, if known.\n */\n Object.defineProperty(TrackRow.prototype, 'mixName', {\n get: function() {\n if (this._m_mixName !== undefined)\n return this._m_mixName;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[12]));\n this._m_mixName = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_mixName;\n }\n });\n\n /**\n * A string of unknown purpose.\n */\n Object.defineProperty(TrackRow.prototype, 'unknownString5', {\n get: function() {\n if (this._m_unknownString5 !== undefined)\n return this._m_unknownString5;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[8]));\n this._m_unknownString5 = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_unknownString5;\n }\n });\n\n /**\n * A string of unknown purpose; @flesniak said \"strange\n * strings, often zero length, sometimes low binary values\n * 0x01/0x02 as content\"\n */\n Object.defineProperty(TrackRow.prototype, 'unknownString4', {\n get: function() {\n if (this._m_unknownString4 !== undefined)\n return this._m_unknownString4;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[4]));\n this._m_unknownString4 = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_unknownString4;\n }\n });\n\n /**\n * A string of unknown purpose, which @flesnik named.\n */\n Object.defineProperty(TrackRow.prototype, 'message', {\n get: function() {\n if (this._m_message !== undefined)\n return this._m_message;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[5]));\n this._m_message = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_message;\n }\n });\n\n /**\n * A string of unknown purpose; @flesniak said \"thought\n * tracknumber -> wrong!\"\n */\n Object.defineProperty(TrackRow.prototype, 'unknownString2', {\n get: function() {\n if (this._m_unknownString2 !== undefined)\n return this._m_unknownString2;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[2]));\n this._m_unknownString2 = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_unknownString2;\n }\n });\n\n /**\n * International Standard Recording Code of track\n * when known (in mangled format).\n */\n Object.defineProperty(TrackRow.prototype, 'isrc', {\n get: function() {\n if (this._m_isrc !== undefined)\n return this._m_isrc;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[0]));\n this._m_isrc = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_isrc;\n }\n });\n\n /**\n * A string of unknown purpose, usually empty.\n */\n Object.defineProperty(TrackRow.prototype, 'unknownString7', {\n get: function() {\n if (this._m_unknownString7 !== undefined)\n return this._m_unknownString7;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[13]));\n this._m_unknownString7 = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_unknownString7;\n }\n });\n\n /**\n * The file name of the track audio file.\n */\n Object.defineProperty(TrackRow.prototype, 'filename', {\n get: function() {\n if (this._m_filename !== undefined)\n return this._m_filename;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[19]));\n this._m_filename = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_filename;\n }\n });\n\n /**\n * The file path of the track analysis, which allows rapid\n * seeking to particular times in variable bit-rate files,\n * jumping to particular beats, visual waveform previews, and\n * stores cue points and loops.\n */\n Object.defineProperty(TrackRow.prototype, 'analyzePath', {\n get: function() {\n if (this._m_analyzePath !== undefined)\n return this._m_analyzePath;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[14]));\n this._m_analyzePath = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_analyzePath;\n }\n });\n\n /**\n * The comment assigned to the track by the DJ, if any.\n */\n Object.defineProperty(TrackRow.prototype, 'comment', {\n get: function() {\n if (this._m_comment !== undefined)\n return this._m_comment;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[16]));\n this._m_comment = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_comment;\n }\n });\n\n /**\n * A string containing the date this track was released, if known.\n */\n Object.defineProperty(TrackRow.prototype, 'releaseDate', {\n get: function() {\n if (this._m_releaseDate !== undefined)\n return this._m_releaseDate;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[11]));\n this._m_releaseDate = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_releaseDate;\n }\n });\n\n /**\n * The title of the track.\n */\n Object.defineProperty(TrackRow.prototype, 'title', {\n get: function() {\n if (this._m_title !== undefined)\n return this._m_title;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[17]));\n this._m_title = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_title;\n }\n });\n\n /**\n * Some kind of magic word? Usually 0x24, 0x00.\n */\n\n /**\n * TODO name from @flesniak, but what does it mean?\n */\n\n /**\n * TODO what do the bits mean?\n */\n\n /**\n * Playback sample rate of the audio file.\n */\n\n /**\n * References a row in the artist table if the composer is\n * known.\n */\n\n /**\n * The length of the audio file, in bytes.\n */\n\n /**\n * Some ID? Purpose as yet unknown.\n */\n\n /**\n * From @flesniak: \"always 19048?\"\n */\n\n /**\n * From @flesniak: \"always 30967?\"\n */\n\n /**\n * References a row in the artwork table if there is album art.\n */\n\n /**\n * References a row in the keys table if the track has a known\n * main musical key.\n */\n\n /**\n * References a row in the artwork table if this is a cover\n * performance and the original artist is known.\n */\n\n /**\n * References a row in the labels table if the track has a\n * known record label.\n */\n\n /**\n * References a row in the artists table if the track has a\n * known remixer.\n */\n\n /**\n * Playback bit rate of the audio file.\n */\n\n /**\n * The position of the track within an album.\n */\n\n /**\n * The tempo at the start of the track in beats per minute,\n * multiplied by 100.\n */\n\n /**\n * References a row in the genres table if the track has a\n * known musical genre.\n */\n\n /**\n * References a row in the albums table if the track has a\n * known album.\n */\n\n /**\n * References a row in the artists table if the track has a\n * known performer.\n */\n\n /**\n * The id by which this track can be looked up; players will\n * report this value in their status packets when they are\n * playing the track.\n */\n\n /**\n * The number of the disc on which this track is found, if it\n * is known to be part of a multi-disc album.\n */\n\n /**\n * The number of times this track has been played.\n */\n\n /**\n * The year in which this track was released.\n */\n\n /**\n * The number of bits per sample of the audio file.\n */\n\n /**\n * The length, in seconds, of the track when played at normal\n * speed.\n */\n\n /**\n * From @flesniak: \"always 41?\"\n */\n\n /**\n * References a row in the colors table if the track has been\n * assigned a color.\n */\n\n /**\n * The number of stars to display for the track, 0 to 5.\n */\n\n /**\n * From @flesniak: \"always 1?\"\n */\n\n /**\n * From @flesniak: \"alternating 2 or 3\"\n */\n\n /**\n * The location, relative to the start of this row, of a\n * variety of variable-length strings.\n */\n\n return TrackRow;\n })();\n\n /**\n * A row that holds a musical key and the associated ID.\n */\n\n var KeyRow = RekordboxPdb.KeyRow = (function() {\n function KeyRow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n KeyRow.prototype._read = function() {\n this.id = this._io.readU4le();\n this.id2 = this._io.readU4le();\n this.name = new DeviceSqlString(this._io, this, this._root);\n }\n\n /**\n * The unique identifier by which this key can be requested\n * and linked from other rows (such as tracks).\n */\n\n /**\n * Seems to be a second copy of the ID?\n */\n\n /**\n * The variable-length string naming the key.\n */\n\n return KeyRow;\n })();\n\n /**\n * A row that associates a track with a position in a playlist.\n */\n\n var PlaylistEntryRow = RekordboxPdb.PlaylistEntryRow = (function() {\n function PlaylistEntryRow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n PlaylistEntryRow.prototype._read = function() {\n this.entryIndex = this._io.readU4le();\n this.trackId = this._io.readU4le();\n this.playlistId = this._io.readU4le();\n }\n\n /**\n * The position within the playlist represented by this entry.\n */\n\n /**\n * The track found at this position in the playlist.\n */\n\n /**\n * The playlist to which this entry belongs.\n */\n\n return PlaylistEntryRow;\n })();\n\n /**\n * A row that holds a label name and the associated ID.\n */\n\n var LabelRow = RekordboxPdb.LabelRow = (function() {\n function LabelRow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n LabelRow.prototype._read = function() {\n this.id = this._io.readU4le();\n this.name = new DeviceSqlString(this._io, this, this._root);\n }\n\n /**\n * The unique identifier by which this label can be requested\n * and linked from other rows (such as tracks).\n */\n\n /**\n * The variable-length string naming the label.\n */\n\n return LabelRow;\n })();\n\n /**\n * A UTF-16LE-encoded string preceded by a two-byte length field.\n */\n\n var DeviceSqlLongUtf16le = RekordboxPdb.DeviceSqlLongUtf16le = (function() {\n function DeviceSqlLongUtf16le(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n DeviceSqlLongUtf16le.prototype._read = function() {\n this.length = this._io.readU2le();\n this._unnamed1 = this._io.readU1();\n this.text = KaitaiStream.bytesToStr(this._io.readBytes((this.length - 4)), \"utf-16le\");\n }\n\n /**\n * Contains the length of the string in bytes, including two trailing nulls.\n */\n\n /**\n * The content of the string.\n */\n\n return DeviceSqlLongUtf16le;\n })();\n\n /**\n * Each table is a linked list of pages containing rows of a single\n * type. This header describes the nature of the table and links to\n * its pages by index.\n */\n\n var Table = RekordboxPdb.Table = (function() {\n function Table(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n Table.prototype._read = function() {\n this.type = this._io.readU4le();\n this.emptyCandidate = this._io.readU4le();\n this.firstPage = new PageRef(this._io, this, this._root);\n this.lastPage = new PageRef(this._io, this, this._root);\n }\n\n /**\n * Identifies the kind of rows that are found in this table.\n */\n\n /**\n * Links to the chain of pages making up that table. The first\n * page seems to always contain similar garbage patterns and\n * zero rows, but the next page it links to contains the start\n * of the meaningful data rows.\n */\n\n /**\n * Holds the index of the last page that makes up this table.\n * When following the linked list of pages of the table, you\n * either need to stop when you reach this page, or when you\n * notice that the `next_page` link you followed took you to a\n * page of a different `type`.\n */\n\n return Table;\n })();\n\n /**\n * An offset which points to a row in the table, whose actual\n * presence is controlled by one of the bits in\n * `row_present_flags`. This instance allows the row itself to be\n * lazily loaded, unless it is not present, in which case there is\n * no content to be loaded.\n */\n\n var RowRef = RekordboxPdb.RowRef = (function() {\n function RowRef(_io, _parent, _root, rowIndex) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n this.rowIndex = rowIndex;\n\n this._read();\n }\n RowRef.prototype._read = function() {\n }\n\n /**\n * The offset of the start of the row (in bytes past the end of\n * the page header).\n */\n Object.defineProperty(RowRef.prototype, 'ofsRow', {\n get: function() {\n if (this._m_ofsRow !== undefined)\n return this._m_ofsRow;\n var _pos = this._io.pos;\n this._io.seek((this._parent.base - (6 + (2 * this.rowIndex))));\n this._m_ofsRow = this._io.readU2le();\n this._io.seek(_pos);\n return this._m_ofsRow;\n }\n });\n\n /**\n * The location of this row relative to the start of the page.\n * A variety of pointers (such as all device_sql_string values)\n * are calculated with respect to this position.\n */\n Object.defineProperty(RowRef.prototype, 'rowBase', {\n get: function() {\n if (this._m_rowBase !== undefined)\n return this._m_rowBase;\n this._m_rowBase = (this.ofsRow + this._parent._parent.heapPos);\n return this._m_rowBase;\n }\n });\n\n /**\n * Indicates whether the row index considers this row to be\n * present in the table. Will be `false` if the row has been\n * deleted.\n */\n Object.defineProperty(RowRef.prototype, 'present', {\n get: function() {\n if (this._m_present !== undefined)\n return this._m_present;\n this._m_present = (((this._parent.rowPresentFlags >>> this.rowIndex) & 1) != 0 ? true : false);\n return this._m_present;\n }\n });\n\n /**\n * The actual content of the row, as long as it is present.\n */\n Object.defineProperty(RowRef.prototype, 'body', {\n get: function() {\n if (this._m_body !== undefined)\n return this._m_body;\n if (this.present) {\n var _pos = this._io.pos;\n this._io.seek(this.rowBase);\n switch (this._parent._parent.type) {\n case RekordboxPdb.PageType.PLAYLIST_TREE:\n this._m_body = new PlaylistTreeRow(this._io, this, this._root);\n break;\n case RekordboxPdb.PageType.KEYS:\n this._m_body = new KeyRow(this._io, this, this._root);\n break;\n case RekordboxPdb.PageType.ARTISTS:\n this._m_body = new ArtistRow(this._io, this, this._root);\n break;\n case RekordboxPdb.PageType.ALBUMS:\n this._m_body = new AlbumRow(this._io, this, this._root);\n break;\n case RekordboxPdb.PageType.GENRES:\n this._m_body = new GenreRow(this._io, this, this._root);\n break;\n case RekordboxPdb.PageType.ARTWORK:\n this._m_body = new ArtworkRow(this._io, this, this._root);\n break;\n case RekordboxPdb.PageType.PLAYLIST_ENTRIES:\n this._m_body = new PlaylistEntryRow(this._io, this, this._root);\n break;\n case RekordboxPdb.PageType.LABELS:\n this._m_body = new LabelRow(this._io, this, this._root);\n break;\n case RekordboxPdb.PageType.TRACKS:\n this._m_body = new TrackRow(this._io, this, this._root);\n break;\n case RekordboxPdb.PageType.COLORS:\n this._m_body = new ColorRow(this._io, this, this._root);\n break;\n }\n this._io.seek(_pos);\n }\n return this._m_body;\n }\n });\n\n /**\n * Identifies which row within the row index this reference\n * came from, so the correct flag can be checked for the row\n * presence and the correct row offset can be found.\n */\n\n return RowRef;\n })();\n\n /**\n * Unknown purpose, perhaps an unoriginal signature, seems to\n * always have the value 0.\n */\n\n /**\n * The database page size, in bytes. Pages are referred to by\n * index, so this size is needed to calculate their offset, and\n * table pages have a row index structure which is built from the\n * end of the page backwards, so finding that also requires this\n * value.\n */\n\n /**\n * Determines the number of table entries that are present. Each\n * table is a linked list of pages containing rows of a particular\n * type.\n */\n\n /**\n * @flesinak said: \"Not used as any `empty_candidate`, points\n * past the end of the file.\"\n */\n\n /**\n * @flesniak said: \"Always incremented by at least one,\n * sometimes by two or three.\"\n */\n\n /**\n * Only exposed until\n * https://github.com/kaitai-io/kaitai_struct/issues/825 can be\n * fixed.\n */\n\n /**\n * Describes and links to the tables present in the database.\n */\n\n return RekordboxPdb;\n})();\nreturn RekordboxPdb;\n}));\n","/**\n * OneLibrary Database Adapter\n *\n * Re-exports from onelibrary-connect for backward compatibility.\n */\n\nexport type {\n Category,\n DeviceProperty,\n HistorySession,\n HotCueBankList,\n MenuItem,\n MyTag,\n SortOption,\n} from 'onelibrary-connect';\nexport {getEncryptionKey, OneLibraryAdapter, openOneLibraryDb} from 'onelibrary-connect';\n","import sqlite3 from 'better-sqlite3-multiple-ciphers';\nimport {camelCase, mapKeys, mapValues, partition, snakeCase} from 'lodash';\n\nimport {EntityFK, Playlist, PlaylistEntry, Track} from 'src/entities';\n\nimport {DatabaseAdapter, DatabaseType} from './database-adapter';\nimport {generateSchema} from './schema';\n\n/**\n * Table names available\n */\nexport enum Table {\n Artist = 'artist',\n Album = 'album',\n Genre = 'genre',\n Color = 'color',\n Label = 'label',\n Key = 'key',\n Artwork = 'artwork',\n Playlist = 'playlist',\n PlaylistEntry = 'playlist_entry',\n Track = 'track',\n}\n\nconst trackRelations = [\n 'artwork',\n 'artist',\n 'originalArtist',\n 'remixer',\n 'composer',\n 'album',\n 'label',\n 'genre',\n 'color',\n 'key',\n];\n\nconst trackRelationTableMap: Record<string, string> = {\n originalArtist: 'artist',\n remixer: 'artist',\n composer: 'artist',\n};\n\n/**\n * Object Relation Mapper as an abstraction ontop of a local database\n * connection.\n *\n * May be used to populate a metadata database and query objects.\n */\nexport class MetadataORM implements DatabaseAdapter {\n readonly type: DatabaseType = 'pdb';\n\n #conn: sqlite3.Database;\n #stmtCache = new Map<string, sqlite3.Statement>();\n #inTransaction = false;\n\n constructor() {\n this.#conn = sqlite3(':memory:');\n this.#conn.exec(generateSchema());\n }\n\n close() {\n this.#stmtCache.clear();\n this.#conn.close();\n }\n\n /**\n * Begin a transaction for bulk inserts. Call commit() when done.\n */\n beginTransaction() {\n if (!this.#inTransaction) {\n this.#conn.exec('BEGIN TRANSACTION');\n this.#inTransaction = true;\n }\n }\n\n /**\n * Commit the current transaction.\n */\n commit() {\n if (this.#inTransaction) {\n this.#conn.exec('COMMIT');\n this.#inTransaction = false;\n }\n }\n\n /**\n * Insert a entity object into the database.\n * For bulk inserts, call beginTransaction() first and commit() when done.\n */\n insertEntity(table: Table, object: Record<string, any>) {\n const fields = Object.entries<any>(object);\n const fieldNames = fields\n .map(f => f[0])\n .sort()\n .join(',');\n const cacheKey = `${table}:${fieldNames}`;\n\n // Reuse prepared statement for same table+fields combination\n let stmt = this.#stmtCache.get(cacheKey);\n if (!stmt) {\n const slots = fields.map(f => `:${f[0]}`).join(', ');\n const columns = fields.map(f => snakeCase(f[0])).join(', ');\n stmt = this.#conn.prepare(`insert into ${table} (${columns}) values (${slots})`);\n this.#stmtCache.set(cacheKey, stmt);\n }\n\n // Translate date and booleans\n const data = mapValues(object, value =>\n value instanceof Date\n ? value.toISOString()\n : typeof value === 'boolean'\n ? Number(value)\n : value\n );\n\n stmt.run(data);\n }\n\n /**\n * Locate a track by ID in the database\n */\n findTrack(id: number): Track | null {\n const row: Record<string, any> | undefined = this.#conn\n .prepare<any, any>(`select * from ${Table.Track} where id = ?`)\n .get(id);\n\n if (!row) {\n return null;\n }\n\n // Map row columns to camel case compatibility\n const trackRow = mapKeys(row, (_, k) => camelCase(k)) as Track<EntityFK.WithFKs>;\n\n trackRow.beatGrid = null;\n trackRow.cueAndLoops = null;\n trackRow.waveformHd = null;\n\n // Explicitly restore dates and booleans\n trackRow.autoloadHotcues = !!trackRow.autoloadHotcues;\n trackRow.kuvoPublic = !!trackRow.kuvoPublic;\n\n // Explicitly restore date objects\n trackRow.analyzeDate = new Date(trackRow.analyzeDate as any);\n trackRow.dateAdded = new Date(trackRow.dateAdded as any);\n\n // Query all track relationships\n const track = trackRow as any;\n\n for (const relation of trackRelations) {\n const fkName = `${relation}Id`;\n\n const fk = track[fkName];\n const table = snakeCase(trackRelationTableMap[relation] ?? relation);\n\n // Swap fk for relation key\n delete track[fkName];\n track[relation] = null;\n\n if (fk === null) {\n continue;\n }\n\n const relationItem: Record<string, any> = this.#conn\n .prepare<any, any>(`select * from ${table} where id = ?`)\n .get(fk);\n\n track[relation] = relationItem;\n }\n\n return track as Track;\n }\n\n /**\n * Query for a list of {folders, playlists, tracks} given a playlist ID. If\n * no ID is provided the root list is queried.\n *\n * Note that when tracks are returned there will be no folders or playslists.\n * But the API here is simpler to assume there could be.\n *\n * Tracks are returned in the order they are placed on the playlist.\n */\n findPlaylist(playlistId?: number) {\n const parentCondition = playlistId === undefined ? 'parent_id is ?' : 'parent_id = ?';\n\n // Lookup playlists / folders for this playlist ID\n const playlistRows: Array<Record<string, any>> = this.#conn\n .prepare<any, any>(`select * from ${Table.Playlist} where ${parentCondition}`)\n .all(playlistId);\n\n const [folders, playlists] = partition(\n playlistRows.map(row => mapKeys(row, (_, k) => camelCase(k)) as Playlist),\n p => p.isFolder\n );\n\n const entryRows: Array<Record<string, any>> = this.#conn\n .prepare<any, any>(`select * from ${Table.PlaylistEntry} where playlist_id = ?`)\n .all(playlistId);\n\n const trackEntries = entryRows.map(\n row => mapKeys(row, (_, k) => camelCase(k)) as PlaylistEntry<EntityFK.WithFKs>\n );\n\n return {folders, playlists, trackEntries};\n }\n}\n","/**\n * Rekordbox Database Utilities\n *\n * Re-exports from the rekordbox/ folder for backward compatibility.\n * @see ./rekordbox/index.ts for the implementation\n */\n\nexport type {\n AnlzResolver,\n AnlzResponse,\n AnlzResponse2EX,\n AnlzResponseDAT,\n AnlzResponseEXT,\n HydrationOptions,\n HydrationProgress,\n} from './rekordbox/index';\nexport {hydrateDatabase, loadAnlz} from './rekordbox/index';\n","import {makeCueLoopEntry} from 'src/localdb/utils';\nimport {\n BeatGrid,\n CueAndLoop,\n ExtendedCue,\n HotcueButton,\n Phrase,\n SongStructure,\n VocalConfig,\n Waveform3BandDetail,\n Waveform3BandPreview,\n WaveformHD,\n WaveformPreviewData,\n} from 'src/types';\nimport {convertWaveformHDData} from 'src/utils/converters';\n\n/**\n * Fill beatgrid data from the ANLZ section\n */\nexport function makeBeatGrid(data: any): BeatGrid {\n return data.body.beats.map((beat: any) => ({\n offset: beat.time,\n bpm: beat.tempo / 100,\n count: beat.beatNumber,\n }));\n}\n\n/**\n * Fill cue and loop data from the ANLZ section\n */\nexport function makeCueAndLoop(data: any): CueAndLoop[] {\n return data.body.cues.map((entry: any) => {\n // Cues with the status 0 are likely leftovers that were removed\n\n const button = entry.hotCue === 0 ? false : (entry.type as HotcueButton);\n const isCue = entry.type === 0x01;\n const isLoop = entry.type === 0x02;\n\n // NOTE: Unlike the remotedb, these entries are already in milliseconds.\n const offset = entry.time;\n const length = entry.loopTime - offset;\n\n return makeCueLoopEntry(isCue, isLoop, offset, length, button);\n });\n}\n\n/**\n * Fill waveform HD data from the ANLZ section\n */\nexport function makeWaveformHd(data: any): WaveformHD {\n return convertWaveformHDData(Buffer.from(data.body.entries));\n}\n\n/**\n * Parse extended cues (PCO2) with colors and comments\n */\nexport function makeExtendedCues(data: any): ExtendedCue[] {\n return data.body.cues.map((entry: any) => {\n const cue: ExtendedCue = {\n hotCue: entry.hotCue,\n type: entry.type,\n time: entry.time,\n };\n\n // Add loop end time if this is a loop\n if (entry.type === 2 && entry.loopTime !== undefined) {\n cue.loopTime = entry.loopTime;\n }\n\n // Add color ID for memory points/loops\n if (entry.colorId !== undefined && entry.colorId > 0) {\n cue.colorId = entry.colorId;\n }\n\n // Add hot cue color information\n if (entry.colorCode !== undefined && entry.colorCode > 0) {\n cue.colorCode = entry.colorCode;\n cue.colorRgb = {\n r: entry.colorRed ?? 0,\n g: entry.colorGreen ?? 0,\n b: entry.colorBlue ?? 0,\n };\n }\n\n // Add comment if present\n if (entry.lenComment > 0 && entry.comment) {\n cue.comment = entry.comment;\n }\n\n // Add quantized loop information if present\n if (entry.loopNumerator !== undefined && entry.loopNumerator > 0) {\n cue.loopNumerator = entry.loopNumerator;\n cue.loopDenominator = entry.loopDenominator ?? 1;\n }\n\n return cue;\n });\n}\n\n/**\n * Parse song structure (PSSI) with phrase analysis\n */\nexport function makeSongStructure(data: any): SongStructure {\n const moodMap: Record<number, 'high' | 'mid' | 'low'> = {\n 1: 'high',\n 2: 'mid',\n 3: 'low',\n };\n\n const bankMap: Record<number, SongStructure['bank']> = {\n 0: 'default',\n 1: 'cool',\n 2: 'natural',\n 3: 'hot',\n 4: 'subtle',\n 5: 'warm',\n 6: 'vivid',\n 7: 'club_1',\n 8: 'club_2',\n };\n\n // Phrase type mappings based on mood\n const phraseTypeMap: Record<'high' | 'mid' | 'low', Record<number, string>> = {\n high: {\n 1: 'Intro',\n 2: 'Up',\n 3: 'Down',\n 5: 'Chorus',\n 6: 'Outro',\n },\n mid: {\n 1: 'Intro',\n 2: 'Verse 1',\n 3: 'Verse 2',\n 4: 'Verse 3',\n 5: 'Verse 4',\n 6: 'Verse 5',\n 7: 'Verse 6',\n 8: 'Bridge',\n 9: 'Chorus',\n 10: 'Outro',\n },\n low: {\n 1: 'Intro',\n 2: 'Verse 1',\n 3: 'Verse 1',\n 4: 'Verse 1',\n 5: 'Verse 2',\n 6: 'Verse 2',\n 7: 'Verse 2',\n 8: 'Bridge',\n 9: 'Chorus',\n 10: 'Outro',\n },\n };\n\n const mood = moodMap[data.body.mood] ?? 'high';\n const bank = bankMap[data.body.rawBank] ?? 'default';\n\n const phrases: Phrase[] = data.body.entries.map((entry: any) => {\n const phrase: Phrase = {\n index: entry.index,\n beat: entry.beat,\n kind: entry.kind,\n phraseType: phraseTypeMap[mood][entry.kind] ?? 'Unknown',\n };\n\n // Add fill-in information if present\n if (entry.fill > 0) {\n phrase.fill = entry.fill;\n phrase.fillBeat = entry.beatFill;\n }\n\n return phrase;\n });\n\n return {\n mood,\n bank,\n endBeat: data.body.endBeat,\n phrases,\n };\n}\n\n/**\n * Parse waveform preview data (PWAV/PWV2)\n */\nexport function makeWaveformPreview(data: any): WaveformPreviewData {\n return {\n data: Buffer.from(data.body.data),\n };\n}\n\n/**\n * Parse 3-band color waveform preview (PWV6 from .2EX files)\n */\nexport function makeWaveform3BandPreview(data: any): Waveform3BandPreview {\n return {\n numEntries: data.body.lenEntries,\n data: Buffer.from(data.body.entries),\n };\n}\n\n/**\n * Parse 3-band color detail waveform (PWV7 from .2EX files)\n */\nexport function makeWaveform3BandDetail(data: any): Waveform3BandDetail {\n return {\n numEntries: data.body.lenEntries,\n data: Buffer.from(data.body.entries),\n };\n}\n\n/**\n * Parse vocal detection config (PWVC from .2EX files)\n */\nexport function makeVocalConfig(data: any): VocalConfig {\n return {\n thresholdLow: data.body.thresholdLow,\n thresholdMid: data.body.thresholdMid,\n thresholdHigh: data.body.thresholdHigh,\n };\n}\n","import {\n Album,\n Artist,\n Artwork,\n Color,\n EntityFK,\n Genre,\n Key,\n Label,\n Playlist,\n PlaylistEntry,\n Track,\n} from 'src/entities';\n\ninterface IdAndNameEntity {\n id: number;\n name: string;\n}\n\nconst ensureDate = (date: Date) =>\n date instanceof Date && !isNaN(date.valueOf()) ? date : undefined;\n\n/**\n * Utility to create a hydrator that hydrates the provided entity with the id\n * and name properties from the row.\n */\nexport const makeIdNameHydrator =\n <T extends IdAndNameEntity>() =>\n (row: any) =>\n ({\n id: row.id,\n name: row.name.body.text ?? '',\n }) as T;\n\n/**\n * Translates a pdb track row entry to a {@link Track} entity.\n */\nexport function createTrack(trackRow: any) {\n const analyzePath: string | undefined = trackRow.analyzePath.body.text;\n\n const track: Track<EntityFK.WithFKs> = {\n id: trackRow.id,\n title: trackRow.title.body.text,\n trackNumber: trackRow.trackNumber,\n discNumber: trackRow.discNumber,\n duration: trackRow.duration,\n sampleRate: trackRow.sampleRate,\n sampleDepth: trackRow.sampleDepth,\n bitrate: trackRow.bitrate,\n tempo: trackRow.tempo / 100,\n playCount: trackRow.playCount,\n year: trackRow.year,\n rating: trackRow.rating,\n mixName: trackRow.mixName.body.text,\n comment: trackRow.comment.body.text,\n autoloadHotcues: trackRow.autoloadHotcues.body.text === 'ON',\n kuvoPublic: trackRow.kuvoPublic.body.text === 'ON',\n filePath: trackRow.filePath.body.text,\n fileName: trackRow.filename.body.text,\n fileSize: trackRow.fileSize,\n releaseDate: trackRow.releaseDate.body.text,\n analyzeDate: ensureDate(new Date(trackRow.analyzeDate.body.text)),\n dateAdded: ensureDate(new Date(trackRow.dateAdded.body.text)),\n\n // The analyze file comes in 3 forms\n //\n // 1. A `DAT` file, which is missing some extended information, for the older\n // Pioneer equipment (likely due to memory constraints).\n //\n // 2. A `EXT` file which includes colored waveforms and other extended data.\n //\n // 3. A `EX2` file -- currently unknown\n //\n // We noramlize this path by trimming the DAT extension off. Later we will\n // try and read whatever is available.\n analyzePath: analyzePath?.substring(0, analyzePath.length - 4),\n\n artworkId: trackRow.artworkId || null,\n artistId: trackRow.artistId || null,\n originalArtistId: trackRow.originalArtistId || null,\n remixerId: trackRow.remixerId || null,\n composerId: trackRow.composerId || null,\n albumId: trackRow.albumId || null,\n labelId: trackRow.labelId || null,\n genreId: trackRow.genreId || null,\n colorId: trackRow.colorId || null,\n keyId: trackRow.keyId || null,\n\n // NOTE: There are a few additional columns that will be hydrated through\n // the analyze files (given the analyzePath) which we do not assign here.\n beatGrid: null,\n cueAndLoops: null,\n waveformHd: null,\n };\n\n return track;\n}\n\n/**\n * Translates a pdb playlist row entry into a {@link Playlist} entity.\n */\nexport function createPlaylist(playlistRow: any) {\n const playlist: Playlist = {\n id: playlistRow.id,\n name: playlistRow.name.body.text,\n isFolder: playlistRow.rawIsFolder !== 0,\n parentId: playlistRow.parentId || null,\n };\n\n return playlist;\n}\n\n/**\n * Translates a pdb playlist track entry into a {@link PlaylistTrack} entity.\n */\nexport function createPlaylistEntry(playlistTrackRow: any) {\n const entry: PlaylistEntry<EntityFK.WithFKs> = {\n id: playlistTrackRow.id,\n sortIndex: playlistTrackRow.entryIndex,\n playlistId: playlistTrackRow.playlistId,\n trackId: playlistTrackRow.trackId,\n };\n\n return entry;\n}\n\n/**\n * Translates a pdb artwork entry into a {@link Artwork} entity.\n */\nexport function createArtworkEntry(artworkRow: any) {\n const art: Artwork = {\n id: artworkRow.id,\n path: artworkRow.path.body.text,\n };\n\n return art;\n}\n\n// Re-export types for table mappings\nexport type {Album, Artist, Color, Genre, Key, Label};\n","import {KaitaiStream} from 'kaitai-struct';\n\nimport RekordboxPdb from 'src/localdb/kaitai/rekordbox_pdb.ksy';\nimport {MetadataORM} from 'src/localdb/orm';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\nimport * as Telemetry from 'src/utils/telemetry';\n\nimport {pdbEntityCreators, pdbTables} from './table-mappings';\nimport type {HydrationOptions, HydrationProgress} from './types';\n\n/**\n * This service provides utilities for translating rekordbox database (pdb_ and\n * analysis (ANLZ) files into the common entity types used in this library.\n */\nexport class RekordboxHydrator {\n #orm: MetadataORM;\n #onProgress: (progress: HydrationProgress) => void;\n\n constructor({orm, onProgress}: Omit<HydrationOptions, 'pdbData' | 'span'>) {\n this.#orm = orm;\n this.#onProgress = onProgress ?? (() => null);\n }\n\n /**\n * Extract entries from a rekordbox pdb file and hydrate the passed database\n * connection with entities derived from the rekordbox entries.\n */\n async hydrateFromPdb(pdbData: Buffer, span?: Span) {\n const tx = span\n ? span.startChild({op: 'hydrateFromPdb'})\n : Telemetry.startTransaction({name: 'hydrateFromPdb'});\n\n const parseTx = tx.startChild({op: 'parsePdbData', data: {size: pdbData.length}});\n const stream = new KaitaiStream(pdbData);\n const db = new RekordboxPdb(stream);\n parseTx.finish();\n\n const hydrateTx = tx.startChild({op: 'hydration'});\n await Promise.all(\n db.tables.map((table: any) => this.hydrateFromTable(table, hydrateTx))\n );\n hydrateTx.finish();\n\n tx.finish();\n }\n\n /**\n * Hydrate the database with entities from the provided RekordboxPdb table.\n * See pdbEntityCreators for how tables are mapped into database entities.\n */\n async hydrateFromTable(table: any, span: Span) {\n const tableName = pdbTables[table.type];\n const createObject = pdbEntityCreators[table.type];\n\n const tx = span.startChild({op: 'hydrateFromTable', description: tableName});\n\n if (createObject === undefined) {\n return;\n }\n\n let totalSaved = 0;\n let totalItems = 0;\n\n for (const _row of tableRows(table)) {\n void _row; // Intentionally unused - just counting\n totalItems++;\n }\n\n tx.setData('items', totalItems);\n\n // Use transaction for bulk inserts (10-100x faster)\n this.#orm.beginTransaction();\n\n try {\n for (const row of tableRows(table)) {\n const entity = createObject(row);\n this.#orm.insertEntity(tableName, entity);\n totalSaved++;\n\n // Report progress and yield every 100 rows (instead of every row)\n if (totalSaved % 100 === 0 || totalSaved === totalItems) {\n this.#onProgress({complete: totalSaved, table: tableName, total: totalItems});\n // Yield to event loop periodically to keep UI responsive\n await new Promise(r => setTimeout(r, 0));\n }\n }\n } finally {\n this.#orm.commit();\n }\n\n tx.finish();\n }\n}\n\n/**\n * Utility generator that pages through a table and yields every present row.\n * This flattens the concept of rowGroups and refs.\n */\nfunction* tableRows(table: any) {\n const {firstPage, lastPage} = table;\n\n let pageRef = firstPage;\n do {\n const page = pageRef.body;\n\n // Adjust our page ref for the next iteration. We do this early in our loop\n // so we can break without having to remember to update for the next iter.\n pageRef = page.nextPage;\n\n // Ignore non-data pages. Not sure what these are for?\n if (!page.isDataPage) {\n continue;\n }\n\n const rows = page.rowGroups\n .map((group: any) => group.rows)\n .flat()\n .filter((row: any) => row.present);\n\n for (const row of rows) {\n yield row.body;\n }\n } while (pageRef.index <= lastPage.index);\n}\n","import {KaitaiStream} from 'kaitai-struct';\n\nimport {Track} from 'src/entities';\nimport RekordboxAnlz from 'src/localdb/kaitai/rekordbox_anlz.ksy';\n\nimport {\n makeBeatGrid,\n makeCueAndLoop,\n makeExtendedCues,\n makeSongStructure,\n makeVocalConfig,\n makeWaveform3BandDetail,\n makeWaveform3BandPreview,\n makeWaveformHd,\n makeWaveformPreview,\n} from './anlz-parsers';\nimport {RekordboxHydrator} from './hydrator';\nimport type {\n AnlzResolver,\n AnlzResponse,\n AnlzResponse2EX,\n AnlzResponseDAT,\n AnlzResponseEXT,\n HydrationOptions,\n HydrationProgress,\n} from './types';\n\nconst {SectionTags} = RekordboxAnlz;\n\n// Re-export types\nexport type {\n AnlzResolver,\n AnlzResponse,\n AnlzResponse2EX,\n AnlzResponseDAT,\n AnlzResponseEXT,\n HydrationOptions,\n HydrationProgress,\n};\n\n/**\n * Given a rekordbox pdb file contents. This function will hydrate the provided\n * database with all entities from the Rekordbox database. This includes all\n * track metadata, including analyzed metadata (such as beatgrids and waveforms).\n */\nexport async function hydrateDatabase({pdbData, span, ...options}: HydrationOptions) {\n const hydrator = new RekordboxHydrator(options);\n await hydrator.hydrateFromPdb(pdbData, span);\n}\n\n/**\n * Loads the ANLZ data of a Track entity from the analyzePath.\n */\nexport async function loadAnlz<T extends keyof AnlzResponse>(\n track: Pick<Track, 'analyzePath'>,\n type: T,\n anlzResolver: AnlzResolver\n): Promise<AnlzResponse[T]> {\n const path = `${track.analyzePath}.${type}`;\n const anlzData = await anlzResolver(path);\n\n const stream = new KaitaiStream(anlzData);\n const anlz = new RekordboxAnlz(stream);\n\n const result = {} as AnlzResponse[T];\n const resultDat = result as AnlzResponseDAT;\n const resultExt = result as AnlzResponseEXT;\n const result2ex = result as AnlzResponse2EX;\n\n for (const section of anlz.sections) {\n switch (section.fourcc) {\n case SectionTags.BEAT_GRID:\n resultDat.beatGrid = makeBeatGrid(section);\n break;\n\n case SectionTags.CUES:\n resultDat.cueAndLoops = makeCueAndLoop(section);\n break;\n\n case SectionTags.CUES_2:\n resultExt.extendedCues = makeExtendedCues(section);\n break;\n\n case SectionTags.WAVE_PREVIEW:\n resultDat.waveformPreview = makeWaveformPreview(section);\n break;\n\n case SectionTags.WAVE_TINY:\n resultDat.waveformTiny = makeWaveformPreview(section);\n break;\n\n case SectionTags.WAVE_SCROLL:\n resultExt.waveformDetail = Buffer.from(section.body.entries);\n break;\n\n case SectionTags.WAVE_COLOR_PREVIEW:\n resultExt.waveformColorPreview = Buffer.from(section.body.entries);\n break;\n\n case SectionTags.WAVE_COLOR_SCROLL:\n resultExt.waveformHd = makeWaveformHd(section);\n break;\n\n case SectionTags.SONG_STRUCTURE:\n resultExt.songStructure = makeSongStructure(section);\n break;\n\n case SectionTags.WAVE_COLOR_3BAND_PREVIEW:\n result2ex.waveform3BandPreview = makeWaveform3BandPreview(section);\n break;\n\n case SectionTags.WAVE_COLOR_3BAND_DETAIL:\n result2ex.waveform3BandDetail = makeWaveform3BandDetail(section);\n break;\n\n case SectionTags.VOCAL_CONFIG:\n result2ex.vocalConfig = makeVocalConfig(section);\n break;\n\n // VBR and PATH tags are defined but not currently extracted\n // as they're not commonly needed in the application\n case SectionTags.VBR:\n case SectionTags.PATH:\n break;\n }\n }\n\n return result;\n}\n","import {Album, Artist, Color, Genre, Key, Label} from 'src/entities';\nimport RekordboxPdb from 'src/localdb/kaitai/rekordbox_pdb.ksy';\nimport {Table} from 'src/localdb/orm';\n\nimport {\n createArtworkEntry,\n createPlaylist,\n createPlaylistEntry,\n createTrack,\n makeIdNameHydrator,\n} from './entity-creators';\n\nconst {PageType} = RekordboxPdb;\n\n/**\n * Maps rekordbox pdb table types to orm table names.\n */\nexport const pdbTables: Record<number, Table> = {\n [PageType.TRACKS]: Table.Track,\n [PageType.ARTISTS]: Table.Artist,\n [PageType.GENRES]: Table.Genre,\n [PageType.ALBUMS]: Table.Album,\n [PageType.LABELS]: Table.Label,\n [PageType.COLORS]: Table.Color,\n [PageType.KEYS]: Table.Key,\n [PageType.ARTWORK]: Table.Artwork,\n [PageType.PLAYLIST_TREE]: Table.Playlist,\n [PageType.PLAYLIST_ENTRIES]: Table.PlaylistEntry,\n};\n\n/**\n * Maps rekordbox pdb table types to functions that create entity objects for\n * the passed pdb row.\n */\nexport const pdbEntityCreators: Record<number, (row: any) => any> = {\n [PageType.TRACKS]: createTrack,\n [PageType.ARTISTS]: makeIdNameHydrator<Artist>(),\n [PageType.GENRES]: makeIdNameHydrator<Genre>(),\n [PageType.ALBUMS]: makeIdNameHydrator<Album>(),\n [PageType.LABELS]: makeIdNameHydrator<Label>(),\n [PageType.COLORS]: makeIdNameHydrator<Color>(),\n [PageType.KEYS]: makeIdNameHydrator<Key>(),\n [PageType.ARTWORK]: createArtworkEntry,\n [PageType.PLAYLIST_TREE]: createPlaylist,\n [PageType.PLAYLIST_ENTRIES]: createPlaylistEntry,\n\n // TODO: Register PageType.HISTORY\n};\n","import {Table} from './orm';\n\nexport const generateSchema = () => `\n CREATE TABLE '${Table.Artist}' (\n 'id' integer not null primary key,\n 'name' varchar not null\n );\n CREATE TABLE '${Table.Album}' (\n 'id' integer not null primary key,\n 'name' varchar not null\n );\n CREATE TABLE '${Table.Genre}' (\n 'id' integer not null primary key,\n 'name' varchar not null\n );\n CREATE TABLE '${Table.Color}' (\n 'id' integer not null primary key,\n 'name' varchar not null\n );\n CREATE TABLE '${Table.Label}' (\n 'id' integer not null primary key,\n 'name' varchar not null\n );\n CREATE TABLE '${Table.Key}' (\n 'id' integer not null primary key,\n 'name' varchar not null\n );\n CREATE TABLE '${Table.Artwork}' (\n 'id' integer not null primary key,\n 'path' varchar not null\n );\n CREATE TABLE '${Table.Track}' (\n 'id' integer not null primary key,\n 'title' varchar not null,\n 'duration' integer not null,\n 'bitrate' integer not null,\n 'tempo' integer not null,\n 'rating' integer not null,\n 'comment' varchar not null,\n 'file_path' varchar not null,\n 'file_name' varchar not null,\n 'track_number' integer not null,\n 'disc_number' integer not null,\n 'sample_rate' integer not null,\n 'sample_depth' integer not null,\n 'play_count' integer not null,\n 'year' integer not null,\n 'mix_name' varchar not null,\n 'autoload_hotcues' integer not null,\n 'kuvo_public' integer not null,\n 'file_size' integer not null,\n 'analyze_path' varchar not null,\n 'release_date' varchar not null,\n 'analyze_date' datetime,\n 'date_added' datetime,\n 'beat_grid' text null,\n 'cue_and_loops' text null,\n 'waveform_hd' text null,\n 'artwork_id' integer null,\n 'artist_id' integer null,\n 'original_artist_id' integer null,\n 'remixer_id' integer null,\n 'composer_id' integer null,\n 'album_id' integer null,\n 'label_id' integer null,\n 'genre_id' integer null,\n 'color_id' integer null,\n 'key_id' integer null\n );\n CREATE TABLE '${Table.Playlist}' (\n 'id' integer not null primary key,\n 'is_folder' integer not null,\n 'name' varchar not null,\n 'parent_id' integer null\n );\n CREATE TABLE '${Table.PlaylistEntry}' (\n 'id' integer not null primary key,\n 'sort_index' integer not null,\n 'playlist_id' integer null,\n 'track_id' integer null\n );\n CREATE INDEX 'track_artwork_id_index' on '${Table.Track}' ('artwork_id');\n CREATE INDEX 'track_artist_id_index' on '${Table.Track}' ('artist_id');\n CREATE INDEX 'track_original_artist_id_index' on '${Table.Track}' ('original_artist_id');\n CREATE INDEX 'track_remixer_id_index' on '${Table.Track}' ('remixer_id');\n CREATE INDEX 'track_composer_id_index' on '${Table.Track}' ('composer_id');\n CREATE INDEX 'track_album_id_index' on '${Table.Track}' ('album_id');\n CREATE INDEX 'track_label_id_index' on '${Table.Track}' ('label_id');\n CREATE INDEX 'track_genre_id_index' on '${Table.Track}' ('genre_id');\n CREATE INDEX 'track_color_id_index' on '${Table.Track}' ('color_id');\n CREATE INDEX 'track_key_id_index' on '${Table.Track}' ('key_id');\n CREATE INDEX 'playlist_parent_id_index' on '${Table.Playlist}' ('parent_id');\n CREATE INDEX 'playlist_entry_playlist_id_index' on '${Table.PlaylistEntry}' ('playlist_id');\n CREATE INDEX 'playlist_entry_track_id_index' on '${Table.PlaylistEntry}' ('track_id');\n`;\n","import {CueAndLoop, HotcueButton} from 'src/types';\n\n/**\n * Create a CueAndLoop entry given common parameters\n */\nexport const makeCueLoopEntry = (\n isCue: boolean,\n isLoop: boolean,\n offset: number,\n length: number,\n button: false | HotcueButton\n): null | CueAndLoop =>\n button !== false\n ? isLoop\n ? {type: 'hot_loop', offset, length, button}\n : {type: 'hot_cue', offset, button}\n : isLoop\n ? {type: 'loop', offset, length}\n : isCue\n ? {type: 'cue_point', offset}\n : null;\n","/**\n * Logger interface for alphatheta-connect package.\n * Consumers can supply their own logger implementation.\n * If no logger is provided, a no-op logger is used (silent).\n */\nexport interface Logger {\n trace(msg: string, ...args: unknown[]): void;\n debug(msg: string, ...args: unknown[]): void;\n info(msg: string, ...args: unknown[]): void;\n warn(msg: string, ...args: unknown[]): void;\n error(msg: string, ...args: unknown[]): void;\n}\n\nexport const noopLogger: Logger = {\n trace() {},\n debug() {},\n info() {},\n warn() {},\n error() {},\n};\n","import {extractMetadata, isExtensionSupported} from 'metadata-connect';\nimport type {ExtractedMetadata, FileReader} from 'metadata-connect';\nimport {getFileInfo, NfsMediaSlot} from './nfs';\nimport {Device} from './types';\nimport {createNfsFileReader} from './artwork/reader';\n\nexport type {ExtractedMetadata} from 'metadata-connect';\n\n/**\n * Extract full metadata from an audio file using a FileReader.\n *\n * This is the low-level API that works with any FileReader implementation.\n * For extracting from a Pro DJ Link device, use extractMetadataFromDevice.\n *\n * @param reader - FileReader interface for reading file data\n * @returns Extracted metadata, or null if extraction fails\n */\nexport async function extractFullMetadata(\n reader: FileReader\n): Promise<ExtractedMetadata | null> {\n return extractMetadata(reader);\n}\n\n/**\n * Check if metadata extraction is supported for a file extension.\n *\n * @param extension - File extension (with or without leading dot)\n * @returns true if the extension is supported\n */\nexport function isMetadataExtractionSupported(extension: string): boolean {\n return isExtensionSupported(extension);\n}\n\n/**\n * Extract full metadata from an audio file on a Pro DJ Link device.\n *\n * This function reads only the necessary bytes from the file header,\n * avoiding the need to transfer entire audio files over the network.\n *\n * @param device - The Pro DJ Link device\n * @param slot - The media slot containing the file (USB, SD, etc.)\n * @param filePath - The file path on the device\n * @returns Extracted metadata, or null if extraction fails\n *\n * @example\n * ```typescript\n * // Extract metadata when a track is loaded\n * const metadata = await extractMetadataFromDevice(device, slot, filePath);\n * if (metadata) {\n * console.log(metadata.title, metadata.artist, metadata.bpm);\n * if (metadata.artwork) {\n * // Display artwork\n * }\n * }\n * ```\n */\nexport async function extractMetadataFromDevice(\n device: Device,\n slot: NfsMediaSlot,\n filePath: string\n): Promise<ExtractedMetadata | null> {\n // Get file extension and check if supported\n const extension = filePath.split('.').pop()?.toLowerCase() ?? '';\n if (!isExtensionSupported(extension)) {\n return null;\n }\n\n try {\n const fileInfo = await getFileInfo({device, slot, path: filePath});\n if (fileInfo.size === 0) {\n return null;\n }\n\n const reader = createNfsFileReader(device, slot, filePath, fileInfo.size);\n return extractMetadata(reader);\n } catch {\n // Return null on any error (file not found, network issues, etc.)\n return null;\n }\n}\n","import StrictEventEmitter from 'strict-event-emitter-types';\n\nimport {EventEmitter} from 'events';\n\nimport {CDJStatus, DeviceID, MixstatusMode} from 'src/types';\nimport {bpmToSeconds} from 'src/utils';\n\nimport {isPlaying, isStopping} from './utils';\n\nexport interface MixstatusConfig {\n /**\n * Selects the mixstatus reporting mode\n */\n mode: MixstatusMode;\n /**\n * Specifies the duration in seconds that no tracks must be on air. This can\n * be thought of as how long 'air silence' is reasonable in a set before a\n * separate one is considered have begun.\n *\n * @default 30 (half a minute)\n */\n timeBetweenSets: number;\n /**\n * Indicates if the status objects reported should have their on-air flag\n * read. Setting this to false will degrade the functionality of the processor\n * such that it will not consider the value of isOnAir and always assume CDJs\n * are live.\n *\n * @default true\n */\n useOnAirStatus: boolean;\n /**\n * Configures how many beats a track may not be live or playing for it to\n * still be considered active.\n *\n * @default 8 (two bars)\n */\n allowedInterruptBeats: number;\n /**\n * Configures how many beats the track must consecutively be playing for\n * (since the beat it was cued at) until the track is considered to be\n * active.\n *\n * Used for MixstatusMode.SmartTiming\n *\n * @default 128 (2 phrases)\n */\n beatsUntilReported: number;\n}\n\nconst defaultConfig: MixstatusConfig = {\n mode: MixstatusMode.SmartTiming,\n timeBetweenSets: 30,\n allowedInterruptBeats: 8,\n beatsUntilReported: 128,\n useOnAirStatus: true,\n};\n\n/**\n * The interface the mix status event emitter should follow\n */\ninterface MixstatusEvents {\n /**\n * Fired when a track is considered to be on-air and is being heard by the\n * audience\n */\n nowPlaying: (state: CDJStatus.State) => void;\n /**\n * Fired when a track has stopped and is completely offair\n */\n stopped: (opt: {deviceId: DeviceID}) => void;\n /**\n * Fired when a DJ set first starts\n */\n setStarted: () => void;\n /**\n * Fired when tracks have been stopped\n */\n setEnded: () => void;\n}\n\ntype Emitter = StrictEventEmitter<EventEmitter, MixstatusEvents>;\n\n/**\n * MixstatusProcessor is a configurable processor which when fed device state\n * will attempt to accurately determine events that happen within the DJ set.\n *\n * The following events are fired:\n *\n * - nowPlaying: The track is considered playing and on air to the audience.\n * - stopped: The track was stopped / paused / went off-air.\n *\n * Additionally the following non-track status are reported:\n *\n * - setStarted: The first track has begun playing.\n * - setEnded: The TimeBetweenSets has passed since any tracks were live.\n *\n * See Config for configuration options.\n *\n * Config options may be changed after the processor has been created and is\n * actively receiving state updates.\n */\nexport class MixstatusProcessor {\n /**\n * Used to fire track mix status events\n */\n #emitter: Emitter = new EventEmitter();\n /**\n * Records the most recent state of each player\n */\n #lastState = new Map<DeviceID, CDJStatus.State>();\n /**\n * Records when each device last started playing a track\n */\n #lastStartTime = new Map<DeviceID, number>();\n /**\n * Records when a device entered a 'may stop' state. If it's in the state for\n * long enough it will be reported as stopped.\n */\n #lastStoppedTimes = new Map<DeviceID, number>();\n /**\n * Records which players have been reported as 'live'\n */\n #livePlayers = new Set<DeviceID>();\n /**\n * Records the last trackId emitted as 'nowPlaying' for each device. Used to\n * suppress duplicate emissions when a deck is briefly cued/loaded and then\n * resumed on the same track (a common pattern for House/Techno DJs who\n * cue-juggle mid-track). The entry is replaced when a different trackId is\n * emitted on the same deck, so subsequent track loads still emit normally.\n */\n #lastEmittedTrackId = new Map<DeviceID, number>();\n /**\n * Incidates if we're currentiny in an active DJ set\n */\n #isSetActive = false;\n /**\n * When we are waiting for a set to end, use this to cancel the timer.\n */\n #cancelSetEnding?: () => void;\n /**\n * The configuration for this instance of the processor\n */\n #config: MixstatusConfig;\n\n constructor(config?: Partial<MixstatusConfig>) {\n this.#config = {...defaultConfig, ...config};\n }\n\n /**\n * Update the configuration\n */\n configure(config?: Partial<MixstatusConfig>) {\n this.#config = {...this.#config, ...config};\n }\n\n // Bind public event emitter interface\n on: Emitter['on'] = this.#emitter.addListener.bind(this.#emitter);\n off: Emitter['off'] = this.#emitter.removeListener.bind(this.#emitter);\n once: Emitter['once'] = this.#emitter.once.bind(this.#emitter);\n removeAllListeners = (event?: keyof MixstatusEvents) =>\n this.#emitter.removeAllListeners(event);\n\n /**\n * Helper to account for the useOnAirStatus config. If not configured\n * with this flag the state will always be determined as on air.\n */\n #onAir = (state: CDJStatus.State) =>\n this.#config.useOnAirStatus ? state.isOnAir : true;\n\n /**\n * Report a player as 'live'. Will not report the state if the player has\n * already previously been reported as live.\n */\n #promotePlayer = (state: CDJStatus.State) => {\n const {deviceId} = state;\n\n if (!this.#onAir(state) || !isPlaying(state)) {\n return;\n }\n\n if (this.#livePlayers.has(deviceId)) {\n return;\n }\n\n // Suppress duplicate nowPlaying for the same track on the same deck. This\n // can happen when a DJ cues mid-track and resumes (Cued/Loading/Ended are\n // all stoppingStates that drop the deck from livePlayers, so the next play\n // of the same trackId would otherwise re-emit). When a different track is\n // loaded, the trackId differs and the new emission proceeds normally.\n if (this.#lastEmittedTrackId.get(deviceId) === state.trackId) {\n return;\n }\n\n if (!this.#isSetActive) {\n this.#isSetActive = true;\n this.#emitter.emit('setStarted');\n }\n\n if (this.#cancelSetEnding) {\n this.#cancelSetEnding();\n }\n\n this.#livePlayers.add(deviceId);\n this.#lastEmittedTrackId.set(deviceId, state.trackId);\n\n this.#emitter.emit('nowPlaying', state);\n };\n\n /**\n * Locate the player that has been playing for the longest time and is onair,\n * and report that device as now playing.\n */\n #promoteNextPlayer = () => {\n const longestPlayingId = [...this.#lastStartTime.entries()]\n .map(([deviceId, startedAt]) => ({\n deviceId,\n startedAt,\n state: this.#lastState.get(deviceId),\n }))\n .filter(s => !this.#livePlayers.has(s.deviceId))\n .filter(s => s.state && isPlaying(s.state))\n .sort((a, b) => b.startedAt - a.startedAt)\n .pop()?.deviceId;\n\n // No other players currently playing?\n if (longestPlayingId === undefined) {\n this.#setMayStop();\n return;\n }\n\n // We know this value is available since we have a live player playing ID\n const nextPlayerState = this.#lastState.get(longestPlayingId)!;\n this.#promotePlayer(nextPlayerState);\n };\n\n #markPlayerStopped = ({deviceId}: CDJStatus.State) => {\n this.#lastStoppedTimes.delete(deviceId);\n this.#lastStartTime.delete(deviceId);\n this.#livePlayers.delete(deviceId);\n\n this.#promoteNextPlayer();\n this.#emitter.emit('stopped', {deviceId});\n };\n\n #setMayStop = async () => {\n // We handle the set ending interrupt as a async timeout as in the case with\n // a set ending, the DJ may immediately turn off the CDJs, stopping state\n // packets meaning we can't process on a heartbeat.\n if (!this.#isSetActive) {\n return;\n }\n\n // If any tracks are still playing the set has not ended\n if ([...this.#lastState.values()].some(s => isPlaying(s) && this.#onAir(s))) {\n return;\n }\n\n const shouldEnd = await new Promise<boolean>(resolve => {\n const endTimeout = setTimeout(\n () => resolve(true),\n this.#config.timeBetweenSets * 1000\n );\n this.#cancelSetEnding = () => {\n clearTimeout(endTimeout);\n resolve(false);\n };\n });\n\n this.#cancelSetEnding = undefined;\n\n if (!shouldEnd || !this.#isSetActive) {\n return;\n }\n\n this.#emitter.emit('setEnded');\n };\n\n /**\n * Called to indicate that we think this player may be the first one to start\n * playing. Will check if no other players are playing, if so it will report\n * the player as now playing.\n */\n #playerMayBeFirst = (state: CDJStatus.State) => {\n const otherPlayersPlaying = [...this.#lastState.values()]\n .filter(otherState => otherState.deviceId !== state.deviceId)\n .some(otherState => this.#onAir(otherState) && isPlaying(otherState));\n\n if (otherPlayersPlaying) {\n return;\n }\n\n this.#promotePlayer(state);\n };\n\n /**\n * Called when the player is in a state where it is no longer playing, but\n * may come back onair. Examples are slip pause, or 'cutting' a track on the\n * mixer taking it offair.\n */\n #playerMayStop = ({deviceId}: CDJStatus.State) => {\n this.#lastStoppedTimes.set(deviceId, Date.now());\n };\n\n /**\n * Called to indicate that a device has reported a different playState than\n * it had previously reported.\n */\n #handlePlaystateChange = (lastState: CDJStatus.State, state: CDJStatus.State) => {\n const {deviceId} = state;\n\n const isFollowingMaster =\n this.#config.mode === MixstatusMode.FollowsMaster && state.isMaster;\n\n const nowPlaying = isPlaying(state);\n const wasPlaying = isPlaying(lastState);\n\n const isNowPlaying = nowPlaying && !wasPlaying;\n\n // Was this device in a 'may stop' state and it has begun on-air playing\n // again?\n if (this.#lastStoppedTimes.has(deviceId) && nowPlaying && this.#onAir(state)) {\n this.#lastStoppedTimes.delete(deviceId);\n return;\n }\n\n if (isNowPlaying && isFollowingMaster) {\n this.#promotePlayer(state);\n }\n\n if (isNowPlaying) {\n this.#lastStartTime.set(deviceId, Date.now());\n this.#playerMayBeFirst(state);\n return;\n }\n\n if (wasPlaying && isStopping(state)) {\n this.#markPlayerStopped(state);\n return;\n }\n\n if (wasPlaying && !nowPlaying) {\n this.#playerMayStop(state);\n }\n };\n\n #handleOnairChange = (state: CDJStatus.State) => {\n const {deviceId} = state;\n\n // Player may have just been brought on with nothing else playing\n this.#playerMayBeFirst(state);\n\n if (!this.#livePlayers.has(deviceId)) {\n return;\n }\n\n if (!this.#onAir(state)) {\n this.#playerMayStop(state);\n return;\n }\n\n // Play has come back onair\n this.#lastStoppedTimes.delete(deviceId);\n };\n\n /**\n * Feed a CDJStatus state object to the mix state processor\n */\n handleState(state: CDJStatus.State) {\n const {deviceId, playState} = state;\n\n const lastState = this.#lastState.get(deviceId);\n this.#lastState.set(deviceId, state);\n\n // If this is the first time we've heard from this CDJ, and it is on air\n // and playing, report it immediately. This is different from reporting the\n // first playing track, as the CDJ will have already sent many states.\n if (lastState === undefined && this.#onAir(state) && isPlaying(state)) {\n this.#lastStartTime.set(deviceId, Date.now());\n this.#playerMayBeFirst(state);\n return;\n }\n\n // Play state has changed since this play last reported\n if (lastState && lastState.playState !== playState) {\n this.#handlePlaystateChange(lastState, state);\n }\n\n if (lastState && this.#onAir(lastState) !== this.#onAir(state)) {\n this.#handleOnairChange(state);\n }\n\n // Are we simply following master?\n if (\n this.#config.mode === MixstatusMode.FollowsMaster &&\n lastState?.isMaster === false &&\n state.isMaster\n ) {\n this.#promotePlayer(state);\n return;\n }\n\n // If a device has been playing for the required number of beats, we may be\n // able to report it as live\n const startedAt = this.#lastStartTime.get(deviceId);\n const requiredPlayTime =\n this.#config.beatsUntilReported *\n bpmToSeconds(state.trackBPM!, state.sliderPitch) *\n 1000;\n\n if (\n this.#config.mode === MixstatusMode.SmartTiming &&\n startedAt !== undefined &&\n requiredPlayTime <= Date.now() - startedAt\n ) {\n this.#promotePlayer(state);\n }\n\n // If a device has been in a 'potentially stopped' state for long enough,\n // we can mark the track as truly stopped.\n const stoppedAt = this.#lastStoppedTimes.get(deviceId);\n const requiredStopTime =\n this.#config.allowedInterruptBeats *\n bpmToSeconds(state.trackBPM!, state.sliderPitch) *\n 1000;\n\n if (stoppedAt !== undefined && requiredStopTime <= Date.now() - stoppedAt) {\n this.#markPlayerStopped(state);\n }\n }\n\n /**\n * Manually reports the track that has been playing the longest which has not\n * yet been reported as live.\n */\n triggerNextTrack() {\n this.#promoteNextPlayer();\n }\n}\n","import {CDJStatus} from 'src/types';\n\nconst playingStates = [CDJStatus.PlayState.Playing, CDJStatus.PlayState.Looping];\n\nconst stoppingStates = [\n CDJStatus.PlayState.Cued,\n CDJStatus.PlayState.Ended,\n CDJStatus.PlayState.Loading,\n];\n\n/**\n * Returns true if the the status reports a playing state.\n */\nexport const isPlaying = (s: CDJStatus.State) => playingStates.includes(s.playState);\n\n/**\n * Returns true if the status reports a stopping state.\n */\nexport const isStopping = (s: CDJStatus.State) => stoppingStates.includes(s.playState);\n","import {randomUUID} from 'crypto';\nimport dgram, {Socket} from 'dgram';\nimport {NetworkInterfaceInfoIPv4} from 'os';\n\nimport {ANNOUNCE_PORT, BEAT_PORT, DEFAULT_VCDJ_ID, STATUS_PORT} from 'src/constants';\nimport Control from 'src/control';\nimport Database from 'src/db';\nimport DeviceManager from 'src/devices';\nimport {type Logger, noopLogger} from 'src/logger';\nimport LocalDatabase from 'src/localdb';\nimport {DatabasePreference} from 'src/localdb/database-adapter';\nimport {MixstatusProcessor} from 'src/mixstatus';\nimport RemoteDatabase from 'src/remotedb';\nimport StatusEmitter from 'src/status';\nimport PositionEmitter from 'src/status/position';\nimport {Device, NetworkState} from 'src/types';\nimport {getMatchingInterface} from 'src/utils';\nimport * as Telemetry from 'src/utils/telemetry';\nimport {SpanStatus} from 'src/utils/telemetry';\nimport {udpBind, udpClose} from 'src/utils/udp';\nimport {Announcer, getVirtualCDJ} from 'src/virtualcdj';\n\nconst connectErrorHelp =\n 'Network must be configured. Try using `autoconfigFromPeers` or `configure`';\n\nexport interface NetworkConfig {\n /**\n * The network interface to listen for devices on the network over\n */\n iface: NetworkInterfaceInfoIPv4;\n /**\n * The ID of the virtual CDJ to pose as.\n *\n * IMPORTANT:\n *\n * You will likely want to configure this to be > 6, however it is important to\n * note, if you choose an ID within the 1-6 range, no other CDJ may exist on the\n * network using that ID. you CAN NOT have 6 CDJs if you're using one of their slots.\n *\n * However, should you want to make metadata queries to a unanalized media\n * device connected to the CDJ, or metadata queries for CD disc data, you MUST\n * use a ID within the 1-6 range, as the CDJs will not respond to metadata\n * requests outside of the range of 1-6\n *\n * Note that rekordbox analyzed media connected to the CDJ is accessed out of\n * band of the networks remote database protocol, and is not limited by this\n * restriction.\n */\n vcdjId: number;\n /**\n * The name to announce the virtual CDJ as on the network.\n *\n * This name will appear in device lists on other Pro DJ Link equipment.\n *\n * @default 'ProLink-Connect'\n */\n vcdjName?: string;\n /**\n * Enable full startup protocol for robust device negotiation.\n * When enabled, the virtual CDJ will go through the complete startup\n * sequence (stages 0x0a → 0x00 → 0x02 → 0x04 → 0x06) before regular\n * keep-alive announcements.\n *\n * This is recommended for production setups with CDJ-3000 and DJM-V10\n * hardware to ensure proper device discovery and network stability.\n */\n fullStartup?: boolean;\n /**\n * Send announcer packets to Pioneer Stagehand devices.\n *\n * Stagehand is excluded from announcer packets by default because it has\n * been observed to crash when it receives them. Enabling this also turns on\n * the cold-start subnet broadcast, which would otherwise reach Stagehand the\n * same way.\n *\n * Enable this only for diagnostic work (e.g. reproducing that crash), never\n * in production.\n *\n * @default false\n */\n announceToStagehand?: boolean;\n /**\n * Database format preference for loading rekordbox databases.\n *\n * - 'auto': Try OneLibrary first (rekordbox 7.x+), fall back to PDB (rekordbox 6.x)\n * - 'oneLibrary': Only use OneLibrary format (exportLibrary.db)\n * - 'pdb': Only use PDB format (export.pdb)\n *\n * @default 'auto'\n */\n databasePreference?: DatabasePreference;\n /**\n * Logger instance for diagnostic output.\n * If not provided, logging is silently discarded.\n */\n logger?: Logger;\n}\n\ninterface ConnectionService {\n announcer: Announcer;\n control: Control;\n remotedb: RemoteDatabase;\n localdb: LocalDatabase;\n database: Database;\n}\n\ninterface ConstructOpts {\n config?: NetworkConfig;\n announceSocket: Socket;\n beatSocket: Socket;\n statusSocket: Socket;\n deviceManager: DeviceManager;\n statusEmitter: StatusEmitter;\n positionEmitter: PositionEmitter;\n}\n\n/**\n * Services that are not accessible until connected\n */\ntype ConnectedServices =\n | 'statusEmitter'\n | 'positionEmitter'\n | 'control'\n | 'db'\n | 'localdb'\n | 'remotedb'\n | 'mixstatus';\n\nexport type ConnectedProlinkNetwork = ProlinkNetwork & {\n [P in ConnectedServices]: NonNullable<ProlinkNetwork[P]>;\n} & {\n state: NetworkState.Connected;\n isConfigured: true;\n};\n\n/**\n * Brings the Prolink network online.\n *\n * This is the primary entrypoint for connecting to the prolink network.\n */\nexport async function bringOnline(config?: NetworkConfig) {\n Telemetry.setTag('connectionId', randomUUID());\n const tx = Telemetry.startTransaction({name: 'bringOnline'});\n\n // Socket used to listen for devices on the network\n const announceSocket = dgram.createSocket({type: 'udp4', reuseAddr: true});\n\n // Socket used to listen for beat timing information\n const beatSocket = dgram.createSocket({type: 'udp4', reuseAddr: true});\n\n // Socket used to listen for status packets\n const statusSocket = dgram.createSocket({type: 'udp4', reuseAddr: true});\n\n try {\n await udpBind(announceSocket, ANNOUNCE_PORT, '0.0.0.0');\n await udpBind(beatSocket, BEAT_PORT, '0.0.0.0');\n await udpBind(statusSocket, STATUS_PORT, '0.0.0.0');\n\n // Enable broadcast so the announcer can reach the whole subnet before any\n // devices have been discovered.\n announceSocket.setBroadcast(true);\n } catch (err) {\n Telemetry.captureException(err);\n tx.setStatus(SpanStatus.Unavailable);\n tx.finish();\n\n throw err;\n }\n\n const deviceManager = new DeviceManager(announceSocket);\n const statusEmitter = new StatusEmitter(statusSocket);\n const positionEmitter = new PositionEmitter(beatSocket);\n\n tx.finish();\n\n const network = new ProlinkNetwork({\n config,\n announceSocket,\n beatSocket,\n statusSocket,\n deviceManager,\n statusEmitter,\n positionEmitter,\n });\n\n return network;\n}\n\nexport class ProlinkNetwork {\n #state: NetworkState = NetworkState.Online;\n\n #announceSocket: Socket;\n #beatSocket: Socket;\n #statusSocket: Socket;\n #deviceManager: DeviceManager;\n #statusEmitter: StatusEmitter;\n #positionEmitter: PositionEmitter;\n #logger: Logger;\n\n #config: null | NetworkConfig;\n #connection: null | ConnectionService;\n #mixstatus: null | MixstatusProcessor;\n\n /**\n * @internal\n */\n constructor({\n config,\n announceSocket,\n beatSocket,\n statusSocket,\n deviceManager,\n statusEmitter,\n positionEmitter,\n }: ConstructOpts) {\n this.#config = config ?? null;\n this.#logger = config?.logger ?? noopLogger;\n\n this.#announceSocket = announceSocket;\n this.#beatSocket = beatSocket;\n this.#statusSocket = statusSocket;\n this.#deviceManager = deviceManager;\n this.#statusEmitter = statusEmitter;\n this.#positionEmitter = positionEmitter;\n\n this.#connection = null;\n this.#mixstatus = null;\n\n // We always start online when constructing the network\n this.#state = NetworkState.Online;\n }\n\n /**\n * Configure / reconfigure the network with an explicit configuration.\n *\n * You may need to disconnect and re-connect the network after making a\n * networking configuration change.\n */\n configure(config: Partial<NetworkConfig>) {\n this.#config = {...this.#config, ...config} as NetworkConfig;\n if (config.logger !== undefined) {\n this.#logger = config.logger;\n }\n }\n\n /**\n * Wait for another device to show up on the network to determine which network\n * interface to listen on.\n *\n * Defaults the Virtual CDJ ID to 7.\n */\n async autoconfigFromPeers() {\n const tx = Telemetry.startTransaction({name: 'autoConfigure'});\n // wait for first device to appear on the network\n const firstDevice = await new Promise<Device>(resolve =>\n this.#deviceManager.once('connected', resolve)\n );\n const iface = getMatchingInterface(firstDevice.ip);\n\n // Log addr and iface addr / mask for cases where it may have matched the\n // wrong interface\n tx.setTag('deviceName', firstDevice.name);\n tx.setData('deviceAddr', firstDevice.ip.address);\n tx.setData('ifaceAddr', iface?.address);\n\n if (iface === null) {\n tx.setStatus(SpanStatus.InternalError);\n tx.setTag('noIfaceFound', 'yes');\n tx.finish();\n\n throw new Error('Unable to determine network interface');\n }\n\n this.#config = {...this.#config, vcdjId: DEFAULT_VCDJ_ID, iface};\n tx.finish();\n }\n\n /**\n * Connect to the network.\n *\n * The network must first have been configured (either with autoconfigFromPeers\n * or manual configuration). This will then initialize all the network services.\n */\n connect() {\n if (this.#config === null) {\n throw new Error(connectErrorHelp);\n }\n\n const tx = Telemetry.startTransaction({name: 'connect'});\n\n // Create VCDJ for the interface's broadcast address\n const vcdj = getVirtualCDJ(\n this.#config.iface,\n this.#config.vcdjId,\n this.#config.vcdjName\n );\n\n // Update device manager to filter out our VCDJ name\n if (this.#config.vcdjName !== undefined) {\n this.#deviceManager.reconfigure({vcdjName: this.#config.vcdjName});\n }\n\n // Start announcing\n const announcer = new Announcer(\n vcdj,\n this.#announceSocket,\n this.deviceManager,\n this.#config.iface,\n this.#config.fullStartup ?? false,\n this.#config.announceToStagehand ?? false,\n this.#logger\n );\n announcer.start();\n\n // Create remote and local databases\n const remotedb = new RemoteDatabase(this.#deviceManager, vcdj);\n const localdb = new LocalDatabase(\n vcdj,\n this.#deviceManager,\n this.#statusEmitter,\n this.#config.databasePreference ?? 'auto'\n );\n\n // Create unified database\n const database = new Database(localdb, remotedb, this.#deviceManager);\n\n // Create controller service\n const control = new Control(this.#beatSocket, vcdj);\n\n this.#state = NetworkState.Connected;\n this.#connection = {announcer, control, remotedb, localdb, database};\n\n tx.finish();\n }\n\n /**\n * Disconnect from the network\n */\n disconnect() {\n if (this.#config === null) {\n throw new Error(connectErrorHelp);\n }\n\n // Stop announcing ourself\n this.#connection?.announcer.stop();\n\n // Disconnect devices from the remote and local databases\n for (const device of this.deviceManager.devices.values()) {\n this.remotedb?.disconnectFromDevice(device);\n this.localdb?.disconnectForDevice(device);\n }\n\n return this.close;\n }\n\n /**\n * Close UDP sockets.\n */\n close() {\n return Promise.all([\n udpClose(this.#announceSocket),\n udpClose(this.#statusSocket),\n udpClose(this.#beatSocket),\n ]);\n }\n\n /**\n * Get the current NetworkState of the network.\n *\n * When the network is Online you may use the deviceManager to list and react to\n * devices on the nettwork\n *\n * Once the network is Connected you may use the statusEmitter to listen for\n * player status events, query the media databases of devices using the db\n * service (or specifically query the localdb or remotedb).\n */\n get state() {\n return this.#state;\n }\n\n /**\n * Check if the network has been configured. You cannot connect to the network\n * until it has been configured.\n */\n get isConfigured() {\n return this.#config !== null;\n }\n\n /**\n * Typescript discriminate helper. Refines the type of the network to one\n * that reflects the connected status. Useful to avoid having to gaurd the\n * service getters from nulls.\n */\n isConnected(): this is ConnectedProlinkNetwork {\n return this.#state === NetworkState.Connected;\n }\n\n /**\n * Get the {@link DeviceManager} service. This service is used to monitor and\n * react to devices connecting and disconnecting from the prolink network.\n */\n get deviceManager() {\n return this.#deviceManager;\n }\n\n /**\n * Get the {@link StatusEmitter} service. This service is used to monitor\n * status updates on each CDJ.\n */\n get statusEmitter() {\n // Even though the status emitter service does not need to wait for the\n // network to be Connected, it does not make sense to use it unless it is. So\n // we artificially return null if we are not connected\n return this.#state === NetworkState.Connected ? this.#statusEmitter : null;\n }\n\n /**\n * Get the {@link PositionEmitter} service. This service provides events with\n * absolute playhead position updates from CDJ-3000+ devices.\n *\n * Position packets are sent approximately every 30ms while a track is loaded,\n * providing precise position tracking independent of beat grids. This enables\n * accurate timecode/video sync even during scratching, reverse play, and loops.\n */\n get positionEmitter() {\n return this.#state === NetworkState.Connected ? this.#positionEmitter : null;\n }\n\n /**\n * Get the {@link Control} service. This service can be used to control the\n * Playstate of CDJs on the network.\n */\n get control() {\n return this.#connection?.control ?? null;\n }\n\n /**\n * Get the {@link Database} service. This service is used to retrieve\n * metadata and listings from devices on the network, automatically choosing the\n * best strategy to access the data.\n */\n get db() {\n return this.#connection?.database ?? null;\n }\n\n /**\n * Get the {@link LocalDatabase} service. This service is used to query and sync\n * metadata that is downloaded directly from the rekordbox database present\n * on media connected to the CDJs.\n */\n get localdb() {\n return this.#connection?.localdb ?? null;\n }\n\n /**\n * Get the {@link RemoteDatabase} service. This service is used to query\n * metadata directly from the database service running on Rekordbox and the CDJs\n * themselves.\n *\n * NOTE: To use this service to access the CDJ remote database service, the\n * Virtual CDJ must report itself as an ID between 1 and 6. This means\n * there cannot be four physical CDJs on the network to access any CDJs\n * remote database.\n */\n get remotedb() {\n return this.#connection?.remotedb ?? null;\n }\n\n /**\n * Returns a promise that resolves when the full startup protocol completes.\n * Resolves immediately if fullStartup is disabled or not connected.\n */\n get startupReady(): Promise<void> {\n return this.#connection?.announcer.ready ?? Promise.resolve();\n }\n\n /**\n * Get (and initialize) the {@link MixstatusProcessor} service. This service can\n * be used to monitor the 'status' of devices on the network as a whole.\n */\n get mixstatus() {\n if (this.#connection === null) {\n return null;\n }\n\n // Delay initialization of the mixstatus processor so that we don't consume\n // status events unless we actually want to.\n if (this.#mixstatus === null) {\n this.#mixstatus = new MixstatusProcessor();\n this.#statusEmitter.on('status', s => this.#mixstatus?.handleState(s));\n }\n\n return this.#mixstatus;\n }\n}\n","import {Device, DeviceID, DeviceType, MediaSlot} from 'src/types';\nimport {getSlotName} from 'src/utils';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\nimport * as Telemetry from 'src/utils/telemetry';\n\nimport {\n fetchFile as fetchFileCall,\n fetchFileRange as fetchFileRangeInternal,\n FileInfo,\n getExports,\n lookupPath,\n makeProgramClient,\n mountFilesystem,\n REKORDBOX_PORTMAP_PORT,\n STANDARD_PORTMAP_PORT,\n} from './programs';\n\nexport type {FileInfo} from './programs';\nimport {RetryConfig, RpcConnection, RpcProgram} from './rpc';\nimport {mount, nfs} from './xdr';\n\nexport interface FetchProgress {\n read: number;\n total: number;\n}\n\ninterface ClientSet {\n conn: RpcConnection;\n mountClient: RpcProgram;\n nfsClient: RpcProgram;\n}\n\n/**\n * The slot <-> mount name mapping is well known.\n */\nconst slotMountMapping = {\n [MediaSlot.USB]: '/C/',\n [MediaSlot.SD]: '/B/',\n} as const;\n\n/**\n * Media slots that support NFS access.\n */\nexport type NfsMediaSlot = MediaSlot.USB | MediaSlot.SD | MediaSlot.RB;\n\n/**\n * Parse a Windows absolute path (e.g. `C:\\Users\\chris\\Music\\track.mp3`)\n * into the NFS mount path and relative file path.\n *\n * @internal Exported for testing\n */\nexport function parseWindowsPath(\n filePath: string\n): {mountPath: string; nfsPath: string} | null {\n const match = filePath.match(/^([A-Za-z]):[/\\\\](.*)$/);\n if (!match) {\n return null;\n }\n return {\n mountPath: `/${match[1].toUpperCase()}/`,\n nfsPath: match[2].replace(/\\\\/g, '/'),\n };\n}\n\n/**\n * Resolve the NFS mount path and file path for a given slot.\n *\n * For USB/SD slots, the mount path is well-known (/C/ and /B/).\n * For the RB slot, the mount path is extracted from the file path returned\n * by remotedb:\n * - Windows: `C:\\Users\\chris\\Music\\track.mp3` → mount `/C/`, path `Users/chris/Music/track.mp3`\n * - macOS: `/Users/chris/Music/track.mp3` → mount `/`, path `Users/chris/Music/track.mp3`\n *\n * @internal Exported for testing\n */\nexport function resolveNfsPath(\n slot: NfsMediaSlot,\n filePath: string\n): {mountPath: string; nfsPath: string} {\n if (slot === MediaSlot.RB) {\n // Windows: C:\\Users\\chris\\Music\\track.mp3 → mount /C/, path Users/...\n const parsed = parseWindowsPath(filePath);\n if (parsed) {\n return parsed;\n }\n\n // macOS: /Users/chris/Music/track.mp3 → mount /, path Users/...\n if (filePath.startsWith('/')) {\n return {\n mountPath: '/',\n nfsPath: filePath.slice(1),\n };\n }\n }\n return {\n mountPath: slotMountMapping[slot as keyof typeof slotMountMapping],\n nfsPath: filePath,\n };\n}\n\n/**\n * The module-level retry configuration for newly created RpcConnections.\n */\nlet retryConfig: RetryConfig = {};\n\n/**\n * This module maintains a singleton cached list of player addresses -> active\n * connections. It is not guaranteed that the connections in the cache will\n * still be connected.\n */\nconst clientsCache = new Map<string, ClientSet>();\n\n/**\n * Get the portmapper port for the given device. Rekordbox software uses a\n * non-standard port (50111) while CDJs and other hardware use the standard\n * port (111).\n *\n * @internal Exported for testing\n */\nexport function getPortmapPort(device: Device): number {\n return device.type === DeviceType.Rekordbox\n ? REKORDBOX_PORTMAP_PORT\n : STANDARD_PORTMAP_PORT;\n}\n\n/**\n * Given a device address running a nfs and mountd RPC server, provide\n * RpcProgram clients that may be used to call these services.\n *\n * NOTE: This function will cache the clients for the address, recreating the\n * connections if the cached clients have disconnected.\n */\nasync function getClients(device: Device) {\n const {address} = device.ip;\n const cachedSet = clientsCache.get(address);\n\n if (cachedSet !== undefined && cachedSet.conn.connected) {\n return cachedSet;\n }\n\n // Cached socket is no longer connected. Remove and reconnect\n if (cachedSet !== undefined) {\n clientsCache.delete(address);\n }\n\n const conn = new RpcConnection(address, retryConfig);\n const portmapPort = getPortmapPort(device);\n\n const mountClient = await makeProgramClient(\n conn,\n {\n id: mount.Program,\n version: mount.Version,\n },\n portmapPort\n );\n\n const nfsClient = await makeProgramClient(\n conn,\n {\n id: nfs.Program,\n version: nfs.Version,\n },\n portmapPort\n );\n\n const set = {conn, mountClient, nfsClient};\n clientsCache.set(address, set);\n\n return set;\n}\n\ninterface GetRootHandleOptions {\n device: Device;\n mountPath: string;\n mountClient: RpcProgram;\n span?: Span;\n}\n\n/**\n * This module maintains a singleton cached list of (device address + mount path) -> file\n * handles. The file handles may become stale in this list should the devices\n * connected to the players slot change.\n */\nconst rootHandleCache = new Map<string, Map<string, Buffer>>();\n\n/**\n * Locate the root filehandle of the given device mount path.\n *\n * NOTE: This function will cache the root handle for the device + mount path. Should\n * the device have changed the slot will not longer be valid (TODO,\n * verify this). It is up to the caller to clear the cache and get the\n * new root handle in that case.\n */\nasync function getRootHandle({\n device,\n mountPath,\n mountClient,\n span,\n}: GetRootHandleOptions) {\n const tx = span?.startChild({op: 'getRootHandle'});\n\n const {address} = device.ip;\n\n const deviceMountCache = rootHandleCache.get(address) ?? new Map<string, Buffer>();\n const cachedRootHandle = deviceMountCache.get(mountPath);\n\n if (cachedRootHandle !== undefined) {\n return cachedRootHandle;\n }\n\n const exports = await getExports(mountClient, tx);\n const targetExport = exports.find(e => e.filesystem === mountPath);\n\n if (targetExport === undefined) {\n return null;\n }\n\n const rootHandle = await mountFilesystem(mountClient, targetExport, tx);\n\n deviceMountCache.set(mountPath, rootHandle);\n rootHandleCache.set(address, deviceMountCache);\n\n tx?.finish();\n\n return rootHandle;\n}\n\ninterface FetchFileOptions {\n device: Device;\n slot: NfsMediaSlot;\n path: string;\n onProgress?: Parameters<typeof fetchFileCall>[2];\n span?: Span;\n chunkSize?: number;\n}\n\nconst badRoothandleError = (slot: MediaSlot, deviceId: DeviceID) =>\n new Error(`The slot (${slot}) is not exported on Device ${deviceId}`);\n\ninterface FetchFileRangeOptions {\n device: Device;\n slot: NfsMediaSlot;\n path: string;\n offset: number;\n length: number;\n span?: Span;\n}\n\n/**\n * Fetch a range of bytes from a file on a device's NFS server.\n * Optimized for partial reads (e.g., reading file headers for metadata extraction).\n */\nexport async function fetchFileRange({\n device,\n slot,\n path,\n offset,\n length,\n span,\n}: FetchFileRangeOptions): Promise<Buffer> {\n const tx = span\n ? span.startChild({op: 'fetchFileRange'})\n : Telemetry.startTransaction({name: 'fetchFileRange'});\n\n const {mountPath, nfsPath} = resolveNfsPath(slot, path);\n const {mountClient, nfsClient} = await getClients(device);\n const rootHandle = await getRootHandle({device, mountPath, mountClient, span: tx});\n\n if (rootHandle === null) {\n throw badRoothandleError(slot, device.id);\n }\n\n let fileInfo: FileInfo | null = null;\n\n try {\n fileInfo = await lookupPath(nfsClient, rootHandle, nfsPath, tx);\n } catch {\n rootHandleCache.delete(device.ip.address);\n const newRootHandle = await getRootHandle({device, mountPath, mountClient, span: tx});\n\n if (newRootHandle === null) {\n throw badRoothandleError(slot, device.id);\n }\n\n fileInfo = await lookupPath(nfsClient, newRootHandle, nfsPath, tx);\n }\n\n const actualOffset = Math.min(offset, fileInfo.size);\n const actualLength = Math.min(length, fileInfo.size - actualOffset);\n\n if (actualLength <= 0) {\n tx.finish();\n return Buffer.alloc(0);\n }\n\n const data = await fetchFileRangeInternal(\n nfsClient,\n fileInfo,\n actualOffset,\n actualLength,\n tx\n );\n\n tx.setData('path', path);\n tx.setData('slot', getSlotName(slot));\n tx.setData('offset', actualOffset);\n tx.setData('length', actualLength);\n tx.setData('fileSize', fileInfo.size);\n tx.finish();\n\n return data;\n}\n\n/**\n * Get file info (size, handle) without fetching the file content.\n */\nexport async function getFileInfo({\n device,\n slot,\n path,\n span,\n}: Omit<FetchFileOptions, 'onProgress' | 'chunkSize'>): Promise<FileInfo> {\n const tx = span\n ? span.startChild({op: 'getFileInfo'})\n : Telemetry.startTransaction({name: 'getFileInfo'});\n\n const {mountPath, nfsPath} = resolveNfsPath(slot, path);\n const {mountClient, nfsClient} = await getClients(device);\n const rootHandle = await getRootHandle({device, mountPath, mountClient, span: tx});\n\n if (rootHandle === null) {\n throw badRoothandleError(slot, device.id);\n }\n\n let fileInfo: FileInfo;\n\n try {\n fileInfo = await lookupPath(nfsClient, rootHandle, nfsPath, tx);\n } catch {\n rootHandleCache.delete(device.ip.address);\n const newRootHandle = await getRootHandle({device, mountPath, mountClient, span: tx});\n\n if (newRootHandle === null) {\n throw badRoothandleError(slot, device.id);\n }\n\n fileInfo = await lookupPath(nfsClient, newRootHandle, nfsPath, tx);\n }\n\n tx.setData('path', path);\n tx.setData('slot', getSlotName(slot));\n tx.setData('size', fileInfo.size);\n tx.finish();\n\n return fileInfo;\n}\n\n/**\n * Fetch a file from a devices NFS server.\n *\n * NOTE: The connection and root filehandle (The 'mounted' NFS export on the\n * device) is cached to improve subsequent fetching performance. It's\n * important that when the device disconnects you call the {@link\n * resetDeviceCache} function.\n */\nexport async function fetchFile({\n device,\n slot,\n path,\n onProgress,\n span,\n chunkSize,\n}: FetchFileOptions) {\n const tx = span\n ? span.startChild({op: 'fetchFile'})\n : Telemetry.startTransaction({name: 'fetchFile'});\n\n const {mountPath, nfsPath} = resolveNfsPath(slot, path);\n const {mountClient, nfsClient} = await getClients(device);\n const rootHandle = await getRootHandle({device, mountPath, mountClient, span: tx});\n\n if (rootHandle === null) {\n throw badRoothandleError(slot, device.id);\n }\n\n // It's possible that our roothandle is no longer valid, if we fail to lookup\n // a path lets first try and clear our roothandle cache\n let fileInfo: FileInfo | null = null;\n\n try {\n fileInfo = await lookupPath(nfsClient, rootHandle, nfsPath, tx);\n } catch {\n rootHandleCache.delete(device.ip.address);\n const rootHandle = await getRootHandle({device, mountPath, mountClient, span: tx});\n\n if (rootHandle === null) {\n throw badRoothandleError(slot, device.id);\n }\n\n // Desperately try once more to lookup the file\n fileInfo = await lookupPath(nfsClient, rootHandle, nfsPath, tx);\n }\n\n const file = await fetchFileCall(nfsClient, fileInfo, onProgress, tx, chunkSize);\n\n tx.setData('path', path);\n tx.setData('slot', getSlotName(slot));\n tx.setData('size', fileInfo.size);\n tx.finish();\n\n return file;\n}\n\n/**\n * Clear the cached NFS connection and root filehandle for the given device\n */\nexport function resetDeviceCache(device: Device) {\n clientsCache.delete(device.ip.address);\n rootHandleCache.delete(device.ip.address);\n}\n\n/**\n * Configure the retry strategy for making NFS calls using this module\n */\nexport function configureRetryStrategy(config: RetryConfig) {\n retryConfig = config;\n\n for (const client of clientsCache.values()) {\n client.conn.retryConfig = config;\n }\n}\n","import {TelemetrySpan as Span} from 'src/utils/telemetry';\n\nimport {RpcConnection, RpcProgram} from './rpc';\nimport {flattenLinkedList} from './utils';\nimport {mount, nfs, portmap} from './xdr';\nimport {FetchProgress} from '.';\n\n/**\n * How many bytes of a file should we read at once.\n */\nconst READ_SIZE = 8192;\n\ninterface Program {\n id: number;\n version: number;\n}\n\n/**\n * Standard portmapper port used by CDJs and other hardware.\n */\nexport const STANDARD_PORTMAP_PORT = 111;\n\n/**\n * Non-standard portmapper port used by rekordbox software.\n * Rekordbox registers its RPC services on this port instead of 111.\n */\nexport const REKORDBOX_PORTMAP_PORT = 50111;\n\n/**\n * Queries for the listening port of a RPC program\n */\nexport async function makeProgramClient(\n conn: RpcConnection,\n program: Program,\n portmapPort: number = STANDARD_PORTMAP_PORT\n) {\n const getPortData = new portmap.GetPort({\n program: program.id,\n version: program.version,\n protocol: 17, // UDP protocol\n port: 0,\n });\n\n const data = await conn.call({\n port: portmapPort,\n program: portmap.Program,\n version: portmap.Version,\n procedure: portmap.Procedure.getPort().value,\n data: getPortData.toXDR(),\n });\n\n const port = data.readInt32BE();\n\n return new RpcProgram(conn, program.id, program.version, port);\n}\n\n/**\n * Export represents a NFS export on a remote system\n */\ninterface Export {\n /**\n * The name of the exported filesystem\n */\n filesystem: string;\n /**\n * The groups allowed to mount this filesystem\n */\n groups: string[];\n}\n\n/**\n * Attributes a remote file\n */\nexport interface FileInfo {\n handle: Buffer;\n name: string;\n size: number;\n type: 'null' | 'regular' | 'directory' | 'block' | 'char' | 'link';\n}\n\n/**\n * Request a list of export entries.\n */\nexport async function getExports(conn: RpcProgram, span?: Span) {\n const tx = span?.startChild({op: 'getExports'});\n\n const data = await conn.call({\n procedure: mount.Procedure.export().value,\n data: Buffer.alloc(0),\n });\n\n const entry = mount.ExportListResponse.fromXDR(data).next();\n if (entry === undefined) {\n return [];\n }\n\n const exports = flattenLinkedList(entry).map((entry: any) => ({\n filesystem: entry.filesystem(),\n groups: flattenLinkedList(entry.groups()).map((g: any) => g.name().toString()),\n }));\n\n tx?.finish();\n\n return exports as Export[];\n}\n\n/**\n * Mount the specified export, returning the file handle.\n */\nexport async function mountFilesystem(\n conn: RpcProgram,\n {filesystem}: Export,\n span?: Span\n) {\n const tx = span?.startChild({op: 'mountFilesystem', data: {filesystem}});\n\n const resp = await conn.call({\n procedure: mount.Procedure.mount().value,\n data: new mount.MountRequest({filesystem}).toXDR(),\n });\n\n const fileHandleResp = mount.FHStatus.fromXDR(resp);\n if (fileHandleResp.arm() !== 'success') {\n throw new Error('Failed to mount filesystem');\n }\n\n tx?.finish();\n\n return fileHandleResp.success() as Buffer;\n}\n\n/**\n * Lookup a file within the directory of the provided file handle, returning\n * the FileInfo object if the file can be located.\n */\nexport async function lookupFile(\n conn: RpcProgram,\n handle: Buffer,\n filename: string,\n span?: Span\n) {\n const tx = span?.startChild({op: 'lookupFile', description: filename});\n\n const resp = await conn.call({\n procedure: nfs.Procedure.lookup().value,\n data: new nfs.DirectoryOpArgs({handle, filename}).toXDR(),\n });\n\n const fileResp = nfs.DirectoryOpResponse.fromXDR(resp);\n if (fileResp.arm() !== 'success') {\n throw new Error(`Failed file lookup of ${filename}`);\n }\n\n const fileHandle = fileResp.success().handle();\n const attributes = fileResp.success().attributes();\n\n const info: FileInfo = {\n name: filename,\n handle: fileHandle,\n size: attributes.size(),\n type: attributes.type().name,\n };\n\n tx?.finish();\n\n return info;\n}\n\n/**\n * Lookup the absolute path to a file, given the root file handle and path,\n */\nexport async function lookupPath(\n conn: RpcProgram,\n rootHandle: Buffer,\n filepath: string,\n span?: Span\n) {\n const tx = span?.startChild({op: 'lookupPath', description: filepath});\n\n // There are times when the path includes a leading slash, sanitize that\n const pathParts = filepath.replace(/^\\//, '').split('/');\n\n let handle: Buffer = rootHandle;\n let info: FileInfo;\n\n while (pathParts.length !== 0) {\n const filename = pathParts.shift()!;\n const fileInfo = await lookupFile(conn, handle, filename, tx);\n\n info = fileInfo;\n handle = info.handle;\n }\n\n tx?.finish();\n\n // We can guarantee this will be set since we will have failed to lookup the\n // file above\n return info!;\n}\n\n/**\n * Fetch the specified file the remote NFS server. This will read the entire\n * file into memory.\n */\nexport async function fetchFile(\n conn: RpcProgram,\n file: FileInfo,\n onProgress?: (progress: FetchProgress) => void,\n span?: Span,\n readSize?: number\n) {\n readSize = readSize || READ_SIZE;\n if (readSize > 8192) {\n throw new Error(`Maximum read size for NFS is 8192. You specified: ${readSize}`);\n }\n const {handle, name, size} = file;\n const data = Buffer.alloc(size);\n\n const tx = span?.startChild({\n op: 'download',\n description: name,\n data: {size},\n });\n\n let bytesRead = 0;\n\n while (bytesRead < size) {\n const readArgs = new nfs.ReadArgs({\n handle,\n offset: bytesRead,\n count: readSize,\n totalCount: 0,\n });\n\n const resp = await conn.call({\n procedure: nfs.Procedure.read().value,\n data: readArgs.toXDR(),\n });\n\n const dataResp = nfs.ReadResponse.fromXDR(resp);\n if (dataResp.arm() !== 'success') {\n throw new Error(`Failed to read file at offset ${bytesRead} / ${size}`);\n }\n\n const buffer = dataResp.success().data();\n\n data.set(buffer, bytesRead);\n bytesRead += buffer.length;\n\n onProgress?.({read: bytesRead, total: size});\n }\n\n tx?.finish();\n\n return data;\n}\n\n/**\n * Fetch a range of bytes from a file on the remote NFS server.\n * Unlike fetchFile, this only reads the specified range.\n */\nexport async function fetchFileRange(\n conn: RpcProgram,\n file: FileInfo,\n offset: number,\n length: number,\n span?: Span\n): Promise<Buffer> {\n const {handle, name} = file;\n const data = Buffer.alloc(length);\n\n const tx = span?.startChild({\n op: 'downloadRange',\n description: name,\n data: {offset, length},\n });\n\n let bytesRead = 0;\n\n while (bytesRead < length) {\n const chunkSize = Math.min(READ_SIZE, length - bytesRead);\n const readArgs = new nfs.ReadArgs({\n handle,\n offset: offset + bytesRead,\n count: chunkSize,\n totalCount: 0,\n });\n\n const resp = await conn.call({\n procedure: nfs.Procedure.read().value,\n data: readArgs.toXDR(),\n });\n\n const dataResp = nfs.ReadResponse.fromXDR(resp);\n if (dataResp.arm() !== 'success') {\n throw new Error(`Failed to read file at offset ${offset + bytesRead}`);\n }\n\n const buffer = dataResp.success().data();\n if (buffer.length === 0) {\n break;\n }\n\n data.set(buffer, bytesRead);\n bytesRead += buffer.length;\n }\n\n tx?.finish();\n\n return bytesRead < length ? data.subarray(0, bytesRead) : data;\n}\n","import {Mutex} from 'async-mutex';\nimport promiseRetry from 'promise-retry';\nimport {timeout, TimeoutError} from 'promise-timeout';\nimport {OperationOptions} from 'retry';\n\nimport dgram, {Socket} from 'dgram';\n\nimport {udpClose, udpRead, udpSend} from 'src/utils/udp';\n\nimport {rpc} from './xdr';\n\n/**\n * The RPC auth stamp passed by the CDJs. It's unclear if this is actually\n * important, but I'm keeping the rpc calls as close to CDJ calls as I can.\n */\nconst CDJ_AUTH_STAMP = 0x967b8703;\n\nconst rpcAuthMessage = new rpc.UnixAuth({\n stamp: CDJ_AUTH_STAMP,\n name: '',\n uid: 0,\n gid: 0,\n gids: [],\n});\n\ninterface RpcCall {\n port: number;\n program: number;\n version: number;\n procedure: number;\n data: Buffer;\n}\n\n/**\n * Configuration for the retry strategy to use when making RPC calls\n *\n * @see https://www.npmjs.com/package/promise-retry#promiseretryfn-options\n */\nexport type RetryConfig = OperationOptions & {\n /**\n * Time in milliseconds to wait before a RPC transaction should timeout.\n * @default 1000\n */\n transactionTimeout?: number;\n};\n\n/**\n * Generic RPC connection. Can be used to make RPC 2 calls to any program\n * specified in the RpcCall.\n */\nexport class RpcConnection {\n address: string;\n retryConfig: RetryConfig;\n socket: Socket;\n mutex: Mutex;\n xid = 1;\n\n constructor(address: string, retryConfig?: RetryConfig) {\n this.address = address;\n this.retryConfig = retryConfig ?? {};\n this.socket = dgram.createSocket('udp4');\n this.mutex = new Mutex();\n }\n\n // TODO: Turn this into a getter and figure out what logic we can do here\n // to determine if the socket is still open.\n connected = true;\n\n setupRequest({program, version, procedure, data}: Omit<RpcCall, 'port'>) {\n const auth = new rpc.Auth({\n flavor: 1,\n body: rpcAuthMessage.toXDR(),\n });\n\n const verifier = new rpc.Auth({\n flavor: 0,\n body: Buffer.alloc(0),\n });\n\n const request = new rpc.Request({\n rpcVersion: rpc.Version,\n programVersion: version,\n program,\n procedure,\n auth,\n verifier,\n data,\n });\n\n const packet = new rpc.Packet({\n xid: this.xid,\n message: rpc.Message.request(request),\n });\n\n return packet.toXDR();\n }\n\n /**\n * Execute a RPC transaction (call and response).\n *\n * If a transaction does not complete after the configured timeout it will be\n * retried with the retry configuration.\n */\n async call({port, ...call}: RpcCall) {\n this.xid++;\n\n const callData = this.setupRequest(call);\n\n // Function to execute the transaction\n const executeCall = async () => {\n await udpSend(this.socket, callData, 0, callData.length, port, this.address);\n return udpRead(this.socket);\n };\n\n const {transactionTimeout, ...retryConfig} = this.retryConfig;\n\n // Function to execute the transaction, with timeout if the transaction\n // does not resolve after RESPONSE_RETRY_TIMEOUT.\n const executeWithTimeout = () => timeout(executeCall(), transactionTimeout ?? 1000);\n\n // Function to execute the transaction, with retries if the transaction times out.\n const executeWithRetry = () =>\n promiseRetry(retryConfig, async retry => {\n try {\n return await executeWithTimeout();\n } catch (err) {\n if (err instanceof TimeoutError) {\n retry(err);\n } else {\n throw err;\n }\n }\n return undefined;\n });\n\n // Execute the transaction exclusively to avoid async call races\n const resp = await this.mutex.runExclusive(executeWithRetry);\n\n // Decode the XDR response\n const packet = rpc.Packet.fromXDR(resp);\n\n const message = packet.message().response();\n if (message.arm() !== 'accepted') {\n throw new Error('RPC request was denied');\n }\n\n const body = message.accepted().response();\n if (body.arm() !== 'success') {\n throw new Error('RPC did not successfully return data');\n }\n\n return body.success() as Buffer;\n }\n\n async disconnect() {\n await udpClose(this.socket);\n }\n}\n\ntype RpcProgramCall = Pick<RpcCall, 'procedure' | 'data'>;\n\n/**\n * RpcProgram is constructed with specialization details for a specific RPC\n * program. This should be used to avoid having to repeat yourself for calls\n * made using the RpcConnection.\n */\nexport class RpcProgram {\n program: number;\n version: number;\n port: number;\n conn: RpcConnection;\n\n constructor(conn: RpcConnection, program: number, version: number, port: number) {\n this.conn = conn;\n this.program = program;\n this.version = version;\n this.port = port;\n }\n\n call(data: RpcProgramCall) {\n const {program, version, port} = this;\n return this.conn.call({program, version, port, ...data});\n }\n\n disconnect() {\n this.conn.disconnect();\n }\n}\n","/**\n * Helper to flatten linked list structures into an array\n */\nexport const flattenLinkedList = (item: any): any => [\n item,\n ...(item.next() ? flattenLinkedList(item.next()) : []),\n];\n","import * as XDR from 'js-xdr';\n\n/**\n * Calculate padding needed to align to 4-byte boundary (XDR requirement)\n */\nfunction calculatePadding(length: number): number {\n const remainder = length % 4;\n return remainder === 0 ? 0 : 4 - remainder;\n}\n\n/**\n * Skip padding bytes in the IO stream\n */\nfunction skipPadding(io: any, padding: number): void {\n if (padding > 0) {\n io._index += padding;\n }\n}\n\n/**\n * Read bytes from IO without automatic padding handling\n */\nfunction readBytes(io: any, length: number): Buffer {\n const from = io._index;\n io._index += length;\n if (io._length < io._index) {\n throw new Error('attempt to read outside the boundary of the buffer');\n }\n return io._buffer.subarray(from, from + length);\n}\n\n/**\n * A xdr type to read the rest of the data in the buffer\n */\nconst OpaqueData = {\n read(io: any) {\n // Read all remaining bytes from the buffer\n const remaining = io._length - io._index;\n if (remaining <= 0) {\n return Buffer.alloc(0);\n }\n // Manually read without padding handling (we want all remaining bytes)\n const from = io._index;\n io._index = io._length;\n return io._buffer.subarray(from, io._length);\n },\n\n write(value: any, io: any) {\n io.write(value, value.length);\n },\n\n isValid(value: any) {\n return Buffer.isBuffer(value);\n },\n};\n\n/**\n * In the standard NFS protocol,strings are typically ASCII. For Pioneer\n * players, it is an UTF-16LE encoded string; This type handles conversion.\n */\nclass StringUTF16LE {\n read(io: any) {\n const length = XDR.Int.read(io);\n const padding = calculatePadding(length);\n const result = readBytes(io, length);\n\n skipPadding(io, padding);\n\n return result.toString('utf16le');\n }\n\n write(value: any, io: any) {\n const data = Buffer.from(value, 'utf16le');\n XDR.Int.write(data.length, io);\n io.write(data, data.length);\n }\n\n isValid(value: any) {\n return typeof value === 'string';\n }\n}\n\n/**\n * RPC XDR data types. This implements nearly the entire XDR spec for the\n * ONC-RPC protocol.\n */\nexport const rpc = XDR.config((xdr: any) => {\n xdr.const('Version', 2);\n\n xdr.enum('MessageType', {\n request: 0,\n response: 1,\n });\n\n xdr.enum('ResponseStatus', {\n accepted: 0,\n denied: 1,\n });\n\n xdr.enum('AcceptStatus', {\n success: 0,\n programUnavailable: 1,\n programMismatch: 2,\n processUnavailable: 3,\n garbageArguments: 4,\n systemError: 5,\n });\n\n xdr.enum('RejectStatus', {\n mismatch: 0,\n authError: 1,\n });\n\n xdr.enum('AuthStatus', {\n ok: 0,\n badCredentials: 1,\n rjectedCredentials: 2,\n badVerification: 3,\n rejectedVerification: 4,\n tooWeak: 5,\n invalidResponse: 6,\n failed: 7,\n });\n\n xdr.struct('UnixAuth', [\n ['stamp', xdr.uint()],\n ['name', xdr.string(255)],\n ['uid', xdr.uint()],\n ['gid', xdr.uint()],\n ['gids', xdr.varArray(xdr.uint(), 16)],\n ]);\n\n xdr.struct('Auth', [\n ['flavor', xdr.uint()],\n ['body', xdr.varOpaque(400)],\n ]);\n\n xdr.struct('Request', [\n ['rpcVersion', xdr.uint()],\n ['program', xdr.uint()],\n ['programVersion', xdr.uint()],\n ['procedure', xdr.uint()],\n ['auth', xdr.lookup('Auth')],\n ['verifier', xdr.lookup('Auth')],\n ['data', OpaqueData],\n ]);\n\n xdr.struct('MismatchInfo', [\n ['low', xdr.uint()],\n ['high', xdr.uint()],\n ]);\n\n xdr.union('ResponseData', {\n switchOn: xdr.lookup('AcceptStatus'),\n defaultArm: xdr.void(),\n switches: [\n ['success', 'success'],\n ['programMismatch', 'programMismatch'],\n ],\n arms: {\n success: OpaqueData,\n programMismatch: xdr.lookup('MismatchInfo'),\n },\n });\n\n xdr.struct('AcceptedResponse', [\n ['verifier', xdr.lookup('Auth')],\n ['response', xdr.lookup('ResponseData')],\n ]);\n\n xdr.union('RejectedResponse', {\n switchOn: xdr.lookup('RejectStatus'),\n switches: [\n ['mismatch', 'mismatch'],\n ['authError', 'authError'],\n ],\n arms: {\n mismatch: xdr.lookup('MismatchInfo'),\n authError: xdr.lookup('AuthStatus'),\n },\n });\n\n xdr.union('Response', {\n switchOn: xdr.lookup('ResponseStatus'),\n switches: [\n ['accepted', 'accepted'],\n ['denied', 'denied'],\n ],\n arms: {\n accepted: xdr.lookup('AcceptedResponse'),\n denied: xdr.void(),\n },\n });\n\n xdr.union('Message', {\n switchOn: xdr.lookup('MessageType'),\n switches: [\n ['request', 'request'],\n ['response', 'response'],\n ],\n arms: {\n request: xdr.lookup('Request'),\n response: xdr.lookup('Response'),\n },\n });\n\n xdr.struct('Packet', [\n ['xid', xdr.uint()],\n ['message', xdr.lookup('Message')],\n ]);\n});\n\n/**\n * Portmap RPC XDR types\n */\nexport const portmap = XDR.config((xdr: any) => {\n xdr.const('Program', 100000);\n xdr.const('Version', 2);\n\n xdr.enum('Procedure', {\n getPort: 3,\n });\n\n xdr.struct('GetPort', [\n ['program', xdr.uint()],\n ['version', xdr.uint()],\n ['protocol', xdr.uint()],\n ['port', xdr.uint()],\n ]);\n});\n\n/**\n * Mount RPC XDR types\n */\nexport const mount = XDR.config((xdr: any) => {\n xdr.const('Program', 100005);\n xdr.const('Version', 1);\n\n xdr.enum('Procedure', {\n mount: 1,\n export: 5,\n });\n\n xdr.typedef('Path', new StringUTF16LE());\n xdr.typedef('Filehandle', xdr.opaque(32));\n\n xdr.struct('MountRequest', [['filesystem', xdr.lookup('Path')]]);\n\n xdr.struct('Groups', [\n ['name', xdr.string(255)],\n ['next', xdr.option(xdr.lookup('Groups'))],\n ]);\n\n xdr.struct('ExportList', [\n ['filesystem', xdr.lookup('Path')],\n ['groups', xdr.option(xdr.lookup('Groups'))],\n ['next', xdr.option(xdr.lookup('ExportList'))],\n ]);\n\n xdr.union('FHStatus', {\n switchOn: xdr.uint(),\n defaultArm: xdr.void(),\n switches: [[0, 'success']],\n arms: {\n success: xdr.lookup('Filehandle'),\n },\n });\n\n xdr.struct('ExportListResponse', [['next', xdr.option(xdr.lookup('ExportList'))]]);\n});\n\n/**\n * NFS RPC XDR types\n */\nexport const nfs = XDR.config((xdr: any) => {\n xdr.const('Program', 100003);\n xdr.const('Version', 2);\n\n xdr.enum('Procedure', {\n lookup: 4,\n read: 6,\n });\n\n xdr.typedef('Filename', new StringUTF16LE());\n xdr.typedef('Filehandle', xdr.opaque(32));\n xdr.typedef('NFSData', xdr.varOpaque(8192));\n\n xdr.enum('FileType', {\n null: 0,\n regular: 1,\n directory: 2,\n block: 3,\n char: 4,\n link: 5,\n });\n\n xdr.struct('TimeValue', [\n ['seconds', xdr.uint()],\n ['useconds', xdr.uint()],\n ]);\n\n xdr.struct('FileAttributes', [\n ['type', xdr.lookup('FileType')],\n ['mode', xdr.uint()],\n ['nlink', xdr.uint()],\n ['uid', xdr.uint()],\n ['gid', xdr.uint()],\n ['size', xdr.uint()],\n ['blocksize', xdr.uint()],\n ['rdev', xdr.uint()],\n ['blocks', xdr.uint()],\n ['fsid', xdr.uint()],\n ['fileid', xdr.uint()],\n ['atime', xdr.lookup('TimeValue')],\n ['mtime', xdr.lookup('TimeValue')],\n ['ctime', xdr.lookup('TimeValue')],\n ]);\n\n xdr.struct('DirectoryOpArgs', [\n ['handle', xdr.lookup('Filehandle')],\n ['filename', xdr.lookup('Filename')],\n ]);\n\n xdr.struct('DirectoryOpResponseBody', [\n ['handle', xdr.lookup('Filehandle')],\n ['attributes', xdr.lookup('FileAttributes')],\n ]);\n\n xdr.union('DirectoryOpResponse', {\n switchOn: xdr.uint(),\n defaultArm: xdr.void(),\n switches: [[0, 'success']],\n arms: {\n success: xdr.lookup('DirectoryOpResponseBody'),\n },\n });\n\n xdr.struct('ReadArgs', [\n ['handle', xdr.lookup('Filehandle')],\n ['offset', xdr.uint()],\n ['count', xdr.uint()],\n ['totalCount', xdr.uint()],\n ]);\n\n xdr.struct('ReadBody', [\n ['attributes', xdr.lookup('FileAttributes')],\n ['data', xdr.lookup('NFSData')],\n ]);\n\n xdr.union('ReadResponse', {\n switchOn: xdr.uint(),\n defaultArm: xdr.void(),\n switches: [[0, 'success']],\n arms: {\n success: xdr.lookup('ReadBody'),\n },\n });\n});\n","/**\n * Cross-platform utilities for detecting AlphaTheta (Pioneer DJ) network interfaces.\n * Supports both USB-connected devices (XDJ-XZ, XDJ-AZ) and Ethernet-connected devices.\n */\n\nimport {execSync} from 'child_process';\nimport {type NetworkInterfaceInfo, networkInterfaces} from 'os';\n\n/**\n * Known MAC address prefixes (OUI) for AlphaTheta/Pioneer DJ devices.\n * These are used to identify devices on the network via ARP cache.\n */\nconst ALPHATHETA_MAC_PREFIXES = [\n 'c8:3d:fc', // AlphaTheta (XDJ-XZ, etc.)\n '74:5e:1c', // Pioneer DJ\n 'ac:b5:7d', // Pioneer DJ\n 'b8:e8:56', // Pioneer DJ\n '00:e0:4c', // Realtek (used in some Pioneer devices)\n];\n\n/**\n * Check if a MAC address belongs to an AlphaTheta/Pioneer device.\n */\nfunction isAlphaThetaMac(mac: string): boolean {\n const normalizedMac = mac.toLowerCase();\n return ALPHATHETA_MAC_PREFIXES.some(prefix => normalizedMac.startsWith(prefix));\n}\n\n/**\n * Check if a network interface info is IPv4.\n * Handles both old (numeric) and new (string) Node.js family types.\n */\nfunction isIPv4(info: NetworkInterfaceInfo): boolean {\n const family = info.family as any;\n return family === 'IPv4' || family === 4;\n}\n\nexport interface AlphaThetaInterface {\n /** The interface name (e.g., \"en15\" on macOS, \"Ethernet 3\" on Windows) */\n name: string;\n /** The MAC address of the interface */\n mac: string;\n /** The IPv4 address of the host on this interface */\n ipv4?: string;\n /** The full NetworkInterfaceInfo from Node.js */\n info: NetworkInterfaceInfo;\n /** How the device is connected */\n connectionType: 'usb' | 'ethernet';\n /** IP addresses of AlphaTheta devices found on this interface */\n deviceIps?: string[];\n}\n\n/**\n * Find the network interface for an AlphaTheta device connected via USB or Ethernet.\n * Works on macOS, Windows, and Linux.\n *\n * Detection methods (tried in order):\n * 1. USB: Looks for USB-connected devices (XDJ-XZ, XDJ-AZ) via system APIs\n * 2. Ethernet: Checks ARP cache for known AlphaTheta/Pioneer MAC address prefixes\n *\n * This is useful for passive mode to automatically detect the correct interface\n * for AlphaTheta devices like XDJ-XZ, XDJ-AZ, CDJ-3000, etc.\n *\n * @example\n * ```typescript\n * import { findAlphaThetaInterface, bringOnlinePassive } from 'alphatheta-connect';\n *\n * const iface = findAlphaThetaInterface();\n * if (iface) {\n * console.log(`Found AlphaTheta device on ${iface.name} (${iface.connectionType})`);\n * const network = await bringOnlinePassive({ iface: iface.name });\n * }\n * ```\n *\n * @returns The AlphaTheta interface info, or null if not found\n */\nexport function findAlphaThetaInterface(): AlphaThetaInterface | null {\n const results = findAllAlphaThetaInterfaces();\n return results.length > 0 ? results[0] : null;\n}\n\n/**\n * Find ALL network interfaces with AlphaTheta/Pioneer DJ devices.\n * Works on macOS, Windows, and Linux.\n *\n * Detection methods:\n * 1. USB: Looks for USB-connected devices (XDJ-XZ, XDJ-AZ) via system APIs\n * 2. Ethernet: Checks ARP cache for known AlphaTheta/Pioneer MAC address prefixes\n *\n * Returns all detected interfaces, with USB interfaces listed first.\n * Use this when you want to present users with a choice of interfaces,\n * or when multiple Pro DJ Link networks are available.\n *\n * @example\n * ```typescript\n * import { findAllAlphaThetaInterfaces, bringOnlinePassive } from 'alphatheta-connect';\n *\n * const interfaces = findAllAlphaThetaInterfaces();\n * if (interfaces.length > 0) {\n * console.log('Available interfaces:');\n * for (const iface of interfaces) {\n * console.log(` ${iface.name} (${iface.connectionType}) - ${iface.ipv4 || 'no IP'}`);\n * }\n *\n * // Let user choose or use first one\n * const network = await bringOnlinePassive({ iface: interfaces[0].name });\n * }\n * ```\n *\n * @returns Array of AlphaTheta interface info, empty if none found\n */\nexport function findAllAlphaThetaInterfaces(): AlphaThetaInterface[] {\n const platform = process.platform;\n const results: AlphaThetaInterface[] = [];\n const seenInterfaces = new Set<string>();\n\n // USB detection first (more specific)\n let usbInterfaces: AlphaThetaInterface[] = [];\n\n if (platform === 'darwin') {\n usbInterfaces = findAllAlphaThetaInterfacesMacOS();\n } else if (platform === 'win32') {\n usbInterfaces = findAllAlphaThetaInterfacesWindows();\n }\n\n for (const iface of usbInterfaces) {\n results.push(iface);\n seenInterfaces.add(iface.name);\n }\n\n // Ethernet detection via ARP cache (works on all platforms)\n const ethernetInterfaces = findAllAlphaThetaViaEthernet();\n\n for (const iface of ethernetInterfaces) {\n // Avoid duplicates if same interface found via both methods\n if (!seenInterfaces.has(iface.name)) {\n results.push(iface);\n seenInterfaces.add(iface.name);\n }\n }\n\n return results;\n}\n\n/**\n * macOS implementation: Find ALL AlphaTheta USB interfaces using ioreg\n * and networksetup to map them to interface names.\n */\nfunction findAllAlphaThetaInterfacesMacOS(): AlphaThetaInterface[] {\n try {\n // Step 1: Check if AlphaTheta USB device is connected\n const ioregOutput = execSync(\n 'ioreg -p IOUSB -l -w 0 | grep -E \\'\"USB Vendor Name\"|\"USB Product Name\"\\'',\n {encoding: 'utf8', timeout: 5000}\n );\n\n if (!ioregOutput.toLowerCase().includes('alphatheta')) {\n return [];\n }\n\n // Step 2: Get all hardware ports and find USB 10/100 LAN adapters\n const networkSetupOutput = execSync('networksetup -listallhardwareports', {\n encoding: 'utf8',\n timeout: 5000,\n });\n\n // Parse the output to find USB LAN adapters\n // Format:\n // Hardware Port: USB 10/100 LAN\n // Device: en15\n // Ethernet Address: c8:3d:fc:0a:58:54\n const blocks = networkSetupOutput.split(/\\n\\n+/);\n const usbLanInterfaces: Array<{name: string; mac: string}> = [];\n\n for (const block of blocks) {\n if (block.includes('USB 10/100 LAN') || block.includes('USB 10_100 LAN')) {\n const deviceMatch = block.match(/Device:\\s*(\\S+)/);\n const macMatch = block.match(/Ethernet Address:\\s*(\\S+)/);\n\n if (deviceMatch && macMatch) {\n usbLanInterfaces.push({\n name: deviceMatch[1],\n mac: macMatch[1],\n });\n }\n }\n }\n\n if (usbLanInterfaces.length === 0) {\n return [];\n }\n\n // Step 3: Match with active network interfaces from Node.js\n const interfaces = networkInterfaces();\n const results: AlphaThetaInterface[] = [];\n\n for (const usbIface of usbLanInterfaces) {\n const nodeIface = interfaces[usbIface.name];\n if (!nodeIface) {\n continue;\n }\n\n // Find the IPv4 entry\n const ipv4Entry = nodeIface.find(isIPv4);\n\n if (ipv4Entry) {\n results.push({\n name: usbIface.name,\n mac: usbIface.mac,\n ipv4: ipv4Entry.address,\n info: ipv4Entry,\n connectionType: 'usb',\n });\n } else {\n // Even without IPv4, include the interface if it exists\n const firstEntry = nodeIface[0];\n if (firstEntry) {\n results.push({\n name: usbIface.name,\n mac: usbIface.mac,\n info: firstEntry,\n connectionType: 'usb',\n });\n }\n }\n }\n\n return results;\n } catch {\n return [];\n }\n}\n\n/**\n * Windows implementation: Find ALL AlphaTheta USB network adapters via PowerShell.\n */\nfunction findAllAlphaThetaInterfacesWindows(): AlphaThetaInterface[] {\n try {\n // Use PowerShell to find USB network adapters from AlphaTheta\n // PnP devices with AlphaTheta in the manufacturer or description\n const psCommand = `\n Get-NetAdapter | Where-Object {\n $_.InterfaceDescription -like '*AlphaTheta*' -or\n $_.InterfaceDescription -like '*Pioneer*' -or\n $_.InterfaceDescription -like '*USB 10/100 LAN*'\n } | Select-Object -Property Name, MacAddress, InterfaceDescription | ConvertTo-Json\n `;\n\n const output = execSync(`powershell -Command \"${psCommand.replace(/\\n/g, ' ')}\"`, {\n encoding: 'utf8',\n timeout: 10000,\n });\n\n if (!output.trim()) {\n return [];\n }\n\n const adapters = JSON.parse(output);\n const adapterList = Array.isArray(adapters) ? adapters : [adapters];\n\n if (adapterList.length === 0) {\n return [];\n }\n\n const interfaces = networkInterfaces();\n const results: AlphaThetaInterface[] = [];\n\n for (const adapter of adapterList) {\n // Windows interface names in Node.js might differ from PowerShell names\n // Try to match by MAC address\n const targetMac = adapter.MacAddress?.replace(/-/g, ':').toLowerCase();\n let found = false;\n\n for (const [ifaceName, ifaceInfos] of Object.entries(interfaces)) {\n if (!ifaceInfos) {\n continue;\n }\n\n for (const info of ifaceInfos) {\n if (info.mac.toLowerCase() === targetMac) {\n const ipv4Entry = ifaceInfos.find(isIPv4);\n\n results.push({\n name: ifaceName,\n mac: info.mac,\n ipv4: ipv4Entry?.address,\n info: ipv4Entry || info,\n connectionType: 'usb',\n });\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n\n // Fallback: try matching by name directly\n if (!found) {\n const nodeIface = interfaces[adapter.Name];\n if (nodeIface) {\n const ipv4Entry = nodeIface.find(isIPv4);\n\n results.push({\n name: adapter.Name,\n mac: adapter.MacAddress,\n ipv4: ipv4Entry?.address,\n info: ipv4Entry || nodeIface[0],\n connectionType: 'usb',\n });\n }\n }\n }\n\n return results;\n } catch {\n return [];\n }\n}\n\n/**\n * Get the device IP address from a link-local interface.\n *\n * When connected via USB, the device typically uses a link-local address\n * in the 169.254.x.x range. The device's IP can often be inferred from\n * the host's IP (they're usually on the same /16 subnet).\n *\n * @param hostIp - The host's IP address on the interface\n * @returns The likely device IP, or null if not determinable\n */\nexport function inferDeviceIpFromHost(hostIp: string): string | null {\n if (!hostIp.startsWith('169.254.')) {\n return null;\n }\n\n // The device is typically at a different address in the same subnet\n // Common patterns observed:\n // - Host: 169.254.82.203, Device: 169.254.88.83\n // - The device often has a lower IP in the range\n // Without ARP cache or actual discovery, we can't know for sure\n return null;\n}\n\n/**\n * Try to find the device IP by checking the ARP cache.\n * Works on macOS and Linux.\n *\n * @param interfaceName - The interface name to check\n * @returns Array of IP addresses found in ARP cache for this interface\n */\nexport function getArpCacheForInterface(interfaceName: string): string[] {\n try {\n if (process.platform === 'darwin' || process.platform === 'linux') {\n const arpOutput = execSync('arp -an', {encoding: 'utf8', timeout: 5000});\n\n const ips: string[] = [];\n const lines = arpOutput.split('\\n');\n\n for (const line of lines) {\n // macOS format: ? (169.254.88.83) at c8:3d:fc:a:58:55 on en15 ifscope [ethernet]\n // Linux format: ? (169.254.88.83) at c8:3d:fc:a:58:55 [ether] on en15\n if (line.includes(interfaceName)) {\n const ipMatch = line.match(/\\((\\d+\\.\\d+\\.\\d+\\.\\d+)\\)/);\n if (ipMatch) {\n ips.push(ipMatch[1]);\n }\n }\n }\n\n return ips;\n }\n } catch {\n // ARP command failed\n }\n\n return [];\n}\n\n/**\n * Parse the ARP cache and return entries with AlphaTheta MAC addresses.\n * Returns a map of interface name to array of {ip, mac} entries.\n */\nfunction getAlphaThetaArpEntries(): Map<string, Array<{ip: string; mac: string}>> {\n const result = new Map<string, Array<{ip: string; mac: string}>>();\n\n try {\n if (process.platform === 'darwin' || process.platform === 'linux') {\n const arpOutput = execSync('arp -an', {encoding: 'utf8', timeout: 5000});\n const lines = arpOutput.split('\\n');\n\n for (const line of lines) {\n // macOS format: ? (169.254.88.83) at c8:3d:fc:a:58:55 on en15 ifscope [ethernet]\n // Linux format: ? (169.254.88.83) at c8:3d:fc:a:58:55 [ether] on en15\n const ipMatch = line.match(/\\((\\d+\\.\\d+\\.\\d+\\.\\d+)\\)/);\n const macMatch = line.match(/at\\s+([0-9a-f:]+)/i);\n const ifaceMatch = line.match(/on\\s+(\\S+)/);\n\n if (ipMatch && macMatch && ifaceMatch) {\n const mac = macMatch[1];\n if (isAlphaThetaMac(mac)) {\n const ifaceName = ifaceMatch[1];\n const entries = result.get(ifaceName) || [];\n entries.push({ip: ipMatch[1], mac});\n result.set(ifaceName, entries);\n }\n }\n }\n } else if (process.platform === 'win32') {\n // Windows: use arp -a\n const arpOutput = execSync('arp -a', {encoding: 'utf8', timeout: 5000});\n const lines = arpOutput.split('\\n');\n\n let currentInterface = '';\n for (const line of lines) {\n // Interface header: Interface: 192.168.1.100 --- 0x5\n const ifaceHeaderMatch = line.match(/Interface:\\s+(\\d+\\.\\d+\\.\\d+\\.\\d+)/);\n if (ifaceHeaderMatch) {\n currentInterface = ifaceHeaderMatch[1];\n continue;\n }\n\n // Entry: 192.168.1.1 00-11-22-33-44-55 dynamic\n const entryMatch = line.match(/(\\d+\\.\\d+\\.\\d+\\.\\d+)\\s+([0-9a-f-]+)/i);\n if (entryMatch && currentInterface) {\n const mac = entryMatch[2].replace(/-/g, ':');\n if (isAlphaThetaMac(mac)) {\n const entries = result.get(currentInterface) || [];\n entries.push({ip: entryMatch[1], mac});\n result.set(currentInterface, entries);\n }\n }\n }\n }\n } catch {\n // ARP command failed\n }\n\n return result;\n}\n\n/**\n * Find ALL AlphaTheta devices connected via Ethernet by checking the ARP cache\n * for known MAC address prefixes.\n */\nfunction findAllAlphaThetaViaEthernet(): AlphaThetaInterface[] {\n const alphaThetaEntries = getAlphaThetaArpEntries();\n\n if (alphaThetaEntries.size === 0) {\n return [];\n }\n\n const interfaces = networkInterfaces();\n const results: AlphaThetaInterface[] = [];\n\n // Find all interfaces that have AlphaTheta devices\n for (const [arpIfaceName, devices] of alphaThetaEntries) {\n // On Windows, ARP uses IP addresses as interface identifiers\n // We need to find the matching Node.js interface\n let nodeIfaceName = arpIfaceName;\n let nodeIface = interfaces[arpIfaceName];\n\n if (!nodeIface) {\n // Try to find interface by IP address (Windows case)\n for (const [ifName, infos] of Object.entries(interfaces)) {\n if (!infos) {\n continue;\n }\n for (const info of infos) {\n if (isIPv4(info) && info.address === arpIfaceName) {\n nodeIfaceName = ifName;\n nodeIface = infos;\n break;\n }\n }\n if (nodeIface) {\n break;\n }\n }\n }\n\n if (!nodeIface) {\n continue;\n }\n\n const ipv4Entry = nodeIface.find(isIPv4);\n if (!ipv4Entry) {\n continue;\n }\n\n results.push({\n name: nodeIfaceName,\n mac: ipv4Entry.mac,\n ipv4: ipv4Entry.address,\n info: ipv4Entry,\n connectionType: 'ethernet',\n deviceIps: devices.map(d => d.ip),\n });\n }\n\n return results;\n}\n","import * as ip from 'ip-address';\nimport StrictEventEmitter from 'strict-event-emitter-types';\n\nimport {EventEmitter} from 'events';\n\nimport {PROLINK_HEADER} from 'src/constants';\nimport {Device, DeviceID, DeviceType} from 'src/types';\n\nimport {PacketInfo, PcapAdapter} from './pcap-adapter';\n\n/**\n * Parse a device from an announce packet, using the source IP from PacketInfo\n * when the packet payload doesn't contain the full IP address.\n *\n * This handles both standard and short-format announce packets (46 bytes)\n * that some devices like XDJ-XZ send.\n */\nfunction deviceFromPacketWithInfo(packet: Buffer, info: PacketInfo): Device | null {\n // Check for Pro DJ Link header\n if (packet.indexOf(PROLINK_HEADER) !== 0) {\n return null;\n }\n\n // Check for stage 3 announce (type 0x06 at offset 0x0a)\n if (packet[0x0a] !== 0x06) {\n return null;\n }\n\n // Extract device name (20 bytes starting at offset 0x0c)\n const name = packet\n .slice(0x0c, 0x0c + 20)\n .toString()\n .replace(/\\0/g, '');\n\n // Short-format packets (46 bytes) have different offsets\n const isShortFormat = packet.length < 0x35;\n\n let deviceId: number;\n let deviceType: DeviceType;\n let macAddr: Uint8Array;\n let deviceIp: ip.Address4;\n\n if (isShortFormat) {\n // Short format (46 bytes) - XDJ-XZ, etc.\n // Device ID at 0x24\n deviceId = packet[0x24];\n\n // Short-format packets don't have device type at the usual offset.\n // Use device ID heuristic: 1-6 are CDJ slots, 17 is Rekordbox, 33+ are mixer\n if (deviceId >= 1 && deviceId <= 6) {\n deviceType = DeviceType.CDJ;\n } else if (deviceId === 17) {\n deviceType = DeviceType.Rekordbox;\n } else {\n deviceType = DeviceType.Mixer;\n }\n\n // MAC address at 0x26 (6 bytes)\n macAddr = new Uint8Array(packet.slice(0x26, Math.min(0x2c, packet.length)));\n\n // Use source IP from packet info (payload may be truncated)\n deviceIp = new ip.Address4(info.srcAddr);\n } else {\n // Standard format\n deviceId = packet[0x24];\n deviceType = packet[0x34];\n macAddr = new Uint8Array(packet.slice(0x26, 0x26 + 6));\n deviceIp = ip.Address4.fromInteger(packet.readUInt32BE(0x2c));\n }\n\n return {\n name,\n id: deviceId,\n type: deviceType,\n macAddr,\n ip: deviceIp,\n };\n}\n\ninterface Config {\n /**\n * Time in milliseconds after which a device is considered to have\n * disconnected if it has not broadcast an announcement.\n *\n * @default 10000 ms\n */\n deviceTimeout?: number;\n}\n\nconst defaultConfig: Required<Config> = {\n deviceTimeout: 10000,\n};\n\n/**\n * The upper bound in milliseconds to wait when looking for a device to be on\n * the network when using the `getDeviceEnsured` method.\n */\nconst ENSURED_TIMEOUT = 2000;\n\n/**\n * The interface the passive device manager event emitter should follow\n */\ninterface DeviceEvents {\n /**\n * Fired when a new device becomes available on the network\n */\n connected: (device: Device) => void;\n /**\n * Fired when a device has not announced itself on the network for the\n * specified timeout.\n */\n disconnected: (device: Device) => void;\n /**\n * Fired every time the device announces itself on the network\n */\n announced: (device: Device) => void;\n}\n\ntype Emitter = StrictEventEmitter<EventEmitter, DeviceEvents>;\n\n/**\n * PassiveDeviceManager tracks devices on the Pro DJ Link network using\n * passive packet capture instead of UDP sockets.\n *\n * It provides the same API as the active DeviceManager, making it easy\n * to swap between active and passive modes.\n */\nexport class PassiveDeviceManager {\n #config: Required<Config>;\n /**\n * The map of all active devices currently available on the network.\n */\n #devices = new Map<DeviceID, Device>();\n /**\n * Tracks device timeout handlers, as devices announce themselves these\n * timeouts will be updated.\n */\n #deviceTimeouts = new Map<DeviceID, NodeJS.Timeout>();\n /**\n * The EventEmitter which will be used to trigger device lifecycle events\n */\n #emitter: Emitter = new EventEmitter();\n /**\n * Reference to the pcap adapter for cleanup\n */\n #adapter: PcapAdapter;\n\n constructor(adapter: PcapAdapter, config?: Config) {\n this.#config = {...defaultConfig, ...config};\n this.#adapter = adapter;\n\n // Listen for announce packets from the pcap adapter\n adapter.on('announce', this.#handleAnnounce as any);\n }\n\n // Bind public event emitter interface\n on: Emitter['on'] = this.#emitter.addListener.bind(this.#emitter);\n off: Emitter['off'] = this.#emitter.removeListener.bind(this.#emitter);\n once: Emitter['once'] = this.#emitter.once.bind(this.#emitter);\n\n /**\n * Get active devices on the network.\n */\n get devices() {\n return this.#devices;\n }\n\n /**\n * Waits for a specific device ID to appear on the network, with a\n * configurable timeout, in which case it will resolve with null.\n */\n async getDeviceEnsured(id: DeviceID, timeout: number = ENSURED_TIMEOUT) {\n const existingDevice = this.devices.get(id);\n\n if (existingDevice !== undefined) {\n return existingDevice;\n }\n\n let handler: ((device: Device) => void) | undefined;\n\n // Wait for the device to be connected\n const devicePromise = new Promise<Device>(resolve => {\n handler = (device: Device) => device.id === id && resolve(device);\n this.on('connected', handler);\n });\n\n const device = await Promise.race([\n devicePromise,\n new Promise<null>(r => setTimeout(() => r(null), timeout)),\n ]);\n this.off('connected', handler!);\n\n return device;\n }\n\n /**\n * Reconfigure the device manager.\n */\n reconfigure(config: Config) {\n this.#config = {...this.#config, ...config};\n }\n\n /**\n * Stop listening to the pcap adapter and clean up timeouts.\n */\n stop() {\n this.#adapter.off('announce', this.#handleAnnounce as any);\n\n // Clear all timeouts\n for (const timeout of this.#deviceTimeouts.values()) {\n clearTimeout(timeout);\n }\n this.#deviceTimeouts.clear();\n }\n\n #handleAnnounce = (message: Buffer, info: PacketInfo) => {\n let device;\n try {\n device = deviceFromPacketWithInfo(message, info);\n } catch {\n // Ignore malformed packets\n return;\n }\n\n if (device === null) {\n return;\n }\n\n // Device has not checked in before\n if (!this.#devices.has(device.id)) {\n this.#devices.set(device.id, device);\n this.#emitter.emit('connected', device);\n }\n\n this.#emitter.emit('announced', device);\n\n // Reset the device timeout handler\n const activeTimeout = this.#deviceTimeouts.get(device.id);\n if (activeTimeout) {\n clearTimeout(activeTimeout);\n }\n\n const timeout = this.#config.deviceTimeout;\n const newTimeout = setTimeout(this.#handleDisconnect, timeout, device);\n this.#deviceTimeouts.set(device.id, newTimeout);\n };\n\n #handleDisconnect = (removedDevice: Device) => {\n this.#devices.delete(removedDevice.id);\n this.#deviceTimeouts.delete(removedDevice.id);\n\n this.#emitter.emit('disconnected', removedDevice);\n };\n}\n\nexport default PassiveDeviceManager;\n","import {type NetworkInterfaceInfo, networkInterfaces} from 'os';\n\nimport {DatabasePreference} from 'src/localdb/database-adapter';\nimport {MixstatusProcessor} from 'src/mixstatus';\n\nimport {PassiveDeviceManager} from './devices';\nimport {PassiveLocalDatabase} from './localdb';\nimport {PcapAdapter} from './pcap-adapter';\nimport {PassivePositionEmitter} from './position';\nimport {PassiveRemoteDatabase} from './remotedb';\nimport {PassiveStatusEmitter} from './status';\n\nexport {\n AlphaThetaInterface,\n findAllAlphaThetaInterfaces,\n findAlphaThetaInterface,\n getArpCacheForInterface,\n} from './alphatheta';\nexport {PassiveDeviceManager} from './devices';\nexport {PassiveLocalDatabase} from './localdb';\nexport {PacketInfo, PcapAdapter, PcapAdapterConfig} from './pcap-adapter';\nexport {PassivePositionEmitter} from './position';\nexport {PassiveRemoteDatabase} from './remotedb';\nexport {PassiveStatusEmitter} from './status';\n\nexport interface PassiveNetworkConfig {\n /**\n * Network interface name (e.g., 'en0', 'eth0', 'en15' for USB-connected devices)\n */\n iface: string;\n /**\n * Buffer size for packet capture in bytes\n * @default 10485760 (10MB)\n */\n bufferSize?: number;\n /**\n * Time in milliseconds after which a device is considered disconnected\n * @default 10000\n */\n deviceTimeout?: number;\n /**\n * Database format preference for loading rekordbox databases.\n *\n * - 'auto': Try OneLibrary first (rekordbox 7.x+), fall back to PDB (rekordbox 6.x)\n * - 'oneLibrary': Only use OneLibrary format (exportLibrary.db)\n * - 'pdb': Only use PDB format (export.pdb)\n *\n * @default 'auto'\n */\n databasePreference?: DatabasePreference;\n}\n\n/**\n * PassiveProlinkNetwork provides a passive monitoring interface to the\n * Pro DJ Link network using pcap packet capture.\n *\n * Unlike the active ProlinkNetwork, passive mode:\n * - Does not bind to UDP ports (no conflicts with Rekordbox)\n * - Does not announce a virtual CDJ (devices don't know we exist)\n * - Cannot send packets (no CDJ control, no queryMediaSlot)\n * - Works with USB-connected devices (XDJ-AZ, XDJ-XZ)\n *\n * Requirements:\n * - Root/sudo privileges for packet capture\n * - libpcap (Linux) or Npcap/WinPcap (Windows)\n * - The 'cap' npm module\n */\nexport class PassiveProlinkNetwork {\n #adapter: PcapAdapter;\n #deviceManager: PassiveDeviceManager;\n #statusEmitter: PassiveStatusEmitter;\n #positionEmitter: PassivePositionEmitter;\n #localdb: PassiveLocalDatabase;\n #remotedb: PassiveRemoteDatabase | null = null;\n #mixstatus: MixstatusProcessor | null = null;\n\n constructor(config: PassiveNetworkConfig) {\n this.#adapter = new PcapAdapter({\n iface: config.iface,\n bufferSize: config.bufferSize,\n });\n\n // Only pass defined config values to avoid overwriting defaults with undefined\n this.#deviceManager = new PassiveDeviceManager(\n this.#adapter,\n config.deviceTimeout !== undefined\n ? {deviceTimeout: config.deviceTimeout}\n : undefined\n );\n\n this.#statusEmitter = new PassiveStatusEmitter(this.#adapter);\n this.#positionEmitter = new PassivePositionEmitter(this.#adapter);\n this.#localdb = new PassiveLocalDatabase(\n this.#deviceManager,\n this.#statusEmitter,\n config.databasePreference ?? 'auto'\n );\n }\n\n /**\n * Start passive packet capture.\n * Requires root/sudo privileges.\n */\n start() {\n this.#adapter.start();\n }\n\n /**\n * Stop packet capture and clean up all resources.\n */\n stop() {\n this.#deviceManager.stop();\n this.#statusEmitter.stop();\n this.#positionEmitter.stop();\n this.#localdb.stop();\n this.#remotedb?.stop();\n this.#adapter.stop();\n }\n\n /**\n * Check if packet capture is active.\n */\n get isCapturing() {\n return this.#adapter.isCapturing;\n }\n\n /**\n * Get the network interface being monitored.\n */\n get interfaceName() {\n return this.#adapter.interfaceName;\n }\n\n /**\n * Get the pcap adapter for advanced usage.\n */\n get adapter() {\n return this.#adapter;\n }\n\n /**\n * Get the PassiveDeviceManager service. Tracks devices on the network\n * by listening to announcement packets.\n */\n get deviceManager() {\n return this.#deviceManager;\n }\n\n /**\n * Get the PassiveStatusEmitter service. Reports CDJ status updates\n * received via packet capture.\n */\n get statusEmitter() {\n return this.#statusEmitter;\n }\n\n /**\n * Get the PassivePositionEmitter service. Reports absolute playhead\n * position updates from CDJ-3000+ devices.\n */\n get positionEmitter() {\n return this.#positionEmitter;\n }\n\n /**\n * Get the PassiveLocalDatabase service. Provides access to rekordbox\n * databases on devices using NFS (works without announcing a VCDJ).\n */\n get localdb() {\n return this.#localdb;\n }\n\n /**\n * Get (and initialize) the PassiveRemoteDatabase service. Provides access\n * to track metadata via RemoteDB queries.\n *\n * Note: This sends TCP packets to devices, so it's not fully \"passive\",\n * but it avoids UDP announcements that would conflict with Rekordbox.\n *\n * Useful for getting metadata for Rekordbox Link tracks where NFS\n * access is not available.\n */\n get remotedb() {\n if (this.#remotedb === null) {\n this.#remotedb = new PassiveRemoteDatabase(this.#deviceManager);\n }\n return this.#remotedb;\n }\n\n /**\n * Get (and initialize) the MixstatusProcessor service. Can be used to\n * monitor the 'status' of devices on the network as a whole.\n */\n get mixstatus() {\n if (this.#mixstatus === null) {\n this.#mixstatus = new MixstatusProcessor();\n this.#statusEmitter.on('status', s => this.#mixstatus?.handleState(s));\n }\n return this.#mixstatus;\n }\n}\n\n/**\n * Create and start a passive Pro DJ Link network monitor.\n *\n * This is the primary entrypoint for passive mode. It captures Pro DJ Link\n * packets via pcap without binding to UDP ports or announcing a virtual CDJ.\n *\n * @example\n * ```typescript\n * import { bringOnlinePassive } from 'alphatheta-connect';\n *\n * // Start passive monitoring on en15 (XDJ-XZ USB interface)\n * const network = await bringOnlinePassive({ iface: 'en15' });\n *\n * // Listen for devices\n * network.deviceManager.on('connected', device => {\n * console.log('Device connected:', device.name);\n * });\n *\n * // Listen for track changes\n * network.statusEmitter.on('status', status => {\n * console.log('Track:', status.trackId);\n * });\n *\n * // Get track metadata via NFS\n * const track = await network.localdb.get(device.id, MediaSlot.USB);\n *\n * // Cleanup\n * network.stop();\n * ```\n *\n * @param config - Configuration including network interface name\n * @returns PassiveProlinkNetwork instance\n */\nexport function bringOnlinePassive(config: PassiveNetworkConfig): PassiveProlinkNetwork {\n const network = new PassiveProlinkNetwork(config);\n network.start();\n return network;\n}\n\n/**\n * List available network interfaces that can be used for packet capture.\n * Useful for finding USB-connected DJ hardware interfaces.\n *\n * @example\n * ```typescript\n * import { listInterfaces } from 'alphatheta-connect/passive';\n *\n * const interfaces = listInterfaces();\n * console.log(interfaces);\n * // [{ name: 'en0', address: '192.168.1.100' }, { name: 'en15', address: '169.254.x.x' }]\n * ```\n */\nexport function listInterfaces(): Array<{\n name: string;\n address: string;\n description?: string;\n}> {\n const interfaces = networkInterfaces();\n const result: Array<{name: string; address: string; description?: string}> = [];\n\n for (const [name, infos] of Object.entries(interfaces)) {\n if (!infos) {\n continue;\n }\n\n for (const info of infos as NetworkInterfaceInfo[]) {\n // Only include IPv4, non-internal interfaces\n if (info.family === 'IPv4' && !info.internal) {\n result.push({\n name,\n address: info.address,\n // USB-connected DJ hardware typically uses link-local addresses\n description: info.address.startsWith('169.254.')\n ? 'Link-local (USB device?)'\n : undefined,\n });\n }\n }\n }\n\n return result;\n}\n","import {Mutex} from 'async-mutex';\nimport StrictEventEmitter from 'strict-event-emitter-types';\n\nimport {createHash} from 'crypto';\nimport {EventEmitter} from 'events';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\n\nimport {MAX_CDJ_DEVICE_ID, MIN_CDJ_DEVICE_ID} from 'src/constants';\nimport {DatabaseAdapter, DatabasePreference} from 'src/localdb/database-adapter';\nimport {OneLibraryAdapter} from 'src/localdb/onelibrary';\nimport {MetadataORM} from 'src/localdb/orm';\nimport {hydrateDatabase, HydrationProgress} from 'src/localdb/rekordbox';\nimport {fetchFile, FetchProgress} from 'src/nfs';\nimport {\n Device,\n DeviceID,\n DeviceType,\n MediaSlot,\n MediaSlotInfo,\n TrackType,\n} from 'src/types';\nimport {getSlotName} from 'src/utils';\nimport * as Telemetry from 'src/utils/telemetry';\n\nimport {PassiveDeviceManager} from './devices';\nimport {PassiveStatusEmitter} from './status';\n\n/**\n * Rekordbox databases will only exist within these two slots\n */\ntype DatabaseSlot = MediaSlot.USB | MediaSlot.SD;\n\ninterface CommonProgressOpts {\n device: Device;\n slot: MediaSlot;\n}\n\ntype DownloadProgressOpts = CommonProgressOpts & {\n progress: FetchProgress;\n};\n\ntype HydrationProgressOpts = CommonProgressOpts & {\n progress: HydrationProgress;\n};\n\ntype HydrationDoneOpts = CommonProgressOpts;\n\n/**\n * Events that may be triggered by the PassiveLocalDatabase emitter\n */\ninterface DatabaseEvents {\n /**\n * Triggered when we are fetching a database from a CDJ\n */\n fetchProgress: (opts: DownloadProgressOpts) => void;\n /**\n * Triggered when we are hydrating a rekordbox database into the in-memory\n * sqlite database.\n */\n hydrationProgress: (opts: HydrationProgressOpts) => void;\n /**\n * Triggered when the database has been fully hydrated.\n */\n hydrationDone: (opts: HydrationDoneOpts) => void;\n}\n\ntype Emitter = StrictEventEmitter<EventEmitter, DatabaseEvents>;\n\ninterface DatabaseItem {\n id: string;\n media: MediaSlotInfo;\n adapter: DatabaseAdapter;\n tempFile?: string;\n}\n\n/**\n * Compute the identifier for media device in a CDJ. This is used to determine\n * if we have already hydrated the device or not into our local database.\n */\nconst getMediaId = (info: MediaSlotInfo) => {\n const inputs = [\n info.deviceId,\n info.slot,\n info.name,\n info.freeBytes,\n info.totalBytes,\n info.trackCount,\n info.createdDate,\n ];\n\n return createHash('sha256').update(inputs.join('.'), 'utf8').digest('hex');\n};\n\n/**\n * PassiveLocalDatabase provides access to rekordbox databases on devices\n * using passive packet capture.\n *\n * Unlike the active LocalDatabase, this version:\n * - Cannot query for media slot info (no queryMediaSlot)\n * - Listens for mediaSlot broadcasts to cache media info\n * - Provides getWithMedia() method when media info is known\n *\n * NFS access to fetch rekordbox databases works without announcing a VCDJ.\n */\nexport class PassiveLocalDatabase {\n #deviceManager: PassiveDeviceManager;\n #statusEmitter: PassiveStatusEmitter;\n #emitter: Emitter = new EventEmitter();\n #slotLocks = new Map<string, Mutex>();\n #dbs: DatabaseItem[] = [];\n /**\n * Cache of media slot info received from broadcast packets\n */\n #mediaCache = new Map<string, MediaSlotInfo>();\n /**\n * Database format preference\n */\n #preference: DatabasePreference = 'auto';\n\n constructor(\n deviceManager: PassiveDeviceManager,\n statusEmitter: PassiveStatusEmitter,\n preference: DatabasePreference = 'auto'\n ) {\n this.#deviceManager = deviceManager;\n this.#statusEmitter = statusEmitter;\n this.#preference = preference;\n\n deviceManager.on('disconnected', this.#handleDeviceRemoved);\n statusEmitter.on('mediaSlot', this.#handleMediaSlot);\n }\n\n /**\n * Get the current database preference\n */\n get preference(): DatabasePreference {\n return this.#preference;\n }\n\n /**\n * Set the database preference. Only affects newly loaded databases.\n */\n set preference(value: DatabasePreference) {\n this.#preference = value;\n }\n\n // Bind public event emitter interface\n on: Emitter['on'] = this.#emitter.addListener.bind(this.#emitter);\n off: Emitter['off'] = this.#emitter.removeListener.bind(this.#emitter);\n once: Emitter['once'] = this.#emitter.once.bind(this.#emitter);\n\n /**\n * Get cached media slot info for a device and slot.\n * Returns undefined if no media slot info has been received.\n */\n getCachedMedia(deviceId: DeviceID, slot: DatabaseSlot): MediaSlotInfo | undefined {\n const key = `${deviceId}-${slot}`;\n return this.#mediaCache.get(key);\n }\n\n /**\n * Get all cached media slot info.\n */\n getAllCachedMedia(): MediaSlotInfo[] {\n return Array.from(this.#mediaCache.values());\n }\n\n /**\n * Disconnects the local database connection for the specified device\n */\n disconnectForDevice(device: Device) {\n this.#handleDeviceRemoved(device);\n }\n\n /**\n * Stop listening to events and clean up.\n */\n stop() {\n this.#deviceManager.off('disconnected', this.#handleDeviceRemoved);\n this.#statusEmitter.off('mediaSlot', this.#handleMediaSlot);\n\n // Close all database connections and clean up temp files\n for (const db of this.#dbs) {\n db.adapter.close();\n if (db.tempFile) {\n try {\n fs.unlinkSync(db.tempFile);\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n this.#dbs = [];\n this.#mediaCache.clear();\n }\n\n #handleMediaSlot = (info: MediaSlotInfo) => {\n const key = `${info.deviceId}-${info.slot}`;\n this.#mediaCache.set(key, info);\n };\n\n #handleDeviceRemoved = (device: Device) => {\n const db = this.#dbs.find(db => db.media.deviceId === device.id);\n if (db) {\n db.adapter.close();\n if (db.tempFile) {\n try {\n fs.unlinkSync(db.tempFile);\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n this.#dbs = this.#dbs.filter(db => db.media.deviceId !== device.id);\n\n // Clear cached media for this device\n for (const key of this.#mediaCache.keys()) {\n if (key.startsWith(`${device.id}-`)) {\n this.#mediaCache.delete(key);\n }\n }\n };\n\n /**\n * Helper to fetch a file from device, trying both dotted and non-dotted paths\n */\n #fetchFileWithFallback = async (\n device: Device,\n slot: DatabaseSlot,\n basePath: string,\n tx: Telemetry.TelemetrySpan\n ): Promise<Buffer> => {\n const attemptOrder =\n process.platform === 'win32'\n ? [basePath, `.${basePath}`]\n : [`.${basePath}`, basePath];\n\n try {\n return await fetchFile({\n device,\n slot,\n path: attemptOrder[0],\n span: tx,\n onProgress: progress =>\n this.#emitter.emit('fetchProgress', {device, slot, progress}),\n });\n } catch {\n return fetchFile({\n device,\n slot,\n path: attemptOrder[1],\n span: tx,\n onProgress: progress =>\n this.#emitter.emit('fetchProgress', {device, slot, progress}),\n });\n }\n };\n\n /**\n * Try to load OneLibrary database (exportLibrary.db).\n */\n #tryLoadOneLibrary = async (\n device: Device,\n slot: DatabaseSlot,\n tx: Telemetry.TelemetrySpan\n ): Promise<{adapter: OneLibraryAdapter; tempFile: string} | null> => {\n const oneLibraryPath = 'PIONEER/rekordbox/exportLibrary.db';\n\n try {\n const dbData = await this.#fetchFileWithFallback(device, slot, oneLibraryPath, tx);\n\n const tempDir = os.tmpdir();\n const tempFile = path.join(\n tempDir,\n `prolink-onelibrary-${device.id}-${slot}-${Date.now()}.db`\n );\n fs.writeFileSync(tempFile, dbData);\n\n const adapter = new OneLibraryAdapter(tempFile);\n return {adapter, tempFile};\n } catch {\n return null;\n }\n };\n\n /**\n * Load PDB database (export.pdb) and hydrate into MetadataORM.\n */\n #loadPdbDatabase = async (\n device: Device,\n slot: DatabaseSlot,\n tx: Telemetry.TelemetrySpan\n ): Promise<MetadataORM> => {\n const pdbPath = 'PIONEER/rekordbox/export.pdb';\n const pdbData = await this.#fetchFileWithFallback(device, slot, pdbPath, tx);\n\n const dbCreateTx = tx.startChild({op: 'setupDatabase'});\n const orm = new MetadataORM();\n dbCreateTx.finish();\n\n await hydrateDatabase({\n orm,\n pdbData,\n span: tx,\n onProgress: progress =>\n this.#emitter.emit('hydrationProgress', {device, slot, progress}),\n });\n\n return orm;\n };\n\n #hydrateDatabase = async (device: Device, slot: DatabaseSlot, media: MediaSlotInfo) => {\n const tx = Telemetry.startTransaction({name: 'hydrateDatabase'});\n\n tx.setTag('slot', getSlotName(media.slot));\n tx.setData('numTracks', media.trackCount.toString());\n tx.setTag('preference', this.#preference);\n\n let adapter: DatabaseAdapter;\n let tempFile: string | undefined;\n\n if (this.#preference === 'pdb') {\n adapter = await this.#loadPdbDatabase(device, slot, tx);\n tx.setTag('dbType', 'pdb');\n } else if (this.#preference === 'oneLibrary') {\n const oneLibraryResult = await this.#tryLoadOneLibrary(device, slot, tx);\n if (!oneLibraryResult) {\n throw new Error(\n 'OneLibrary database not found and preference is set to oneLibrary only'\n );\n }\n adapter = oneLibraryResult.adapter;\n tempFile = oneLibraryResult.tempFile;\n tx.setTag('dbType', 'oneLibrary');\n } else {\n // Auto: Try OneLibrary first, fall back to PDB\n const oneLibraryResult = await this.#tryLoadOneLibrary(device, slot, tx);\n\n if (oneLibraryResult) {\n adapter = oneLibraryResult.adapter;\n tempFile = oneLibraryResult.tempFile;\n tx.setTag('dbType', 'oneLibrary');\n } else {\n adapter = await this.#loadPdbDatabase(device, slot, tx);\n tx.setTag('dbType', 'pdb');\n }\n }\n\n this.#emitter.emit('hydrationDone', {device, slot});\n\n const db: DatabaseItem = {adapter, media, id: getMediaId(media), tempFile};\n this.#dbs.push(db);\n\n tx.finish();\n\n return db;\n };\n\n /**\n * Gets the database adapter for the media metadata in the provided device slot,\n * using cached media info.\n *\n * This method uses cached media slot info that was received from\n * broadcast packets. If no media info is cached for this slot,\n * it will attempt to fetch the database without media info (useful\n * for all-in-one units like XDJ-XZ that don't broadcast mediaSlot).\n *\n * @returns null if no rekordbox media present or fetch fails\n */\n get(deviceId: DeviceID, slot: DatabaseSlot): Promise<DatabaseAdapter | null> {\n const cachedMedia = this.getCachedMedia(deviceId, slot);\n const device = this.#deviceManager.devices.get(deviceId);\n\n if (!device) {\n return Promise.resolve(null);\n }\n\n if (cachedMedia) {\n return this.getWithMedia(device, slot, cachedMedia);\n }\n\n // No cached media - try fetching without media info\n // This is needed for all-in-one units (XDJ-XZ, XDJ-RX) that don't\n // broadcast mediaSlot info packets\n return this.getWithoutMedia(device, slot);\n }\n\n /**\n * Gets the database adapter for the media metadata using provided media slot info.\n *\n * Use this method when you have media slot info from another source\n * (e.g., parsed from status packets or provided manually).\n *\n * @returns null if no rekordbox media present\n */\n async getWithMedia(\n device: Device,\n slot: DatabaseSlot,\n media: MediaSlotInfo\n ): Promise<DatabaseAdapter | null> {\n const lockKey = `${device.id}-${slot}`;\n const lock =\n this.#slotLocks.get(lockKey) ??\n this.#slotLocks.set(lockKey, new Mutex()).get(lockKey)!;\n\n if (\n device.type !== DeviceType.CDJ ||\n device.id < MIN_CDJ_DEVICE_ID ||\n device.id > MAX_CDJ_DEVICE_ID\n ) {\n return null;\n }\n\n if (media.tracksType !== TrackType.RB) {\n return null;\n }\n\n const id = getMediaId(media);\n\n const db = await lock.runExclusive(() => {\n const cached = this.#dbs.find(db => db.id === id);\n if (cached) {\n return cached;\n }\n return this.#hydrateDatabase(device, slot, media);\n });\n\n return db.adapter;\n }\n\n /**\n * Attempts to get/hydrate a database without cached media slot info.\n * This is used for all-in-one units (XDJ-XZ, XDJ-RX, etc.) that don't\n * broadcast mediaSlot info packets.\n *\n * The method will try to fetch the rekordbox export.pdb file directly\n * via NFS. If successful, the database is hydrated and cached.\n *\n * @returns null if no rekordbox database found or fetch fails\n */\n async getWithoutMedia(device: Device, slot: DatabaseSlot) {\n const lockKey = `${device.id}-${slot}-nomedia`;\n const lock =\n this.#slotLocks.get(lockKey) ??\n this.#slotLocks.set(lockKey, new Mutex()).get(lockKey)!;\n\n if (\n device.type !== DeviceType.CDJ ||\n device.id < MIN_CDJ_DEVICE_ID ||\n device.id > MAX_CDJ_DEVICE_ID\n ) {\n return null;\n }\n\n // Check if we already have a cached database for this device/slot\n const existingDb = this.#dbs.find(\n db => db.media.deviceId === device.id && db.media.slot === slot\n );\n if (existingDb) {\n return existingDb.adapter;\n }\n\n try {\n const db = await lock.runExclusive(() => {\n // Double-check cache inside lock\n const cached = this.#dbs.find(\n db => db.media.deviceId === device.id && db.media.slot === slot\n );\n if (cached) {\n return cached;\n }\n\n // Create synthetic media info - we assume rekordbox since we're\n // attempting to fetch a rekordbox database\n const syntheticMedia: MediaSlotInfo = {\n deviceId: device.id,\n slot,\n name: 'Unknown Media',\n color: 0,\n createdDate: new Date(0),\n freeBytes: BigInt(0),\n totalBytes: BigInt(0),\n tracksType: TrackType.RB,\n trackCount: 0,\n playlistCount: 0,\n hasSettings: false,\n };\n\n return this.#hydrateDatabase(device, slot, syntheticMedia);\n });\n\n return db.adapter;\n } catch {\n return null;\n }\n }\n\n /**\n * Preload the databases for all connected devices using cached media info.\n */\n async preload() {\n const allDevices = [...this.#deviceManager.devices.values()];\n const cdjDevices = allDevices.filter(\n device =>\n device.type === DeviceType.CDJ &&\n device.id >= MIN_CDJ_DEVICE_ID &&\n device.id <= MAX_CDJ_DEVICE_ID\n );\n\n if (cdjDevices.length === 0) {\n return;\n }\n\n const loaders = cdjDevices.map(device =>\n Promise.all([this.get(device.id, MediaSlot.USB), this.get(device.id, MediaSlot.SD)])\n );\n\n await Promise.all(loaders);\n }\n}\n\nexport default PassiveLocalDatabase;\n","import StrictEventEmitter from 'strict-event-emitter-types';\n\nimport {EventEmitter} from 'events';\nimport {networkInterfaces} from 'os';\n\nimport {ANNOUNCE_PORT, BEAT_PORT, STATUS_PORT} from 'src/constants';\n\n// Cap module types - this is a native pcap module\n// Type definitions are inline since @types/cap doesn't exist\ninterface CapInstance {\n on(event: 'packet', handler: (nbytes: number, truncated: boolean) => void): void;\n on(event: 'error', handler: (err: Error) => void): void;\n setMinBytes(bytes: number): void;\n close(): void;\n open(\n device: string,\n filter: string,\n bufSize: number,\n buffer: Buffer,\n linkType?: string\n ): void;\n send(buffer: Buffer, len: number): boolean;\n linkType: string;\n}\n\n// Protocol constants for packet decoding\ninterface ProtocolConstants {\n ETHERNET: {IPV4: number};\n IP: {UDP: number};\n}\n\ninterface CapDeviceListEntry {\n name: string;\n description: string;\n addresses: Array<{addr: string}>;\n}\n\ninterface CapConstructor {\n new (): CapInstance;\n deviceList(): CapDeviceListEntry[];\n}\n\ninterface CapModule {\n Cap: CapConstructor;\n decoders: {\n PROTOCOL: ProtocolConstants;\n Ethernet: (buf: Buffer) => {info: {type: number}; offset: number};\n IPV4: (\n buf: Buffer,\n offset: number\n ) => {\n info: {protocol: number; srcaddr: string; dstaddr: string; totallen: number};\n offset: number;\n };\n UDP: (\n buf: Buffer,\n offset: number\n ) => {\n info: {srcport: number; dstport: number; length: number};\n offset: number;\n };\n };\n}\n\n/**\n * Packet info including source IP (useful for short-format packets\n * where the IP may not be fully present in the payload).\n */\nexport interface PacketInfo {\n /** The UDP payload */\n payload: Buffer;\n /** Source IP address (e.g., '169.254.88.83') */\n srcAddr: string;\n}\n\ninterface PcapAdapterEvents {\n /**\n * Fired when a device announcement packet is received (port 50000)\n */\n announce: (packet: Buffer, info: PacketInfo) => void;\n /**\n * Fired when a status packet is received (port 50002)\n */\n status: (packet: Buffer, info: PacketInfo) => void;\n /**\n * Fired when a beat/position packet is received (port 50001)\n */\n beat: (packet: Buffer, info: PacketInfo) => void;\n /**\n * Fired when an error occurs\n */\n error: (error: Error) => void;\n}\n\ntype Emitter = StrictEventEmitter<EventEmitter, PcapAdapterEvents>;\n\nexport interface PcapAdapterConfig {\n /**\n * Network interface name (e.g., 'en0', 'eth0', 'en15')\n */\n iface: string;\n /**\n * Buffer size for packet capture in bytes\n * @default 10485760 (10MB)\n */\n bufferSize?: number;\n}\n\n/**\n * PcapAdapter captures Pro DJ Link packets via pcap (libpcap).\n * It extracts UDP payloads and emits them to event listeners based on\n * destination port.\n *\n * This allows passive monitoring of the Pro DJ Link network without\n * binding to UDP ports or announcing a virtual CDJ.\n *\n * NOTE: Requires root/sudo privileges for packet capture.\n */\nexport class PcapAdapter {\n #emitter: Emitter = new EventEmitter();\n #cap: CapInstance | null = null;\n #buffer: Buffer;\n #iface: string;\n #started = false;\n\n constructor(config: PcapAdapterConfig) {\n this.#iface = config.iface;\n this.#buffer = Buffer.alloc(config.bufferSize ?? 10 * 1024 * 1024); // 10MB default\n }\n\n // Bind public event emitter interface\n on: Emitter['on'] = this.#emitter.addListener.bind(this.#emitter);\n off: Emitter['off'] = this.#emitter.removeListener.bind(this.#emitter);\n once: Emitter['once'] = this.#emitter.once.bind(this.#emitter);\n\n /**\n * Start capturing packets on the configured interface.\n * Requires root/sudo privileges.\n */\n start() {\n if (this.#started) {\n return;\n }\n\n // Dynamic require to avoid bundling issues and allow optional dependency\n let cap: CapModule;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n cap = require('cap') as CapModule;\n } catch {\n throw new Error(\n 'The \"cap\" module is required for passive mode. ' +\n 'Install it with: npm install cap\\n' +\n 'Note: Requires libpcap-dev on Linux or Npcap/WinPcap on Windows.'\n );\n }\n\n const {Cap, decoders} = cap;\n const PROTOCOL = decoders.PROTOCOL;\n\n this.#cap = new Cap();\n\n // On Windows, translate Node.js interface name (e.g. \"Ethernet\") to Npcap\n // device path (e.g. \"\\Device\\NPF_{GUID}\") by matching IPv4 addresses.\n let deviceName = this.#iface;\n if (process.platform === 'win32' && !deviceName.startsWith('\\\\Device\\\\')) {\n const resolved = resolveWindowsInterface(this.#iface, Cap);\n if (resolved) {\n deviceName = resolved;\n }\n }\n\n // BPF filter for Pro DJ Link UDP ports\n const filter = `udp and (port ${ANNOUNCE_PORT} or port ${BEAT_PORT} or port ${STATUS_PORT})`;\n\n try {\n this.#cap.open(deviceName, filter, 65535, this.#buffer);\n } catch (err) {\n throw new Error(\n `Failed to open interface \"${this.#iface}\" (device: ${deviceName}) for packet capture. ` +\n `Ensure you have root/sudo privileges and the interface exists.\\n` +\n `Original error: ${err}`\n );\n }\n\n // setMinBytes may not be available on all platforms\n if (typeof this.#cap.setMinBytes === 'function') {\n this.#cap.setMinBytes(0);\n }\n\n this.#cap.on('packet', (nbytes: number, truncated: boolean) => {\n if (truncated) {\n return;\n }\n\n try {\n // Parse Ethernet header\n const ethResult = decoders.Ethernet(this.#buffer);\n if (ethResult.info.type !== PROTOCOL.ETHERNET.IPV4) {\n return;\n }\n\n // Parse IPv4 header\n const ipResult = decoders.IPV4(this.#buffer, ethResult.offset);\n if (ipResult.info.protocol !== PROTOCOL.IP.UDP) {\n return;\n }\n\n // Parse UDP header\n const udpResult = decoders.UDP(this.#buffer, ipResult.offset);\n const dstPort = udpResult.info.dstport;\n const udpPayloadOffset = udpResult.offset;\n const udpPayloadLen = udpResult.info.length - 8; // UDP header is 8 bytes\n\n if (udpPayloadLen <= 0) {\n return;\n }\n\n // Extract the UDP payload as a new Buffer (copy to avoid overwrite)\n const payload = Buffer.alloc(udpPayloadLen);\n this.#buffer.copy(payload, 0, udpPayloadOffset, udpPayloadOffset + udpPayloadLen);\n\n // Build packet info with source IP (useful when payload doesn't contain full IP)\n const info: PacketInfo = {\n payload,\n srcAddr: ipResult.info.srcaddr,\n };\n\n // Emit to appropriate handler based on destination port\n switch (dstPort) {\n case ANNOUNCE_PORT:\n this.#emitter.emit('announce', payload, info);\n break;\n case BEAT_PORT:\n this.#emitter.emit('beat', payload, info);\n break;\n case STATUS_PORT:\n this.#emitter.emit('status', payload, info);\n break;\n }\n } catch (err) {\n this.#emitter.emit('error', err as Error);\n }\n });\n\n this.#cap.on('error', (err: Error) => {\n this.#emitter.emit('error', err);\n });\n\n this.#started = true;\n }\n\n /**\n * Stop capturing packets and release resources.\n */\n stop() {\n if (this.#cap) {\n this.#cap.close();\n this.#cap = null;\n }\n this.#started = false;\n }\n\n /**\n * Check if the adapter is currently capturing.\n */\n get isCapturing() {\n return this.#started;\n }\n\n /**\n * Get the interface name being captured.\n */\n get interfaceName() {\n return this.#iface;\n }\n}\n\n/**\n * Resolve a Node.js network interface name (e.g. \"Ethernet\") to an Npcap\n * device path (e.g. \"\\Device\\NPF_{GUID}\") on Windows.\n *\n * Node.js os.networkInterfaces() returns friendly names, but the cap module\n * requires Npcap device paths. This function matches by comparing IPv4\n * addresses between os.networkInterfaces() and Cap.deviceList().\n */\nfunction resolveWindowsInterface(ifaceName: string, Cap: CapConstructor): string | null {\n // Get the IPv4 addresses for the requested Node.js interface\n const nodeInterfaces = networkInterfaces();\n const nodeIface = nodeInterfaces[ifaceName];\n if (!nodeIface) {\n return null;\n }\n\n const nodeIpv4Addresses = new Set(\n nodeIface\n .filter(i => (i.family as any) === 'IPv4' || (i.family as any) === 4)\n .map(i => i.address)\n );\n\n if (nodeIpv4Addresses.size === 0) {\n return null;\n }\n\n // Find the cap device whose addresses overlap with the Node.js interface\n const capDevices = Cap.deviceList();\n for (const device of capDevices) {\n if (!device.addresses) {\n continue;\n }\n for (const addr of device.addresses) {\n if (addr.addr && nodeIpv4Addresses.has(addr.addr)) {\n return device.name;\n }\n }\n }\n\n return null;\n}\n\nexport default PcapAdapter;\n","import StrictEventEmitter from 'strict-event-emitter-types';\n\nimport {EventEmitter} from 'events';\n\nimport {positionFromPacket} from 'src/status/utils';\nimport {CDJStatus} from 'src/types';\n\nimport {PacketInfo, PcapAdapter} from './pcap-adapter';\n\ninterface PositionEvents {\n /**\n * Fired when an absolute position packet is received from a CDJ-3000+.\n * These packets are sent approximately every 30ms while a track is loaded.\n */\n position: (position: CDJStatus.PositionState) => void;\n}\n\ntype Emitter = StrictEventEmitter<EventEmitter, PositionEvents>;\n\n/**\n * PassivePositionEmitter reports absolute playhead position updates from\n * CDJ-3000+ devices using passive packet capture.\n *\n * Position packets provide precise track position independent of beat grids,\n * enabling accurate timecode, lighting cue, and video synchronization even\n * during scratching, reverse play, loops, and needle jumps.\n */\nexport class PassivePositionEmitter {\n #emitter: Emitter = new EventEmitter();\n #adapter: PcapAdapter;\n\n constructor(adapter: PcapAdapter) {\n this.#adapter = adapter;\n adapter.on('beat', this.#handlePosition as any);\n }\n\n // Bind public event emitter interface\n on: Emitter['on'] = this.#emitter.addListener.bind(this.#emitter);\n off: Emitter['off'] = this.#emitter.removeListener.bind(this.#emitter);\n once: Emitter['once'] = this.#emitter.once.bind(this.#emitter);\n\n /**\n * Stop listening to the pcap adapter.\n */\n stop() {\n this.#adapter.off('beat', this.#handlePosition as any);\n }\n\n #handlePosition = (message: Buffer, _info: PacketInfo) => {\n const position = positionFromPacket(message);\n\n if (position !== undefined) {\n this.#emitter.emit('position', position);\n }\n };\n}\n\nexport default PassivePositionEmitter;\n","import {Mutex} from 'async-mutex';\nimport PromiseSocket from 'promise-socket';\n\nimport {Socket} from 'net';\n\nimport {Connection, MenuTarget, Query, QueryInterface} from 'src/remotedb';\nimport {REMOTEDB_SERVER_QUERY_PORT} from 'src/remotedb/constants';\nimport {readField, UInt32} from 'src/remotedb/fields';\nimport {Message} from 'src/remotedb/message';\nimport {MessageType} from 'src/remotedb/message/types';\nimport {Device, DeviceID, MediaSlot, TrackType} from 'src/types';\nimport * as Telemetry from 'src/utils/telemetry';\n\nimport {PassiveDeviceManager} from './devices';\n\n/**\n * Queries the remote device for the port that the remote database server is\n * listening on for requests.\n */\nasync function getRemoteDBServerPort(deviceIp: string): Promise<number> {\n const conn = new PromiseSocket(new Socket());\n await conn.connect(REMOTEDB_SERVER_QUERY_PORT, deviceIp);\n\n // Magic request packet asking the device to report its remoteDB port\n const data = Buffer.from([\n ...[0x00, 0x00, 0x00, 0x0f],\n ...Buffer.from('RemoteDBServer', 'ascii'),\n 0x00,\n ]);\n\n await conn.write(data);\n const resp = await conn.read();\n\n await conn.destroy();\n\n if (typeof resp !== 'object') {\n throw new Error('Invalid response from remotedb');\n }\n\n if (resp.length !== 2) {\n throw new Error(`Expected 2 bytes, got ${resp.length}`);\n }\n\n return resp.readUInt16BE();\n}\n\n/**\n * PassiveRemoteDatabase provides RemoteDB query support for passive mode.\n *\n * This allows querying track metadata from Rekordbox Link without fully\n * announcing a virtual CDJ on the network. It uses a \"virtual\" device ID\n * (default: 5) for the introduction handshake.\n *\n * Note: This makes the mode not fully \"passive\" since we're sending TCP\n * packets, but we still avoid UDP announcements that would conflict with\n * Rekordbox.\n */\nexport class PassiveRemoteDatabase {\n #deviceManager: PassiveDeviceManager;\n #virtualDeviceId: number;\n\n /**\n * Active device connection map\n */\n #connections = new Map<DeviceID, Connection>();\n /**\n * Locks for each device when locating the connection\n */\n #deviceLocks = new Map<DeviceID, Mutex>();\n\n constructor(deviceManager: PassiveDeviceManager, virtualDeviceId = 5) {\n this.#deviceManager = deviceManager;\n this.#virtualDeviceId = virtualDeviceId;\n }\n\n /**\n * Open a connection to the specified device for querying\n */\n async connectToDevice(device: Device): Promise<void> {\n const tx = Telemetry.startTransaction({\n name: 'passiveConnectRemotedb',\n data: {device},\n });\n\n const {ip} = device;\n const dbPort = await getRemoteDBServerPort(ip.address);\n\n const socket = new PromiseSocket(new Socket());\n await socket.connect(dbPort, ip.address);\n\n // Send required preamble to open communications with the device\n const preamble = new UInt32(0x01);\n await socket.write(preamble.buffer);\n\n // Read the response. It should be a UInt32 field with the value 0x01.\n const data = await readField(socket, UInt32.type);\n\n if (data.value !== 0x01) {\n throw new Error(`Expected 0x01 during preamble handshake. Got ${data.value}`);\n }\n\n // Send introduction message with our virtual device ID\n const intro = new Message({\n transactionId: 0xfffffffe,\n type: MessageType.Introduce,\n args: [new UInt32(this.#virtualDeviceId)],\n });\n\n await socket.write(intro.buffer);\n const resp = await Message.fromStream(socket, MessageType.Success, tx);\n\n if (resp.type !== MessageType.Success) {\n throw new Error(`Failed to introduce self to device ID: ${device.id}`);\n }\n\n this.#connections.set(device.id, new Connection(device, socket));\n tx.finish();\n }\n\n /**\n * Disconnect from the specified device\n */\n async disconnectFromDevice(device: Device): Promise<void> {\n const conn = this.#connections.get(device.id);\n\n if (conn === undefined) {\n return;\n }\n\n try {\n const tx = Telemetry.startTransaction({\n name: 'passiveDisconnectFromDevice',\n data: {device},\n });\n\n const goodbye = new Message({\n transactionId: 0xfffffffe,\n type: MessageType.Disconnect,\n args: [],\n });\n\n await conn.writeMessage(goodbye, tx);\n tx.finish();\n } catch {\n // Ignore errors during disconnect\n }\n\n conn.close();\n this.#connections.delete(device.id);\n }\n\n /**\n * Gets the remote database query interface for the given device.\n *\n * If we have not already established a connection with the specified device,\n * we will attempt to first connect.\n *\n * @returns null if the device is not found\n */\n async get(deviceId: DeviceID): Promise<QueryInterface | null> {\n const device = this.#deviceManager.devices.get(deviceId);\n if (device === undefined) {\n return null;\n }\n\n const lock =\n this.#deviceLocks.get(device.id) ??\n this.#deviceLocks.set(device.id, new Mutex()).get(device.id)!;\n\n const releaseLock = await lock.acquire();\n\n let conn = this.#connections.get(deviceId);\n if (conn === undefined) {\n try {\n await this.connectToDevice(device);\n conn = this.#connections.get(deviceId);\n } catch (err) {\n releaseLock();\n throw err;\n }\n }\n\n releaseLock();\n\n if (conn === undefined) {\n return null;\n }\n\n // Create a virtual host device for the query interface\n const virtualHostDevice: Device = {\n id: this.#virtualDeviceId,\n name: 'alphatheta-connect',\n type: 0x01, // CDJ type\n macAddr: new Uint8Array([0, 0, 0, 0, 0, 0]),\n ip: device.ip, // Not really used, just needs to be valid\n };\n\n return new QueryInterface(conn, lock, virtualHostDevice);\n }\n\n /**\n * Query track metadata from a device.\n *\n * @param deviceId - The device to query (e.g., 17 for Rekordbox)\n * @param trackSlot - The media slot (e.g., MediaSlot.RB for Rekordbox Link)\n * @param trackType - The track type (e.g., TrackType.RB)\n * @param trackId - The track ID to look up\n */\n async getTrackMetadata(\n deviceId: DeviceID,\n trackSlot: MediaSlot,\n trackType: TrackType,\n trackId: number\n ) {\n const conn = await this.get(deviceId);\n if (conn === null) {\n return null;\n }\n\n const queryDescriptor = {\n trackSlot,\n trackType,\n menuTarget: MenuTarget.Main,\n };\n\n try {\n const track = await conn.query({\n queryDescriptor,\n query: Query.GetMetadata,\n args: {trackId},\n });\n\n // File path is not available for streaming tracks (Beatport, etc.)\n try {\n track.filePath = await conn.query({\n queryDescriptor,\n query: Query.GetTrackInfo,\n args: {trackId},\n });\n } catch {\n // No-op — streaming tracks don't have a local file\n }\n\n return track;\n } catch (err) {\n // Connection may have been closed, remove it\n this.#connections.delete(deviceId);\n throw err;\n }\n }\n\n /**\n * Query metadata for an unanalyzed track (loaded directly from USB without\n * Rekordbox analysis). Uses GetGenericMetadata which reads ID3 tags from the\n * audio file via the CDJ.\n *\n * @param deviceId - The CDJ device to query\n * @param trackSlot - The media slot (USB or SD)\n * @param trackType - Should be TrackType.Unanalyzed\n * @param trackId - The track ID to look up\n */\n async getGenericTrackMetadata(\n deviceId: DeviceID,\n trackSlot: MediaSlot,\n trackType: TrackType,\n trackId: number\n ) {\n const conn = await this.get(deviceId);\n if (conn === null) {\n return null;\n }\n\n const queryDescriptor = {\n trackSlot,\n trackType,\n menuTarget: MenuTarget.Main,\n };\n\n try {\n const track = await conn.query({\n queryDescriptor,\n query: Query.GetGenericMetadata,\n args: {trackId},\n });\n\n // Try to get file path for artwork extraction\n try {\n track.filePath = await conn.query({\n queryDescriptor,\n query: Query.GetTrackInfo,\n args: {trackId},\n });\n } catch {\n // GetTrackInfo may not be available for unanalyzed tracks\n }\n\n return track;\n } catch (err) {\n this.#connections.delete(deviceId);\n throw err;\n }\n }\n\n /**\n * Stop all connections\n */\n stop() {\n for (const conn of this.#connections.values()) {\n conn.close();\n }\n this.#connections.clear();\n }\n}\n\nexport default PassiveRemoteDatabase;\n","import StrictEventEmitter from 'strict-event-emitter-types';\n\nimport {EventEmitter} from 'events';\n\nimport {mediaSlotFromPacket, onAirFromPacket, statusFromPacket} from 'src/status/utils';\nimport {CDJStatus, MediaSlotInfo} from 'src/types';\n\nimport {PacketInfo, PcapAdapter} from './pcap-adapter';\n\ninterface StatusEvents {\n /**\n * Fired each time the CDJ reports its status\n */\n status: (status: CDJStatus.State) => void;\n /**\n * Fired when the CDJ reports its media slot status\n */\n mediaSlot: (info: MediaSlotInfo) => void;\n /**\n * Fired when the mixer broadcasts on-air channel status\n */\n onAir: (status: CDJStatus.OnAirStatus) => void;\n}\n\ntype Emitter = StrictEventEmitter<EventEmitter, StatusEvents>;\n\n/**\n * PassiveStatusEmitter reports CDJ status updates received via passive\n * packet capture instead of UDP sockets.\n *\n * It provides the same event API as the active StatusEmitter, but does\n * NOT support the queryMediaSlot method since that requires sending packets.\n *\n * In passive mode, media slot information is received when CDJs broadcast\n * it naturally (e.g., when media is inserted or at startup).\n */\nexport class PassiveStatusEmitter {\n #emitter: Emitter = new EventEmitter();\n #adapter: PcapAdapter;\n\n constructor(adapter: PcapAdapter) {\n this.#adapter = adapter;\n adapter.on('status', this.#handleStatus as any);\n }\n\n // Bind public event emitter interface\n on: Emitter['on'] = this.#emitter.addListener.bind(this.#emitter);\n off: Emitter['off'] = this.#emitter.removeListener.bind(this.#emitter);\n once: Emitter['once'] = this.#emitter.once.bind(this.#emitter);\n\n /**\n * Stop listening to the pcap adapter.\n */\n stop() {\n this.#adapter.off('status', this.#handleStatus as any);\n }\n\n #handleStatus = (message: Buffer, _info: PacketInfo) => {\n try {\n const status = statusFromPacket(message);\n\n if (status !== undefined) {\n return this.#emitter.emit('status', status);\n }\n\n // Media slot status is also reported on this socket\n const mediaSlot = mediaSlotFromPacket(message);\n\n if (mediaSlot !== undefined) {\n return this.#emitter.emit('mediaSlot', mediaSlot);\n }\n\n // On-air status from mixer is also reported on this socket\n const onAir = onAirFromPacket(message);\n\n if (onAir !== undefined) {\n return this.#emitter.emit('onAir', onAir);\n }\n } catch {\n // Ignore malformed packets\n }\n\n return undefined;\n };\n}\n\nexport default PassiveStatusEmitter;\n","/**\n * All remote database messages include this 4 byte magic value.\n */\nexport const REMOTEDB_MAGIC = 0x872349ae;\n\n/**\n * The consistent port on which we can query the remote db server for the port\n */\nexport const REMOTEDB_SERVER_QUERY_PORT = 12523;\n","import {PromiseReadable} from 'promise-readable';\n\nconst NULL_CHAR = '\\0';\n\n/**\n * Field type is a leading byte that indicates what the field is.\n */\nexport enum FieldType {\n UInt8 = 0x0f,\n UInt16 = 0x10,\n UInt32 = 0x11,\n Binary = 0x14,\n String = 0x26,\n}\n\nexport abstract class BaseField {\n // The constructor property (which is used to access the class from an\n // instance of it) must be set to the BaseClass object so we can access the\n // `.type` property.\n //\n // @see https://github.com/Microsoft/TypeScript/issues/3841#issuecomment-337560146\n declare ['constructor']: typeof BaseField;\n\n /**\n * The raw field data\n */\n declare data: Buffer;\n /**\n * Corce the field into a buffer. This differs from reading the data\n * property in that it will include the field type header.\n */\n abstract buffer: Buffer;\n\n /**\n * Declares the type of field this class represents\n */\n static type: FieldType;\n\n /**\n * The number of bytes to read for this field. If the field is not a fixed size,\n * set this to a function which will receive the UInt32 value just after\n * reading the field type, returning the next number of bytes to read.\n */\n static bytesToRead: number | ((reportedLength: number) => number);\n}\n\nexport type NumberField<T extends number = number> = BaseField & {\n /**\n * The fields number value\n */\n value: T;\n};\n\nexport type StringField<T extends string = string> = BaseField & {\n /**\n * The fields decoded string value\n */\n value: T;\n};\n\nexport type BinaryField = BaseField & {\n /**\n * The binary value encapsulated in the field\n */\n value: Buffer;\n};\n\nexport type Field = NumberField | StringField | BinaryField;\n\ntype NumberFieldType = FieldType.UInt32 | FieldType.UInt16 | FieldType.UInt8;\n\nconst numberNameMap = Object.fromEntries(\n Object.entries(FieldType).map(e => [e[1], e[0]])\n);\n\nconst numberBufferInfo = {\n [FieldType.UInt8]: [1, 'writeUInt8', 'readUInt8'],\n [FieldType.UInt16]: [2, 'writeUInt16BE', 'readUInt16BE'],\n [FieldType.UInt32]: [4, 'writeUInt32BE', 'readUInt32BE'],\n} as const;\n\nfunction parseNumber(value: number | Buffer, type: NumberFieldType): [number, Buffer] {\n const [bytes, writeFn, readFn] = numberBufferInfo[type];\n const data = Buffer.alloc(bytes);\n\n if (typeof value === 'number') {\n data[writeFn](value);\n return [value, data];\n }\n\n return [value[readFn](), value];\n}\n\nfunction makeVariableBuffer(type: FieldType, fieldData: Buffer, lengthHeader?: number) {\n // Add 4 bytes for length header and 1 byte for type header.\n const data = Buffer.alloc(fieldData.length + 4 + 1);\n data.writeUInt8(type);\n data.writeUInt32BE(lengthHeader ?? fieldData.length, 0x01);\n\n fieldData.copy(data, 0x05);\n\n return data;\n}\n\nconst makeNumberField = (type: NumberFieldType) => {\n const Number = class extends BaseField implements NumberField {\n static type = type;\n static bytesToRead = numberBufferInfo[type][0];\n\n value: number;\n\n constructor(value: number | Buffer) {\n super();\n const [number, data] = parseNumber(value, type);\n this.data = data;\n this.value = number;\n }\n\n get buffer() {\n return Buffer.from([type, ...this.data]);\n }\n };\n\n // We use the name property in readField to create helpful error messages\n Object.defineProperty(Number, 'name', {value: numberNameMap[type]});\n\n return Number;\n};\n\n/**\n * Field representing a UInt8\n */\nexport const UInt8 = makeNumberField(FieldType.UInt8);\n\n/**\n * Field representing a UInt16\n */\nexport const UInt16 = makeNumberField(FieldType.UInt16);\n\n/**\n * Field representing a UInt32\n */\nexport const UInt32 = makeNumberField(FieldType.UInt32);\n\n/**\n * Field representing a null-terminated big endian UTF-16 string\n */\nexport class String extends BaseField implements StringField {\n static type = FieldType.String as const;\n\n // Compute the number of bytes in the string given the length of the string.\n // A UTF-16 string takes 2 bytes per character.\n static bytesToRead = (length: number) => length * 2;\n\n value: string;\n\n constructor(value: Buffer | string) {\n super();\n if (typeof value === 'string') {\n this.value = value;\n this.data = Buffer.from(value + NULL_CHAR, 'utf16le').swap16();\n return;\n }\n\n // Slice off the last two bytes to remove the trailing null bytes\n this.value = Buffer.from(value).swap16().slice(0, -2).toString('utf16le');\n this.data = value;\n }\n\n get buffer() {\n return makeVariableBuffer(FieldType.String, this.data, this.data.length / 2);\n }\n}\n\n/**\n * Field representing binary data\n */\nexport class Binary extends BaseField implements BinaryField {\n static type = FieldType.Binary as const;\n static bytesToRead = (bytes: number) => bytes;\n\n value: Buffer;\n\n constructor(value: Buffer) {\n super();\n this.value = this.data = value;\n }\n\n get buffer() {\n return makeVariableBuffer(FieldType.Binary, this.data);\n }\n}\n\nconst fieldMap = {\n [FieldType.UInt8]: UInt8,\n [FieldType.UInt16]: UInt16,\n [FieldType.UInt32]: UInt32,\n [FieldType.Binary]: Binary,\n [FieldType.String]: String,\n} as const;\n\n/**\n * Helper to read from stream.\n *\n * NOTE: I suspect the typescript interface on PromiseReadable may be wrong, as\n * I'm not sure when this would return a string. We'll play it safe for now.\n */\nasync function read(stream: PromiseReadable<any>, bytes: number) {\n const data = await stream.read(bytes);\n\n if (data instanceof Buffer) {\n return data;\n }\n\n throw new Error('Expected buffer from stream read');\n}\n\n/**\n * Read a single field from a socket stream.\n */\nexport async function readField<\n T extends FieldType,\n F extends InstanceType<(typeof fieldMap)[T]>,\n>(stream: PromiseReadable<any>, expect: T): Promise<F> {\n const typeData = await read(stream, 1);\n const Field = fieldMap[typeData[0] as FieldType];\n\n if (Field.type !== expect) {\n throw new Error(`Expected ${fieldMap[expect].name} but got ${Field.name}`);\n }\n\n let nextByteCount: number;\n\n if (typeof Field.bytesToRead === 'number') {\n nextByteCount = Field.bytesToRead;\n } else {\n // Read the field length as a UInt32 when we do not know the field length\n // from the type\n const lengthData = await read(stream, 4);\n nextByteCount = Field.bytesToRead(lengthData.readUInt32BE());\n }\n\n const data = nextByteCount === 0 ? Buffer.alloc(0) : await read(stream, nextByteCount);\n\n return new Field(data) as F;\n}\n","import {Mutex} from 'async-mutex';\nimport * as ip from 'ip-address';\nimport PromiseSocket from 'promise-socket';\n\nimport {Socket} from 'net';\n\nimport DeviceManager from 'src/devices';\nimport {Device, DeviceID, MediaSlot, TrackType} from 'src/types';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\nimport * as Telemetry from 'src/utils/telemetry';\n\nimport {getMessageName, MessageType, Request, Response} from './message/types';\nimport {REMOTEDB_SERVER_QUERY_PORT} from './constants';\nimport {readField, UInt32} from './fields';\nimport {Message} from './message';\nimport {HandlerArgs, HandlerReturn, queryHandlers} from './queries';\n\ntype Await<T> = T extends PromiseLike<infer U> ? U : T;\n\n/**\n * Menu target specifies where a menu should be \"rendered\" This differs based\n * on the request being made.\n */\nexport enum MenuTarget {\n Main = 0x01,\n}\n\n/**\n * Used to specify where to lookup data when making queries\n */\nexport interface QueryDescriptor {\n menuTarget: MenuTarget;\n trackSlot: MediaSlot;\n trackType: TrackType;\n}\n\n/**\n * Used internally when making queries.\n */\nexport type LookupDescriptor = QueryDescriptor & {\n targetDevice: Device;\n hostDevice: Device;\n};\n\n/**\n * Used to specify the query type that is being made\n */\nexport type Query = keyof typeof queryHandlers;\nexport const Query = Request;\n\nconst QueryInverse = Object.fromEntries(Object.entries(Query).map(e => [e[1], e[0]]));\n\n/**\n * Returns a string representation of a remote query\n */\nexport function getQueryName(query: Query) {\n return QueryInverse[query];\n}\n\n/**\n * Options used to make a remotedb query\n */\ninterface QueryOpts<T extends Query> {\n queryDescriptor: QueryDescriptor;\n /**\n * The query type to make\n */\n query: T;\n /**\n * Arguments to pass to the query. These are query specific\n */\n args: HandlerArgs<T>;\n /**\n * The sentry span to associate the query with\n */\n span?: Span;\n}\n\n/**\n * Queries the remote device for the port that the remote database server is\n * listening on for requests.\n */\nasync function getRemoteDBServerPort(deviceIp: ip.Address4) {\n const conn = new PromiseSocket(new Socket());\n await conn.connect(REMOTEDB_SERVER_QUERY_PORT, deviceIp.address);\n\n // Magic request packet asking the device to report it's remoteDB port\n const data = Buffer.from([\n ...[0x00, 0x00, 0x00, 0x0f],\n ...Buffer.from('RemoteDBServer', 'ascii'),\n 0x00,\n ]);\n\n await conn.write(data);\n const resp = await conn.read();\n\n if (typeof resp !== 'object') {\n throw new Error('Invalid response from remotedb');\n }\n\n if (resp.length !== 2) {\n throw new Error(`Expected 2 bytes, got ${resp.length}`);\n }\n\n return resp.readUInt16BE();\n}\n\n/**\n * Manages a connection to a single device\n */\nexport class Connection {\n #socket: PromiseSocket<Socket>;\n #txId = 0;\n #lock = new Mutex();\n\n device: Device;\n\n constructor(device: Device, socket: PromiseSocket<Socket>) {\n this.#socket = socket;\n this.device = device;\n }\n\n async writeMessage(message: Message, span: Span) {\n const tx = span.startChild({\n op: 'writeMessage',\n description: getMessageName(message.type),\n });\n\n message.transactionId = ++this.#txId;\n await this.#socket.write(message.buffer);\n tx.finish();\n }\n\n readMessage<T extends Response>(expect: T, span: Span) {\n return this.#lock.runExclusive(() => Message.fromStream(this.#socket, expect, span));\n }\n\n close() {\n this.#socket.destroy();\n }\n}\n\nexport class QueryInterface {\n #conn: Connection;\n #hostDevice: Device;\n #lock: Mutex;\n\n constructor(conn: Connection, lock: Mutex, hostDevice: Device) {\n this.#conn = conn;\n this.#lock = lock;\n this.#hostDevice = hostDevice;\n }\n\n /**\n * Make a query to the remote database connection.\n */\n async query<T extends Query>(opts: QueryOpts<T>): Promise<Await<HandlerReturn<T>>> {\n const {query, queryDescriptor, args, span} = opts;\n const conn = this.#conn;\n\n const queryName = getQueryName(opts.query);\n\n const tx = span\n ? span.startChild({op: 'remoteQuery', description: queryName})\n : Telemetry.startTransaction({name: 'remoteQuery', description: queryName});\n\n const lookupDescriptor: LookupDescriptor = {\n ...queryDescriptor,\n hostDevice: this.#hostDevice,\n targetDevice: this.#conn.device,\n };\n\n // TODO: Figure out why typescirpt can't understand our query type discriminate\n // for args here. The interface for this actual query function discrimites just\n // fine.\n const anyArgs = args as any;\n\n const handler = queryHandlers[query];\n\n const releaseLock = await this.#lock.acquire();\n try {\n const response = await handler({conn, lookupDescriptor, span: tx, args: anyArgs});\n tx.finish();\n return response as Await<HandlerReturn<T>>;\n } finally {\n releaseLock();\n }\n }\n}\n\n/**\n * Service that maintains remote database connections with devices on the network.\n */\nexport default class RemoteDatabase {\n #hostDevice: Device;\n #deviceManager: DeviceManager;\n\n /**\n * Active device connection map\n */\n #connections = new Map<DeviceID, Connection>();\n /**\n * Locks for each device when locating the connection\n */\n #deviceLocks = new Map<DeviceID, Mutex>();\n\n constructor(deviceManager: DeviceManager, hostDevice: Device) {\n this.#deviceManager = deviceManager;\n this.#hostDevice = hostDevice;\n }\n\n /**\n * Open a connection to the specified device for querying\n */\n connectToDevice = async (device: Device) => {\n const tx = Telemetry.startTransaction({name: 'connectRemotedb', data: {device}});\n\n const {ip} = device;\n\n const dbPort = await getRemoteDBServerPort(ip);\n\n const socket = new PromiseSocket(new Socket());\n\n // Set a connection timeout to prevent hanging forever\n (socket.stream as Socket).setTimeout(10_000);\n (socket.stream as Socket).once('timeout', () => {\n (socket.stream as Socket).destroy(\n new Error(`RemoteDB connection to ${ip.address}:${dbPort} timed out`)\n );\n });\n\n await socket.connect(dbPort, ip.address);\n\n // Send required preamble to open communications with the device\n const preamble = new UInt32(0x01);\n await socket.write(preamble.buffer);\n\n // Read the response. It should be a UInt32 field with the value 0x01.\n // There is some kind of problem if not.\n const data = await readField(socket, UInt32.type);\n\n if (data.value !== 0x01) {\n throw new Error(`Expected 0x01 during preamble handshake. Got ${data.value}`);\n }\n\n // Send introduction message to set context for querying\n const intro = new Message({\n transactionId: 0xfffffffe,\n type: MessageType.Introduce,\n args: [new UInt32(this.#hostDevice.id)],\n });\n\n await socket.write(intro.buffer);\n const resp = await Message.fromStream(socket, MessageType.Success, tx);\n\n if (resp.type !== MessageType.Success) {\n throw new Error(`Failed to introduce self to device ID: ${device.id}`);\n }\n\n // Clear socket timeout after successful connection — the per-device mutex\n // and application-level Promise.race timeouts handle query timeouts\n (socket.stream as Socket).setTimeout(0);\n\n this.#connections.set(device.id, new Connection(device, socket));\n tx.finish();\n };\n\n /**\n * Disconnect from the specified device\n */\n disconnectFromDevice = async (device: Device) => {\n const tx = Telemetry.startTransaction({name: 'disconnectFromDevice', data: {device}});\n\n const conn = this.#connections.get(device.id);\n\n if (conn === undefined) {\n return;\n }\n\n const goodbye = new Message({\n transactionId: 0xfffffffe,\n type: MessageType.Disconnect,\n args: [],\n });\n\n await conn.writeMessage(goodbye, tx);\n\n conn.close();\n this.#connections.delete(device.id);\n tx.finish();\n };\n\n /**\n * Gets the remote database query interface for the given device.\n *\n * If we have not already established a connection with the specified device,\n * we will attempt to first connect.\n *\n * @returns null if the device does not export a remote database service\n */\n async get(deviceId: DeviceID) {\n const device = this.#deviceManager.devices.get(deviceId);\n if (device === undefined) {\n return null;\n }\n\n const lock =\n this.#deviceLocks.get(device.id) ??\n this.#deviceLocks.set(device.id, new Mutex()).get(device.id)!;\n\n const releaseLock = await lock.acquire();\n\n try {\n let conn = this.#connections.get(deviceId);\n if (conn === undefined) {\n await this.connectToDevice(device);\n }\n\n conn = this.#connections.get(deviceId)!;\n\n // NOTE: We pass the same lock we use for this device to the query\n // interface to ensure all query interfaces use the same lock.\n\n return new QueryInterface(conn, lock, this.#hostDevice);\n } finally {\n releaseLock();\n }\n }\n}\n","import {TelemetrySpan as Span, SpanStatus} from 'src/utils/telemetry';\nimport {PromiseReadable} from 'promise-readable';\n\nimport {REMOTEDB_MAGIC} from 'src/remotedb/constants';\nimport {\n Binary,\n Field,\n FieldType,\n readField,\n UInt8,\n UInt16,\n UInt32,\n} from 'src/remotedb/fields';\nimport {responseTransform} from 'src/remotedb/message/response';\nimport {getMessageName, MessageType, Response} from 'src/remotedb/message/types';\n\n/**\n * Argument types are used in argument list fields. This is essentially\n * duplicating the field type, but has different values for whatever reason.\n *\n * There do not appear to be argument types for UInt8 and UInt16. At least, no\n * messages include these field types as arguments as far as we know.\n */\nenum ArgumentType {\n String = 0x02,\n Binary = 0x03,\n UInt32 = 0x06,\n}\n\n/**\n * The message argument list always contains 12 slots\n */\nconst ARG_COUNT = 12;\n\nconst fieldArgsMap = {\n [FieldType.UInt32]: ArgumentType.UInt32,\n [FieldType.String]: ArgumentType.String,\n [FieldType.Binary]: ArgumentType.Binary,\n\n // The following two field types do not have associated argument types (see\n // the note in ArgumentType), but we declare them here to make typescript happy\n // when mapping these values over.\n [FieldType.UInt8]: 0x00,\n [FieldType.UInt16]: 0x00,\n};\n\nconst argsFieldMap = {\n [ArgumentType.UInt32]: FieldType.UInt32,\n [ArgumentType.String]: FieldType.String,\n [ArgumentType.Binary]: FieldType.Binary,\n};\n\ninterface Options<T extends MessageType> {\n transactionId?: number;\n type: T;\n args: Field[];\n}\n\ntype ResponseType<T> = T extends Response ? T : never;\ntype Data<T> = ReturnType<(typeof responseTransform)[ResponseType<T>]>;\n\n/**\n * Representation of a set of fields sequenced into a known message format.\n */\nexport class Message<T extends MessageType = MessageType> {\n /**\n * Read a single mesasge via a readable stream\n */\n static async fromStream<T extends Response>(\n stream: PromiseReadable<any>,\n expect: T,\n span: Span\n ) {\n const tx = span.startChild({\n op: 'readFromStream',\n description: getMessageName(expect),\n });\n\n // 01. Read magic bytes\n const magicHeader = await readField(stream, FieldType.UInt32);\n\n if (magicHeader.value !== REMOTEDB_MAGIC) {\n throw new Error('Did not receive expected magic value. Corrupt message');\n }\n\n // 02. Read transaction ID\n const txId = await readField(stream, FieldType.UInt32);\n\n // 03. Read message type\n const messageType = await readField(stream, FieldType.UInt16);\n\n // 04. Read argument count\n const argCount = await readField(stream, FieldType.UInt8);\n\n // 05. Read argument list\n const argList = await readField(stream, FieldType.Binary);\n\n // 06. Read all argument fields in\n const args: Field[] = new Array(argCount.value);\n\n for (let i = 0; i < argCount.value; ++i) {\n // XXX: There is a small quirk in a few message response types that send\n // binary data, but if the binary data is empty the field will not\n // be sent.\n if (argList.value[i] === ArgumentType.Binary && args[i - 1]?.value === 0) {\n args[i] = new Binary(Buffer.alloc(0));\n continue;\n }\n\n args[i] = await readField(stream, argsFieldMap[argList.value[i] as ArgumentType]);\n }\n\n if (messageType.value !== expect) {\n const expected = expect.toString(16);\n const actual = messageType.value.toString(16);\n\n tx.setStatus(SpanStatus.FailedPrecondition);\n tx.finish();\n\n throw new Error(`Expected message type 0x${expected}, got 0x${actual}`);\n }\n\n tx.finish();\n\n return new Message({\n transactionId: txId.value,\n type: messageType.value as T,\n args,\n });\n }\n\n /**\n * The transaction ID is used to associate responses to their requests.\n */\n transactionId?: number;\n\n readonly type: T;\n readonly args: Field[];\n\n constructor({transactionId, type, args}: Options<T>) {\n this.transactionId = transactionId;\n this.type = type;\n this.args = args;\n }\n\n /**\n * The byte serialization of the message\n */\n get buffer() {\n // Determine the argument list from the list of fields\n const argList = Buffer.alloc(ARG_COUNT, 0x00);\n argList.set(this.args.map(arg => fieldArgsMap[arg.constructor.type]));\n\n // XXX: Following the parsing quirk for messages that contain binary data\n // but are _empty_, we check for binary fields with UInt32 fields\n // before with the value of 0 (indicating \"an empty binary field\").\n const args = this.args.reduce<Field[]>((args, arg, i) => {\n const prevArg = this.args[i - 1];\n\n const isEmptyBuffer =\n arg.constructor.type === FieldType.Binary &&\n i !== 0 &&\n prevArg.constructor.type === FieldType.UInt32 &&\n prevArg.value === 0;\n\n return isEmptyBuffer ? args : [...args, arg];\n }, []);\n\n const fields = [\n new UInt32(REMOTEDB_MAGIC),\n new UInt32(this.transactionId ?? 0),\n new UInt16(this.type),\n new UInt8(this.args.length),\n new Binary(argList),\n ...args,\n ];\n\n return Buffer.concat(fields.map(f => f.buffer));\n }\n\n /**\n * The JS representation of the message.\n *\n * Currently only supports representing response messages.\n */\n get data(): Data<T> {\n const type = this.type as ResponseType<T>;\n\n if (!Object.values(Response).includes(type)) {\n throw new Error('Representation of non-responses is not currently supported');\n }\n\n return responseTransform[type](this.args) as Data<T>;\n }\n}\n","import * as Telemetry from 'src/utils/telemetry';\n\nimport {Field, NumberField, StringField} from 'src/remotedb/fields';\n\n/**\n * Item types associated to the MenuItem message type.\n */\nexport enum ItemType {\n Path = 0x0000,\n Folder = 0x0001,\n AlbumTitle = 0x0002,\n Disc = 0x0003,\n TrackTitle = 0x0004,\n Genre = 0x0006,\n Artist = 0x0007,\n Playlist = 0x0008,\n Rating = 0x000a,\n Duration = 0x000b,\n Tempo = 0x000d,\n Label = 0x000e,\n Key = 0x000f,\n BitRate = 0x0010,\n Year = 0x0011,\n Comment = 0x0023,\n HistoryPlaylist = 0x0024,\n OriginalArtist = 0x0028,\n Remixer = 0x0029,\n DateAdded = 0x002e,\n Unknown01 = 0x002f,\n Unknown02 = 0x002a,\n\n ColorNone = 0x0013,\n ColorPink = 0x0014,\n ColorRed = 0x0015,\n ColorOrange = 0x0016,\n ColorYellow = 0x0017,\n ColorGreen = 0x0018,\n ColorAqua = 0x0019,\n ColorBlue = 0x001a,\n ColorPurple = 0x001b,\n\n MenuGenre = 0x0080,\n MenuArtist = 0x0081,\n MenuAlbum = 0x0082,\n MenuTrack = 0x0083,\n MenuPlaylist = 0x0084,\n MenuBPM = 0x0085,\n MenuRating = 0x0086,\n MenuYear = 0x0087,\n MenuRemixer = 0x0088,\n MenuLabel = 0x0089,\n MenuOriginal = 0x008a,\n MenuKey = 0x008b,\n MenuColor = 0x008e,\n MenuFolder = 0x0090,\n MenuSearch = 0x0091,\n MenuTime = 0x0092,\n MenuBit = 0x0093,\n MenuFilename = 0x0094,\n MenuHistory = 0x0095,\n MenuAll = 0x00a0,\n\n TrackTitleAlbum = 0x0204,\n TrackTitleGenre = 0x0604,\n TrackTitleArtist = 0x0704,\n TrackTitleRating = 0x0a04,\n TrackTitleTime = 0x0b04,\n TrackTitleBPM = 0x0d04,\n TrackTitleLabel = 0x0e04,\n TrackTitleKey = 0x0f04,\n TrackTitleBitRate = 0x1004,\n TrackTitleColor = 0x1a04,\n TrackTitleComment = 0x2304,\n TrackTitleOriginalArtist = 0x2804,\n TrackTitleRemixer = 0x2904,\n TrackTitleDJPlayCount = 0x2a04,\n MenuTrackTitleDateAdded = 0x2e04,\n}\n\n/**\n * All items have 12 arguments of these types\n */\ntype ItemArgs = [\n NumberField, // Parent ID, such as an artist for a track item.\n NumberField, // Main ID, such as rekordbox for a track item.\n NumberField, // Length in bytes of Label 1.\n StringField, // Label 1 main text\n NumberField, // Length in bytes of Label 2.\n StringField, // Label 2 (secondary text, e.g. artist name for playlist entries)\n NumberField<ItemType>,\n NumberField, // Some type of flags\n NumberField, // Only holds artwork ID?\n NumberField,\n NumberField,\n NumberField,\n];\n\n/**\n * Convert a message item argument lists to a structured intermediate object\n * for more clear access.\n */\nconst makeItemData = (args: ItemArgs) => ({\n parentId: args[0].value,\n mainId: args[1].value,\n label1: args[3].value,\n label2: args[5].value,\n type: args[6].value,\n artworkId: args[8].value,\n});\n\ntype ItemData = ReturnType<typeof makeItemData>;\n\n/**\n * Generic transformer for items that include just an id and label\n */\nconst mapIdName = (a: ItemData) => ({\n id: a.mainId,\n name: a.label1,\n});\n\n/**\n * Maps item types to structured objects\n */\nconst transformItem = {\n [ItemType.Path]: (a: ItemData) => ({path: a.label1}),\n [ItemType.TrackTitle]: (a: ItemData) => ({\n id: a.mainId,\n title: a.label1,\n artworkId: a.artworkId,\n }),\n [ItemType.AlbumTitle]: mapIdName,\n [ItemType.Artist]: mapIdName,\n [ItemType.Genre]: mapIdName,\n [ItemType.Label]: mapIdName,\n [ItemType.Key]: mapIdName,\n [ItemType.OriginalArtist]: mapIdName,\n [ItemType.Remixer]: mapIdName,\n [ItemType.BitRate]: (a: ItemData) => ({bitrate: a.mainId}),\n [ItemType.Comment]: (a: ItemData) => ({comment: a.label1}),\n [ItemType.Year]: (a: ItemData) => ({year: Number(a.label1)}),\n [ItemType.Rating]: (a: ItemData) => ({rating: a.mainId}),\n [ItemType.Tempo]: (a: ItemData) => ({bpm: a.mainId / 100}),\n [ItemType.Duration]: (a: ItemData) => ({duration: a.mainId}),\n [ItemType.Unknown01]: (_: ItemData) => null,\n [ItemType.Unknown02]: (_: ItemData) => null,\n\n [ItemType.ColorNone]: mapIdName,\n [ItemType.ColorPink]: mapIdName,\n [ItemType.ColorRed]: mapIdName,\n [ItemType.ColorOrange]: mapIdName,\n [ItemType.ColorYellow]: mapIdName,\n [ItemType.ColorGreen]: mapIdName,\n [ItemType.ColorAqua]: mapIdName,\n [ItemType.ColorBlue]: mapIdName,\n [ItemType.ColorPurple]: mapIdName,\n\n [ItemType.Folder]: mapIdName,\n [ItemType.Playlist]: mapIdName,\n\n // TODO: All of these item types are missing\n [ItemType.Disc]: (a: ItemData) => a,\n\n [ItemType.HistoryPlaylist]: (a: ItemData) => a,\n [ItemType.DateAdded]: (a: ItemData) => a,\n [ItemType.MenuGenre]: (a: ItemData) => a,\n [ItemType.MenuArtist]: (a: ItemData) => a,\n [ItemType.MenuAlbum]: (a: ItemData) => a,\n [ItemType.MenuTrack]: (a: ItemData) => a,\n [ItemType.MenuPlaylist]: (a: ItemData) => a,\n [ItemType.MenuBPM]: (a: ItemData) => a,\n [ItemType.MenuRating]: (a: ItemData) => a,\n [ItemType.MenuYear]: (a: ItemData) => a,\n [ItemType.MenuRemixer]: (a: ItemData) => a,\n [ItemType.MenuLabel]: (a: ItemData) => a,\n [ItemType.MenuOriginal]: (a: ItemData) => a,\n [ItemType.MenuKey]: (a: ItemData) => a,\n [ItemType.MenuColor]: (a: ItemData) => a,\n [ItemType.MenuFolder]: (a: ItemData) => a,\n [ItemType.MenuSearch]: (a: ItemData) => a,\n [ItemType.MenuTime]: (a: ItemData) => a,\n [ItemType.MenuBit]: (a: ItemData) => a,\n [ItemType.MenuFilename]: (a: ItemData) => a,\n [ItemType.MenuHistory]: (a: ItemData) => a,\n [ItemType.MenuAll]: (a: ItemData) => a,\n [ItemType.TrackTitleAlbum]: (a: ItemData) => a,\n [ItemType.TrackTitleGenre]: (a: ItemData) => a,\n [ItemType.TrackTitleArtist]: (a: ItemData) => a,\n [ItemType.TrackTitleRating]: (a: ItemData) => a,\n [ItemType.TrackTitleTime]: (a: ItemData) => a,\n [ItemType.TrackTitleBPM]: (a: ItemData) => a,\n [ItemType.TrackTitleLabel]: (a: ItemData) => a,\n [ItemType.TrackTitleKey]: (a: ItemData) => a,\n [ItemType.TrackTitleBitRate]: (a: ItemData) => a,\n [ItemType.TrackTitleColor]: (a: ItemData) => a,\n [ItemType.TrackTitleComment]: (a: ItemData) => a,\n [ItemType.TrackTitleOriginalArtist]: (a: ItemData) => a,\n [ItemType.TrackTitleRemixer]: (a: ItemData) => a,\n [ItemType.TrackTitleDJPlayCount]: (a: ItemData) => a,\n [ItemType.MenuTrackTitleDateAdded]: (a: ItemData) => a,\n};\n\n/**\n * Represents a generic Item, specialized to a specific item by providing a\n * ItemType to the template.\n */\nexport type Item<T extends ItemType> = ReturnType<(typeof transformItem)[T]> & {type: T};\n\n/**\n * Maps ItemTypes to Items\n */\nexport type Items = {\n [T in keyof typeof transformItem]: Item<T>;\n};\n\n/**\n * Translate a list of fields for an item response into a structure object,\n * making items more clear to work with.\n */\nexport const fieldsToItem = (args: Field[]) => {\n const itemData = makeItemData(args as ItemArgs);\n const {type} = itemData;\n\n let transformer = transformItem[type];\n\n // Typescript gives us safety, but it is possible there is an itemType we're\n // not aware of yet.\n if (transformer === undefined) {\n transformer = () => null;\n\n Telemetry.captureMessage(\n `No item transformer registered for item type ${type}`,\n Telemetry.Severity.Error\n );\n }\n\n return {...transformer(itemData), type} as Items[ItemType];\n};\n","import {makeCueLoopEntry} from 'src/localdb/utils';\nimport {Field} from 'src/remotedb/fields';\nimport {fieldsToItem} from 'src/remotedb/message/item';\nimport {Response} from 'src/remotedb/message/types';\nimport {\n BeatGrid,\n CueAndLoop,\n HotcueButton,\n WaveformDetailed,\n WaveformHD,\n WaveformPreview,\n} from 'src/types';\nimport {\n convertWaveformHDData,\n extractBitMask,\n extractColor,\n makeOffsetArray,\n} from 'src/utils/converters';\n\n/**\n * Generic null converter, for responses with no data.\n */\nconst nullConverter = (_args: Field[]) => null;\n\n/**\n * Converts setup success messages, which primarily includes the number of\n * items available upon the next request.\n */\nconst convertSuccess = (args: Field[]) => ({\n itemsAvailable: args[1].value as number,\n});\n\n/**\n * Converts artwork to a buffer. Will be mempty for empty artwork\n */\nconst convertArtwork = (args: Field[]) => args[3].value as Buffer;\n\n/**\n * Converts the beat grid binary response to a BeatGrid array.\n */\nconst convertBeatGrid = (args: Field[]): BeatGrid => {\n const BEATGRID_START = 0x14;\n const data = (args[3].value as Buffer).slice(BEATGRID_START);\n\n type Count = BeatGrid[number]['count'];\n\n return makeOffsetArray(data.length, 0x10).map(byteOffset => ({\n offset: data.readUInt32LE(byteOffset + 4),\n bpm: data.readUInt16LE(byteOffset + 2) / 100,\n count: data[byteOffset] as Count,\n }));\n};\n\n/**\n * Converts preview waveform data\n */\nconst convertWaveformPreview = (args: Field[]): WaveformPreview => {\n const data = args[3].value as Buffer;\n\n // TODO: The last 100 bytes in the data array is a tiny waveform preview\n const PREVIEW_DATA_LEN = 800;\n\n return makeOffsetArray(PREVIEW_DATA_LEN, 0x02).map(byteOffset => ({\n height: data[byteOffset],\n whiteness: data[byteOffset + 1] / 7,\n }));\n};\n\n/**\n * Converts detailed waveform data.\n */\nconst convertWaveformDetailed = (args: Field[]): WaveformDetailed => {\n const data = args[3].value as Buffer;\n\n // Every byte represents one segment of the waveform, and there are 150\n // segments per second of audio. (These seem to correspond to 'half frames'\n // following the seconds in the player display.) Each byte encodes both a\n // color and height.\n //\n // | 7 6 5 | 4 3 2 1 0 |\n // [ whiteness | height ]\n const whitenessMask = 0b11100000; // prettier-ignore\n const heightMask = 0b00011111; // prettier-ignore\n\n return Array.from(data).map(b => ({\n height: extractBitMask(b, heightMask),\n whiteness: extractColor(b, whitenessMask),\n }));\n};\n\n/**\n * Converts HD waveform data.\n */\nconst convertWaveformHD = (args: Field[]): WaveformHD => {\n // TODO: Verify this 0x34 offset is correct\n const WAVEFORM_START = 0x34;\n const data = (args[3].value as Buffer).slice(WAVEFORM_START);\n\n // TODO: This response is also used for the HD waveform previews, however\n // those have a much more complex data structure.\n\n return convertWaveformHDData(data);\n};\n\n/**\n * Converts old-style cue / loop / hotcue / hotloop data.\n */\nconst convertCueAndLoops = (args: Field[]): CueAndLoop[] => {\n const data = args[3].value as Buffer;\n\n return makeOffsetArray(data.length, 0x24)\n .map(byteOffset => {\n const entry = data.slice(byteOffset, byteOffset + 0x24);\n\n const isLoop = !!entry[0];\n const isCue = !!entry[1];\n const button = entry[2] === 0 ? false : (entry[2] as HotcueButton);\n\n const offsetInFrames = entry.readUInt32LE(0x0c);\n const lengthInFrames = entry.readUInt32LE(0x10) - offsetInFrames;\n\n // NOTE: The offset and length are reported as 1/150th second increments.\n // We convert these to milliseconds here.\n const offset = (offsetInFrames / 150) * 1000;\n const length = (lengthInFrames / 150) * 1000;\n\n return makeCueLoopEntry(isCue, isLoop, offset, length, button);\n })\n .filter((c): c is CueAndLoop => c !== null);\n};\n\n/**\n * Converts new-style cue / loop / hotcue / hotloop data, including labels and\n * colors.\n */\nconst convertAdvCueAndLoops = (args: Field[]): CueAndLoop[] => {\n const data = args[3].value as Buffer;\n const entries = [];\n\n for (let offset = 0; offset < data.length; ) {\n const length = data.readUInt32LE(offset);\n entries.push(data.slice(offset, offset + length));\n offset += length;\n }\n\n return entries\n .map(entry => {\n // Deleted cue point\n if (entry[6] === 0x00) {\n return null;\n }\n\n // The layout here is minorly different from the basic cue and loops,\n // so we unfortunately cannot reuse that logic.\n const button = entry[4] === 0 ? false : (entry[4] as HotcueButton);\n const isCue = entry[6] === 0x01;\n const isLoop = entry[6] === 0x02;\n\n const offsetInFrames = entry.readUInt32LE(0x0c);\n const lengthInFrames = entry.readUInt32LE(0x10) - offsetInFrames;\n\n // NOTE: The offset and length are reported as 1/150th second increments.\n // We convert these to milliseconds here.\n const offset = (offsetInFrames / 150) * 1000;\n const length = (lengthInFrames / 150) * 1000;\n\n const basicEntry = makeCueLoopEntry(isCue, isLoop, offset, length, button);\n\n // It seems the label may not always be included, if the entry is only 0x38\n // bytes long, exclude color and comment\n if (entry.length === 0x38) {\n return basicEntry;\n }\n\n const labelByteLength = entry.readUInt16LE(0x48);\n const label = entry\n .slice(0x4a, 0x4a + labelByteLength)\n .slice(0, -2)\n .toString('utf16le');\n\n const color = entry[0x4a + labelByteLength + 0x04];\n\n return {...basicEntry, color, label};\n })\n .filter((c): c is CueAndLoop => c !== null);\n};\n\nexport const responseTransform = {\n [Response.Success]: convertSuccess,\n [Response.Error]: nullConverter,\n [Response.MenuHeader]: nullConverter,\n [Response.MenuFooter]: nullConverter,\n\n [Response.MenuItem]: fieldsToItem,\n [Response.Artwork]: convertArtwork,\n [Response.BeatGrid]: convertBeatGrid,\n [Response.CueAndLoop]: convertCueAndLoops,\n [Response.WaveformPreview]: convertWaveformPreview,\n [Response.WaveformDetailed]: convertWaveformDetailed,\n [Response.WaveformHD]: convertWaveformHD,\n [Response.AdvCueAndLoops]: convertAdvCueAndLoops,\n} as const;\n","/**\n * Used for control messages with the remote database\n */\nexport enum ControlRequest {\n Introduce = 0x0000,\n Disconnect = 0x0100,\n RenderMenu = 0x3000,\n}\n\n/**\n * Used to setup renders for specific Menus\n */\nexport enum MenuRequest {\n MenuRoot = 0x1000,\n MenuGenre = 0x1001,\n MenuArtist = 0x1002,\n MenuAlbum = 0x1003,\n MenuTrack = 0x1004,\n MenuBPM = 0x1006,\n MenuRating = 0x1007,\n MenuYear = 0x1008,\n MenuLabel = 0x100a,\n MenuColor = 0x100d,\n MenuTime = 0x1010,\n MenuBitrate = 0x1011,\n MenuHistory = 0x1012,\n MenuFilename = 0x1013,\n MenuKey = 0x1014,\n MenuOriginalArtist = 0x1302,\n MenuRemixer = 0x1602,\n MenuPlaylist = 0x1105,\n MenuArtistsOfGenre = 0x1101,\n MenuAlbumsOfArtist = 0x1102,\n MenuTracksOfAlbum = 0x1103,\n MenuTracksOfRating = 0x1107,\n MenuYearsOfDecade = 0x1108,\n MenuArtistsOfLabel = 0x110a,\n MenuTracksOfColor = 0x110d,\n MenuTracksOfTime = 0x1110,\n MenuTracksOfHistory = 0x1112,\n MenuDistancesOfKey = 0x1114,\n MenuAlbumsOfOriginalArtist = 0x1402,\n MenuAlbumsOfRemixer = 0x1702,\n MenuAlbumsOfGenreAndArtist = 0x1201,\n MenuTracksOfArtistAndAlbum = 0x1202,\n MenuTracksOfBPMPercentRange = 0x1206,\n MenuTracksOfDecadeAndYear = 0x1208,\n MenuAlbumsOfLabelAndArtist = 0x120a,\n MenuTracksNearKey = 0x1214,\n MenuTracksOfOriginalArtistAndAlbum = 0x1502,\n MenuTracksOfRemixerAndAlbum = 0x1802,\n MenuTracksOfGenreArtistAndAlbum = 0x1301,\n MenuTracksOfLabelArtistAndAlbum = 0x130a,\n MenuSearch = 0x1300,\n MenuFolder = 0x2006,\n}\n\n/**\n * Request message types used to obtain specfiic track information\n */\nexport enum DataRequest {\n GetMetadata = 0x2002,\n GetArtwork = 0x2003,\n GetWaveformPreview = 0x2004,\n GetTrackInfo = 0x2102,\n GetGenericMetadata = 0x2202,\n GetCueAndLoops = 0x2104,\n GetBeatGrid = 0x2204,\n GetWaveformDetailed = 0x2904,\n GetAdvCueAndLoops = 0x2b04,\n GetWaveformHD = 0x2c04,\n}\n\n/**\n * Response message types for messages sent back by the server.\n */\nexport enum Response {\n Success = 0x4000,\n Error = 0x4003,\n Artwork = 0x4002,\n MenuItem = 0x4101,\n MenuHeader = 0x4001,\n MenuFooter = 0x4201,\n BeatGrid = 0x4602,\n CueAndLoop = 0x4702,\n WaveformPreview = 0x4402,\n WaveformDetailed = 0x4a02,\n AdvCueAndLoops = 0x4e02,\n WaveformHD = 0x4f02,\n}\n\n/**\n * Request message types, only sent to the device.\n */\nexport type Request = ControlRequest | MenuRequest | DataRequest;\n\nexport const Request = {\n ...ControlRequest,\n ...MenuRequest,\n ...DataRequest,\n} as const;\n\n/**\n * All Known message types. These are used for both request and response messages.\n */\nexport type MessageType = ControlRequest | MenuRequest | DataRequest | Response;\n\nexport const MessageType = {\n ...ControlRequest,\n ...MenuRequest,\n ...DataRequest,\n ...Response,\n} as const;\n\nconst MessageTypeInverse = Object.fromEntries(\n Object.entries(MessageType).map(e => [e[1], e[0]])\n);\n\n/**\n * Returns a string representation of a message type\n */\nexport function getMessageName(type: MessageType) {\n return MessageTypeInverse[type];\n}\n","import * as entities from 'src/entities';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\n\nimport {Item, Items, ItemType} from './message/item';\nimport {Request, Response} from './message/types';\nimport {Binary, UInt32} from './fields';\nimport {Message} from './message';\nimport {fieldFromDescriptor, findColor, renderItems} from './utils';\nimport {Connection, LookupDescriptor, Query} from '.';\n\n/**\n * This module contains logic for each type of query to understand what\n * arguments are required, and how to transform the resulting Items into\n * something useful.\n */\n\ninterface HandlerOpts<A extends Record<string, unknown> = Record<string, unknown>> {\n conn: Connection;\n lookupDescriptor: LookupDescriptor;\n span: Span;\n args: A;\n}\n\n// Track lookups are so common that we specify an alias specifically for track\n// lookup query options.\n\ntype TrackQueryOpts = HandlerOpts<{\n /**\n * The ID of the track to query for\n */\n trackId: number;\n}>;\n\n/**\n * Lookup track metadata from rekordbox and coerce it into a Track entity\n */\nasync function getMetadata(opts: TrackQueryOpts) {\n const {conn, lookupDescriptor, span, args} = opts;\n const {trackId} = args;\n\n const request = new Message({\n type: Request.GetMetadata,\n args: [fieldFromDescriptor(lookupDescriptor), new UInt32(trackId)],\n });\n\n await conn.writeMessage(request, span);\n const resp = await conn.readMessage(Response.Success, span);\n\n // We'll get back these specific items when rendering out the items\n //\n // NOTE: We actually also get back a color, but we'll find that one later,\n // since each color is it's own item type.\n type MetadataItems =\n | ItemType.AlbumTitle\n | ItemType.TrackTitle\n | ItemType.Genre\n | ItemType.Artist\n | ItemType.Rating\n | ItemType.Duration\n | ItemType.Tempo\n | ItemType.Label\n | ItemType.Key\n | ItemType.Comment\n | ItemType.BitRate\n | ItemType.Remixer\n | ItemType.Year\n | ItemType.OriginalArtist;\n\n const items = renderItems<MetadataItems>(\n conn,\n lookupDescriptor,\n resp.data.itemsAvailable,\n span\n );\n\n // NOTE: We do a bit of any-ing here to help typescript understand we're\n // discriminating the type by our object key\n const trackItems: Pick<Items, MetadataItems> = {} as any;\n for await (const item of items) {\n trackItems[item.type] = item as any;\n }\n\n // Translate our trackItems into a (partial) Track entity.\n // Use optional chaining for all fields since streaming tracks may omit some.\n const track: entities.Track = {\n id: trackItems[ItemType.TrackTitle]?.id ?? 0,\n title: trackItems[ItemType.TrackTitle]?.title ?? '',\n duration: trackItems[ItemType.Duration]?.duration ?? 0,\n tempo: trackItems[ItemType.Tempo]?.bpm ?? 0,\n comment: trackItems[ItemType.Comment]?.comment ?? '',\n rating: trackItems[ItemType.Rating]?.rating ?? 0,\n year: trackItems?.[ItemType.Year]?.year,\n bitrate: trackItems?.[ItemType.BitRate]?.bitrate,\n\n artwork: {id: trackItems[ItemType.TrackTitle]?.artworkId ?? 0},\n album: trackItems[ItemType.AlbumTitle] ?? null,\n artist: trackItems[ItemType.Artist] ?? null,\n genre: trackItems[ItemType.Genre] ?? null,\n key: trackItems[ItemType.Key] ?? null,\n color: findColor(Object.values(trackItems)) ?? null,\n label: trackItems[ItemType.Label] ?? null,\n remixer: trackItems?.[ItemType.Remixer] ?? null,\n originalArtist: trackItems?.[ItemType.OriginalArtist] ?? null,\n composer: null,\n\n fileName: '',\n filePath: '',\n\n beatGrid: null,\n cueAndLoops: null,\n waveformHd: null,\n };\n\n return track;\n}\n\n/**\n * Lookup generic metadata for an unanalyzed track\n */\nasync function getGenericMetadata(opts: TrackQueryOpts) {\n const {conn, lookupDescriptor, span, args} = opts;\n const {trackId} = args;\n\n const request = new Message({\n type: Request.GetGenericMetadata,\n args: [fieldFromDescriptor(lookupDescriptor), new UInt32(trackId)],\n });\n\n await conn.writeMessage(request, span);\n const resp = await conn.readMessage(Response.Success, span);\n\n // NOTE: We actually also get back a color, but we'll find that one later,\n // since each color is it's own item type.\n type GenericMetadataItems =\n | ItemType.AlbumTitle\n | ItemType.TrackTitle\n | ItemType.Genre\n | ItemType.Artist\n | ItemType.Rating\n | ItemType.Duration\n | ItemType.Tempo\n | ItemType.BitRate\n | ItemType.Comment;\n\n const items = renderItems<GenericMetadataItems>(\n conn,\n lookupDescriptor,\n resp.data.itemsAvailable,\n span\n );\n\n // NOTE: We do a bit of any-ing here to help typescript understand we're\n // discriminating the type by our object key\n const fileItems: Pick<Items, GenericMetadataItems> = {} as any;\n for await (const item of items) {\n fileItems[item.type] = item as any;\n }\n\n // Translate our fileItems into a (partial) Track entity.\n const track: entities.Track = {\n id: fileItems[ItemType.TrackTitle].id,\n title: fileItems[ItemType.TrackTitle].title,\n duration: fileItems[ItemType.Duration].duration,\n tempo: fileItems[ItemType.Tempo].bpm,\n comment: fileItems[ItemType.Comment].comment,\n rating: fileItems[ItemType.Rating].rating,\n bitrate: fileItems[ItemType.BitRate].bitrate,\n\n artwork: {id: fileItems[ItemType.TrackTitle].artworkId},\n album: fileItems?.[ItemType.AlbumTitle],\n artist: fileItems[ItemType.Artist],\n genre: fileItems[ItemType.Genre],\n color: findColor(Object.values(fileItems))!,\n\n fileName: '',\n filePath: '',\n\n key: null,\n label: null,\n remixer: null,\n originalArtist: null,\n composer: null,\n\n beatGrid: null,\n cueAndLoops: null,\n waveformHd: null,\n };\n\n return track;\n}\n\n/**\n * Lookup the artwork image given the artworkId obtained from a track\n */\nasync function getArtwork(opts: HandlerOpts<{artworkId: number}>) {\n const {conn, lookupDescriptor, span, args} = opts;\n const {artworkId} = args;\n\n const request = new Message({\n type: Request.GetArtwork,\n args: [fieldFromDescriptor(lookupDescriptor), new UInt32(artworkId)],\n });\n\n await conn.writeMessage(request, span);\n const art = await conn.readMessage(Response.Artwork, span);\n\n return art.data;\n}\n\n/**\n * Lookup the beatgrid for the specified trackId\n */\nasync function getBeatgrid(opts: TrackQueryOpts) {\n const {conn, lookupDescriptor, span, args} = opts;\n const {trackId} = args;\n\n const request = new Message({\n type: Request.GetBeatGrid,\n args: [fieldFromDescriptor(lookupDescriptor), new UInt32(trackId)],\n });\n\n await conn.writeMessage(request, span);\n const grid = await conn.readMessage(Response.BeatGrid, span);\n\n return grid.data;\n}\n\n/**\n * Lookup the waveform preview for the specified trackId\n */\nasync function getWaveformPreview(opts: TrackQueryOpts) {\n const {conn, lookupDescriptor, span, args} = opts;\n const {trackId} = args;\n\n const request = new Message({\n type: Request.GetWaveformPreview,\n args: [\n fieldFromDescriptor(lookupDescriptor),\n new UInt32(0),\n new UInt32(trackId),\n new UInt32(0),\n new Binary(Buffer.alloc(0)),\n ],\n });\n\n await conn.writeMessage(request, span);\n const waveformPreview = await conn.readMessage(Response.WaveformPreview, span);\n\n return waveformPreview.data;\n}\n\n/**\n * Lookup the detailed waveform for the specified trackId\n */\nasync function getWaveformDetailed(opts: TrackQueryOpts) {\n const {conn, lookupDescriptor, span, args} = opts;\n const {trackId} = args;\n\n const request = new Message({\n type: Request.GetWaveformDetailed,\n args: [fieldFromDescriptor(lookupDescriptor), new UInt32(trackId), new UInt32(0)],\n });\n\n await conn.writeMessage(request, span);\n const waveformDetailed = await conn.readMessage(Response.WaveformDetailed, span);\n\n return waveformDetailed.data;\n}\n\n/**\n * Lookup the HD (nexus2) waveform for the specified trackId\n */\nasync function getWaveformHD(opts: TrackQueryOpts) {\n const {conn, lookupDescriptor, span, args} = opts;\n const {trackId} = args;\n\n const request = new Message({\n type: Request.GetWaveformHD,\n args: [\n fieldFromDescriptor(lookupDescriptor),\n new UInt32(trackId),\n new UInt32(Buffer.from('PWV5').readUInt32LE()),\n new UInt32(Buffer.from('EXT\\0').readUInt32LE()),\n ],\n });\n\n await conn.writeMessage(request, span);\n const waveformHD = await conn.readMessage(Response.WaveformHD, span);\n\n return waveformHD.data;\n}\n\n/**\n * Lookup the [hot]cue points and [hot]loops for a track\n */\nasync function getCueAndLoops(opts: TrackQueryOpts) {\n const {conn, lookupDescriptor, span, args} = opts;\n const {trackId} = args;\n\n const request = new Message({\n type: Request.GetCueAndLoops,\n args: [fieldFromDescriptor(lookupDescriptor), new UInt32(trackId)],\n });\n\n await conn.writeMessage(request, span);\n const cueAndLoops = await conn.readMessage(Response.CueAndLoop, span);\n\n return cueAndLoops.data;\n}\n\n/**\n * Lookup the \"advanced\" (nexus2) [hot]cue points and [hot]loops for a track\n */\nasync function getCueAndLoopsAdv(opts: TrackQueryOpts) {\n const {conn, lookupDescriptor, span, args} = opts;\n const {trackId} = args;\n\n const request = new Message({\n type: Request.GetAdvCueAndLoops,\n args: [fieldFromDescriptor(lookupDescriptor), new UInt32(trackId), new UInt32(0)],\n });\n\n await conn.writeMessage(request, span);\n const advCueAndLoops = await conn.readMessage(Response.AdvCueAndLoops, span);\n\n return advCueAndLoops.data;\n}\n\n/**\n * Lookup the track information, currently just returns the track path\n */\nasync function getTrackInfo(opts: TrackQueryOpts) {\n const {conn, lookupDescriptor, span, args} = opts;\n const {trackId} = args;\n\n const request = new Message({\n type: Request.GetTrackInfo,\n args: [fieldFromDescriptor(lookupDescriptor), new UInt32(trackId)],\n });\n\n await conn.writeMessage(request, span);\n const resp = await conn.readMessage(Response.Success, span);\n\n type TrackInfoItems =\n | ItemType.TrackTitle\n | ItemType.Path\n | ItemType.Duration\n | ItemType.Tempo\n | ItemType.Comment\n | ItemType.Unknown01;\n\n const items = renderItems<TrackInfoItems>(\n conn,\n lookupDescriptor,\n resp.data.itemsAvailable,\n span\n );\n\n const infoItems: Pick<Items, TrackInfoItems> = {} as any;\n for await (const item of items) {\n infoItems[item.type] = item as any;\n }\n\n return infoItems[ItemType.Path].path;\n}\n\ntype PlaylistQueryOpts = HandlerOpts<{\n /**\n * The ID of the playlist to query for. May be left blank to query the root\n * playlist folder.\n */\n id?: number;\n /**\n * When querying for a playlist folder this must be true.\n */\n isFolderRequest: boolean;\n}>;\n\n/**\n * Lookup playlist entries\n */\nasync function getPlaylist(opts: PlaylistQueryOpts) {\n const {conn, lookupDescriptor, span, args} = opts;\n\n // XXX: The or operator is correct here to coerece `0` into null to keep a\n // consistent representation of parentId.\n const parentId = args.id || null;\n\n // TODO: Maybe sort could become a parameter\n const sort = new UInt32(0);\n const id = new UInt32(parentId ?? 0);\n const isFolder = new UInt32(args.isFolderRequest ? 0x1 : 0x0);\n\n const request = new Message({\n type: Request.MenuPlaylist,\n args: [fieldFromDescriptor(lookupDescriptor), sort, id, isFolder],\n });\n\n await conn.writeMessage(request, span);\n const resp = await conn.readMessage(Response.Success, span);\n\n type PlaylistItemTypes = ItemType.Folder | ItemType.Playlist | ItemType.TrackTitle;\n\n const items = renderItems<PlaylistItemTypes>(\n conn,\n lookupDescriptor,\n resp.data.itemsAvailable,\n span\n );\n\n const playlistItems: Array<Item<PlaylistItemTypes>> = [];\n for await (const item of items) {\n playlistItems.push(item);\n }\n\n const folders: entities.Playlist[] = (playlistItems as Array<Item<ItemType.Folder>>)\n .filter(item => item.type === ItemType.Folder)\n .map(({id, name}) => ({isFolder: true, id, name, parentId}));\n\n const playlists: entities.Playlist[] = (playlistItems as Array<Item<ItemType.Playlist>>)\n .filter(item => item.type === ItemType.Playlist)\n .map(({id, name}) => ({isFolder: false, id, name, parentId}));\n\n const trackEntries = (playlistItems as Array<Item<ItemType.TrackTitle>>).filter(\n item => item.type === ItemType.TrackTitle\n );\n\n return {folders, playlists, trackEntries};\n}\n\nexport const queryHandlers = {\n [Request.GetMetadata]: getMetadata,\n [Request.GetArtwork]: getArtwork,\n [Request.GetWaveformPreview]: getWaveformPreview,\n [Request.GetTrackInfo]: getTrackInfo,\n [Request.GetGenericMetadata]: getGenericMetadata,\n [Request.GetCueAndLoops]: getCueAndLoops,\n [Request.GetBeatGrid]: getBeatgrid,\n [Request.GetWaveformDetailed]: getWaveformDetailed,\n [Request.GetAdvCueAndLoops]: getCueAndLoopsAdv,\n [Request.GetWaveformHD]: getWaveformHD,\n [Request.MenuPlaylist]: getPlaylist,\n\n // TODO: Add queries for all different kinds of menu requests\n};\n\nexport type Handler<T extends Query> = (typeof queryHandlers)[T];\n\nexport type HandlerArgs<T extends Query> = Parameters<Handler<T>>[0]['args'];\nexport type HandlerReturn<T extends Query> = ReturnType<Handler<T>>;\n","import {TelemetrySpan as Span} from 'src/utils/telemetry';\n\nimport {Items, ItemType} from './message/item';\nimport {MessageType} from './message/types';\nimport {UInt32} from './fields';\nimport {Message} from './message';\nimport {Connection, LookupDescriptor} from '.';\n\n/**\n * Specifies the number of items we should request at a time in menu render\n * requests.\n */\nconst LIMIT = 64;\n\nexport const fieldFromDescriptor = ({\n hostDevice,\n menuTarget,\n trackSlot,\n trackType,\n}: LookupDescriptor) =>\n new UInt32(Buffer.of(hostDevice.id, menuTarget, trackSlot, trackType));\n\nexport const makeRenderMessage = (\n descriptor: LookupDescriptor,\n offset: number,\n count: number,\n total: number\n) =>\n new Message({\n type: MessageType.RenderMenu,\n args: [\n fieldFromDescriptor(descriptor),\n new UInt32(offset),\n new UInt32(count),\n new UInt32(0),\n new UInt32(total),\n new UInt32(0x0c),\n ],\n });\n\n/**\n * Async generator to page through menu results after a successful lookup\n * request.\n */\nexport async function* renderItems<T extends ItemType = ItemType>(\n conn: Connection,\n descriptor: LookupDescriptor,\n total: number,\n span: Span\n) {\n let itemsRead = 0;\n\n while (itemsRead < total) {\n // Request another page of items\n if (itemsRead % LIMIT === 0) {\n // XXX: itemsRead + count should NOT exceed the total. A larger value\n // will push the offset back to accommodate for the extra items, ensuring\n // we always receive count items.\n const count = Math.min(LIMIT, total - itemsRead);\n const message = makeRenderMessage(descriptor, itemsRead, count, total);\n\n await conn.writeMessage(message, span);\n await conn.readMessage(MessageType.MenuHeader, span);\n }\n\n // Read each item. Ignoring headers and footers, we will determine when to\n // stop by counting the items read until we reach the total items.\n const resp = await conn.readMessage(MessageType.MenuItem, span);\n\n yield resp.data as Items[T];\n itemsRead++;\n\n // When we've reached the end of a page we must read the footer\n if (itemsRead % LIMIT === 0 || itemsRead === total) {\n await conn.readMessage(MessageType.MenuFooter, span);\n }\n }\n}\n\nconst colors = [\n ItemType.ColorNone,\n ItemType.ColorPink,\n ItemType.ColorRed,\n ItemType.ColorOrange,\n ItemType.ColorYellow,\n ItemType.ColorGreen,\n ItemType.ColorAqua,\n ItemType.ColorBlue,\n ItemType.ColorPurple,\n] as const;\n\nconst colorSet = new Set(colors);\n\ntype ColorType = (typeof colors)[number];\n\n/**\n * Locate the color item in an item list\n */\nexport const findColor = (items: Array<Items[ItemType]>) =>\n items.filter(item => colorSet.has(item.type as any)).pop() as Items[ColorType];\n","import {Mutex} from 'async-mutex';\nimport StrictEventEmitter from 'strict-event-emitter-types';\n\nimport {Socket} from 'dgram';\nimport {EventEmitter} from 'events';\n\nimport {STATUS_PORT} from 'src/constants';\nimport {CDJStatus, MediaSlotInfo} from 'src/types';\nimport {udpSend} from 'src/utils/udp';\n\nimport {makeMediaSlotRequest} from './media';\nimport {mediaSlotFromPacket, onAirFromPacket, statusFromPacket} from './utils';\n\ninterface StatusEvents {\n /**\n * Fired each time the CDJ reports its status\n */\n status: (status: CDJStatus.State) => void;\n /**\n * Fired when the CDJ reports its media slot status\n */\n mediaSlot: (info: MediaSlotInfo) => void;\n /**\n * Fired when the mixer broadcasts on-air channel status\n */\n onAir: (status: CDJStatus.OnAirStatus) => void;\n}\n\ntype Emitter = StrictEventEmitter<EventEmitter, StatusEvents>;\n\ntype MediaSlotOptions = Parameters<typeof makeMediaSlotRequest>[0];\n\n/**\n * The status emitter will report every time a device status is received\n */\nclass StatusEmitter {\n #statusSocket: Socket;\n /**\n * The EventEmitter which reports the device status\n */\n #emitter: Emitter = new EventEmitter();\n /**\n * Lock used to avoid media slot query races\n */\n #mediaSlotQueryLock = new Mutex();\n\n /**\n * @param statusSocket A UDP socket to receive CDJ status packets on\n */\n constructor(statusSocket: Socket) {\n this.#statusSocket = statusSocket;\n statusSocket.on('message', this.#handleStatus);\n }\n\n // Bind public event emitter interface\n on: Emitter['on'] = this.#emitter.addListener.bind(this.#emitter);\n off: Emitter['off'] = this.#emitter.removeListener.bind(this.#emitter);\n once: Emitter['once'] = this.#emitter.once.bind(this.#emitter);\n\n #handleStatus = (message: Buffer) => {\n const status = statusFromPacket(message);\n\n if (status !== undefined) {\n return this.#emitter.emit('status', status);\n }\n\n // Media slot status is also reported on this socket\n const mediaSlot = mediaSlotFromPacket(message);\n\n if (mediaSlot !== undefined) {\n return this.#emitter.emit('mediaSlot', mediaSlot);\n }\n\n // On-air status from mixer is also reported on this socket\n const onAir = onAirFromPacket(message);\n\n if (onAir !== undefined) {\n return this.#emitter.emit('onAir', onAir);\n }\n\n return undefined;\n };\n\n /**\n * Retrieve media slot status information.\n */\n async queryMediaSlot(options: MediaSlotOptions) {\n const request = makeMediaSlotRequest(options);\n\n const media = await this.#mediaSlotQueryLock.runExclusive(async () => {\n await udpSend(this.#statusSocket, request, STATUS_PORT, options.device.ip.address);\n\n return new Promise<MediaSlotInfo>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.off('mediaSlot', handler);\n reject(\n new Error(\n `Timeout waiting for media slot response from device ${options.device.id}`\n )\n );\n }, 10000);\n\n const handler = (info: MediaSlotInfo) => {\n // Only resolve if this is for our device and slot\n if (info.deviceId === options.device.id && info.slot === options.slot) {\n clearTimeout(timeout);\n resolve(info);\n } else {\n // Re-register for the next event\n this.once('mediaSlot', handler);\n }\n };\n\n this.once('mediaSlot', handler);\n });\n });\n\n return media;\n }\n}\n\nexport default StatusEmitter;\n","import {PROLINK_HEADER} from 'src/constants';\nimport {Device, MediaSlot} from 'src/types';\nimport {buildName} from 'src/utils';\n\ninterface Options {\n /**\n * The device asking for media info\n */\n hostDevice: Device;\n /**\n * The target device. This is the device we'll be querying for details of\n * it's media slot.\n */\n device: Device;\n /**\n * The specific slot\n */\n slot: MediaSlot;\n}\n\n/**\n * Get information about the media connected to the specified slot on the\n * device.\n */\nexport const makeMediaSlotRequest = ({hostDevice, device, slot}: Options) =>\n Uint8Array.from([\n ...PROLINK_HEADER,\n ...[0x05],\n ...buildName(hostDevice),\n ...[0x01, 0x00],\n ...[hostDevice.id],\n ...[0x00, 0x0c],\n ...hostDevice.ip.toArray(),\n ...[0x00, 0x00, 0x00, device.id],\n ...[0x00, 0x00, 0x00, slot],\n ]);\n","import StrictEventEmitter from 'strict-event-emitter-types';\n\nimport {Socket} from 'dgram';\nimport {EventEmitter} from 'events';\n\nimport {CDJStatus} from 'src/types';\n\nimport {positionFromPacket} from './utils';\n\ninterface PositionEvents {\n /**\n * Fired when an absolute position packet is received from a CDJ-3000+.\n * These packets are sent approximately every 30ms while a track is loaded.\n */\n position: (position: CDJStatus.PositionState) => void;\n}\n\ntype Emitter = StrictEventEmitter<EventEmitter, PositionEvents>;\n\n/**\n * The position emitter reports absolute playhead position updates from CDJ-3000+ devices.\n * These packets provide precise track position independent of beat grids, enabling\n * accurate timecode, lighting cue, and video synchronization even during scratching,\n * reverse play, loops, and needle jumps.\n */\nclass PositionEmitter {\n /**\n * The EventEmitter which reports position updates\n */\n #emitter: Emitter = new EventEmitter();\n\n /**\n * @param beatSocket A UDP socket to receive position packets on port 50001\n */\n constructor(beatSocket: Socket) {\n beatSocket.on('message', this.#handlePosition);\n }\n\n // Bind public event emitter interface\n on: Emitter['on'] = this.#emitter.addListener.bind(this.#emitter);\n off: Emitter['off'] = this.#emitter.removeListener.bind(this.#emitter);\n once: Emitter['once'] = this.#emitter.once.bind(this.#emitter);\n\n #handlePosition = (message: Buffer) => {\n const position = positionFromPacket(message);\n\n if (position !== undefined) {\n this.#emitter.emit('position', position);\n }\n };\n}\n\nexport default PositionEmitter;\n","import {DeviceID, MediaSlot, TrackType} from 'src/types';\n\n/**\n * Status flag bitmasks\n */\nexport enum StatusFlag {\n OnAir = 1 << 3,\n Sync = 1 << 4,\n Master = 1 << 5,\n Playing = 1 << 6,\n}\n\n/**\n * Play state flags\n */\nexport enum PlayState {\n Empty = 0x00,\n Loading = 0x02,\n Playing = 0x03,\n Looping = 0x04,\n Paused = 0x05,\n Cued = 0x06,\n Cuing = 0x07,\n PlatterHeld = 0x08,\n Searching = 0x09,\n SpunDown = 0x0e,\n Ended = 0x11,\n}\n\n/**\n * Represents various details about the current state of the CDJ.\n */\nexport interface State {\n /**\n * The device reporting this status.\n */\n deviceId: number;\n /**\n * The ID of the track loaded on the device.\n *\n * 0 When no track is loaded.\n */\n trackId: number;\n /**\n * The device ID the track is loaded from.\n *\n * For example if you have two CDJs and you've loaded a track over the 'LINK',\n * this will be the ID of the player with the USB media device connected to it.\n */\n trackDeviceId: DeviceID;\n /**\n * The MediaSlot the track is loaded from. For example a SD card or USB device.\n */\n trackSlot: MediaSlot;\n /**\n * The TrackType of the track, for example a CD or Rekordbox analyzed track.\n */\n trackType: TrackType;\n /**\n * The current play state of the CDJ.\n */\n playState: PlayState;\n /**\n * Whether the CDJ is currently reporting itself as 'on-air'.\n *\n * This is indicated by the red ring around the platter on the CDJ Nexus models.\n * A DJM mixer must be ont he network for the CDJ to report this as true.\n */\n isOnAir: boolean;\n /**\n * Whether the CDJ is synced.\n */\n isSync: boolean;\n /**\n * Whether the CDJ is the master player.\n */\n isMaster: boolean;\n /**\n * Whether the CDJ is in an emergency state (emergecy loop / emergency mode\n * on newer players)\n */\n isEmergencyMode: boolean;\n /**\n * The BPM of the loaded track. null if no track is loaded or the BPM is unknown.\n */\n trackBPM: number | null;\n /**\n * The \"effective\" pitch of the plyaer. This is reported anytime the jogwheel is\n * nudged, the CDJ spins down by pausing with the vinyl stop knob not at 0, or\n * by holding the platter.\n */\n effectivePitch: number;\n /**\n * The current slider pitch\n */\n sliderPitch: number;\n /**\n * The current beat within the measure. 1-4. 0 when no track is loaded.\n */\n beatInMeasure: number;\n /**\n * Number of beats remaining until the next cue point is reached. Null if there\n * is no next cue point\n */\n beatsUntilCue: number | null;\n /**\n * The beat 'timestamp' of the track. Can be used to compute absolute track time\n * given the slider pitch.\n */\n beat: number | null;\n /**\n * A counter that increments for every status packet sent.\n */\n packetNum: number;\n}\n\n/**\n * Absolute position information from CDJ-3000+ devices.\n * Sent every 30ms on port 50001 while a track is loaded.\n * Provides precise playhead position independent of beat grid.\n */\nexport interface PositionState {\n /**\n * The device ID sending this position update.\n */\n deviceId: number;\n /**\n * Track length in seconds (rounded down to nearest second).\n */\n trackLength: number;\n /**\n * Absolute playhead position in milliseconds.\n */\n playhead: number;\n /**\n * Pitch slider value as shown on screen.\n * For example, 3.26% is represented as 3.26.\n */\n pitch: number;\n /**\n * Effective BPM (track BPM adjusted by pitch) as shown on screen.\n * null if BPM is unknown.\n */\n bpm: number | null;\n}\n\n/**\n * On-Air status from DJM mixer.\n * Broadcast by the mixer to indicate which channels are currently audible.\n * Supports both 4-channel (DJM-900/1000) and 6-channel (DJM-V10) mixers.\n */\nexport interface OnAirStatus {\n /**\n * The mixer device ID (typically 33 / 0x21).\n */\n deviceId: number;\n /**\n * On-air flags for channels 1-4 (always present).\n * 0x00 = channel is off-air (silenced)\n * 0x01 = channel is on-air (audible)\n */\n channels: {\n 1: boolean;\n 2: boolean;\n 3: boolean;\n 4: boolean;\n 5?: boolean;\n 6?: boolean;\n };\n /**\n * Whether this is a 6-channel variant (CDJ-3000 + DJM-V10).\n * Determined by packet subtype (0x00 = 4-channel, 0x03 = 6-channel).\n */\n isSixChannel: boolean;\n}\n","import {PROLINK_HEADER} from 'src/constants';\nimport {CDJStatus, MediaSlotInfo} from 'src/types';\n\nconst MAX_INT32 = Math.pow(2, 32) - 1;\nconst MAX_INT16 = Math.pow(2, 16) - 1;\nconst MAX_INT9 = Math.pow(2, 9) - 1;\n\nexport function statusFromPacket(packet: Buffer) {\n if (packet.indexOf(PROLINK_HEADER) !== 0) {\n throw new Error('CDJ status packet does not start with the expected header');\n }\n\n // Rekordbox sends some short status packets that we can just ignore.\n if (packet.length < 0xc8) {\n return undefined;\n }\n\n // No track loaded: BPM = MAX_INT16\n const rawBPM = packet.readUInt16BE(0x92);\n const trackBPM = rawBPM === MAX_INT16 ? null : rawBPM / 100;\n\n // No next cue: beatsUntilCue = MAX_INT9\n const rawBeatsUntilCue = packet.readUInt16BE(0xa4);\n const beatsUntilCue = rawBeatsUntilCue === MAX_INT9 ? null : rawBeatsUntilCue;\n\n // No track loaded: beat = MAX_INT32\n const rawBeat = packet.readUInt32BE(0xa0);\n const beat = rawBeat === MAX_INT32 ? null : rawBeat;\n\n const status: CDJStatus.State = {\n deviceId: packet[0x21],\n trackId: packet.readUInt32BE(0x2c),\n trackDeviceId: packet[0x28],\n trackSlot: packet[0x29],\n trackType: packet[0x2a],\n playState: packet[0x7b],\n isOnAir: (packet[0x89] & CDJStatus.StatusFlag.OnAir) !== 0,\n isSync: (packet[0x89] & CDJStatus.StatusFlag.Sync) !== 0,\n isMaster: (packet[0x89] & CDJStatus.StatusFlag.Master) !== 0,\n isEmergencyMode: !!packet[0xba],\n trackBPM,\n sliderPitch: calcPitch(packet.slice(0x8d, 0x8d + 3)),\n effectivePitch: calcPitch(packet.slice(0x99, 0x99 + 3)),\n beatInMeasure: packet[0xa6],\n beatsUntilCue,\n beat,\n packetNum: packet.readUInt32BE(0xc8),\n };\n\n return status;\n}\n\nexport function mediaSlotFromPacket(packet: Buffer) {\n if (packet.indexOf(PROLINK_HEADER) !== 0) {\n throw new Error('CDJ media slot packet does not start with the expected header');\n }\n\n if (packet[0x0a] !== 0x06) {\n return undefined;\n }\n\n const name = packet\n .slice(0x2c, 0x2c + 40)\n .toString()\n .replace(/\\0/g, '');\n\n const createdDate = new Date(\n packet\n .slice(0x6c, 0x6c + 24)\n .toString()\n .replace(/\\0/g, '')\n );\n\n const deviceId = packet[0x27];\n const slot = packet[0x2b];\n\n const trackCount = packet.readUInt16BE(0xa6);\n const tracksType = packet[0xaa];\n const hasSettings = !!packet[0xab];\n const playlistCount = packet.readUInt16BE(0xae);\n const color = packet.readUInt8(0xa8);\n const totalBytes = packet.readBigUInt64BE(0xb0);\n const freeBytes = packet.readBigUInt64BE(0xb8);\n\n const info: MediaSlotInfo = {\n deviceId,\n slot,\n name,\n color,\n createdDate,\n freeBytes,\n totalBytes,\n tracksType,\n trackCount,\n playlistCount,\n hasSettings,\n };\n\n return info;\n}\n\n/**\n * calcPitch converts a uint24 byte value into a float32 pitch.\n *\n * The pitch information ranges from 0x000000 (meaning -100%, complete stop) to\n * 0x200000 (+100%).\n */\nfunction calcPitch(pitch: Buffer) {\n const value = Buffer.from([0x0, ...pitch]).readUInt32BE();\n const relativeZero = 0x100000;\n\n const computed = ((value - relativeZero) / relativeZero) * 100;\n\n return +computed.toFixed(2);\n}\n\n/**\n * Parse absolute position packet from CDJ-3000+ devices.\n * These packets are sent every 30ms on port 50001 while a track is loaded.\n * Packet structure: subtype 0x00, lenr varies based on device.\n */\nexport function positionFromPacket(packet: Buffer): CDJStatus.PositionState | undefined {\n if (packet.indexOf(PROLINK_HEADER) !== 0) {\n return undefined;\n }\n\n // Check if this is a position packet (subtype 0x00)\n if (packet[0x20] !== 0x00) {\n return undefined;\n }\n\n // Check minimum length for position packet\n const lenr = packet.readUInt16BE(0x22);\n if (lenr < 0x0c || packet.length < 0x34) {\n return undefined;\n }\n\n const deviceId = packet[0x21];\n const trackLength = packet.readUInt32BE(0x24);\n const playhead = packet.readUInt32BE(0x28);\n\n // Parse pitch: 32-bit signed integer representing pitch × 64 × 100\n // To get percentage: divide by 6400\n const rawPitch = packet.readInt32BE(0x2c);\n const pitch = rawPitch / 6400;\n\n // Parse BPM: multiply by 10, or null if 0xffffffff\n const rawBPM = packet.readUInt32BE(0x30);\n const bpm = rawBPM === 0xffffffff ? null : rawBPM / 10;\n\n const position: CDJStatus.PositionState = {\n deviceId,\n trackLength,\n playhead,\n pitch,\n bpm,\n };\n\n return position;\n}\n\n/**\n * Parse on-air status packet from DJM mixer.\n * The mixer broadcasts which channels are currently audible.\n * Supports both 4-channel (subtype 0x00) and 6-channel (subtype 0x03) variants.\n *\n * Packet structure:\n * - 4-channel: subtype 0x00, length 0x0009 (9 data bytes: F1 F2 F3 F4 00 00 00 00 00)\n * - 6-channel: subtype 0x03, length 0x0011 (17 data bytes: F1 F2 F3 F4 00 00 00 00 00 F5 F6 00 30 00 00 00 00 00)\n */\nexport function onAirFromPacket(packet: Buffer): CDJStatus.OnAirStatus | undefined {\n if (packet.indexOf(PROLINK_HEADER) !== 0) {\n return undefined;\n }\n\n const subtype = packet[0x20];\n const lenr = packet.readUInt16BE(0x22);\n\n // Check for 4-channel variant (subtype 0x00, length 0x0009)\n if (subtype === 0x00 && lenr === 0x0009 && packet.length >= 0x2e) {\n const deviceId = packet[0x21];\n const channels = {\n 1: packet[0x24] !== 0x00,\n 2: packet[0x25] !== 0x00,\n 3: packet[0x26] !== 0x00,\n 4: packet[0x27] !== 0x00,\n };\n\n const onAir: CDJStatus.OnAirStatus = {\n deviceId,\n channels,\n isSixChannel: false,\n };\n\n return onAir;\n }\n\n // Check for 6-channel variant (subtype 0x03, length 0x0011)\n if (subtype === 0x03 && lenr === 0x0011 && packet.length >= 0x36) {\n const deviceId = packet[0x21];\n const channels = {\n 1: packet[0x24] !== 0x00,\n 2: packet[0x25] !== 0x00,\n 3: packet[0x26] !== 0x00,\n 4: packet[0x27] !== 0x00,\n 5: packet[0x2e] !== 0x00,\n 6: packet[0x2f] !== 0x00,\n };\n\n const onAir: CDJStatus.OnAirStatus = {\n deviceId,\n channels,\n isSixChannel: true,\n };\n\n return onAir;\n }\n\n return undefined;\n}\n","import type {Address4} from 'ip-address';\n\nimport type {Playlist, Track} from './entities';\n\nexport * as CDJStatus from 'src/status/types';\n\n/**\n * Re-export various types for the types only compile target\n */\n\nexport type {\n Album,\n Artist,\n Artwork,\n Color,\n Genre,\n Key,\n Label,\n Playlist,\n Track,\n} from './entities';\nexport type {TrackAnalysis} from './db/getTrackAnalysis';\nexport type {HydrationProgress} from './localdb/rekordbox';\nexport type {MixstatusConfig, MixstatusProcessor} from './mixstatus';\n// Note: ProlinkNetwork is exported as a class from ./network, not re-exported here as type-only\n// to preserve method signatures like close()\nexport type {ConnectedProlinkNetwork, NetworkConfig} from './network';\nexport type {FetchProgress} from './nfs';\n\n/**\n * Known device types on the network\n */\nexport enum DeviceType {\n CDJ = 0x01,\n Mixer = 0x03,\n Rekordbox = 0x04,\n}\n\n/**\n * The 8-bit identifier of the device on the network\n */\nexport type DeviceID = number;\n\n/**\n * Represents a device on the prolink network.\n */\nexport interface Device {\n name: string;\n id: DeviceID;\n type: DeviceType;\n macAddr: Uint8Array;\n ip: Address4;\n lastActive?: Date;\n}\n\n/**\n * Details of a particular media slot on the CDJ\n */\nexport interface MediaSlotInfo {\n /**\n * The device the slot physically exists on\n */\n deviceId: DeviceID;\n /**\n * The slot type\n */\n slot: MediaSlot;\n /**\n * The name of the media connected\n */\n name: string;\n /**\n * The rekordbox configured color of the media connected\n */\n color: MediaColor;\n /**\n * Creation date\n */\n createdDate: Date;\n /**\n * Number of free bytes available on the media\n */\n freeBytes: bigint;\n /**\n * Number of bytes used on the media\n */\n totalBytes: bigint;\n /**\n * Specifies the available tracks type on the media\n */\n tracksType: TrackType;\n /**\n * Total number of rekordbox tracks on the media. Will be zero if there is\n * no rekordbox database on the media\n */\n trackCount: number;\n /**\n * Same as track count, except for playlists\n */\n playlistCount: number;\n /**\n * True when a rekordbox 'my settings' file has been exported to the media\n */\n hasSettings: boolean;\n}\n\nexport enum MediaColor {\n Default = 0x00,\n Pink = 0x01,\n Red = 0x02,\n Orange = 0x03,\n Yellow = 0x04,\n Green = 0x05,\n Aqua = 0x06,\n Blue = 0x07,\n Purple = 0x08,\n}\n\n/**\n * A slot where media is present on the CDJ\n */\nexport enum MediaSlot {\n Empty = 0x00,\n CD = 0x01,\n SD = 0x02,\n USB = 0x03,\n RB = 0x04,\n Unknown05 = 0x05, // Possibly TIDAL, Apple Music, or other streaming\n StreamingDirectPlay = 0x06,\n Unknown07 = 0x07, // Possibly TIDAL, Apple Music, or other streaming\n Unknown08 = 0x08, // Possibly TIDAL, Apple Music, or other streaming\n Beatport = 0x09,\n}\n\n/**\n * Track type flags\n */\nexport enum TrackType {\n None = 0x00,\n RB = 0x01,\n Unanalyzed = 0x02,\n AudioCD = 0x05,\n Streaming = 0x06,\n}\n\n/**\n * A beat grid is a series of offsets from the start of the track. Each offset\n * indicates what count within the measure it is along with the BPM.\n */\nexport type BeatGrid = Array<{\n /**\n * Offset from the beginning of track in milliseconds of this beat.\n */\n offset: number;\n /**\n * The count of this particular beat within the measure\n */\n count: 1 | 2 | 3 | 4;\n /**\n * The BPM at this beat.\n */\n bpm: number;\n}>;\n\n/**\n * A waveform segment contains a height and 'whiteness' value.\n */\ninterface WaveformSegment {\n /**\n * The height this segment in the waveform. Ranges from 0 - 31.\n */\n height: number;\n /**\n * The level of \"whiteness\" of the waveform. 0 being completely blue, and 1\n * being completely white.\n */\n whiteness: number;\n}\n\n/**\n * A HD waveform segment contains the height of the waveform, and it's color\n * represented as RGB values.\n */\ninterface WaveformHDSegment {\n /**\n * The height this segment in the waveform. Ranges from 0 - 31.\n */\n height: number;\n /**\n * the RGB value, each channel ranges from 0-1 for the segment.\n */\n color: [number, number, number];\n}\n\n/**\n * The waveform preview will be 400 segments of data.\n */\nexport type WaveformPreview = WaveformSegment[];\n\n/**\n * Detailed waveforms have 150 segments per second of audio (150 'half frames'\n * per second of audio).\n */\nexport type WaveformDetailed = WaveformSegment[];\n\n/**\n * HD waveforms have 150 segments per second of audio (150 'half frames' per\n * second of audio).\n */\nexport type WaveformHD = WaveformHDSegment[];\n\n/**\n * The result of looking up track waveforms\n */\nexport interface Waveforms {\n /**\n * The full-size and full-color waveform\n */\n waveformHd: WaveformHD;\n\n /**\n * Color waveform preview (PWV4 tag).\n * Raw bytes: 1200 columns × 6 bytes per column (3 frequency bands × 2 bytes each).\n */\n waveformColorPreview?: Uint8Array;\n\n /**\n * Standard waveform preview (400 entries). Available for streaming tracks.\n */\n waveformPreview?: WaveformPreview;\n\n /**\n * Full detailed waveform. Available for streaming tracks.\n */\n waveformDetailed?: WaveformDetailed;\n}\n\n/**\n * Re-export cue types from onelibrary-connect\n */\nexport {CueColor, HotcueButton} from 'onelibrary-connect';\nexport type {CueAndLoop, CuePoint, Hotcue, Hotloop, Loop} from 'onelibrary-connect';\n\n/**\n * Extended cue with color and comment support (PCO2 tag from rekordbox).\n * Includes additional metadata like RGB colors, comments, and quantized loop information.\n */\nexport interface ExtendedCue {\n /**\n * Hot cue number (0 for memory points, 1-8 for hot cues A-H)\n */\n hotCue: number;\n /**\n * Type of cue: 1 = simple position/cue, 2 = loop\n */\n type: 1 | 2;\n /**\n * Position in milliseconds from the start of the track\n */\n time: number;\n /**\n * For loops, the end position in milliseconds\n */\n loopTime?: number;\n /**\n * Color ID referencing the color table (for memory points/loops)\n */\n colorId?: number;\n /**\n * Color code for the hot cue palette (0x00 = default green, 0x01-0x3e = palette colors)\n */\n colorCode?: number;\n /**\n * RGB color values used to illuminate the player's RGB LEDs\n */\n colorRgb?: {r: number; g: number; b: number};\n /**\n * User-assigned comment text for the cue\n */\n comment?: string;\n /**\n * For quantized loops, the numerator of the loop size fraction (e.g., 4 for a 4-beat loop)\n */\n loopNumerator?: number;\n /**\n * For quantized loops, the denominator of the loop size fraction (e.g., 1 for a 4-beat loop)\n */\n loopDenominator?: number;\n}\n\n/**\n * A phrase within a track's song structure\n */\nexport interface Phrase {\n /**\n * Sequential phrase number starting from 1\n */\n index: number;\n /**\n * Beat number where this phrase begins\n */\n beat: number;\n /**\n * Raw phrase kind value from rekordbox\n */\n kind: number;\n /**\n * Human-readable phrase type (e.g., \"Intro\", \"Verse 1\", \"Chorus\")\n */\n phraseType: string;\n /**\n * Whether this phrase has a fill-in section (non-zero if present)\n */\n fill?: number;\n /**\n * Beat number where the fill-in begins (if present)\n */\n fillBeat?: number;\n}\n\n/**\n * Song structure / phrase analysis (PSSI tag from rekordbox).\n * Used by CDJ-3000 players for phrase-based navigation and lighting control.\n */\nexport interface SongStructure {\n /**\n * Overall mood classification of the track\n */\n mood: 'high' | 'mid' | 'low';\n /**\n * Stylistic bank assigned for lighting control\n */\n bank:\n | 'default'\n | 'cool'\n | 'natural'\n | 'hot'\n | 'subtle'\n | 'warm'\n | 'vivid'\n | 'club_1'\n | 'club_2';\n /**\n * Beat number where the last phrase ends (track may continue after this)\n */\n endBeat: number;\n /**\n * List of identified phrases in the track\n */\n phrases: Phrase[];\n}\n\n/**\n * 3-band color waveform preview (PWV6 tag from .2EX files).\n * Same resolution as PWV4 (typically 1200 entries) but with separate\n * low, mid, and high frequency band amplitudes.\n *\n * @see https://djl-analysis.deepsymmetry.org/djl-analysis/track-metadata.html#color-3band-preview-waveform\n */\nexport interface Waveform3BandPreview {\n numEntries: number;\n /** Raw interleaved bytes: numEntries × 3 (low, mid, high per entry) */\n data: Uint8Array;\n}\n\n/**\n * 3-band color detail waveform (PWV7 tag from .2EX files).\n * Higher resolution than PWV6, approximately 150 entries per second.\n *\n * @see https://djl-analysis.deepsymmetry.org/djl-analysis/track-metadata.html#color-3band-detail-waveform\n */\nexport interface Waveform3BandDetail {\n numEntries: number;\n /** Raw interleaved bytes: numEntries × 3 (low, mid, high per entry) */\n data: Uint8Array;\n}\n\n/**\n * Vocal detection configuration (PWVC tag from .2EX files).\n * Threshold values used to classify frequency content as vocal or non-vocal.\n *\n * Values are u16 but observed range across 192 real files is 80-159,\n * matching the 0-255 byte scale used by waveform band values.\n * Observed ranges: low 80-114, mid 80-146, high 98-159.\n */\nexport interface VocalConfig {\n thresholdLow: number;\n thresholdMid: number;\n thresholdHigh: number;\n}\n\n/**\n * Monochrome waveform preview data (PWAV/PWV2 tags).\n * PWAV contains 400 bytes, PWV2 contains 100 bytes.\n */\nexport interface WaveformPreviewData {\n /**\n * Raw waveform data - each byte encodes height and whiteness\n */\n data: Uint8Array;\n}\n\n/**\n * Represents the contents of a playlist\n */\nexport interface PlaylistContents {\n /**\n * The playlists in this playlist.\n */\n playlists: Playlist[];\n /**\n * The folders in this playlist.\n */\n folders: Playlist[];\n /**\n * The tracks in this playlist. This is an AsyncIterator as looking up track\n * metadata may be slow when connected to the remote database.\n */\n tracks: AsyncIterable<Track>;\n /**\n * The total number of tracks in this playlist.\n */\n totalTracks: number;\n}\n\nexport enum NetworkState {\n /**\n * The network is offline when we don't have an open connection to the network\n * (no connection to the announcement and or status UDP socket is present).\n */\n Offline,\n /**\n * The network is online when we have opened sockets to the network, but have\n * not yet started announcing ourselves as a virtual CDJ.\n */\n Online,\n /**\n * The network is connected once we have heard from another device on the network\n */\n Connected,\n /**\n * The network may have failed to connect if we aren't able to open the\n * announcement and or status UDP socket.\n */\n Failed,\n}\n\n/**\n * Mixstatus reporting modes specify how the mixstatus processor will determine when a new\n * track is 'now playing'.\n */\nexport enum MixstatusMode {\n /**\n * Tracks will be smartly marked as playing following rules:\n *\n * - The track that has been in the play state with the CDJ in the \"on air\" state\n * for the longest period of time (allowing for a configurable length of\n * interruption with allowedInterruptBeats) is considered to be the active\n * track that incoming tracks will be compared against.\n *\n * - A incoming track will immediately be reported as nowPlaying if it is on\n * air, playing, and the last active track has been cued.\n *\n * - A incoming track will be reported as nowPlaying if the active track has\n * not been on air or has not been playing for the configured\n * allowedInterruptBeats.\n *\n * - A incoming track will be reported as nowPlaying if it has played\n * consecutively (with allowedInterruptBeats honored for the incoming track)\n * for the configured beatsUntilReported.\n */\n SmartTiming,\n /**\n * Tracks will not be reported after the beatsUntilReported AND will ONLY\n * be reported if the other track has gone into a non-playing play state, or\n * taken off air (when useOnAirStatus is enabled).\n */\n WaitsForSilence,\n /**\n * The track will simply be reported only after the player becomes master.\n */\n FollowsMaster,\n}\n","import {WaveformHD} from 'src/types';\n\n/**\n * Extracts a specific bitmask, shifting it to the bitmask.\n */\nexport const extractBitMask = (val: number, mask: number): number =>\n (val & mask) >> Math.log2(mask & -mask);\n\n/**\n * Pioneer colors are 3 bits, convert this to a percentage.\n */\nexport const extractColor = (val: number, mask: number): number =>\n extractBitMask(val, mask) / 0b111;\n\n/**\n * Utility to generate an filled with byte offsets for each segment\n */\nexport const makeOffsetArray = (byteLength: number, segmentSize: number) =>\n new Array(byteLength / segmentSize).fill(null).map((_, i) => i * segmentSize);\n\n/**\n * Convert raw waveform HD data into the structured WaveformHD type\n */\nexport const convertWaveformHDData = (data: Buffer): WaveformHD => {\n // Two byte bit representation for the color waveform.\n //\n // | f e d | c b a | 9 8 7 | 6 5 4 3 2 | 1 0 |\n // [ red | green | blue | height | ~ | ~ ]\n const redMask = 0b11100000_00000000; // prettier-ignore\n const greenMask = 0b00011100_00000000; // prettier-ignore\n const blueMask = 0b00000011_10000000; // prettier-ignore\n const heightMask = 0b00000000_01111100; // prettier-ignore\n\n const ec = extractColor;\n\n return makeOffsetArray(data.length, 0x02)\n .map(byteOffset => data.readUInt16BE(byteOffset))\n .map(v => ({\n height: extractBitMask(v, heightMask),\n color: [ec(v, redMask), ec(v, greenMask), ec(v, blueMask)],\n }));\n};\n","import * as ip from 'ip-address';\n\nimport {NetworkInterfaceInfo, NetworkInterfaceInfoIPv4, networkInterfaces} from 'os';\n\nimport {Device, MediaSlot, TrackType} from 'src/types';\n\n/**\n * Get the byte representation of the device name\n */\nexport function buildName(device: Device): Uint8Array {\n const name = new Uint8Array(20);\n name.set(Buffer.from(device.name, 'ascii'));\n\n return name;\n}\n\n/**\n * Determines the interface that routes the given address by comparing the\n * masked addresses. This type of information is generally determined through\n * the kernels routing table, but for sake of cross-platform compatibility, we\n * do some rudimentary lookup.\n */\nexport function getMatchingInterface(ipAddr: ip.Address4) {\n const flatList = Object.entries(networkInterfaces()).reduce(\n (acc, [name, info]) =>\n info !== undefined ? acc.concat(info.map(i => ({...i, name}))) : acc,\n [] as Array<{name: string} & NetworkInterfaceInfo>\n );\n\n let matchedIface: (NetworkInterfaceInfoIPv4 & {name: string}) | null = null;\n let matchedSubnet = 0;\n\n for (const iface of flatList) {\n const {internal, cidr} = iface;\n\n if (iface.family !== 'IPv4' || internal || cidr === null) {\n continue;\n }\n\n const ifaceAddr = new ip.Address4(cidr);\n\n if (ipAddr.isInSubnet(ifaceAddr) && ifaceAddr.subnetMask > matchedSubnet) {\n matchedIface = iface;\n matchedSubnet = ifaceAddr.subnetMask;\n }\n }\n\n return matchedIface;\n}\n\n/**\n * Computes the IPv4 subnet broadcast address for a network interface.\n *\n * Builds the address from the interface CIDR so the broadcast covers the whole\n * subnet (e.g. x.x.x.255 for a /24). Falls back to the bare interface address\n * when no CIDR is available, which only reaches the host itself but avoids\n * throwing.\n */\nexport function getBroadcastAddress(iface: NetworkInterfaceInfoIPv4): string {\n return new ip.Address4(iface.cidr ?? iface.address).endAddress().address;\n}\n\n/**\n * Given a BPM and pitch value, compute how many seconds per beat\n */\nexport function bpmToSeconds(bpm: number, pitch: number) {\n const bps = ((pitch / 100) * bpm + bpm) / 60;\n return 1 / bps;\n}\n\nconst slotNames = Object.fromEntries(\n Object.entries(MediaSlot).map(e => [e[1], e[0].toLowerCase()])\n);\n\n/**\n * Returns a string representation of a media slot\n */\nexport function getSlotName(slot: MediaSlot) {\n return slotNames[slot];\n}\n\nconst trackTypeNames = Object.fromEntries(\n Object.entries(TrackType).map(e => [e[1], e[0].toLowerCase()])\n);\n\n/**\n * Returns a string representation of a track type\n */\nexport function getTrackTypeName(type: TrackType) {\n return trackTypeNames[type];\n}\n","/**\n * Telemetry utility - Sentry removed, now a no-op implementation.\n */\n\n/**\n * Check if telemetry is enabled - always false now.\n */\nexport const isTelemetryEnabled = (): boolean => false;\n\n/**\n * Span status values for telemetry.\n */\nexport const SpanStatus = {\n Ok: 'ok',\n Cancelled: 'cancelled',\n Unknown: 'unknown',\n InvalidArgument: 'invalid_argument',\n DeadlineExceeded: 'deadline_exceeded',\n NotFound: 'not_found',\n AlreadyExists: 'already_exists',\n PermissionDenied: 'permission_denied',\n ResourceExhausted: 'resource_exhausted',\n FailedPrecondition: 'failed_precondition',\n Aborted: 'aborted',\n OutOfRange: 'out_of_range',\n Unimplemented: 'unimplemented',\n InternalError: 'internal_error',\n Unavailable: 'unavailable',\n DataLoss: 'data_loss',\n Unauthenticated: 'unauthenticated',\n} as const;\n\nexport type SpanStatusType = (typeof SpanStatus)[keyof typeof SpanStatus];\n\n/**\n * Context for starting a child span.\n */\nexport interface SpanContext {\n name?: string;\n op?: string;\n description?: string;\n data?: Record<string, unknown>;\n}\n\n/**\n * Interface for span-like objects returned by telemetry functions.\n */\nexport interface TelemetrySpan {\n startChild(context?: SpanContext): TelemetrySpan;\n setData(key: string, value: unknown): TelemetrySpan;\n setTag(key: string, value: string): TelemetrySpan;\n setStatus(status: SpanStatusType): TelemetrySpan;\n end(): void;\n /** @deprecated Use end() instead */\n finish(): void;\n}\n\n/**\n * No-op span implementation.\n */\nconst noopSpan: TelemetrySpan = {\n startChild(_context?: SpanContext) {\n return noopSpan;\n },\n setData(_key: string, _value: unknown) {\n return noopSpan;\n },\n setTag(_key: string, _value: string) {\n return noopSpan;\n },\n setStatus(_status: SpanStatusType) {\n return noopSpan;\n },\n end() {\n // Intentional no-op\n },\n finish() {\n // Intentional no-op\n },\n};\n\n/**\n * Initialize telemetry - no-op.\n */\nexport function init(_options?: unknown): void {\n // Intentional no-op\n}\n\n/**\n * Start a transaction/span - returns no-op.\n */\nexport function startTransaction(_context: SpanContext): TelemetrySpan {\n return noopSpan;\n}\n\n/**\n * Capture an exception - no-op.\n */\nexport function captureException(_exception: unknown, _hint?: unknown): string {\n return '';\n}\n\n/**\n * Capture a message - no-op.\n */\nexport function captureMessage(_message: string, _level?: unknown): string {\n return '';\n}\n\n/**\n * Set a tag - no-op.\n */\nexport function setTag(_key: string, _value: string): void {\n // Intentional no-op\n}\n\n/**\n * Severity levels for messages.\n */\nexport const Severity = {\n Fatal: 'fatal',\n Error: 'error',\n Warning: 'warning',\n Log: 'log',\n Info: 'info',\n Debug: 'debug',\n} as const;\n","import {BindOptions, Socket} from 'dgram';\nimport {AddressInfo} from 'net';\n\n/**\n * Async version of upd socket bind\n */\nexport function udpBind(\n conn: Socket,\n port?: number,\n address?: string\n): Promise<AddressInfo>;\nexport function udpBind(conn: Socket, options: BindOptions): Promise<AddressInfo>;\nexport function udpBind(conn: Socket, arg1?: any, arg2?: any): Promise<AddressInfo> {\n return new Promise((resolve, reject) => {\n conn.once('error', reject);\n conn.once('listening', () => {\n conn.off('error', reject);\n resolve(conn.address());\n });\n\n if (arg2 !== undefined) {\n conn.bind(arg1, arg2);\n } else {\n conn.bind(arg1);\n }\n });\n}\n\n/**\n * Async version of udp socket read\n */\nexport function udpRead(conn: Socket) {\n return new Promise<Buffer>(resolve => conn.once('message', resolve));\n}\n\n/**\n * Async version of udp socket send\n */\nexport function udpSend(\n conn: Socket,\n msg: Buffer | string | Uint8Array | any[],\n port: number,\n address: string\n): Promise<number>;\nexport function udpSend(\n conn: Socket,\n msg: Buffer | string | Uint8Array,\n offset: number,\n length: number,\n port: number,\n address: string\n): Promise<number>;\nexport function udpSend(\n conn: Socket,\n arg1: any,\n arg2: any,\n arg3: any,\n arg4?: any,\n arg5?: any\n): Promise<number> {\n return new Promise((resolve, reject) => {\n try {\n if (arg4 !== undefined) {\n conn.send(arg1, arg2, arg3, arg4, arg5, (err, sent) =>\n err ? reject(err) : resolve(sent)\n );\n } else {\n conn.send(arg1, arg2, arg3, (err, sent) => (err ? reject(err) : resolve(sent)));\n }\n } catch (err) {\n reject(err);\n }\n });\n}\n\n/**\n * Async version of udp socket close\n */\nexport function udpClose(conn: Socket) {\n return new Promise((resolve, reject) => {\n try {\n conn.once('close', resolve);\n conn.close();\n } catch (err) {\n reject(err);\n }\n });\n}\n","import * as ip from 'ip-address';\n\nimport {Socket} from 'dgram';\nimport {NetworkInterfaceInfoIPv4} from 'os';\n\nimport {\n ANNOUNCE_INTERVAL,\n ANNOUNCE_PORT,\n PROLINK_HEADER,\n STARTUP_STAGE_INTERVAL,\n VIRTUAL_CDJ_FIRMWARE,\n VIRTUAL_CDJ_NAME,\n} from 'src/constants';\nimport DeviceManager from 'src/devices';\nimport {type Logger, noopLogger} from 'src/logger';\nimport {Device, DeviceID, DeviceType} from 'src/types';\nimport {buildName, getBroadcastAddress} from 'src/utils';\n\n/**\n * Constructs a virtual CDJ Device.\n *\n * @param iface - The network interface to use\n * @param id - The device ID to use\n * @param name - Optional custom name (defaults to VIRTUAL_CDJ_NAME constant)\n */\nexport const getVirtualCDJ = (\n iface: NetworkInterfaceInfoIPv4,\n id: DeviceID,\n name: string = VIRTUAL_CDJ_NAME\n): Device => ({\n id,\n name,\n type: DeviceType.CDJ,\n ip: new ip.Address4(iface.address),\n macAddr: new Uint8Array(iface.mac.split(':').map(s => parseInt(s, 16))),\n});\n\n/**\n * Returns a mostly empty-state status packet. This is currently used to report\n * the virtual CDJs status, which *seems* to be required for the CDJ to send\n * metadata about some unanalyzed mp3 files.\n */\nexport function makeStatusPacket(device: Device): Uint8Array {\n // NOTE: It seems that byte 0x68 and 0x75 MUST be 1 in order for the CDJ to\n // correctly report mp3 metadata (again, only for some files).\n // See https://github.com/brunchboy/dysentery/issues/15\n // NOTE: Byte 0xb6 MUST be 1 in order for the CDJ to not think that our\n // device is \"running an older firmware\"\n //\n // prettier-ignore\n const b = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n 0x03, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0xff, 0xfe, 0x00, 0x10, 0x00, 0x00,\n 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,\n 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n ]);\n\n // The following items get replaced in this format:\n //\n // - 0x00: 10 byte header\n // - 0x0B: 20 byte device name\n // - 0x21: 01 byte device ID\n // - 0x24: 01 byte device ID\n // - 0x7C: 04 byte firmware string\n\n b.set(PROLINK_HEADER, 0x0b);\n b.set(Buffer.from(device.name, 'ascii'), 0x0b);\n b.set(new Uint8Array([device.id]), 0x21);\n b.set(new Uint8Array([device.id]), 0x24);\n b.set(Buffer.from(VIRTUAL_CDJ_FIRMWARE, 'ascii'), 0x7c);\n\n return b;\n}\n\n/**\n * constructs the announce packet that is sent on the prolink network to\n * announce a devices existence.\n */\nexport function makeAnnouncePacket(deviceToAnnounce: Device): Uint8Array {\n const d = deviceToAnnounce;\n\n // unknown padding bytes\n const unknown1 = [0x01, 0x02];\n // Updated on 2024-04-27 to be compatible with CDJ-3000 players that use player number 5 or 6.\n const unknown2 = [0x02, 0x00, 0x00, 0x00];\n\n // The packet below is constructed in the following format:\n //\n // - 0x00: 10 byte header\n // - 0x0A: 02 byte announce packet type\n // - 0x0c: 20 byte device name\n // - 0x20: 02 byte unknown\n // - 0x22: 02 byte packet length\n // - 0x24: 01 byte for the player ID\n // - 0x25: 01 byte for the player type\n // - 0x26: 06 byte mac address\n // - 0x2C: 04 byte IP address\n // - 0x30: 04 byte unknown\n // - 0x34: 01 byte for the player type\n // - 0x35: 01 byte final padding\n\n const parts = [\n ...PROLINK_HEADER,\n ...[0x06, 0x00],\n ...buildName(d),\n ...unknown1,\n ...[0x00, 0x36],\n ...[d.id],\n ...[d.type],\n ...d.macAddr,\n ...d.ip.toArray(),\n ...unknown2,\n ...[d.type],\n // Updated on 2024-04-27 to be compatible with CDJ-3000 players that use player number 5 or 6.\n ...[0x64],\n ];\n\n return Uint8Array.from(parts);\n}\n\n/**\n * Startup stages for the full startup protocol.\n */\nenum StartupStage {\n /** Initial announcement packets (0x0a) */\n InitialAnnounce = 0x0a,\n /** First-stage device number claim (0x00) */\n FirstStageClaim = 0x00,\n /** Second-stage device number claim (0x02) */\n SecondStageClaim = 0x02,\n /** Final-stage device number claim (0x04) */\n FinalStageClaim = 0x04,\n /** Keep-alive packets (0x06) */\n KeepAlive = 0x06,\n}\n\n/**\n * Build stage 0x0a packet: Initial announcement (CDJ-3000 compatible).\n * Sent 3 times at 300ms intervals.\n */\nfunction makeStage0aPacket(device: Device): Uint8Array {\n const isHighPlayerNumber = device.id >= 5;\n const parts = [\n ...PROLINK_HEADER,\n ...[0x0a, 0x00],\n ...buildName(device),\n ...[0x01],\n ...[isHighPlayerNumber ? 0x04 : 0x02],\n ...[0x00, isHighPlayerNumber ? 0x26 : 0x25],\n ...[0x01],\n ];\n\n if (isHighPlayerNumber) {\n parts.push(0x40);\n }\n\n return Uint8Array.from(parts);\n}\n\n/**\n * Build stage 0x00 packet: First-stage device number claim (CDJ-3000 compatible).\n * Sent 3 times at 300ms intervals with counter N (1, 2, 3).\n */\nfunction makeStage00Packet(device: Device, counter: number): Uint8Array {\n const isHighPlayerNumber = device.id >= 5;\n const parts = [\n ...PROLINK_HEADER,\n ...[0x00, 0x00],\n ...buildName(device),\n ...[0x01],\n ...[isHighPlayerNumber ? 0x03 : 0x02],\n ...[0x00, 0x2c],\n ...[counter],\n ...[0x01],\n ...device.macAddr,\n ];\n\n return Uint8Array.from(parts);\n}\n\n/**\n * Build stage 0x02 packet: Second-stage device number claim (CDJ-3000 compatible).\n * Sent 3 times at 300ms intervals with counter N (1, 2, 3).\n */\nfunction makeStage02Packet(device: Device, counter: number): Uint8Array {\n const isHighPlayerNumber = device.id >= 5;\n const parts = [\n ...PROLINK_HEADER,\n ...[0x02, 0x00],\n ...buildName(device),\n ...[0x01],\n ...[isHighPlayerNumber ? 0x03 : 0x02],\n ...[0x00, 0x32],\n ...device.ip.toArray(),\n ...device.macAddr,\n ...[device.id],\n ...[counter],\n ...[0x30, 0x01, 0x01], // auto-assign mode\n ];\n\n return Uint8Array.from(parts);\n}\n\n/**\n * Build stage 0x04 packet: Final-stage device number claim (CDJ-3000 compatible).\n * Sent 1-3 times at 300ms intervals with counter N.\n */\nfunction makeStage04Packet(device: Device, counter: number): Uint8Array {\n const isHighPlayerNumber = device.id >= 5;\n const parts = [\n ...PROLINK_HEADER,\n ...[0x04, 0x00],\n ...buildName(device),\n ...[0x01],\n ...[isHighPlayerNumber ? 0x03 : 0x02],\n ...[0x00, 0x26],\n ...[device.id],\n ...[counter],\n ];\n\n return Uint8Array.from(parts);\n}\n\n/**\n * Build stage 0x06 packet: Keep-alive (CDJ-3000 compatible).\n * Sent every 1.5s after startup complete.\n */\nfunction makeStage06Packet(device: Device, peerCount: number): Uint8Array {\n const isHighPlayerNumber = device.id >= 5;\n const parts = [\n ...PROLINK_HEADER,\n ...[0x06, 0x00],\n ...buildName(device),\n ...[0x01, 0x02],\n ...[0x00, 0x36],\n ...[device.id],\n ...[0x01],\n ...device.macAddr,\n ...device.ip.toArray(),\n ...[0x30],\n ...[peerCount],\n ...[0x00, 0x00, 0x00, 0x01],\n ...[isHighPlayerNumber ? 0x64 : 0x00],\n ];\n\n return Uint8Array.from(parts);\n}\n\n/**\n * Check if a packet is a channel conflict (0x08) packet.\n * Returns the conflicting device ID if this is a conflict packet, null otherwise.\n */\nfunction parseConflictPacket(packet: Buffer): number | null {\n // Conflict packets are 0x29 (41) bytes long with packet type 0x08 at byte 0x0a\n if (packet.length !== 0x29) {\n return null;\n }\n\n // Check for PROLINK_HEADER\n if (!packet.subarray(0, 10).equals(Buffer.from(PROLINK_HEADER))) {\n return null;\n }\n\n // Check packet type byte (0x0a)\n if (packet[0x0a] !== 0x08) {\n return null;\n }\n\n // Extract the device ID being defended (byte 0x24)\n return packet[0x24];\n}\n\n/**\n * the announcer service is used to report our fake CDJ to the prolink network,\n * as if it was a real CDJ.\n */\nexport class Announcer {\n /**\n * The announce socket to use to make the announcements\n */\n #announceSocket: Socket;\n /**\n * The device manager service used to determine which devices to announce\n * ourselves to.\n */\n #deviceManager: DeviceManager;\n /**\n * The virtual CDJ device to announce\n */\n #vcdj: Device;\n /**\n * The interval handle used to stop announcing\n */\n #intervalHandle?: NodeJS.Timeout;\n /**\n * Whether to use full startup protocol\n */\n #fullStartup: boolean;\n /**\n * Whether to send announcer packets to Pioneer Stagehand devices, which are\n * normally excluded because they crash on our packets\n */\n #announceToStagehand: boolean;\n /**\n * Current startup stage (only used when fullStartup is enabled)\n */\n #currentStage: StartupStage = StartupStage.InitialAnnounce;\n /**\n * Packet counter within current stage (1, 2, 3)\n */\n #stageCounter = 0;\n /**\n * Listener for incoming conflict packets\n */\n #conflictListener?: (msg: Buffer) => void;\n /**\n * Network interface for the virtual CDJ\n */\n #iface: NetworkInterfaceInfoIPv4;\n /**\n * Logger instance for diagnostic output\n */\n #logger: Logger;\n /**\n * Callback invoked when the full startup protocol completes\n */\n #onStartupComplete?: () => void;\n\n constructor(\n vcdj: Device,\n announceSocket: Socket,\n deviceManager: DeviceManager,\n iface: NetworkInterfaceInfoIPv4,\n fullStartup = false,\n announceToStagehand = false,\n logger: Logger = noopLogger\n ) {\n this.#vcdj = vcdj;\n this.#announceSocket = announceSocket;\n this.#deviceManager = deviceManager;\n this.#iface = iface;\n this.#fullStartup = fullStartup;\n this.#announceToStagehand = announceToStagehand;\n this.#logger = logger;\n }\n\n /**\n * Returns a promise that resolves when the startup protocol completes.\n * Resolves immediately if fullStartup is disabled.\n */\n get ready(): Promise<void> {\n if (!this.#fullStartup) {\n return Promise.resolve();\n }\n if (this.#currentStage === StartupStage.KeepAlive) {\n return Promise.resolve();\n }\n return new Promise(resolve => {\n this.#onStartupComplete = resolve;\n });\n }\n\n start() {\n if (this.#fullStartup) {\n this.#startFullStartup();\n } else {\n this.#startKeepAlive();\n }\n }\n\n /**\n * Start the full startup protocol with stage progression.\n */\n #startFullStartup() {\n this.#currentStage = StartupStage.InitialAnnounce;\n this.#stageCounter = 0;\n\n // Set up conflict detection listener\n this.#conflictListener = (msg: Buffer) => {\n const conflictDeviceId = parseConflictPacket(msg);\n if (conflictDeviceId === this.#vcdj.id) {\n this.#logger.warn(\n `Device ID ${this.#vcdj.id} is already in use. Finding alternative...`\n );\n this.#handleConflict();\n }\n };\n this.#announceSocket.on('message', this.#conflictListener);\n\n this.#sendStagePackets();\n }\n\n /**\n * Handle a device ID conflict by finding an available ID and restarting.\n */\n #handleConflict() {\n // Stop current startup\n if (this.#intervalHandle) {\n clearTimeout(this.#intervalHandle);\n this.#intervalHandle = undefined;\n }\n\n // Find an available device ID\n const usedIds = new Set([...this.#deviceManager.devices.values()].map(d => d.id));\n let newId: number | null = null;\n\n // Try IDs from 7-32 first (recommended range), then 1-6 if needed\n for (let id = 7; id <= 32; id++) {\n if (!usedIds.has(id)) {\n newId = id;\n break;\n }\n }\n if (newId === null) {\n for (let id = 1; id <= 6; id++) {\n if (!usedIds.has(id)) {\n newId = id;\n break;\n }\n }\n }\n\n if (newId === null) {\n this.#logger.error('No available device IDs. All 32 slots are occupied.');\n this.stop();\n return;\n }\n\n this.#logger.info(`Switching to device ID ${newId}`);\n\n // Update virtual CDJ with new ID\n this.#vcdj = getVirtualCDJ(this.#iface, newId as DeviceID);\n\n // Restart startup sequence\n this.#currentStage = StartupStage.InitialAnnounce;\n this.#stageCounter = 0;\n this.#sendStagePackets();\n }\n\n /**\n * Sends a packet by unicast to every discovered device.\n *\n * Pioneer Stagehand is excluded by default (it crashes on our packets)\n * unless announceToStagehand is enabled.\n *\n * When nothing has been discovered yet, falls back to a subnet broadcast —\n * but only when announceToStagehand is enabled, because a broadcast reaches\n * every host including Stagehand. In normal operation the virtual CDJ is\n * found via unicast replies to peers' own announce broadcasts, so skipping\n * this cold-start broadcast costs nothing.\n */\n #sendPacket(packet: Uint8Array) {\n const devices = [...this.#deviceManager.devices.values()].filter(\n d => this.#announceToStagehand || !d.name.toLowerCase().includes('stagehand')\n );\n devices.forEach(device =>\n this.#announceSocket.send(packet, ANNOUNCE_PORT, device.ip.address)\n );\n\n // Cold-start discovery broadcast — gated; see the method doc above.\n if (devices.length === 0 && this.#announceToStagehand) {\n const broadcastAddr = getBroadcastAddress(this.#iface);\n this.#announceSocket.send(packet, ANNOUNCE_PORT, broadcastAddr);\n }\n }\n\n /**\n * Send packets for the current startup stage and progress to next stage.\n */\n #sendStagePackets() {\n this.#stageCounter++;\n\n // Build packet for current stage\n let packet: Uint8Array;\n switch (this.#currentStage) {\n case StartupStage.InitialAnnounce:\n packet = makeStage0aPacket(this.#vcdj);\n break;\n case StartupStage.FirstStageClaim:\n packet = makeStage00Packet(this.#vcdj, this.#stageCounter);\n break;\n case StartupStage.SecondStageClaim:\n packet = makeStage02Packet(this.#vcdj, this.#stageCounter);\n break;\n case StartupStage.FinalStageClaim:\n packet = makeStage04Packet(this.#vcdj, this.#stageCounter);\n break;\n case StartupStage.KeepAlive:\n // Transition to keep-alive mode\n this.#startKeepAlive();\n this.#onStartupComplete?.();\n this.#onStartupComplete = undefined;\n return;\n }\n\n this.#sendPacket(packet);\n\n // Progress to next packet or stage\n if (this.#stageCounter >= 3) {\n // Move to next stage\n this.#advanceStage();\n }\n\n // Schedule next packet (300ms for startup stages)\n this.#intervalHandle = setTimeout(\n () => this.#sendStagePackets(),\n STARTUP_STAGE_INTERVAL\n );\n }\n\n /**\n * Advance to the next startup stage.\n */\n #advanceStage() {\n this.#stageCounter = 0;\n\n switch (this.#currentStage) {\n case StartupStage.InitialAnnounce:\n this.#currentStage = StartupStage.FirstStageClaim;\n break;\n case StartupStage.FirstStageClaim:\n this.#currentStage = StartupStage.SecondStageClaim;\n break;\n case StartupStage.SecondStageClaim:\n this.#currentStage = StartupStage.FinalStageClaim;\n break;\n case StartupStage.FinalStageClaim:\n this.#currentStage = StartupStage.KeepAlive;\n break;\n }\n }\n\n /**\n * Start sending keep-alive packets (final stage or when fullStartup is disabled).\n */\n #startKeepAlive() {\n if (this.#intervalHandle) {\n clearTimeout(this.#intervalHandle);\n this.#intervalHandle = undefined;\n }\n\n // Remove conflict listener once we're in keep-alive mode\n if (this.#conflictListener) {\n this.#announceSocket.off('message', this.#conflictListener);\n this.#conflictListener = undefined;\n }\n\n const sendKeepAlive = () => {\n const peerCount = this.#deviceManager.devices.size + 1; // +1 for ourselves\n const packet = this.#fullStartup\n ? makeStage06Packet(this.#vcdj, peerCount)\n : makeAnnouncePacket(this.#vcdj);\n\n this.#sendPacket(packet);\n };\n\n // Send first keep-alive immediately\n sendKeepAlive();\n\n // Then schedule regular keep-alives\n this.#intervalHandle = setInterval(sendKeepAlive, ANNOUNCE_INTERVAL);\n }\n\n stop() {\n if (this.#intervalHandle !== undefined) {\n clearInterval(this.#intervalHandle);\n clearTimeout(this.#intervalHandle);\n this.#intervalHandle = undefined;\n }\n\n // Remove conflict listener if active\n if (this.#conflictListener) {\n this.#announceSocket.off('message', this.#conflictListener);\n this.#conflictListener = undefined;\n }\n }\n}\n","module.exports = require(\"async-mutex\");","module.exports = require(\"better-sqlite3-multiple-ciphers\");","module.exports = require(\"cap\");","module.exports = require(\"child_process\");","module.exports = require(\"crypto\");","module.exports = require(\"dgram\");","module.exports = require(\"events\");","module.exports = require(\"fs\");","module.exports = require(\"ip-address\");","module.exports = require(\"js-xdr\");","module.exports = require(\"kaitai-struct\");","module.exports = require(\"kaitai-struct/KaitaiStream\");","module.exports = require(\"lodash\");","module.exports = require(\"metadata-connect\");","module.exports = require(\"net\");","module.exports = require(\"onelibrary-connect\");","module.exports = require(\"os\");","module.exports = require(\"path\");","module.exports = require(\"promise-retry\");","module.exports = require(\"promise-socket\");","module.exports = require(\"promise-timeout\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Check if module exists (development only)\n\tif (__webpack_modules__[moduleId] === undefined) {\n\t\tvar e = new Error(\"Cannot find module '\" + moduleId + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(\"./src/index.ts\");\n",""],"names":[],"ignoreList":[],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"index.js","mappings":"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A;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,mBAAmB;AACzC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,6BAA6B;AACnD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB,SAAS;AAC/B;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,kBAAkB;AACxC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,kBAAkB;AACxC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AACD;AACA,CAAC;;;;;;;;;;;ACznCD;;AAEA;AACA,MAAM,IAA0C;AAChD,IAAI,iCAAO,CAAC,mFAA4B,CAAC,oCAAE,OAAO;AAAA;AAAA;AAAA,kGAAC;AACnD,IAAI,KAAK;AAAA,EAIN;AACH,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,KAAK,EAAE;AAAA,EAEV;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,oBAAoB;AAC9C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,mDAAmD;AACnD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oHAAoH;AAC5I;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,oDAAoD;AACpD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,CAAC;AACD;AACA,CAAC;;;;;;;;;;;;;ACrpDD;;;;GAIG;;;AAWH,+FAAyF;AAAjF,uIAAgB;AAAE,yIAAiB;AAAE,uIAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACf7D,yJAAsD;AACtD,6DAA2E;AAK3E,gFAAwC;AAExC;;GAEG;AACH,IAAY,KAWX;AAXD,WAAY,KAAK;IACf,0BAAiB;IACjB,wBAAe;IACf,wBAAe;IACf,wBAAe;IACf,wBAAe;IACf,oBAAW;IACX,4BAAmB;IACnB,8BAAqB;IACrB,yCAAgC;IAChC,wBAAe;AACjB,CAAC,EAXW,KAAK,qBAAL,KAAK,QAWhB;AAED,MAAM,cAAc,GAAG;IACrB,SAAS;IAC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AI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;QAC9F,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EA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","sources":["webpack://alphatheta-connect/./src/artwork/index.ts","webpack://alphatheta-connect/./src/artwork/parsers/aiff.ts","webpack://alphatheta-connect/./src/artwork/parsers/flac.ts","webpack://alphatheta-connect/./src/artwork/parsers/id3.ts","webpack://alphatheta-connect/./src/artwork/parsers/index.ts","webpack://alphatheta-connect/./src/artwork/parsers/mp4.ts","webpack://alphatheta-connect/./src/artwork/parsers/utils.ts","webpack://alphatheta-connect/./src/artwork/reader.ts","webpack://alphatheta-connect/./src/artwork/types.ts","webpack://alphatheta-connect/./src/constants.ts","webpack://alphatheta-connect/./src/control/index.ts","webpack://alphatheta-connect/./src/db/getArtworkFromFile.ts","webpack://alphatheta-connect/./src/db/getArtworkThumbnail.ts","webpack://alphatheta-connect/./src/db/getFile.ts","webpack://alphatheta-connect/./src/db/getMetadata.ts","webpack://alphatheta-connect/./src/db/getPlaylist.ts","webpack://alphatheta-connect/./src/db/getTrackAnalysis.ts","webpack://alphatheta-connect/./src/db/getWaveforms.ts","webpack://alphatheta-connect/./src/db/index.ts","webpack://alphatheta-connect/./src/db/utils.ts","webpack://alphatheta-connect/./src/devices/index.ts","webpack://alphatheta-connect/./src/devices/utils.ts","webpack://alphatheta-connect/./src/entities.ts","webpack://alphatheta-connect/./src/index.ts","webpack://alphatheta-connect/./src/localdb/index.ts","webpack://alphatheta-connect/./src/localdb/kaitai/rekordbox_anlz.ksy","webpack://alphatheta-connect/./src/localdb/kaitai/rekordbox_pdb.ksy","webpack://alphatheta-connect/./src/localdb/onelibrary.ts","webpack://alphatheta-connect/./src/localdb/orm.ts","webpack://alphatheta-connect/./src/localdb/rekordbox.ts","webpack://alphatheta-connect/./src/localdb/rekordbox/anlz-parsers.ts","webpack://alphatheta-connect/./src/localdb/rekordbox/entity-creators.ts","webpack://alphatheta-connect/./src/localdb/rekordbox/hydrator.ts","webpack://alphatheta-connect/./src/localdb/rekordbox/index.ts","webpack://alphatheta-connect/./src/localdb/rekordbox/table-mappings.ts","webpack://alphatheta-connect/./src/localdb/schema.ts","webpack://alphatheta-connect/./src/localdb/utils.ts","webpack://alphatheta-connect/./src/logger.ts","webpack://alphatheta-connect/./src/metadata.ts","webpack://alphatheta-connect/./src/mixstatus/index.ts","webpack://alphatheta-connect/./src/mixstatus/utils.ts","webpack://alphatheta-connect/./src/network.ts","webpack://alphatheta-connect/./src/nfs/index.ts","webpack://alphatheta-connect/./src/nfs/programs.ts","webpack://alphatheta-connect/./src/nfs/rpc.ts","webpack://alphatheta-connect/./src/nfs/utils.ts","webpack://alphatheta-connect/./src/nfs/xdr.ts","webpack://alphatheta-connect/./src/passive/alphatheta.ts","webpack://alphatheta-connect/./src/passive/devices.ts","webpack://alphatheta-connect/./src/passive/index.ts","webpack://alphatheta-connect/./src/passive/localdb.ts","webpack://alphatheta-connect/./src/passive/pcap-adapter.ts","webpack://alphatheta-connect/./src/passive/position.ts","webpack://alphatheta-connect/./src/passive/remotedb.ts","webpack://alphatheta-connect/./src/passive/status.ts","webpack://alphatheta-connect/./src/remotedb/constants.ts","webpack://alphatheta-connect/./src/remotedb/fields.ts","webpack://alphatheta-connect/./src/remotedb/index.ts","webpack://alphatheta-connect/./src/remotedb/message/index.ts","webpack://alphatheta-connect/./src/remotedb/message/item.ts","webpack://alphatheta-connect/./src/remotedb/message/response.ts","webpack://alphatheta-connect/./src/remotedb/message/types.ts","webpack://alphatheta-connect/./src/remotedb/queries.ts","webpack://alphatheta-connect/./src/remotedb/utils.ts","webpack://alphatheta-connect/./src/status/index.ts","webpack://alphatheta-connect/./src/status/media.ts","webpack://alphatheta-connect/./src/status/position.ts","webpack://alphatheta-connect/./src/status/types.ts","webpack://alphatheta-connect/./src/status/utils.ts","webpack://alphatheta-connect/./src/types.ts","webpack://alphatheta-connect/./src/utils/converters.ts","webpack://alphatheta-connect/./src/utils/index.ts","webpack://alphatheta-connect/./src/utils/telemetry.ts","webpack://alphatheta-connect/./src/utils/udp.ts","webpack://alphatheta-connect/./src/virtualcdj/index.ts","webpack://alphatheta-connect/external commonjs \"async-mutex\"","webpack://alphatheta-connect/external commonjs \"better-sqlite3-multiple-ciphers\"","webpack://alphatheta-connect/external node-commonjs \"child_process\"","webpack://alphatheta-connect/external node-commonjs \"crypto\"","webpack://alphatheta-connect/external node-commonjs \"dgram\"","webpack://alphatheta-connect/external commonjs \"events\"","webpack://alphatheta-connect/external node-commonjs \"fs\"","webpack://alphatheta-connect/external commonjs \"ip-address\"","webpack://alphatheta-connect/external commonjs \"js-xdr\"","webpack://alphatheta-connect/external commonjs \"kaitai-struct\"","webpack://alphatheta-connect/external commonjs \"kaitai-struct/KaitaiStream\"","webpack://alphatheta-connect/external commonjs \"lodash\"","webpack://alphatheta-connect/external commonjs \"metadata-connect\"","webpack://alphatheta-connect/external node-commonjs \"net\"","webpack://alphatheta-connect/external commonjs \"onelibrary-connect\"","webpack://alphatheta-connect/external node-commonjs \"os\"","webpack://alphatheta-connect/external node-commonjs \"path\"","webpack://alphatheta-connect/external commonjs \"promise-retry\"","webpack://alphatheta-connect/external commonjs \"promise-socket\"","webpack://alphatheta-connect/external commonjs \"promise-timeout\"","webpack://alphatheta-connect/webpack/bootstrap","webpack://alphatheta-connect/webpack/before-startup","webpack://alphatheta-connect/webpack/startup","webpack://alphatheta-connect/webpack/after-startup"],"sourcesContent":["import {type Logger, noopLogger} from 'src/logger';\nimport {getFileInfo, NfsMediaSlot} from 'src/nfs';\nimport {Device} from 'src/types';\n\nimport {\n extractFromAiff,\n extractFromFlac,\n extractFromMp3,\n extractFromMp4,\n} from './parsers';\nimport {createNfsFileReader} from './reader';\nimport {ExtractedArtwork, FileReader} from './types';\n\nexport {\n createBufferReader,\n createNfsFileReader,\n createNfsFileReaderWithInfo,\n} from './reader';\nexport type {ExtractedArtwork, FileReader} from './types';\nexport {PictureType} from './types';\n\nconst SUPPORTED_EXTENSIONS = new Set(['mp3', 'm4a', 'mp4', 'aac', 'flac', 'aiff', 'aif']);\n\nexport function isArtworkExtractionSupported(extension: string): boolean {\n return SUPPORTED_EXTENSIONS.has(extension.toLowerCase());\n}\n\nexport async function extractArtwork(\n reader: FileReader\n): Promise<ExtractedArtwork | null> {\n const ext = reader.extension.toLowerCase();\n\n switch (ext) {\n case 'mp3':\n return extractFromMp3(reader);\n case 'm4a':\n case 'mp4':\n case 'aac':\n return extractFromMp4(reader);\n case 'flac':\n return extractFromFlac(reader);\n case 'aiff':\n case 'aif':\n return extractFromAiff(reader);\n default: {\n const mp3Result = await extractFromMp3(reader);\n if (mp3Result) {\n return mp3Result;\n }\n return extractFromMp4(reader);\n }\n }\n}\n\nexport async function extractArtworkFromDevice(\n device: Device,\n slot: NfsMediaSlot,\n filePath: string,\n logger: Logger = noopLogger\n): Promise<ExtractedArtwork | null> {\n logger.debug(\n `[artwork-nfs] getFileInfo: device=${device.ip.address}, slot=${slot}, path=${filePath}`\n );\n const fileInfo = await getFileInfo({device, slot, path: filePath});\n logger.debug(`[artwork-nfs] File found: ${fileInfo.size} bytes`);\n const reader = createNfsFileReader(device, slot, filePath, fileInfo.size);\n const result = await extractArtwork(reader);\n logger.debug(\n `[artwork-nfs] extractArtwork result: ${result ? `${result.mimeType} (${result.data.length}b)` : 'null'}`\n );\n return result;\n}\n","import {ExtractedArtwork, FileReader} from '../types';\nimport {extractFromMp3} from './id3';\nimport {createBufferReader} from '../reader';\n\nexport async function extractFromAiff(reader: FileReader): Promise<ExtractedArtwork | null> {\n const header = await reader.read(0, 12);\n if (header.length < 12 || header.toString('ascii', 0, 4) !== 'FORM') return null;\n\n const formType = header.toString('ascii', 8, 12);\n if (formType !== 'AIFF' && formType !== 'AIFC') return null;\n\n const formSize = header.readUInt32BE(4);\n const fileEnd = Math.min(8 + formSize, reader.size);\n\n let offset = 12;\n\n while (offset + 8 < fileEnd) {\n const chunkHeader = await reader.read(offset, 8);\n if (chunkHeader.length < 8) break;\n\n const chunkId = chunkHeader.toString('ascii', 0, 4);\n const chunkSize = chunkHeader.readUInt32BE(4);\n\n if (chunkSize <= 0 || offset + 8 + chunkSize > fileEnd) break;\n\n if (chunkId === 'ID3 ' || chunkId === 'id3 ') {\n const id3Data = await reader.read(offset + 8, chunkSize);\n const id3Reader = createBufferReader(id3Data, 'mp3');\n return extractFromMp3(id3Reader);\n }\n\n offset += 8 + chunkSize + (chunkSize % 2);\n }\n\n return null;\n}\n","import {ExtractedArtwork, FileReader, PictureType} from '../types';\nimport {normalizeMimeType} from './utils';\n\nconst enum MetadataBlockType {\n STREAMINFO = 0,\n PICTURE = 6,\n}\n\nfunction parsePictureBlock(data: Buffer): ExtractedArtwork | null {\n if (data.length < 32) return null;\n\n let offset = 0;\n\n const pictureType = data.readUInt32BE(offset) as PictureType;\n offset += 4;\n\n const mimeLength = data.readUInt32BE(offset);\n offset += 4;\n\n if (offset + mimeLength > data.length) return null;\n\n const mimeType = data.toString('utf8', offset, offset + mimeLength);\n offset += mimeLength;\n\n const descLength = data.readUInt32BE(offset);\n offset += 4 + descLength;\n\n if (offset + 16 > data.length) return null;\n\n const width = data.readUInt32BE(offset);\n offset += 4;\n\n const height = data.readUInt32BE(offset);\n offset += 4 + 8; // Skip depth and colors\n\n const imageLength = data.readUInt32BE(offset);\n offset += 4;\n\n if (offset + imageLength > data.length) return null;\n\n const imageData = data.subarray(offset, offset + imageLength);\n if (imageData.length === 0) return null;\n\n return {\n data: imageData,\n mimeType: normalizeMimeType(mimeType),\n width: width > 0 ? width : undefined,\n height: height > 0 ? height : undefined,\n pictureType,\n };\n}\n\nexport async function extractFromFlac(reader: FileReader): Promise<ExtractedArtwork | null> {\n const signature = await reader.read(0, 4);\n if (signature.toString('ascii') !== 'fLaC') return null;\n\n let offset = 4;\n let isLastBlock = false;\n\n let frontCover: ExtractedArtwork | null = null;\n let anyArtwork: ExtractedArtwork | null = null;\n\n while (!isLastBlock && offset < reader.size) {\n const blockHeader = await reader.read(offset, 4);\n if (blockHeader.length < 4) break;\n\n isLastBlock = (blockHeader[0] & 0x80) !== 0;\n const blockType = blockHeader[0] & 0x7f;\n const blockLength = (blockHeader[1] << 16) | (blockHeader[2] << 8) | blockHeader[3];\n\n if (blockLength <= 0 || offset + 4 + blockLength > reader.size) break;\n\n if (blockType === MetadataBlockType.PICTURE) {\n const pictureData = await reader.read(offset + 4, blockLength);\n const artwork = parsePictureBlock(pictureData);\n\n if (artwork) {\n if (artwork.pictureType === PictureType.FrontCover) frontCover = artwork;\n else if (!anyArtwork) anyArtwork = artwork;\n }\n }\n\n offset += 4 + blockLength;\n }\n\n return frontCover ?? anyArtwork;\n}\n","import {ExtractedArtwork, FileReader, PictureType} from '../types';\nimport {detectImageType} from './utils';\n\nfunction readSyncsafe(buffer: Buffer, offset: number = 0): number {\n return (\n ((buffer[offset] & 0x7f) << 21) |\n ((buffer[offset + 1] & 0x7f) << 14) |\n ((buffer[offset + 2] & 0x7f) << 7) |\n (buffer[offset + 3] & 0x7f)\n );\n}\n\nfunction readNullTerminatedString(\n buffer: Buffer,\n offset: number,\n encoding: 'latin1' | 'utf8' | 'utf16le' | 'utf16be'\n): {value: string; bytesConsumed: number} {\n const isUtf16 = encoding === 'utf16le' || encoding === 'utf16be';\n let end = offset;\n\n if (isUtf16) {\n while (end < buffer.length - 1) {\n if (buffer[end] === 0 && buffer[end + 1] === 0) break;\n end += 2;\n }\n } else {\n while (end < buffer.length && buffer[end] !== 0) end++;\n }\n\n let value: string;\n if (encoding === 'utf16be') {\n const swapped = Buffer.alloc(end - offset);\n for (let i = 0; i < end - offset; i += 2) {\n swapped[i] = buffer[offset + i + 1];\n swapped[i + 1] = buffer[offset + i];\n }\n value = swapped.toString('utf16le');\n } else {\n value = buffer.toString(encoding === 'utf16le' ? 'utf16le' : encoding, offset, end);\n }\n\n return {value, bytesConsumed: end - offset + (isUtf16 ? 2 : 1)};\n}\n\nfunction getTextEncoding(encodingByte: number): 'latin1' | 'utf8' | 'utf16le' | 'utf16be' {\n switch (encodingByte) {\n case 0: return 'latin1';\n case 1: return 'utf16le';\n case 2: return 'utf16be';\n case 3: return 'utf8';\n default: return 'latin1';\n }\n}\n\nfunction parseApicFrame(data: Buffer): ExtractedArtwork | null {\n if (data.length < 4) return null;\n\n let offset = 0;\n const encodingByte = data[offset++];\n let encoding = getTextEncoding(encodingByte);\n\n if (encodingByte === 1 && data.length > offset + 2) {\n const bom = data.readUInt16BE(offset);\n if (bom === 0xfeff) encoding = 'utf16be';\n else if (bom === 0xfffe) encoding = 'utf16le';\n }\n\n const mimeResult = readNullTerminatedString(data, offset, 'latin1');\n const mimeType = mimeResult.value;\n offset += mimeResult.bytesConsumed;\n\n if (offset >= data.length) return null;\n\n const pictureType = data[offset++] as PictureType;\n if (offset >= data.length) return null;\n\n const descResult = readNullTerminatedString(data, offset, encoding);\n offset += descResult.bytesConsumed;\n\n if (offset >= data.length) return null;\n\n const imageData = data.subarray(offset);\n if (imageData.length === 0) return null;\n\n const detectedType = detectImageType(imageData);\n const finalMimeType = detectedType ?? (mimeType.includes('png') ? 'image/png' : 'image/jpeg');\n\n return {data: imageData, mimeType: finalMimeType, pictureType};\n}\n\nexport async function extractFromMp3(reader: FileReader): Promise<ExtractedArtwork | null> {\n const header = await reader.read(0, 10);\n if (header.length < 10 || header.toString('ascii', 0, 3) !== 'ID3') return null;\n\n const majorVersion = header[3];\n const flags = header[5];\n const tagSize = readSyncsafe(header, 6);\n\n let extendedHeaderSize = 0;\n if (flags & 0x40) {\n const extHeader = await reader.read(10, 4);\n extendedHeaderSize = majorVersion === 4 ? readSyncsafe(extHeader, 0) : extHeader.readUInt32BE(0);\n }\n\n const tagData = await reader.read(10 + extendedHeaderSize, tagSize - extendedHeaderSize);\n\n let offset = 0;\n const frameHeaderSize = majorVersion >= 3 ? 10 : 6;\n\n let frontCover: ExtractedArtwork | null = null;\n let anyArtwork: ExtractedArtwork | null = null;\n\n while (offset < tagData.length - frameHeaderSize) {\n if (tagData[offset] === 0) break;\n\n let frameId: string;\n let frameSize: number;\n\n if (majorVersion >= 3) {\n frameId = tagData.toString('ascii', offset, offset + 4);\n frameSize = majorVersion === 4 ? readSyncsafe(tagData, offset + 4) : tagData.readUInt32BE(offset + 4);\n } else {\n frameId = tagData.toString('ascii', offset, offset + 3);\n frameSize = (tagData[offset + 3] << 16) | (tagData[offset + 4] << 8) | tagData[offset + 5];\n }\n\n if (frameSize <= 0 || frameSize > tagData.length - offset) break;\n\n const frameIdNormalized = majorVersion >= 3 ? frameId : frameId === 'PIC' ? 'APIC' : frameId;\n\n if (frameIdNormalized === 'APIC') {\n const frameData = tagData.subarray(offset + frameHeaderSize, offset + frameHeaderSize + frameSize);\n const artwork = parseApicFrame(frameData);\n\n if (artwork) {\n if (artwork.pictureType === PictureType.FrontCover) frontCover = artwork;\n else if (!anyArtwork) anyArtwork = artwork;\n }\n }\n\n offset += frameHeaderSize + frameSize;\n }\n\n return frontCover ?? anyArtwork;\n}\n","export {extractFromMp3} from './id3';\nexport {extractFromMp4} from './mp4';\nexport {extractFromFlac} from './flac';\nexport {extractFromAiff} from './aiff';\nexport {detectImageType, normalizeMimeType} from './utils';\n","import {ExtractedArtwork, FileReader, PictureType} from '../types';\nimport {detectImageType} from './utils';\n\ninterface AtomHeader {\n size: number;\n type: string;\n headerSize: number;\n}\n\nasync function readAtomHeader(reader: FileReader, offset: number): Promise<AtomHeader | null> {\n if (offset + 8 > reader.size) return null;\n\n const header = await reader.read(offset, 8);\n const size = header.readUInt32BE(0);\n const type = header.toString('ascii', 4, 8);\n\n if (size === 1) {\n if (offset + 16 > reader.size) return null;\n const extHeader = await reader.read(offset + 8, 8);\n const extSize = Number(extHeader.readBigUInt64BE(0));\n return {size: extSize, type, headerSize: 16};\n }\n\n if (size === 0) return {size: reader.size - offset, type, headerSize: 8};\n\n return {size, type, headerSize: 8};\n}\n\nasync function findAtom(\n reader: FileReader,\n startOffset: number,\n endOffset: number,\n targetType: string\n): Promise<{dataOffset: number; dataSize: number} | null> {\n let offset = startOffset;\n\n while (offset < endOffset) {\n const header = await readAtomHeader(reader, offset);\n if (!header || header.size <= 0) break;\n\n if (header.type === targetType) {\n return {dataOffset: offset + header.headerSize, dataSize: header.size - header.headerSize};\n }\n\n offset += header.size;\n }\n\n return null;\n}\n\nasync function findMoovAtom(reader: FileReader): Promise<{dataOffset: number; dataSize: number} | null> {\n return findAtom(reader, 0, reader.size, 'moov');\n}\n\nasync function findCoverArtData(\n reader: FileReader,\n moovOffset: number,\n moovSize: number\n): Promise<Buffer | null> {\n const udta = await findAtom(reader, moovOffset, moovOffset + moovSize, 'udta');\n if (!udta) return null;\n\n const meta = await findAtom(reader, udta.dataOffset, udta.dataOffset + udta.dataSize, 'meta');\n if (!meta) return null;\n\n const metaDataStart = meta.dataOffset + 4;\n const metaDataEnd = meta.dataOffset + meta.dataSize;\n\n const ilst = await findAtom(reader, metaDataStart, metaDataEnd, 'ilst');\n if (!ilst) return null;\n\n const covr = await findAtom(reader, ilst.dataOffset, ilst.dataOffset + ilst.dataSize, 'covr');\n if (!covr) return null;\n\n const data = await findAtom(reader, covr.dataOffset, covr.dataOffset + covr.dataSize, 'data');\n if (!data || data.dataSize < 8) return null;\n\n return reader.read(data.dataOffset + 8, data.dataSize - 8);\n}\n\nexport async function extractFromMp4(reader: FileReader): Promise<ExtractedArtwork | null> {\n const ftypHeader = await reader.read(0, 8);\n if (ftypHeader.length < 8 || ftypHeader.toString('ascii', 4, 8) !== 'ftyp') return null;\n\n const moov = await findMoovAtom(reader);\n if (!moov) return null;\n\n const imageData = await findCoverArtData(reader, moov.dataOffset, moov.dataSize);\n if (!imageData || imageData.length === 0) return null;\n\n const mimeType = detectImageType(imageData) ?? 'image/jpeg';\n\n return {data: imageData, mimeType, pictureType: PictureType.FrontCover};\n}\n","import {ExtractedArtwork} from '../types';\n\nexport function detectImageType(\n data: Buffer\n): 'image/jpeg' | 'image/png' | 'image/gif' | null {\n if (data.length < 4) return null;\n if (data[0] === 0xff && data[1] === 0xd8 && data[2] === 0xff) return 'image/jpeg';\n if (data[0] === 0x89 && data.toString('ascii', 1, 4) === 'PNG') return 'image/png';\n if (data.toString('ascii', 0, 3) === 'GIF') return 'image/gif';\n return null;\n}\n\nexport function normalizeMimeType(mimeType: string): ExtractedArtwork['mimeType'] {\n const lower = mimeType.toLowerCase();\n if (lower.includes('png')) return 'image/png';\n if (lower.includes('gif')) return 'image/gif';\n return 'image/jpeg';\n}\n","import {fetchFileRange, getFileInfo, NfsMediaSlot} from 'src/nfs';\nimport {Device} from 'src/types';\n\nimport {FileReader} from './types';\n\n/**\n * Create a FileReader backed by NFS that reads from a device's media slot.\n */\nexport function createNfsFileReader(\n device: Device,\n slot: NfsMediaSlot,\n path: string,\n fileSize: number\n): FileReader {\n const extension = path.split('.').pop()?.toLowerCase() ?? '';\n\n return {\n size: fileSize,\n extension,\n read: (offset: number, length: number): Promise<Buffer> =>\n fetchFileRange({device, slot, path, offset, length}),\n };\n}\n\n/**\n * Create a FileReader backed by NFS, automatically fetching file size.\n */\nexport async function createNfsFileReaderWithInfo(\n device: Device,\n slot: NfsMediaSlot,\n path: string\n): Promise<FileReader> {\n const fileInfo = await getFileInfo({device, slot, path});\n return createNfsFileReader(device, slot, path, fileInfo.size);\n}\n\n/**\n * Create a FileReader from a Buffer (for testing).\n */\nexport function createBufferReader(buffer: Buffer, extension: string): FileReader {\n return {\n size: buffer.length,\n extension,\n read: (offset: number, length: number): Promise<Buffer> => {\n const end = Math.min(offset + length, buffer.length);\n return Promise.resolve(buffer.subarray(offset, end));\n },\n };\n}\n","/**\n * Extracted artwork from an audio file\n */\nexport interface ExtractedArtwork {\n data: Buffer;\n mimeType: 'image/jpeg' | 'image/png' | 'image/gif';\n width?: number;\n height?: number;\n pictureType?: PictureType;\n}\n\n/**\n * Standard picture types from ID3v2 / FLAC specs\n */\nexport enum PictureType {\n Other = 0,\n FileIcon32x32 = 1,\n OtherFileIcon = 2,\n FrontCover = 3,\n BackCover = 4,\n LeafletPage = 5,\n Media = 6,\n LeadArtist = 7,\n Artist = 8,\n Conductor = 9,\n Band = 10,\n Composer = 11,\n Lyricist = 12,\n RecordingLocation = 13,\n DuringRecording = 14,\n DuringPerformance = 15,\n MovieScreenCapture = 16,\n BrightColoredFish = 17,\n Illustration = 18,\n BandLogotype = 19,\n PublisherLogotype = 20,\n}\n\n/**\n * Interface for reading file data at arbitrary offsets.\n */\nexport interface FileReader {\n readonly size: number;\n readonly extension: string;\n read(offset: number, length: number): Promise<Buffer>;\n}\n","/**\n * The default virtual CDJ ID to use.\n *\n * This particular ID is out of the 1-6 range, thus will not be able to request\n * metadata via the remotedb for CDJs.\n */\nexport const DEFAULT_VCDJ_ID = 0x07;\n\n/**\n * The port on which devices on the prolink network announce themselves.\n */\nexport const ANNOUNCE_PORT = 50000;\n\n/**\n * The port on which devices on the prolink network send beat timing information.\n */\nexport const BEAT_PORT = 50001;\n\n/**\n * The port on which devices on the prolink network announce themselves.\n */\nexport const STATUS_PORT = 50002;\n\n/**\n * The amount of time in ms between sending each announcement packet.\n */\nexport const ANNOUNCE_INTERVAL = 1500;\n\n/**\n * The interval in ms between startup stage packets (0x0a, 0x00, 0x02, 0x04).\n */\nexport const STARTUP_STAGE_INTERVAL = 300;\n\n// prettier-ignore\n/**\n * All UDP packets on the PRO DJ LINK network start with this magic header.\n */\nexport const PROLINK_HEADER = Uint8Array.of(\n 0x51, 0x73, 0x70, 0x74, 0x31,\n 0x57, 0x6d, 0x4a, 0x4f, 0x4c\n);\n\n/**\n * VirtualCDJName is the name given to the Virtual CDJ device.\n */\nexport const VIRTUAL_CDJ_NAME = 'ProLink-Connect';\n\n/**\n * VirtualCDJFirmware is a string indicating the firmware version reported with\n * status packets.\n */\nexport const VIRTUAL_CDJ_FIRMWARE = '3.20';\n\n/**\n * CDJs use device IDs 1-6. Devices outside this range (e.g. Stagehand at 154)\n * should not be queried for media slots or databases as they may crash.\n */\nexport const MIN_CDJ_DEVICE_ID = 1;\nexport const MAX_CDJ_DEVICE_ID = 6;\n","import {Socket} from 'dgram';\n\nimport {BEAT_PORT, PROLINK_HEADER} from 'src/constants';\nimport {CDJStatus, Device} from 'src/types';\nimport {buildName} from 'src/utils';\nimport {udpSend} from 'src/utils/udp';\n\ninterface Options {\n hostDevice: Device;\n device: Device;\n playState: CDJStatus.PlayState.Cued | CDJStatus.PlayState.Playing;\n}\n\nconst STATE_MAP = {\n [CDJStatus.PlayState.Cued]: 0x01,\n [CDJStatus.PlayState.Playing]: 0x00,\n};\n\n/**\n * Generates the packet used to control the playstate of CDJs\n */\nexport const makePlaystatePacket = ({hostDevice, device, playState}: Options) =>\n Uint8Array.from([\n ...PROLINK_HEADER,\n ...[0x02],\n ...buildName(hostDevice),\n ...[0x01, 0x00],\n ...[hostDevice.id],\n ...[0x00, 0x04],\n ...new Array(4)\n .fill(0x00)\n .map((_, i) => (i === device.id ? STATE_MAP[playState] : 0)),\n ]);\n\nexport default class Control {\n #hostDevice: Device;\n /**\n * The socket used to send control packets\n */\n #beatSocket: Socket;\n\n constructor(beatSocket: Socket, hostDevice: Device) {\n this.#beatSocket = beatSocket;\n this.#hostDevice = hostDevice;\n }\n\n /**\n * Start or stop a CDJ on the network\n */\n async setPlayState(device: Device, playState: Options['playState']) {\n const packet = makePlaystatePacket({hostDevice: this.#hostDevice, device, playState});\n await udpSend(this.#beatSocket, packet, BEAT_PORT, device.ip.address);\n }\n}\n","import {extractArtworkFromDevice, isArtworkExtractionSupported} from 'src/artwork';\nimport {Track} from 'src/entities';\nimport {type Logger, noopLogger} from 'src/logger';\nimport {NfsMediaSlot} from 'src/nfs';\nimport {Device, DeviceID, MediaSlot} from 'src/types';\nimport {getSlotName} from 'src/utils';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\nimport * as Telemetry from 'src/utils/telemetry';\n\nexport interface Options {\n deviceId: DeviceID;\n trackSlot: MediaSlot;\n track: Track;\n span?: Span;\n logger?: Logger;\n}\n\n/**\n * Extract artwork directly from an audio file via NFS.\n */\nexport async function viaFileExtraction(\n device: Device,\n opts: Options\n): Promise<Buffer | null> {\n const {trackSlot, track, span} = opts;\n const logger = opts.logger ?? noopLogger;\n\n if (\n trackSlot !== MediaSlot.USB &&\n trackSlot !== MediaSlot.SD &&\n trackSlot !== MediaSlot.RB\n ) {\n logger.debug(\n `[artwork-nfs] Skipping: unsupported slot ${getSlotName(trackSlot)} (device ${device.name})`\n );\n return null;\n }\n\n const slot = trackSlot as NfsMediaSlot;\n\n if (!track.filePath) {\n logger.debug('[artwork-nfs] Skipping: no filePath on track');\n return null;\n }\n\n const extension = track.filePath.split('.').pop()?.toLowerCase() ?? '';\n if (!isArtworkExtractionSupported(extension)) {\n logger.debug(\n `[artwork-nfs] Skipping: unsupported extension \".${extension}\" (${track.filePath})`\n );\n return null;\n }\n\n logger.debug(\n `[artwork-nfs] Extracting from ${track.filePath} (slot=${getSlotName(trackSlot)}, device=${device.name} @ ${device.ip.address})`\n );\n\n const tx = span\n ? span.startChild({op: 'getArtworkFromFile'})\n : Telemetry.startTransaction({name: 'getArtworkFromFile'});\n\n try {\n const artwork = await extractArtworkFromDevice(device, slot, track.filePath, logger);\n\n if (!artwork) {\n logger.debug('[artwork-nfs] No embedded artwork found in file');\n tx.setData('result', 'no_artwork');\n tx.finish();\n return null;\n }\n\n logger.debug(\n `[artwork-nfs] Success: ${artwork.mimeType} (${artwork.data.length} bytes)`\n );\n tx.setData('result', 'success');\n tx.setData('mimeType', artwork.mimeType);\n tx.setData('size', artwork.data.length);\n tx.finish();\n\n return artwork.data;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.warn(`[artwork-nfs] NFS extraction failed: ${msg}`);\n tx.setData('result', 'error');\n tx.finish();\n Telemetry.captureException(error);\n return null;\n }\n}\n","import {Track} from 'src/entities';\nimport LocalDatabase from 'src/localdb';\nimport {fetchFile} from 'src/nfs';\nimport RemoteDatabase, {MenuTarget, Query} from 'src/remotedb';\nimport {Device, DeviceID, MediaSlot, TrackType} from 'src/types';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\nimport * as Telemetry from 'src/utils/telemetry';\n\nexport interface Options {\n /**\n * The device to query the track artwork off of\n */\n deviceId: DeviceID;\n /**\n * The media slot the track is present in\n */\n trackSlot: MediaSlot;\n /**\n * The type of track we are querying artwork for\n */\n trackType: TrackType;\n /**\n * The track to lookup artwork for\n */\n track: Track;\n /**\n * The Sentry transaction span\n */\n span?: Span;\n}\n\nexport async function viaRemote(remote: RemoteDatabase, opts: Required<Options>) {\n const {deviceId, trackSlot, trackType, track, span} = opts;\n\n const conn = await remote.get(deviceId);\n if (conn === null) {\n return null;\n }\n\n if (track.artwork === null) {\n return null;\n }\n\n const queryDescriptor = {\n trackSlot,\n trackType,\n menuTarget: MenuTarget.Main,\n };\n\n return conn.query({\n queryDescriptor,\n query: Query.GetArtwork,\n args: {artworkId: track.artwork.id},\n span,\n });\n}\n\nexport async function viaLocal(\n local: LocalDatabase,\n device: Device,\n opts: Required<Options>\n) {\n const {deviceId, trackSlot, track} = opts;\n\n if (trackSlot !== MediaSlot.USB && trackSlot !== MediaSlot.SD) {\n throw new Error('Expected USB or SD slot for remote database query');\n }\n\n const conn = await local.get(deviceId, trackSlot);\n if (conn === null) {\n return null;\n }\n\n if (track.artwork === null || track.artwork.path === undefined) {\n return null;\n }\n\n try {\n return fetchFile({device, slot: trackSlot, path: track.artwork.path});\n } catch (error) {\n Telemetry.captureException(error);\n return null;\n }\n}\n","import {Track} from 'src/entities';\nimport LocalDatabase from 'src/localdb';\nimport {type Logger, noopLogger} from 'src/logger';\nimport {fetchFile} from 'src/nfs';\nimport RemoteDatabase from 'src/remotedb';\nimport {Device, DeviceID, MediaSlot, TrackType} from 'src/types';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\nimport * as Telemetry from 'src/utils/telemetry';\n\nexport interface Options {\n /**\n * The device to query the file off of\n */\n deviceId: DeviceID;\n /**\n * The media slot the track is present in\n */\n trackSlot: MediaSlot;\n /**\n * The type of track we are querying file for\n */\n trackType: TrackType;\n /**\n * The track to get track for\n */\n track: Track;\n /**\n * The Sentry transaction span\n */\n span?: Span;\n /**\n * Logger instance for diagnostic output\n */\n logger?: Logger;\n}\n\nconst CHUNK_SIZE = 8192; // Maximum allowed XDR read size\n\nexport function viaRemote(\n _remote: RemoteDatabase,\n _device: Device,\n _opts: Options\n): null {\n const logger = _opts.logger ?? noopLogger;\n logger.error('Getting a file from Rekordbox via ProDJ-Link is not yet supported.');\n return null;\n\n // const conn = await remote.get(deviceId);\n // if (conn === null) {\n // return null;\n // }\n\n // if (track.artwork === null) {\n // return null;\n // }\n\n // const queryDescriptor = {\n // trackSlot,\n // trackType,\n // menuTarget: MenuTarget.Main,\n // };\n\n // return conn.query({\n // queryDescriptor,\n // query: Query.GetArtwork,\n // args: {artworkId: track.artwork.id},\n // span,\n // });\n}\n\nexport async function viaLocal(local: LocalDatabase, device: Device, opts: Options) {\n const {deviceId, trackSlot, track} = opts;\n const logger = opts.logger ?? noopLogger;\n\n if (trackSlot !== MediaSlot.USB && trackSlot !== MediaSlot.SD) {\n throw new Error('Expected USB or SD or RB slot for remote database query');\n }\n\n const conn = await local.get(deviceId, trackSlot);\n if (conn === null) {\n return null;\n }\n\n try {\n return fetchFile({\n device,\n slot: trackSlot,\n path: track.filePath,\n onProgress: progress => {\n logger.trace('%d %d', progress.read, progress.total);\n },\n chunkSize: CHUNK_SIZE,\n });\n } catch (error) {\n Telemetry.captureException(error);\n return null;\n }\n}\n","import {Track} from 'src/entities';\nimport LocalDatabase from 'src/localdb';\nimport {loadAnlz} from 'src/localdb/rekordbox';\nimport RemoteDatabase, {MenuTarget, Query} from 'src/remotedb';\nimport {Device, DeviceID, MediaSlot, TrackType} from 'src/types';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\n\nimport {anlzLoader} from './utils';\n\nexport interface Options {\n /**\n * The device to query the track metadata from\n */\n deviceId: DeviceID;\n /**\n * The media slot the track is present in\n */\n trackSlot: MediaSlot;\n /**\n * The type of track we are querying for\n */\n trackType: TrackType;\n /**\n * The track id to retrieve metadata for\n */\n trackId: number;\n /**\n * The Sentry transaction span\n */\n span?: Span;\n}\n\nexport async function viaRemote(remote: RemoteDatabase, opts: Required<Options>) {\n const {deviceId, trackSlot, trackType, trackId, span} = opts;\n\n const conn = await remote.get(deviceId);\n if (conn === null) {\n return null;\n }\n\n const queryDescriptor = {\n trackSlot,\n trackType,\n menuTarget: MenuTarget.Main,\n };\n\n const isUnanalyzed =\n trackType === TrackType.Unanalyzed || trackType === TrackType.AudioCD;\n const isStreaming = trackType === TrackType.Streaming;\n const skipLocalFileLookups = isUnanalyzed || isStreaming;\n\n // Unanalyzed tracks use GetGenericMetadata (reads ID3 tags from the audio file).\n // Streaming tracks (Beatport) use the regular GetMetadata query.\n const track = await conn.query({\n queryDescriptor,\n query: isUnanalyzed ? Query.GetGenericMetadata : Query.GetMetadata,\n args: {trackId},\n span,\n });\n\n // Try to get file path — for streaming tracks this returns the Beatport track ID\n // (e.g. \"/26883657.m4a\") which we use for Beatport API lookups\n try {\n track.filePath = await conn.query({\n queryDescriptor,\n query: Query.GetTrackInfo,\n args: {trackId},\n span,\n });\n } catch (err) {\n if (!skipLocalFileLookups) {\n throw err;\n }\n }\n\n // Beat grid is only available for analyzed local tracks\n if (!skipLocalFileLookups) {\n track.beatGrid = await conn.query({\n queryDescriptor,\n query: Query.GetBeatGrid,\n args: {trackId},\n span,\n });\n }\n\n return track;\n}\n\nexport async function viaLocal(\n local: LocalDatabase,\n device: Device,\n opts: Required<Options>\n) {\n const {deviceId, trackSlot, trackId} = opts;\n\n if (trackSlot !== MediaSlot.USB && trackSlot !== MediaSlot.SD) {\n throw new Error('Expected USB or SD slot for local database query');\n }\n\n const adapter = await local.get(deviceId, trackSlot);\n if (adapter === null) {\n return null;\n }\n\n const dbTrack = adapter.findTrack(trackId);\n\n if (dbTrack === null) {\n return null;\n }\n\n const anlz = await loadAnlz(dbTrack, 'DAT', anlzLoader({device, slot: trackSlot}));\n\n const track: Track = {\n ...dbTrack,\n beatGrid: anlz.beatGrid,\n waveformHd: null,\n };\n\n return track;\n}\n","import {Playlist} from 'src/entities';\nimport LocalDatabase from 'src/localdb';\nimport RemoteDatabase, {MenuTarget, Query} from 'src/remotedb';\nimport {DeviceID, MediaSlot, PlaylistContents, TrackType} from 'src/types';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\n\nexport interface Options {\n /**\n * The playlist or folder to query the entries of. This may be left as\n * undefined to retrieve the root playlist.\n */\n playlist?: Playlist;\n /**\n * The device to query the track metadata from\n */\n deviceId: DeviceID;\n /**\n * The media slot the track is present in\n */\n mediaSlot: MediaSlot;\n /**\n * The Sentry transaction span\n */\n span?: Span;\n}\n\nexport async function viaRemote(remote: RemoteDatabase, opts: Options) {\n const {playlist, deviceId, mediaSlot, span} = opts;\n\n const conn = await remote.get(deviceId);\n if (conn === null) {\n return null;\n }\n\n const queryDescriptor = {\n trackSlot: mediaSlot,\n trackType: TrackType.RB,\n menuTarget: MenuTarget.Main,\n };\n\n const id = playlist?.id;\n const isFolderRequest = playlist?.isFolder ?? true;\n\n const {folders, playlists, trackEntries} = await conn.query({\n queryDescriptor,\n query: Query.MenuPlaylist,\n args: {id, isFolderRequest},\n span,\n });\n\n const iterateTracks = async function* () {\n for (const entry of trackEntries) {\n if (!conn) {\n break;\n }\n\n yield conn.query({\n queryDescriptor,\n query: Query.GetMetadata,\n args: {trackId: entry.id},\n span,\n });\n }\n };\n\n const tracks = {[Symbol.asyncIterator]: iterateTracks};\n const totalTracks = trackEntries.length;\n\n return {folders, playlists, tracks, totalTracks} as PlaylistContents;\n}\n\nexport async function viaLocal(local: LocalDatabase, opts: Options) {\n const {playlist, deviceId, mediaSlot} = opts;\n\n if (mediaSlot !== MediaSlot.USB && mediaSlot !== MediaSlot.SD) {\n throw new Error('Expected USB or SD slot for local database query');\n }\n\n const orm = await local.get(deviceId, mediaSlot);\n if (orm === null) {\n return null;\n }\n\n const {folders, playlists, trackEntries} = orm.findPlaylist(playlist?.id);\n\n const iterateTracks = async function* () {\n for (const entry of trackEntries) {\n if (!orm) {\n break;\n }\n yield orm.findTrack(entry.id);\n }\n };\n\n const tracks = {[Symbol.asyncIterator]: iterateTracks};\n const totalTracks = trackEntries.length;\n\n return {folders, playlists, tracks, totalTracks} as PlaylistContents;\n}\n","import {Track} from 'src/entities';\nimport LocalDatabase from 'src/localdb';\nimport {loadAnlz} from 'src/localdb/rekordbox';\nimport {\n Device,\n DeviceID,\n ExtendedCue,\n MediaSlot,\n SongStructure,\n TrackType,\n VocalConfig,\n Waveform3BandDetail,\n Waveform3BandPreview,\n WaveformHD,\n} from 'src/types';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\n\nimport {anlzLoader} from './utils';\n\nexport interface TrackAnalysis {\n /** Extended cues with colors and comments (PCO2 tag) */\n extendedCues: ExtendedCue[] | null;\n /** Song structure / phrase analysis (PSSI tag) */\n songStructure: SongStructure | null;\n /** Color waveform preview (PWV4 tag) */\n waveformColorPreview: Uint8Array | undefined;\n /** HD waveform data (PWV5 tag) */\n waveformHd: WaveformHD | null;\n /** 3-band color waveform preview (PWV6 tag from .2EX) */\n waveform3BandPreview: Waveform3BandPreview | null;\n /** 3-band color detail waveform (PWV7 tag from .2EX) */\n waveform3BandDetail: Waveform3BandDetail | null;\n /** Vocal detection config (PWVC tag from .2EX) */\n vocalConfig: VocalConfig | null;\n}\n\nexport interface Options {\n deviceId: DeviceID;\n trackSlot: MediaSlot;\n trackType: TrackType;\n track: Track;\n span?: Span;\n}\n\nexport async function viaLocal(\n local: LocalDatabase,\n device: Device,\n opts: Required<Options>\n): Promise<TrackAnalysis | null> {\n const {deviceId, trackSlot, track} = opts;\n\n if (trackSlot !== MediaSlot.USB && trackSlot !== MediaSlot.SD) {\n throw new Error('Expected USB or SD slot for local database query');\n }\n\n const conn = await local.get(deviceId, trackSlot);\n if (conn === null) {\n return null;\n }\n\n const resolver = anlzLoader({device, slot: trackSlot});\n const [extResult, twoxResult] = await Promise.all([\n loadAnlz(track, 'EXT', resolver),\n loadAnlz(track, '2EX', resolver).catch(() => null),\n ]);\n\n return {\n extendedCues: extResult.extendedCues,\n songStructure: extResult.songStructure,\n waveformColorPreview: extResult.waveformColorPreview ?? undefined,\n waveformHd: extResult.waveformHd,\n waveform3BandPreview: twoxResult?.waveform3BandPreview ?? null,\n waveform3BandDetail: twoxResult?.waveform3BandDetail ?? null,\n vocalConfig: twoxResult?.vocalConfig ?? null,\n };\n}\n","import {Track} from 'src/entities';\nimport LocalDatabase from 'src/localdb';\nimport {loadAnlz} from 'src/localdb/rekordbox';\nimport RemoteDatabase, {MenuTarget, Query} from 'src/remotedb';\nimport {\n Device,\n DeviceID,\n MediaSlot,\n TrackType,\n WaveformDetailed,\n WaveformPreview,\n Waveforms,\n} from 'src/types';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\n\nimport {anlzLoader} from './utils';\n\nexport interface Options {\n /**\n * The device to query the track waveforms off of\n */\n deviceId: DeviceID;\n /**\n * The media slot the track is present in\n */\n trackSlot: MediaSlot;\n /**\n * The type of track we are querying waveforms for\n */\n trackType: TrackType;\n /**\n * The track to lookup waveforms for\n */\n track: Track;\n /**\n * The Sentry transaction span\n */\n span?: Span;\n}\n\nexport async function viaRemote(remote: RemoteDatabase, opts: Required<Options>) {\n const {deviceId, trackSlot, trackType, track, span} = opts;\n\n const conn = await remote.get(deviceId);\n if (conn === null) {\n return null;\n }\n\n const queryDescriptor = {\n trackSlot,\n trackType,\n menuTarget: MenuTarget.Main,\n };\n\n const waveformHd = await conn.query({\n queryDescriptor,\n query: Query.GetWaveformHD,\n args: {trackId: track.id},\n span,\n });\n\n const isStreaming = trackType === TrackType.Streaming;\n\n if (!isStreaming) {\n return {waveformHd} as Waveforms;\n }\n\n // Streaming tracks (e.g. Beatport LINK) have no local ANLZ file but the CDJ\n // serves waveform preview and detailed via remotedb.\n const [waveformPreview, waveformDetailed] = await Promise.all([\n conn.query({\n queryDescriptor,\n query: Query.GetWaveformPreview,\n args: {trackId: track.id},\n span,\n }) as Promise<WaveformPreview>,\n conn.query({\n queryDescriptor,\n query: Query.GetWaveformDetailed,\n args: {trackId: track.id},\n span,\n }) as Promise<WaveformDetailed>,\n ]);\n\n return {waveformHd, waveformPreview, waveformDetailed} as Waveforms;\n}\n\nexport async function viaLocal(\n local: LocalDatabase,\n device: Device,\n opts: Required<Options>\n) {\n const {deviceId, trackSlot, track} = opts;\n\n if (trackSlot !== MediaSlot.USB && trackSlot !== MediaSlot.SD) {\n throw new Error('Expected USB or SD slot for remote database query');\n }\n\n const conn = await local.get(deviceId, trackSlot);\n if (conn === null) {\n return null;\n }\n\n const anlz = await loadAnlz(track, 'EXT', anlzLoader({device, slot: trackSlot}));\n\n return {\n waveformHd: anlz.waveformHd,\n waveformColorPreview: anlz.waveformColorPreview ?? undefined,\n } as Waveforms;\n}\n","import DeviceManager from 'src/devices';\nimport {Track} from 'src/entities';\nimport LocalDatabase from 'src/localdb';\nimport {DatabaseType} from 'src/localdb/database-adapter';\nimport RemoteDatabase from 'src/remotedb';\nimport {\n Device,\n DeviceType,\n MediaSlot,\n PlaylistContents,\n TrackType,\n Waveforms,\n} from 'src/types';\nimport {getSlotName, getTrackTypeName} from 'src/utils';\nimport * as Telemetry from 'src/utils/telemetry';\nimport {SpanStatus} from 'src/utils/telemetry';\n\nimport * as GetArtworkFromFile from './getArtworkFromFile';\nimport * as GetArtworkThumbnail from './getArtworkThumbnail';\nimport * as GetFile from './getFile';\nimport * as GetMetadata from './getMetadata';\nimport * as GetPlaylist from './getPlaylist';\nimport * as GetTrackAnalysis from './getTrackAnalysis';\nimport * as GetWaveforms from './getWaveforms';\n\nenum LookupStrategy {\n Remote,\n Local,\n NoneAvailable,\n}\n\n/**\n * A Database is the central service used to query devices on the prolink\n * network for information from their databases.\n */\nclass Database {\n #deviceManager: DeviceManager;\n /**\n * The local database service, used when querying media devices connected\n * directly to CDJs containing a rekordbox formatted database.\n */\n #localDatabase: LocalDatabase;\n /**\n * The remote database service, used when querying the Rekordbox software or a\n * CDJ with an unanalyzed media device connected (when possible).\n */\n #remoteDatabase: RemoteDatabase;\n\n constructor(\n local: LocalDatabase,\n remote: RemoteDatabase,\n deviceManager: DeviceManager\n ) {\n this.#localDatabase = local;\n this.#remoteDatabase = remote;\n this.#deviceManager = deviceManager;\n }\n\n #getTrackLookupStrategy = (device: Device, type: TrackType) => {\n const isUnanalyzed = type === TrackType.AudioCD || type === TrackType.Unanalyzed;\n const isStreaming = type === TrackType.Streaming;\n\n // Unanalyzed and streaming tracks on CDJs must use RemoteDB\n // (streaming services like Beatport have no local database)\n if (device.type === DeviceType.CDJ && (isUnanalyzed || isStreaming)) {\n return LookupStrategy.Remote;\n }\n\n return device.type === DeviceType.Rekordbox\n ? LookupStrategy.Remote\n : device.type === DeviceType.CDJ && type === TrackType.RB\n ? LookupStrategy.Local\n : LookupStrategy.NoneAvailable;\n };\n\n #getMediaLookupStrategy = (device: Device, slot: MediaSlot) =>\n device.type === DeviceType.Rekordbox && slot === MediaSlot.RB\n ? LookupStrategy.Remote\n : device.type === DeviceType.Rekordbox\n ? LookupStrategy.NoneAvailable\n : LookupStrategy.Local;\n /**\n * Get the database type (oneLibrary or pdb) for a loaded device slot.\n * Returns null if the slot uses remote database or no database is loaded.\n */\n getDatabaseType(\n deviceId: number,\n slot: MediaSlot.USB | MediaSlot.SD\n ): DatabaseType | null {\n return this.#localDatabase.getDatabaseType(deviceId, slot);\n }\n\n /**\n * Retrieve metadata for a track on a specific device slot.\n */\n async getMetadata(opts: GetMetadata.Options) {\n const {deviceId, trackType, trackSlot, span} = opts;\n\n const tx = span\n ? span.startChild({op: 'dbGetMetadata'})\n : Telemetry.startTransaction({name: 'dbGetMetadata'});\n\n tx.setTag('deviceId', deviceId.toString());\n tx.setTag('trackType', getTrackTypeName(trackType));\n tx.setTag('trackSlot', getSlotName(trackSlot));\n\n const callOpts = {...opts, span: tx};\n\n const device = await this.#deviceManager.getDeviceEnsured(deviceId);\n if (device === null) {\n return null;\n }\n\n const strategy = this.#getTrackLookupStrategy(device, trackType);\n let track: Track | null = null;\n\n if (strategy === LookupStrategy.Remote) {\n track = await GetMetadata.viaRemote(this.#remoteDatabase, callOpts);\n }\n\n if (strategy === LookupStrategy.Local) {\n track = await GetMetadata.viaLocal(this.#localDatabase, device, callOpts);\n }\n\n if (strategy === LookupStrategy.NoneAvailable) {\n tx.setStatus(SpanStatus.Unavailable);\n }\n\n tx.finish();\n\n return track;\n }\n\n /**\n * Retrieves the file off a specific device slot.\n */\n async getFile(opts: GetArtworkThumbnail.Options) {\n const {deviceId, trackType, trackSlot, span} = opts;\n\n const tx = span\n ? span.startChild({op: 'dbGetFile'})\n : Telemetry.startTransaction({name: 'dbGetFile'});\n\n tx.setTag('deviceId', deviceId.toString());\n tx.setTag('trackType', getTrackTypeName(trackType));\n tx.setTag('trackSlot', getSlotName(trackSlot));\n\n const callOpts = {...opts, span: tx};\n\n const device = await this.#deviceManager.getDeviceEnsured(deviceId);\n if (device === null) {\n return null;\n }\n\n const strategy = this.#getTrackLookupStrategy(device, trackType);\n let artwork: Buffer | null = null;\n\n if (strategy === LookupStrategy.Remote) {\n artwork = await GetFile.viaRemote(this.#remoteDatabase, device, callOpts);\n }\n\n if (strategy === LookupStrategy.Local) {\n artwork = await GetFile.viaLocal(this.#localDatabase, device, callOpts);\n }\n\n if (strategy === LookupStrategy.NoneAvailable) {\n tx.setStatus(SpanStatus.Unavailable);\n }\n\n tx.finish();\n\n return artwork;\n }\n\n /**\n * Retrieves the low-resolution artwork thumbnail from the rekordbox database.\n *\n * This returns the pre-generated thumbnail stored in the rekordbox database,\n * which is typically small (around 80x80 pixels).\n *\n * For full-resolution artwork extracted from the audio file, use getArtwork().\n */\n async getArtworkThumbnail(opts: GetArtworkThumbnail.Options) {\n const {deviceId, trackType, trackSlot, span} = opts;\n\n const tx = span\n ? span.startChild({op: 'dbGetArtwork'})\n : Telemetry.startTransaction({name: 'dbGetArtwork'});\n\n tx.setTag('deviceId', deviceId.toString());\n tx.setTag('trackType', getTrackTypeName(trackType));\n tx.setTag('trackSlot', getSlotName(trackSlot));\n\n const callOpts = {...opts, span: tx};\n\n const device = await this.#deviceManager.getDeviceEnsured(deviceId);\n if (device === null) {\n return null;\n }\n\n const strategy = this.#getTrackLookupStrategy(device, trackType);\n let artwork: Buffer | null = null;\n\n if (strategy === LookupStrategy.Remote) {\n artwork = await GetArtworkThumbnail.viaRemote(this.#remoteDatabase, callOpts);\n }\n\n if (strategy === LookupStrategy.Local) {\n artwork = await GetArtworkThumbnail.viaLocal(this.#localDatabase, device, callOpts);\n }\n\n if (strategy === LookupStrategy.NoneAvailable) {\n tx.setStatus(SpanStatus.Unavailable);\n }\n\n tx.finish();\n\n return artwork;\n }\n\n /**\n * Retrieves artwork for a track by extracting it from the audio file via NFS.\n *\n * This is the primary method for getting artwork. It reads embedded artwork\n * from the audio file (ID3 tags for MP3, metadata atoms for M4A, PICTURE\n * blocks for FLAC, etc.) using partial file reads to minimize data transfer.\n *\n * For low-resolution thumbnails from the rekordbox database, use\n * getArtworkThumbnail() instead.\n */\n async getArtwork(opts: GetArtworkFromFile.Options) {\n const {deviceId, trackSlot, span} = opts;\n\n const tx = span\n ? span.startChild({op: 'dbGetArtwork'})\n : Telemetry.startTransaction({name: 'dbGetArtwork'});\n\n tx.setTag('deviceId', deviceId.toString());\n tx.setTag('trackSlot', getSlotName(trackSlot));\n\n const callOpts = {...opts, span: tx};\n\n const device = await this.#deviceManager.getDeviceEnsured(deviceId);\n if (device === null) {\n tx.setStatus(SpanStatus.NotFound);\n tx.finish();\n return null;\n }\n\n const artwork = await GetArtworkFromFile.viaFileExtraction(device, callOpts);\n\n tx.finish();\n\n return artwork;\n }\n\n /**\n * Retrieves the waveforms for a track on a specific device slot.\n */\n async getWaveforms(opts: GetArtworkThumbnail.Options) {\n const {deviceId, trackType, trackSlot, span} = opts;\n\n const tx = span\n ? span.startChild({op: 'dbGetWaveforms'})\n : Telemetry.startTransaction({name: 'dbGetWaveforms'});\n\n tx.setTag('deviceId', deviceId.toString());\n tx.setTag('trackType', getTrackTypeName(trackType));\n tx.setTag('trackSlot', getSlotName(trackSlot));\n\n const callOpts = {...opts, span: tx};\n\n const device = await this.#deviceManager.getDeviceEnsured(deviceId);\n if (device === null) {\n return null;\n }\n\n const strategy = this.#getTrackLookupStrategy(device, trackType);\n let waveforms: Waveforms | null = null;\n\n if (strategy === LookupStrategy.Remote) {\n waveforms = await GetWaveforms.viaRemote(this.#remoteDatabase, callOpts);\n }\n\n if (strategy === LookupStrategy.Local) {\n waveforms = await GetWaveforms.viaLocal(this.#localDatabase, device, callOpts);\n }\n\n if (strategy === LookupStrategy.NoneAvailable) {\n tx.setStatus(SpanStatus.Unavailable);\n }\n\n tx.finish();\n\n return waveforms;\n }\n\n /**\n * Retrieves all analysis data from the EXT file for a track.\n * Returns extended cues, song structure, waveform color preview, and HD waveform.\n */\n async getTrackAnalysis(opts: GetTrackAnalysis.Options) {\n const {deviceId, trackType, trackSlot, span} = opts;\n\n const tx = span\n ? span.startChild({op: 'dbGetTrackAnalysis'})\n : Telemetry.startTransaction({name: 'dbGetTrackAnalysis'});\n\n tx.setTag('deviceId', deviceId.toString());\n tx.setTag('trackType', getTrackTypeName(trackType));\n tx.setTag('trackSlot', getSlotName(trackSlot));\n\n const callOpts = {...opts, span: tx};\n\n const device = await this.#deviceManager.getDeviceEnsured(deviceId);\n if (device === null) {\n tx.finish();\n return null;\n }\n\n const strategy = this.#getTrackLookupStrategy(device, trackType);\n let analysis: GetTrackAnalysis.TrackAnalysis | null = null;\n\n if (strategy === LookupStrategy.Local) {\n analysis = await GetTrackAnalysis.viaLocal(this.#localDatabase, device, callOpts);\n }\n\n if (strategy === LookupStrategy.NoneAvailable || strategy === LookupStrategy.Remote) {\n tx.setStatus(SpanStatus.Unavailable);\n }\n\n tx.finish();\n\n return analysis;\n }\n\n /**\n * Retrieve folders, playlists, and tracks within the playlist tree. The id\n * may be left undefined to query the root of the playlist tree.\n *\n * NOTE: You will never receive a track list and playlists or folders at the\n * same time. But the API is simpler to combine the lookup for these.\n */\n async getPlaylist(opts: GetPlaylist.Options) {\n const {deviceId, mediaSlot, span} = opts;\n\n const tx = span\n ? span.startChild({op: 'dbGetPlaylist'})\n : Telemetry.startTransaction({name: 'dbGetPlaylist'});\n\n tx.setTag('deviceId', deviceId.toString());\n tx.setTag('mediaSlot', getSlotName(mediaSlot));\n\n const callOpts = {...opts, span: tx};\n\n const device = await this.#deviceManager.getDeviceEnsured(deviceId);\n if (device === null) {\n return null;\n }\n\n const strategy = this.#getMediaLookupStrategy(device, mediaSlot);\n let contents: PlaylistContents | null = null;\n\n if (strategy === LookupStrategy.Remote) {\n contents = await GetPlaylist.viaRemote(this.#remoteDatabase, callOpts);\n }\n\n if (strategy === LookupStrategy.Local) {\n contents = await GetPlaylist.viaLocal(this.#localDatabase, callOpts);\n }\n\n if (strategy === LookupStrategy.NoneAvailable) {\n tx.setStatus(SpanStatus.Unavailable);\n }\n\n tx.finish();\n\n return contents;\n }\n}\n\nexport default Database;\n","import {fetchFile} from 'src/nfs';\nimport {Device, MediaSlot} from 'src/types';\n\ninterface AnlzLoaderOpts {\n device: Device;\n slot: MediaSlot.RB | MediaSlot.USB | MediaSlot.SD;\n}\n\nexport function anlzLoader(opts: AnlzLoaderOpts) {\n return (path: string) => fetchFile({...opts, path});\n}\n","import StrictEventEmitter from 'strict-event-emitter-types';\n\nimport {Socket} from 'dgram';\nimport {EventEmitter} from 'events';\n\nimport {VIRTUAL_CDJ_NAME} from 'src/constants';\nimport {Device, DeviceID} from 'src/types';\n\nimport {deviceFromPacket} from './utils';\n\ninterface Config {\n /**\n * Time in milliseconds after which a device is considered to have\n * disconnected if it has not broadcast an announcement.\n *\n * @default 10000 ms\n */\n deviceTimeout?: number;\n /**\n * The name of the virtual CDJ to filter out from device announcements.\n * This prevents our own device from appearing in the device list.\n *\n * @default VIRTUAL_CDJ_NAME constant\n */\n vcdjName?: string;\n}\n\nconst defaultConfig: Required<Config> = {\n deviceTimeout: 10000,\n vcdjName: VIRTUAL_CDJ_NAME,\n};\n\n/**\n * The upper bound in milliseconds to wait when looking for a device to be on\n * the network when using the `getDeviceEnsured` method.\n */\nconst ENSURED_TIMEOUT = 2000;\n\n/**\n * The configuration object that may be passed to reconfigure the manager\n */\ntype ConfigEditable = Omit<Config, 'announceSocket'>;\n\n/**\n * The interface the device manager event emitter should follow\n */\ninterface DeviceEvents {\n /**\n * Fired when a new device becomes available on the network\n */\n connected: (device: Device) => void;\n /**\n * Fired when a device has not announced itself on the network for the\n * specified timeout.\n */\n disconnected: (device: Device) => void;\n /**\n * Fired every time the device announces itself on the network\n */\n announced: (device: Device) => void;\n}\n\ntype Emitter = StrictEventEmitter<EventEmitter, DeviceEvents>;\n\n/**\n * The device manager is responsible for tracking devices that appear on the\n * prolink network, providing an API to react to devices livecycle events as\n * they connect and disconnect form the network.\n */\nclass DeviceManager {\n /**\n * Device manager configuration\n */\n #config: Required<Config>;\n /**\n * The map of all active devices currently available on the network.\n */\n #devices = new Map<DeviceID, Device>();\n /**\n * Tracks device timeout handlers, as devices announce themselves these\n * timeouts will be updated.\n */\n #deviceTimeouts = new Map<DeviceID, NodeJS.Timeout>();\n /**\n * The EventEmitter which will be used to trigger device lifecycle events\n */\n #emitter: Emitter = new EventEmitter();\n\n constructor(announceSocket: Socket, config?: Config) {\n this.#config = {...defaultConfig, ...config};\n\n // Begin listening for device announcements\n announceSocket.on('message', this.#handleAnnounce);\n }\n\n // Bind public event emitter interface\n on: Emitter['on'] = this.#emitter.addListener.bind(this.#emitter);\n off: Emitter['off'] = this.#emitter.removeListener.bind(this.#emitter);\n once: Emitter['once'] = this.#emitter.once.bind(this.#emitter);\n\n /**\n * Get active devices on the network.\n */\n get devices() {\n return this.#devices;\n }\n\n /**\n * Waits for a specific device ID to appear on the network, with a\n * configurable timeout, in which case it will resolve with null.\n */\n async getDeviceEnsured(id: DeviceID, timeout: number = ENSURED_TIMEOUT) {\n const existingDevice = this.devices.get(id);\n\n if (existingDevice !== undefined) {\n return existingDevice;\n }\n\n let handler: ((device: Device) => void) | undefined;\n\n // Wait for the device to be connected\n const devicePromise = new Promise<Device>(resolve => {\n handler = (device: Device) => device.id === id && resolve(device);\n this.on('connected', handler);\n });\n\n const device = await Promise.race([\n devicePromise,\n new Promise<null>(r => setTimeout(() => r(null), timeout)),\n ]);\n this.off('connected', handler!);\n\n return device;\n }\n\n reconfigure(config: ConfigEditable) {\n this.#config = {...this.#config, ...config};\n }\n\n #handleAnnounce = (message: Buffer) => {\n const device = deviceFromPacket(message);\n\n if (device === null) {\n return;\n }\n\n if (device.name === this.#config.vcdjName) {\n return;\n }\n\n // Device has not checked in before\n if (!this.#devices.has(device.id)) {\n this.#devices.set(device.id, device);\n this.#emitter.emit('connected', device);\n }\n\n this.#emitter.emit('announced', device);\n\n // Reset the device timeout handler\n const activeTimeout = this.#deviceTimeouts.get(device.id);\n if (activeTimeout) {\n clearTimeout(activeTimeout);\n }\n\n const timeout = this.#config.deviceTimeout;\n const newTimeout = setTimeout(this.#handleDisconnect, timeout, device);\n this.#deviceTimeouts.set(device.id, newTimeout);\n };\n\n #handleDisconnect = (removedDevice: Device) => {\n this.#devices.delete(removedDevice.id);\n this.#deviceTimeouts.delete(removedDevice.id);\n\n this.#emitter.emit('disconnected', removedDevice);\n };\n}\n\nexport default DeviceManager;\n","import * as ip from 'ip-address';\n\nimport {PROLINK_HEADER} from 'src/constants';\nimport {Device} from 'src/types';\n\n/**\n * Converts a announce packet to a device object.\n */\nexport function deviceFromPacket(packet: Buffer) {\n if (packet.indexOf(PROLINK_HEADER) !== 0) {\n throw new Error('Announce packet does not start with expected header');\n }\n\n if (packet[0x0a] !== 0x06) {\n return null;\n }\n\n const name = packet\n .slice(0x0c, 0x0c + 20)\n .toString()\n .replace(/\\0/g, '');\n\n const device: Device = {\n name,\n id: packet[0x24],\n type: packet[0x34],\n macAddr: new Uint8Array(packet.slice(0x26, 0x26 + 6)),\n ip: ip.Address4.fromInteger(packet.readUInt32BE(0x2c)),\n };\n\n return device;\n}\n","import type {BeatGrid, WaveformHD} from 'src/types';\nimport type {\n Track as OneLibraryTrack,\n CueAndLoop,\n} from 'onelibrary-connect';\n\n/**\n * Re-export entity types from onelibrary-connect.\n * These types represent what is stored in the rekordbox database.\n */\nexport {EntityFK} from 'onelibrary-connect';\nexport type {\n Album,\n Artist,\n Artwork,\n Color,\n Genre,\n Key,\n Label,\n Playlist,\n PlaylistEntry,\n} from 'onelibrary-connect';\n\n/**\n * Represents a track with both database fields and ANLZ analysis data.\n *\n * Extends the onelibrary-connect Track type with ANLZ-specific fields\n * that are populated from .DAT/.EXT analysis files on the CDJ.\n */\nexport type Track<withFKs extends import('onelibrary-connect').EntityFK = import('onelibrary-connect').EntityFK.WithRelations> =\n OneLibraryTrack<withFKs> & {\n /**\n * Embedded beat grid information (from ANLZ files)\n */\n beatGrid: BeatGrid | null;\n\n /**\n * Embedded HD Waveform information (from ANLZ files)\n */\n waveformHd: WaveformHD | null;\n };\n","export * from './entities';\nexport * from './mixstatus';\nexport * from './network';\nexport {default as PositionEmitter} from './status/position';\n\n// Passive mode (pcap-based monitoring without announcing a VCDJ)\nexport * from './passive';\n\n// Artwork extraction\nexport {\n extractArtwork,\n extractArtworkFromDevice,\n isArtworkExtractionSupported,\n PictureType,\n} from './artwork';\nexport type {ExtractedArtwork, FileReader as ArtworkFileReader} from './artwork';\n\n// Full metadata extraction (title, artist, album, BPM, key, genre, artwork)\nexport {\n extractFullMetadata,\n extractMetadataFromDevice,\n isMetadataExtractionSupported,\n} from './metadata';\nexport type {ExtractedMetadata} from './metadata';\n\n// ANLZ file loading (for analysis data: beat grid, cues, phrases, waveforms)\nexport {loadAnlz} from './localdb/rekordbox';\nexport {fetchFile} from './nfs';\nexport type {AnlzResolver, AnlzResponse, AnlzResponse2EX, AnlzResponseDAT, AnlzResponseEXT} from './localdb/rekordbox';\n\n// Database adapters (re-exported from onelibrary-connect)\nexport type {\n DatabaseAdapter,\n DatabasePreference,\n DatabaseType,\n PlaylistQueryResult,\n} from 'onelibrary-connect';\nexport {OneLibraryAdapter} from 'onelibrary-connect';\n\n// OneLibrary schema types (re-exported from onelibrary-connect)\nexport type {\n Category,\n DeviceProperty,\n HistorySession,\n HotCueBankList,\n MenuItem,\n MyTag,\n SortOption,\n} from 'onelibrary-connect';\n\n// Logger interface for pluggable logging\nexport {noopLogger} from './logger';\nexport type {Logger} from './logger';\n\n// Types are exported last to avoid overwriting values with type-only exports\nexport * from './types';\n","import {Mutex} from 'async-mutex';\nimport {\n type DatabaseAdapter,\n type DatabasePreference,\n type DatabaseType,\n OneLibraryAdapter,\n} from 'onelibrary-connect';\nimport StrictEventEmitter from 'strict-event-emitter-types';\n\nimport {createHash} from 'crypto';\nimport {EventEmitter} from 'events';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\n\nimport {MAX_CDJ_DEVICE_ID, MIN_CDJ_DEVICE_ID} from 'src/constants';\nimport DeviceManager from 'src/devices';\nimport {fetchFile, FetchProgress} from 'src/nfs';\nimport StatusEmitter from 'src/status';\nimport {\n Device,\n DeviceID,\n DeviceType,\n MediaSlot,\n MediaSlotInfo,\n TrackType,\n} from 'src/types';\nimport {getSlotName} from 'src/utils';\nimport * as Telemetry from 'src/utils/telemetry';\n\nimport {MetadataORM} from './orm';\nimport {hydrateDatabase, HydrationProgress} from './rekordbox';\n\n/**\n * Rekordbox databases will only exist within these two slots\n */\ntype DatabaseSlot = MediaSlot.USB | MediaSlot.SD;\n\ninterface CommonProgressOpts {\n /**\n * The device progress is being reported for\n */\n device: Device;\n /**\n * The media slot progress is being reported for\n */\n slot: MediaSlot;\n}\n\ntype DownloadProgressOpts = CommonProgressOpts & {\n /**\n * The current progress of the fetch\n */\n progress: FetchProgress;\n};\n\ntype HydrationProgressOpts = CommonProgressOpts & {\n /**\n * The current progress of the database hydration\n */\n progress: HydrationProgress;\n};\n\ntype HydrationDoneOpts = CommonProgressOpts;\n\n/**\n * Events that may be triggered by the LocalDatabase emitter\n */\ninterface DatabaseEvents {\n /**\n * Triggered when we are fetching a database from a CDJ\n */\n fetchProgress: (opts: DownloadProgressOpts) => void;\n /**\n * Triggered when we are hydrating a rekordbox database into the in-memory\n * sqlite database.\n */\n hydrationProgress: (opts: HydrationProgressOpts) => void;\n /**\n * Triggered when the database has been fully hydrated.\n *\n * There is a period of time between hydrationProgress reporting 100% copletion,\n * and the database being flushed, so it may be useful to wait for this event\n * before considering the database to be fully hydrated.\n */\n hydrationDone: (opts: HydrationDoneOpts) => void;\n}\n\ntype Emitter = StrictEventEmitter<EventEmitter, DatabaseEvents>;\n\ninterface DatabaseItem {\n /**\n * The uniquity identifier of the database\n */\n id: string;\n /**\n * The media device plugged into the device\n */\n media: MediaSlotInfo;\n /**\n * The database adapter instance (MetadataORM or OneLibraryAdapter)\n */\n adapter: DatabaseAdapter;\n /**\n * Path to temp file (for OneLibrary), needs cleanup on close\n */\n tempFile?: string;\n}\n\n/**\n * Compute the identifier for media device in a CDJ. This is used to determine\n * if we have already hydrated the device or not into our local database.\n */\nconst getMediaId = (info: MediaSlotInfo) => {\n const inputs = [\n info.deviceId,\n info.slot,\n info.name,\n info.freeBytes,\n info.totalBytes,\n info.trackCount,\n info.createdDate,\n ];\n\n return createHash('sha256').update(inputs.join('.'), 'utf8').digest('hex');\n};\n\n/**\n * The local database is responsible for syncing the remote rekordbox databases\n * of media slots on a device into in-memory sqlite databases.\n *\n * This service will attempt to ensure the in-memory databases for each media\n * device that is connected to a CDJ is locally kept in sync. Fetching the\n * database for any media slot of it's not already cached.\n */\nclass LocalDatabase {\n #hostDevice: Device;\n #deviceManager: DeviceManager;\n #statusEmitter: StatusEmitter;\n /**\n * The EventEmitter that will report database events\n */\n #emitter: Emitter = new EventEmitter();\n /**\n * Locks for each device slot: ${device.id}-${slot}. Used when making track\n * requets.\n */\n #slotLocks = new Map<string, Mutex>();\n /**\n * The current available databases\n */\n #dbs: DatabaseItem[] = [];\n /**\n * Database format preference\n */\n #preference: DatabasePreference = 'auto';\n\n constructor(\n hostDevice: Device,\n deviceManager: DeviceManager,\n statusEmitter: StatusEmitter,\n preference: DatabasePreference = 'auto'\n ) {\n this.#hostDevice = hostDevice;\n this.#deviceManager = deviceManager;\n this.#statusEmitter = statusEmitter;\n this.#preference = preference;\n\n deviceManager.on('disconnected', this.#handleDeviceRemoved);\n }\n\n /**\n * Get the current database preference\n */\n get preference(): DatabasePreference {\n return this.#preference;\n }\n\n /**\n * Set the database preference. Only affects newly loaded databases.\n */\n set preference(value: DatabasePreference) {\n this.#preference = value;\n }\n\n // Bind public event emitter interface\n on: Emitter['on'] = this.#emitter.addListener.bind(this.#emitter);\n off: Emitter['off'] = this.#emitter.removeListener.bind(this.#emitter);\n once: Emitter['once'] = this.#emitter.once.bind(this.#emitter);\n\n /**\n * Disconnects the local database connection for the specified device\n */\n disconnectForDevice(device: Device) {\n this.#handleDeviceRemoved(device);\n }\n\n /**\n * Closes the database connection and removes the database entry when a\n * device is removed.\n */\n #handleDeviceRemoved = (device: Device) => {\n const db = this.#dbs.find(db => db.media.deviceId === device.id);\n if (db) {\n db.adapter.close();\n // Clean up temp file if it exists (OneLibrary databases)\n if (db.tempFile) {\n try {\n fs.unlinkSync(db.tempFile);\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n this.#dbs = this.#dbs.filter(db => db.media.deviceId !== device.id);\n };\n\n /**\n * Helper to fetch a file from device, trying both dotted and non-dotted paths\n */\n #fetchFileWithFallback = async (\n device: Device,\n slot: DatabaseSlot,\n basePath: string,\n tx: Telemetry.TelemetrySpan\n ): Promise<Buffer> => {\n const attemptOrder =\n process.platform === 'win32'\n ? [basePath, `.${basePath}`]\n : [`.${basePath}`, basePath];\n\n try {\n return await fetchFile({\n device,\n slot,\n path: attemptOrder[0],\n span: tx,\n onProgress: progress =>\n this.#emitter.emit('fetchProgress', {device, slot, progress}),\n });\n } catch {\n return fetchFile({\n device,\n slot,\n path: attemptOrder[1],\n span: tx,\n onProgress: progress =>\n this.#emitter.emit('fetchProgress', {device, slot, progress}),\n });\n }\n };\n\n /**\n * Try to load OneLibrary database (exportLibrary.db).\n * Returns the adapter and temp file path, or null if not available.\n */\n #tryLoadOneLibrary = async (\n device: Device,\n slot: DatabaseSlot,\n tx: Telemetry.TelemetrySpan\n ): Promise<{adapter: OneLibraryAdapter; tempFile: string} | null> => {\n const oneLibraryPath = 'PIONEER/rekordbox/exportLibrary.db';\n\n try {\n const dbData = await this.#fetchFileWithFallback(device, slot, oneLibraryPath, tx);\n\n // Write to temp file (OneLibrary requires file path for SQLCipher)\n const tempDir = os.tmpdir();\n const tempFile = path.join(\n tempDir,\n `prolink-onelibrary-${device.id}-${slot}-${Date.now()}.db`\n );\n fs.writeFileSync(tempFile, dbData);\n\n const adapter = new OneLibraryAdapter(tempFile);\n return {adapter, tempFile};\n } catch {\n // OneLibrary not available\n return null;\n }\n };\n\n /**\n * Load PDB database (export.pdb) and hydrate into MetadataORM.\n */\n #loadPdbDatabase = async (\n device: Device,\n slot: DatabaseSlot,\n tx: Telemetry.TelemetrySpan\n ): Promise<MetadataORM> => {\n const pdbPath = 'PIONEER/rekordbox/export.pdb';\n const pdbData = await this.#fetchFileWithFallback(device, slot, pdbPath, tx);\n\n const dbCreateTx = tx.startChild({op: 'setupDatabase'});\n const orm = new MetadataORM();\n dbCreateTx.finish();\n\n await hydrateDatabase({\n orm,\n pdbData,\n span: tx,\n onProgress: progress =>\n this.#emitter.emit('hydrationProgress', {device, slot, progress}),\n });\n\n return orm;\n };\n\n /**\n * Downloads and loads a database from a device.\n * Respects the database preference setting:\n * - 'auto': Try OneLibrary first, fall back to PDB\n * - 'oneLibrary': Only use OneLibrary\n * - 'pdb': Only use PDB\n */\n #hydrateDatabase = async (device: Device, slot: DatabaseSlot, media: MediaSlotInfo) => {\n const tx = Telemetry.startTransaction({name: 'hydrateDatabase'});\n\n tx.setTag('slot', getSlotName(media.slot));\n tx.setData('numTracks', media.trackCount.toString());\n tx.setTag('preference', this.#preference);\n\n let adapter: DatabaseAdapter;\n let tempFile: string | undefined;\n\n if (this.#preference === 'pdb') {\n // PDB only\n adapter = await this.#loadPdbDatabase(device, slot, tx);\n tx.setTag('dbType', 'pdb');\n } else if (this.#preference === 'oneLibrary') {\n // OneLibrary only\n const oneLibraryResult = await this.#tryLoadOneLibrary(device, slot, tx);\n if (!oneLibraryResult) {\n throw new Error(\n 'OneLibrary database not found and preference is set to oneLibrary only'\n );\n }\n adapter = oneLibraryResult.adapter;\n tempFile = oneLibraryResult.tempFile;\n tx.setTag('dbType', 'oneLibrary');\n } else {\n // Auto: Try OneLibrary first, fall back to PDB\n const oneLibraryResult = await this.#tryLoadOneLibrary(device, slot, tx);\n\n if (oneLibraryResult) {\n adapter = oneLibraryResult.adapter;\n tempFile = oneLibraryResult.tempFile;\n tx.setTag('dbType', 'oneLibrary');\n } else {\n adapter = await this.#loadPdbDatabase(device, slot, tx);\n tx.setTag('dbType', 'pdb');\n }\n }\n\n this.#emitter.emit('hydrationDone', {device, slot});\n\n const db: DatabaseItem = {adapter, media, id: getMediaId(media), tempFile};\n this.#dbs.push(db);\n\n tx.finish();\n\n return db;\n };\n\n /**\n * Gets the database adapter for the media metadata in the provided device slot.\n *\n * If the database has not already been loaded this will first fetch and load the\n * database, which may take some time depending on the size of the database.\n *\n * @returns null if no rekordbox media present\n */\n async get(deviceId: DeviceID, slot: DatabaseSlot): Promise<DatabaseAdapter | null> {\n const lockKey = `${deviceId}-${slot}`;\n const lock =\n this.#slotLocks.get(lockKey) ??\n this.#slotLocks.set(lockKey, new Mutex()).get(lockKey)!;\n\n const device = this.#deviceManager.devices.get(deviceId);\n if (device === undefined) {\n return null;\n }\n\n if (\n device.type !== DeviceType.CDJ ||\n device.id < MIN_CDJ_DEVICE_ID ||\n device.id > MAX_CDJ_DEVICE_ID\n ) {\n return null;\n }\n\n let media;\n try {\n media = await this.#statusEmitter.queryMediaSlot({\n hostDevice: this.#hostDevice,\n device,\n slot,\n });\n } catch {\n // Timeout or other error - treat as no media\n return null;\n }\n\n if (media.tracksType !== TrackType.RB) {\n return null;\n }\n\n const id = getMediaId(media);\n\n // Acquire a lock for this device slot that will not release until we've\n // guaranteed the existence of the database.\n const db = await lock.runExclusive(() => {\n const cached = this.#dbs.find(db => db.id === id);\n if (cached) {\n return cached;\n }\n return this.#hydrateDatabase(device, slot, media);\n });\n\n return db.adapter;\n }\n\n /**\n * Get the database type for an already-loaded device slot.\n * Returns null if no database is loaded for that device/slot.\n */\n getDatabaseType(deviceId: DeviceID, slot: DatabaseSlot): DatabaseType | null {\n const db = this.#dbs.find(\n db => db.media.deviceId === deviceId && db.media.slot === slot\n );\n return db?.adapter.type ?? null;\n }\n\n /**\n * Preload the databases for all connected devices.\n */\n async preload() {\n const allDevices = [...this.#deviceManager.devices.values()];\n const cdjDevices = allDevices.filter(\n device =>\n device.type === DeviceType.CDJ &&\n device.id >= MIN_CDJ_DEVICE_ID &&\n device.id <= MAX_CDJ_DEVICE_ID\n );\n\n if (cdjDevices.length === 0) {\n return;\n }\n\n const loaders = cdjDevices.map(device =>\n Promise.all([this.get(device.id, MediaSlot.USB), this.get(device.id, MediaSlot.SD)])\n );\n\n await Promise.all(loaders);\n }\n}\n\nexport default LocalDatabase;\n","// This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild\n\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define(['kaitai-struct/KaitaiStream'], factory);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = factory(require('kaitai-struct/KaitaiStream'));\n } else {\n root.RekordboxAnlz = factory(root.KaitaiStream);\n }\n}(this, function (KaitaiStream) {\n/**\n * These files are created by rekordbox when analyzing audio tracks\n * to facilitate DJ performance. They include waveforms, beat grids\n * (information about the precise time at which each beat occurs),\n * time indices to allow efficient seeking to specific positions\n * inside variable bit-rate audio streams, and lists of memory cues\n * and loop points. They are used by Pioneer professional DJ\n * equipment.\n * \n * The format has been reverse-engineered to facilitate sophisticated\n * integrations with light and laser shows, videos, and other musical\n * instruments, by supporting deep knowledge of what is playing and\n * what is coming next through monitoring the network communications\n * of the players.\n * @see {@link https://reverseengineering.stackexchange.com/questions/4311/help-reversing-a-edb-database-file-for-pioneers-rekordbox-software|Source}\n */\n\nvar RekordboxAnlz = (function() {\n RekordboxAnlz.CueEntryStatus = Object.freeze({\n DISABLED: 0,\n ENABLED: 1,\n\n 0: \"DISABLED\",\n 1: \"ENABLED\",\n });\n\n RekordboxAnlz.CueListType = Object.freeze({\n MEMORY_CUES: 0,\n HOT_CUES: 1,\n\n 0: \"MEMORY_CUES\",\n 1: \"HOT_CUES\",\n });\n\n RekordboxAnlz.MoodHighPhrase = Object.freeze({\n INTRO: 1,\n UP: 2,\n DOWN: 3,\n CHORUS: 5,\n OUTRO: 6,\n\n 1: \"INTRO\",\n 2: \"UP\",\n 3: \"DOWN\",\n 5: \"CHORUS\",\n 6: \"OUTRO\",\n });\n\n RekordboxAnlz.TrackBank = Object.freeze({\n DEFAULT: 0,\n COOL: 1,\n NATURAL: 2,\n HOT: 3,\n SUBTLE: 4,\n WARM: 5,\n VIVID: 6,\n CLUB_1: 7,\n CLUB_2: 8,\n\n 0: \"DEFAULT\",\n 1: \"COOL\",\n 2: \"NATURAL\",\n 3: \"HOT\",\n 4: \"SUBTLE\",\n 5: \"WARM\",\n 6: \"VIVID\",\n 7: \"CLUB_1\",\n 8: \"CLUB_2\",\n });\n\n RekordboxAnlz.CueEntryType = Object.freeze({\n MEMORY_CUE: 1,\n LOOP: 2,\n\n 1: \"MEMORY_CUE\",\n 2: \"LOOP\",\n });\n\n RekordboxAnlz.SectionTags = Object.freeze({\n CUES_2: 1346588466,\n CUES: 1346588482,\n PATH: 1347441736,\n BEAT_GRID: 1347507290,\n SONG_STRUCTURE: 1347638089,\n VBR: 1347830354,\n WAVE_PREVIEW: 1347895638,\n WAVE_TINY: 1347900978,\n WAVE_SCROLL: 1347900979,\n WAVE_COLOR_PREVIEW: 1347900980,\n WAVE_COLOR_SCROLL: 1347900981,\n WAVE_COLOR_3BAND_PREVIEW: 1347900982,\n WAVE_COLOR_3BAND_DETAIL: 1347900983,\n VOCAL_CONFIG: 1347900995,\n\n 1346588466: \"CUES_2\",\n 1346588482: \"CUES\",\n 1347441736: \"PATH\",\n 1347507290: \"BEAT_GRID\",\n 1347638089: \"SONG_STRUCTURE\",\n 1347830354: \"VBR\",\n 1347895638: \"WAVE_PREVIEW\",\n 1347900978: \"WAVE_TINY\",\n 1347900979: \"WAVE_SCROLL\",\n 1347900980: \"WAVE_COLOR_PREVIEW\",\n 1347900981: \"WAVE_COLOR_SCROLL\",\n 1347900982: \"WAVE_COLOR_3BAND_PREVIEW\",\n 1347900983: \"WAVE_COLOR_3BAND_DETAIL\",\n 1347900995: \"VOCAL_CONFIG\",\n });\n\n RekordboxAnlz.TrackMood = Object.freeze({\n HIGH: 1,\n MID: 2,\n LOW: 3,\n\n 1: \"HIGH\",\n 2: \"MID\",\n 3: \"LOW\",\n });\n\n RekordboxAnlz.MoodMidPhrase = Object.freeze({\n INTRO: 1,\n VERSE_1: 2,\n VERSE_2: 3,\n VERSE_3: 4,\n VERSE_4: 5,\n VERSE_5: 6,\n VERSE_6: 7,\n BRIDGE: 8,\n CHORUS: 9,\n OUTRO: 10,\n\n 1: \"INTRO\",\n 2: \"VERSE_1\",\n 3: \"VERSE_2\",\n 4: \"VERSE_3\",\n 5: \"VERSE_4\",\n 6: \"VERSE_5\",\n 7: \"VERSE_6\",\n 8: \"BRIDGE\",\n 9: \"CHORUS\",\n 10: \"OUTRO\",\n });\n\n RekordboxAnlz.MoodLowPhrase = Object.freeze({\n INTRO: 1,\n VERSE_1: 2,\n VERSE_1B: 3,\n VERSE_1C: 4,\n VERSE_2: 5,\n VERSE_2B: 6,\n VERSE_2C: 7,\n BRIDGE: 8,\n CHORUS: 9,\n OUTRO: 10,\n\n 1: \"INTRO\",\n 2: \"VERSE_1\",\n 3: \"VERSE_1B\",\n 4: \"VERSE_1C\",\n 5: \"VERSE_2\",\n 6: \"VERSE_2B\",\n 7: \"VERSE_2C\",\n 8: \"BRIDGE\",\n 9: \"CHORUS\",\n 10: \"OUTRO\",\n });\n\n function RekordboxAnlz(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n RekordboxAnlz.prototype._read = function() {\n this.magic = this._io.readBytes(4);\n if (!((KaitaiStream.byteArrayCompare(this.magic, [80, 77, 65, 73]) == 0))) {\n throw new KaitaiStream.ValidationNotEqualError([80, 77, 65, 73], this.magic, this._io, \"/seq/0\");\n }\n this.lenHeader = this._io.readU4be();\n this.lenFile = this._io.readU4be();\n this._unnamed3 = this._io.readBytes((this.lenHeader - this._io.pos));\n this.sections = [];\n var i = 0;\n while (!this._io.isEof()) {\n this.sections.push(new TaggedSection(this._io, this, this._root));\n i++;\n }\n }\n\n var PhraseMid = RekordboxAnlz.PhraseMid = (function() {\n function PhraseMid(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n PhraseMid.prototype._read = function() {\n this.id = this._io.readU2be();\n }\n\n return PhraseMid;\n })();\n\n /**\n * Stores the file path of the audio file to which this analysis\n * applies.\n */\n\n var PathTag = RekordboxAnlz.PathTag = (function() {\n function PathTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n PathTag.prototype._read = function() {\n this.lenPath = this._io.readU4be();\n if (this.lenPath > 1) {\n this.path = KaitaiStream.bytesToStr(this._io.readBytes((this.lenPath - 2)), \"utf-16be\");\n }\n }\n\n return PathTag;\n })();\n\n /**\n * A 3-band color waveform preview (PWV6, found in .2EX files).\n * Same resolution as PWV4 (typically 1200 entries) but with 3 bytes\n * per entry representing low, mid, and high frequency band amplitudes.\n * Layout is identical to wave_color_preview_tag (PWV4).\n * @see {@link https://djl-analysis.deepsymmetry.org/djl-analysis/track-metadata.html#color-3band-preview-waveform|Source}\n */\n\n var WaveColor3bandPreviewTag = RekordboxAnlz.WaveColor3bandPreviewTag = (function() {\n function WaveColor3bandPreviewTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n WaveColor3bandPreviewTag.prototype._read = function() {\n this.lenEntryBytes = this._io.readU4be();\n this.lenEntries = this._io.readU4be();\n this.entries = this._io.readBytes((this.lenEntries * this.lenEntryBytes));\n }\n\n /**\n * The size of each entry, in bytes. Always 3 (low, mid, high).\n */\n\n /**\n * The number of waveform data points. Typically 1200.\n */\n\n return WaveColor3bandPreviewTag;\n })();\n\n /**\n * Stores a waveform preview image suitable for display above\n * the touch strip for jumping to a track position.\n */\n\n var WavePreviewTag = RekordboxAnlz.WavePreviewTag = (function() {\n function WavePreviewTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n WavePreviewTag.prototype._read = function() {\n this.lenPreview = this._io.readU4be();\n this._unnamed1 = this._io.readU4be();\n if (this._parent.lenTag > this._parent.lenHeader) {\n this.data = this._io.readBytes(this.lenPreview);\n }\n }\n\n /**\n * The length, in bytes, of the preview data itself. This is\n * slightly redundant because it can be computed from the\n * length of the tag.\n */\n\n /**\n * The actual bytes of the waveform preview.\n */\n\n return WavePreviewTag;\n })();\n\n /**\n * Holds a list of all the beats found within the track, recording\n * their bar position, the time at which they occur, and the tempo\n * at that point.\n */\n\n var BeatGridTag = RekordboxAnlz.BeatGridTag = (function() {\n function BeatGridTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n BeatGridTag.prototype._read = function() {\n this._unnamed0 = this._io.readU4be();\n this._unnamed1 = this._io.readU4be();\n this.lenBeats = this._io.readU4be();\n this.beats = new Array(this.lenBeats);\n for (var i = 0; i < this.lenBeats; i++) {\n this.beats[i] = new BeatGridBeat(this._io, this, this._root);\n }\n }\n\n /**\n * The number of beat entries which follow.\n */\n\n /**\n * The entries of the beat grid.\n */\n\n return BeatGridTag;\n })();\n\n /**\n * Stores the rest of the song structure tag, which can only be\n * parsed after unmasking.\n */\n\n var SongStructureBody = RekordboxAnlz.SongStructureBody = (function() {\n function SongStructureBody(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n SongStructureBody.prototype._read = function() {\n this.mood = this._io.readU2be();\n this._unnamed1 = this._io.readBytes(6);\n this.endBeat = this._io.readU2be();\n this._unnamed3 = this._io.readBytes(2);\n this.bank = this._io.readU1();\n this._unnamed5 = this._io.readBytes(1);\n this.entries = new Array(this._parent.lenEntries);\n for (var i = 0; i < this._parent.lenEntries; i++) {\n this.entries[i] = new SongStructureEntry(this._io, this, this._root);\n }\n }\n\n /**\n * The mood which rekordbox assigns the track as a whole during phrase analysis.\n */\n\n /**\n * The beat number at which the last phrase ends. The track may\n * continue after the last phrase ends. If this is the case, it will\n * mostly be silence.\n */\n\n /**\n * The stylistic bank which can be assigned to the track in rekordbox Lighting mode.\n */\n\n return SongStructureBody;\n })();\n\n /**\n * A larger, colorful waveform preview image suitable for display\n * above the touch strip for jumping to a track position on newer\n * high-resolution players.\n */\n\n var WaveColorPreviewTag = RekordboxAnlz.WaveColorPreviewTag = (function() {\n function WaveColorPreviewTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n WaveColorPreviewTag.prototype._read = function() {\n this.lenEntryBytes = this._io.readU4be();\n this.lenEntries = this._io.readU4be();\n this._unnamed2 = this._io.readU4be();\n this.entries = this._io.readBytes((this.lenEntries * this.lenEntryBytes));\n }\n\n /**\n * The size of each entry, in bytes. Seems to always be 6.\n */\n\n /**\n * The number of waveform data points, each of which takes one\n * byte for each of six channels of information.\n */\n\n return WaveColorPreviewTag;\n })();\n\n /**\n * A 3-band color detail waveform (PWV7, found in .2EX files).\n * Higher resolution than PWV6. Each entry is 3 bytes (low, mid, high).\n * Layout is identical to wave_color_scroll_tag (PWV5).\n * @see {@link https://djl-analysis.deepsymmetry.org/djl-analysis/track-metadata.html#color-3band-detail-waveform|Source}\n */\n\n var WaveColor3bandDetailTag = RekordboxAnlz.WaveColor3bandDetailTag = (function() {\n function WaveColor3bandDetailTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n WaveColor3bandDetailTag.prototype._read = function() {\n this.lenEntryBytes = this._io.readU4be();\n this.lenEntries = this._io.readU4be();\n this._unnamed2 = this._io.readU4be();\n this.entries = this._io.readBytes((this.lenEntries * this.lenEntryBytes));\n }\n\n /**\n * The size of each entry, in bytes. Always 3 (low, mid, high).\n */\n\n /**\n * The number of columns of waveform data.\n */\n\n return WaveColor3bandDetailTag;\n })();\n\n /**\n * Vocal detection configuration (PWVC, found in .2EX files).\n * Contains threshold values used to classify frequency content\n * as vocal or non-vocal. Body is 8 bytes: unknown(2) + 3 thresholds(2 each).\n * Observed threshold ranges: low 80-114, mid 80-146, high 98-159.\n */\n\n var VocalConfigTag = RekordboxAnlz.VocalConfigTag = (function() {\n function VocalConfigTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n VocalConfigTag.prototype._read = function() {\n this._unnamed0 = this._io.readU2be();\n this.thresholdLow = this._io.readU2be();\n this.thresholdMid = this._io.readU2be();\n this.thresholdHigh = this._io.readU2be();\n }\n\n /**\n * Low frequency vocal detection threshold. Observed range: 80-114.\n */\n\n /**\n * Mid frequency vocal detection threshold. Observed range: 80-146.\n */\n\n /**\n * High frequency vocal detection threshold. Observed range: 98-159.\n */\n\n return VocalConfigTag;\n })();\n\n var PhraseHigh = RekordboxAnlz.PhraseHigh = (function() {\n function PhraseHigh(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n PhraseHigh.prototype._read = function() {\n this.id = this._io.readU2be();\n }\n\n return PhraseHigh;\n })();\n\n /**\n * A larger waveform image suitable for scrolling along as a track\n * plays.\n */\n\n var WaveScrollTag = RekordboxAnlz.WaveScrollTag = (function() {\n function WaveScrollTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n WaveScrollTag.prototype._read = function() {\n this.lenEntryBytes = this._io.readU4be();\n this.lenEntries = this._io.readU4be();\n this._unnamed2 = this._io.readU4be();\n this.entries = this._io.readBytes((this.lenEntries * this.lenEntryBytes));\n }\n\n /**\n * The size of each entry, in bytes. Seems to always be 1.\n */\n\n /**\n * The number of waveform data points, each of which takes one\n * byte.\n */\n\n return WaveScrollTag;\n })();\n\n /**\n * Stores the song structure, also known as phrases (intro, verse,\n * bridge, chorus, up, down, outro).\n */\n\n var SongStructureTag = RekordboxAnlz.SongStructureTag = (function() {\n function SongStructureTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n SongStructureTag.prototype._read = function() {\n this.lenEntryBytes = this._io.readU4be();\n this.lenEntries = this._io.readU2be();\n this._raw__raw_body = this._io.readBytesFull();\n this._raw_body = KaitaiStream.processXorMany(this._raw__raw_body, this.mask);\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new SongStructureBody(_io__raw_body, this, this._root);\n }\n Object.defineProperty(SongStructureTag.prototype, 'c', {\n get: function() {\n if (this._m_c !== undefined)\n return this._m_c;\n this._m_c = this.lenEntries;\n return this._m_c;\n }\n });\n Object.defineProperty(SongStructureTag.prototype, 'mask', {\n get: function() {\n if (this._m_mask !== undefined)\n return this._m_mask;\n this._m_mask = new Uint8Array([(203 + this.c), (225 + this.c), (238 + this.c), (250 + this.c), (229 + this.c), (238 + this.c), (173 + this.c), (238 + this.c), (233 + this.c), (210 + this.c), (233 + this.c), (235 + this.c), (225 + this.c), (233 + this.c), (243 + this.c), (232 + this.c), (233 + this.c), (244 + this.c), (225 + this.c)]);\n return this._m_mask;\n }\n });\n\n /**\n * The size of each entry, in bytes. Seems to always be 24.\n */\n\n /**\n * The number of phrases.\n */\n\n /**\n * The rest of the tag, which needs to be unmasked before it\n * can be parsed.\n */\n\n return SongStructureTag;\n })();\n\n /**\n * A cue extended list entry. Can either describe a memory cue or a\n * loop.\n */\n\n var CueExtendedEntry = RekordboxAnlz.CueExtendedEntry = (function() {\n function CueExtendedEntry(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n CueExtendedEntry.prototype._read = function() {\n this.magic = this._io.readBytes(4);\n if (!((KaitaiStream.byteArrayCompare(this.magic, [80, 67, 80, 50]) == 0))) {\n throw new KaitaiStream.ValidationNotEqualError([80, 67, 80, 50], this.magic, this._io, \"/types/cue_extended_entry/seq/0\");\n }\n this.lenHeader = this._io.readU4be();\n this.lenEntry = this._io.readU4be();\n this.hotCue = this._io.readU4be();\n this.type = this._io.readU1();\n this._unnamed5 = this._io.readBytes(3);\n this.time = this._io.readU4be();\n this.loopTime = this._io.readU4be();\n this.colorId = this._io.readU1();\n this._unnamed9 = this._io.readBytes(11);\n if (this.lenEntry > 43) {\n this.lenComment = this._io.readU4be();\n }\n if (this.lenEntry > 43) {\n this.comment = KaitaiStream.bytesToStr(this._io.readBytes(this.lenComment), \"utf-16be\");\n }\n if ((this.lenEntry - this.lenComment) > 44) {\n this.colorCode = this._io.readU1();\n }\n if ((this.lenEntry - this.lenComment) > 45) {\n this.colorRed = this._io.readU1();\n }\n if ((this.lenEntry - this.lenComment) > 46) {\n this.colorGreen = this._io.readU1();\n }\n if ((this.lenEntry - this.lenComment) > 47) {\n this.colorBlue = this._io.readU1();\n }\n if ((this.lenEntry - this.lenComment) > 48) {\n this._unnamed16 = this._io.readBytes(((this.lenEntry - 48) - this.lenComment));\n }\n }\n\n /**\n * Identifies this as an extended cue list entry (cue point).\n */\n\n /**\n * If zero, this is an ordinary memory cue, otherwise this a\n * hot cue with the specified number.\n */\n\n /**\n * Indicates whether this is a memory cue or a loop.\n */\n\n /**\n * The position, in milliseconds, at which the cue point lies\n * in the track.\n */\n\n /**\n * The position, in milliseconds, at which the player loops\n * back to the cue time if this is a loop.\n */\n\n /**\n * References a row in the colors table if this is a memory cue or loop\n * and has been assigned a color.\n */\n\n /**\n * The comment assigned to this cue by the DJ, if any, with a trailing NUL.\n */\n\n /**\n * A lookup value for a color table? We use this to index to the hot cue colors shown in rekordbox.\n */\n\n /**\n * The red component of the hot cue color to be displayed.\n */\n\n /**\n * The green component of the hot cue color to be displayed.\n */\n\n /**\n * The blue component of the hot cue color to be displayed.\n */\n\n return CueExtendedEntry;\n })();\n\n /**\n * Stores an index allowing rapid seeking to particular times\n * within a variable-bitrate audio file.\n */\n\n var VbrTag = RekordboxAnlz.VbrTag = (function() {\n function VbrTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n VbrTag.prototype._read = function() {\n this._unnamed0 = this._io.readU4be();\n this.index = new Array(400);\n for (var i = 0; i < 400; i++) {\n this.index[i] = this._io.readU4be();\n }\n }\n\n return VbrTag;\n })();\n\n /**\n * A song structure entry, represents a single phrase.\n */\n\n var SongStructureEntry = RekordboxAnlz.SongStructureEntry = (function() {\n function SongStructureEntry(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n SongStructureEntry.prototype._read = function() {\n this.phraseNumber = this._io.readU2be();\n this.beatNumber = this._io.readU2be();\n switch (this._parent.mood) {\n case RekordboxAnlz.TrackMood.HIGH:\n this.kind = new PhraseHigh(this._io, this, this._root);\n break;\n case RekordboxAnlz.TrackMood.MID:\n this.kind = new PhraseMid(this._io, this, this._root);\n break;\n case RekordboxAnlz.TrackMood.LOW:\n this.kind = new PhraseLow(this._io, this, this._root);\n break;\n default:\n this.kind = new UnknownTag(this._io, this, this._root);\n break;\n }\n this._unnamed3 = this._io.readBytes((this._parent._parent.lenEntryBytes - 9));\n this.fillIn = this._io.readU1();\n this.fillInBeatNumber = this._io.readU2be();\n }\n\n /**\n * The absolute number of the phrase, starting at one.\n */\n\n /**\n * The beat number at which the phrase starts.\n */\n\n /**\n * The kind of phrase as displayed in rekordbox.\n */\n\n /**\n * If nonzero, fill-in is present.\n */\n\n /**\n * The beat number at which fill-in starts.\n */\n\n return SongStructureEntry;\n })();\n\n /**\n * A cue list entry. Can either represent a memory cue or a loop.\n */\n\n var CueEntry = RekordboxAnlz.CueEntry = (function() {\n function CueEntry(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n CueEntry.prototype._read = function() {\n this.magic = this._io.readBytes(4);\n if (!((KaitaiStream.byteArrayCompare(this.magic, [80, 67, 80, 84]) == 0))) {\n throw new KaitaiStream.ValidationNotEqualError([80, 67, 80, 84], this.magic, this._io, \"/types/cue_entry/seq/0\");\n }\n this.lenHeader = this._io.readU4be();\n this.lenEntry = this._io.readU4be();\n this.hotCue = this._io.readU4be();\n this.status = this._io.readU4be();\n this._unnamed5 = this._io.readU4be();\n this.orderFirst = this._io.readU2be();\n this.orderLast = this._io.readU2be();\n this.type = this._io.readU1();\n this._unnamed9 = this._io.readBytes(3);\n this.time = this._io.readU4be();\n this.loopTime = this._io.readU4be();\n this._unnamed12 = this._io.readBytes(16);\n }\n\n /**\n * Identifies this as a cue list entry (cue point).\n */\n\n /**\n * If zero, this is an ordinary memory cue, otherwise this a\n * hot cue with the specified number.\n */\n\n /**\n * If zero, this entry should be ignored.\n */\n\n /**\n * @flesniak says: \"0xffff for first cue, 0,1,3 for next\"\n */\n\n /**\n * @flesniak says: \"1,2,3 for first, second, third cue, 0xffff for last\"\n */\n\n /**\n * Indicates whether this is a memory cue or a loop.\n */\n\n /**\n * The position, in milliseconds, at which the cue point lies\n * in the track.\n */\n\n /**\n * The position, in milliseconds, at which the player loops\n * back to the cue time if this is a loop.\n */\n\n return CueEntry;\n })();\n\n /**\n * Describes an individual beat in a beat grid.\n */\n\n var BeatGridBeat = RekordboxAnlz.BeatGridBeat = (function() {\n function BeatGridBeat(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n BeatGridBeat.prototype._read = function() {\n this.beatNumber = this._io.readU2be();\n this.tempo = this._io.readU2be();\n this.time = this._io.readU4be();\n }\n\n /**\n * The position of the beat within its musical bar, where beat 1\n * is the down beat.\n */\n\n /**\n * The tempo at the time of this beat, in beats per minute,\n * multiplied by 100.\n */\n\n /**\n * The time, in milliseconds, at which this beat occurs when\n * the track is played at normal (100%) pitch.\n */\n\n return BeatGridBeat;\n })();\n\n /**\n * A variation of cue_tag which was introduced with the nxs2 line,\n * and adds descriptive names. (Still comes in two forms, either\n * holding memory cues and loop points, or holding hot cues and\n * loop points.) Also includes hot cues D through H and color assignment.\n */\n\n var CueExtendedTag = RekordboxAnlz.CueExtendedTag = (function() {\n function CueExtendedTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n CueExtendedTag.prototype._read = function() {\n this.type = this._io.readU4be();\n this.lenCues = this._io.readU2be();\n this._unnamed2 = this._io.readBytes(2);\n this.cues = new Array(this.lenCues);\n for (var i = 0; i < this.lenCues; i++) {\n this.cues[i] = new CueExtendedEntry(this._io, this, this._root);\n }\n }\n\n /**\n * Identifies whether this tag stores ordinary or hot cues.\n */\n\n /**\n * The length of the cue comment list.\n */\n\n return CueExtendedTag;\n })();\n\n var PhraseLow = RekordboxAnlz.PhraseLow = (function() {\n function PhraseLow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n PhraseLow.prototype._read = function() {\n this.id = this._io.readU2be();\n }\n\n return PhraseLow;\n })();\n\n var UnknownTag = RekordboxAnlz.UnknownTag = (function() {\n function UnknownTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n UnknownTag.prototype._read = function() {\n }\n\n return UnknownTag;\n })();\n\n /**\n * A type-tagged file section, identified by a four-byte magic\n * sequence, with a header specifying its length, and whose payload\n * is determined by the type tag.\n */\n\n var TaggedSection = RekordboxAnlz.TaggedSection = (function() {\n function TaggedSection(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n TaggedSection.prototype._read = function() {\n this.fourcc = this._io.readS4be();\n this.lenHeader = this._io.readU4be();\n this.lenTag = this._io.readU4be();\n switch (this.fourcc) {\n case RekordboxAnlz.SectionTags.WAVE_COLOR_SCROLL:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new WaveColorScrollTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.WAVE_SCROLL:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new WaveScrollTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.VBR:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new VbrTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.CUES_2:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new CueExtendedTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.CUES:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new CueTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.SONG_STRUCTURE:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new SongStructureTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.BEAT_GRID:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new BeatGridTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.VOCAL_CONFIG:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new VocalConfigTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.WAVE_PREVIEW:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new WavePreviewTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.WAVE_COLOR_PREVIEW:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new WaveColorPreviewTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.PATH:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new PathTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.WAVE_TINY:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new WavePreviewTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.WAVE_COLOR_3BAND_DETAIL:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new WaveColor3bandDetailTag(_io__raw_body, this, this._root);\n break;\n case RekordboxAnlz.SectionTags.WAVE_COLOR_3BAND_PREVIEW:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new WaveColor3bandPreviewTag(_io__raw_body, this, this._root);\n break;\n default:\n this._raw_body = this._io.readBytes((this.lenTag - 12));\n var _io__raw_body = new KaitaiStream(this._raw_body);\n this.body = new UnknownTag(_io__raw_body, this, this._root);\n break;\n }\n }\n\n /**\n * A tag value indicating what kind of section this is.\n */\n\n /**\n * The size, in bytes, of the header portion of the tag.\n */\n\n /**\n * The size, in bytes, of this entire tag, counting the header.\n */\n\n return TaggedSection;\n })();\n\n /**\n * A larger, colorful waveform image suitable for scrolling along\n * as a track plays on newer high-resolution hardware. Also\n * contains a higher-resolution blue/white waveform.\n */\n\n var WaveColorScrollTag = RekordboxAnlz.WaveColorScrollTag = (function() {\n function WaveColorScrollTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n WaveColorScrollTag.prototype._read = function() {\n this.lenEntryBytes = this._io.readU4be();\n this.lenEntries = this._io.readU4be();\n this._unnamed2 = this._io.readU4be();\n this.entries = this._io.readBytes((this.lenEntries * this.lenEntryBytes));\n }\n\n /**\n * The size of each entry, in bytes. Seems to always be 2.\n */\n\n /**\n * The number of columns of waveform data (this matches the\n * non-color waveform length.\n */\n\n return WaveColorScrollTag;\n })();\n\n /**\n * Stores either a list of ordinary memory cues and loop points, or\n * a list of hot cues and loop points.\n */\n\n var CueTag = RekordboxAnlz.CueTag = (function() {\n function CueTag(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n CueTag.prototype._read = function() {\n this.type = this._io.readU4be();\n this._unnamed1 = this._io.readBytes(2);\n this.lenCues = this._io.readU2be();\n this.memoryCount = this._io.readU4be();\n this.cues = new Array(this.lenCues);\n for (var i = 0; i < this.lenCues; i++) {\n this.cues[i] = new CueEntry(this._io, this, this._root);\n }\n }\n\n /**\n * Identifies whether this tag stores ordinary or hot cues.\n */\n\n /**\n * The length of the cue list.\n */\n\n /**\n * Unsure what this means.\n */\n\n return CueTag;\n })();\n\n /**\n * Identifies this as an analysis file.\n */\n\n /**\n * The number of bytes of this header section.\n */\n\n /**\n * The number of bytes in the entire file.\n */\n\n /**\n * The remainder of the file is a sequence of type-tagged sections,\n * identified by a four-byte magic sequence.\n */\n\n return RekordboxAnlz;\n})();\nreturn RekordboxAnlz;\n}));\n","// This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild\n\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define(['kaitai-struct/KaitaiStream'], factory);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = factory(require('kaitai-struct/KaitaiStream'));\n } else {\n root.RekordboxPdb = factory(root.KaitaiStream);\n }\n}(this, function (KaitaiStream) {\n/**\n * This is a relational database format designed to be efficiently used\n * by very low power devices (there were deployments on 16 bit devices\n * with 32K of RAM). Today you are most likely to encounter it within\n * the Pioneer Professional DJ ecosystem, because it is the format that\n * their rekordbox software uses to write USB and SD media which can be\n * mounted in DJ controllers and used to play and mix music.\n * \n * It has been reverse-engineered to facilitate sophisticated\n * integrations with light and laser shows, videos, and other musical\n * instruments, by supporting deep knowledge of what is playing and\n * what is coming next through monitoring the network communications of\n * the players.\n * \n * The file is divided into fixed-size blocks. The first block has a\n * header that establishes the block size, and lists the tables\n * available in the database, identifying their types and the index of\n * the first of the series of linked pages that make up that table.\n * \n * Each table is made up of a series of rows which may be spread across\n * any number of pages. The pages start with a header describing the\n * page and linking to the next page. The rest of the page is used as a\n * heap: rows are scattered around it, and located using an index\n * structure that builds backwards from the end of the page. Each row\n * of a given type has a fixed size structure which links to any\n * variable-sized strings by their offsets within the page.\n * \n * As changes are made to the table, some records may become unused,\n * and there may be gaps within the heap that are too small to be used\n * by other data. There is a bit map in the row index that identifies\n * which rows are actually present. Rows that are not present must be\n * ignored: they do not contain valid (or even necessarily well-formed)\n * data.\n * \n * The majority of the work in reverse-engineering this format was\n * performed by @henrybetts and @flesniak, for which I am hugely\n * grateful. @GreyCat helped me learn the intricacies (and best\n * practices) of Kaitai far faster than I would have managed on my own.\n * @see {@link https://github.com/Deep-Symmetry/crate-digger/blob/master/doc/Analysis.pdf|Source}\n */\n\nvar RekordboxPdb = (function() {\n RekordboxPdb.PageType = Object.freeze({\n TRACKS: 0,\n GENRES: 1,\n ARTISTS: 2,\n ALBUMS: 3,\n LABELS: 4,\n KEYS: 5,\n COLORS: 6,\n PLAYLIST_TREE: 7,\n PLAYLIST_ENTRIES: 8,\n UNKNOWN_9: 9,\n UNKNOWN_10: 10,\n UNKNOWN_11: 11,\n UNKNOWN_12: 12,\n ARTWORK: 13,\n UNKNOWN_14: 14,\n UNKNOWN_15: 15,\n COLUMNS: 16,\n UNKNOWN_17: 17,\n UNKNOWN_18: 18,\n HISTORY: 19,\n\n 0: \"TRACKS\",\n 1: \"GENRES\",\n 2: \"ARTISTS\",\n 3: \"ALBUMS\",\n 4: \"LABELS\",\n 5: \"KEYS\",\n 6: \"COLORS\",\n 7: \"PLAYLIST_TREE\",\n 8: \"PLAYLIST_ENTRIES\",\n 9: \"UNKNOWN_9\",\n 10: \"UNKNOWN_10\",\n 11: \"UNKNOWN_11\",\n 12: \"UNKNOWN_12\",\n 13: \"ARTWORK\",\n 14: \"UNKNOWN_14\",\n 15: \"UNKNOWN_15\",\n 16: \"COLUMNS\",\n 17: \"UNKNOWN_17\",\n 18: \"UNKNOWN_18\",\n 19: \"HISTORY\",\n });\n\n function RekordboxPdb(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n RekordboxPdb.prototype._read = function() {\n this._unnamed0 = this._io.readU4le();\n this.lenPage = this._io.readU4le();\n this.numTables = this._io.readU4le();\n this.nextUnusedPage = this._io.readU4le();\n this._unnamed4 = this._io.readU4le();\n this.sequence = this._io.readU4le();\n this.gap = this._io.readBytes(4);\n if (!((KaitaiStream.byteArrayCompare(this.gap, [0, 0, 0, 0]) == 0))) {\n throw new KaitaiStream.ValidationNotEqualError([0, 0, 0, 0], this.gap, this._io, \"/seq/6\");\n }\n this.tables = new Array(this.numTables);\n for (var i = 0; i < this.numTables; i++) {\n this.tables[i] = new Table(this._io, this, this._root);\n }\n }\n\n /**\n * A variable length string which can be stored in a variety of\n * different encodings.\n */\n\n var DeviceSqlString = RekordboxPdb.DeviceSqlString = (function() {\n function DeviceSqlString(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n DeviceSqlString.prototype._read = function() {\n this.lengthAndKind = this._io.readU1();\n switch (this.lengthAndKind) {\n case 64:\n this.body = new DeviceSqlLongAscii(this._io, this, this._root);\n break;\n case 144:\n this.body = new DeviceSqlLongUtf16le(this._io, this, this._root);\n break;\n default:\n this.body = new DeviceSqlShortAscii(this._io, this, this._root, this.lengthAndKind);\n break;\n }\n }\n\n /**\n * Mangled length of an ordinary ASCII string if odd, or a flag\n * indicating another encoding with a longer length value to\n * follow.\n */\n\n return DeviceSqlString;\n })();\n\n /**\n * A row that holds a playlist name, ID, indication of whether it\n * is an ordinary playlist or a folder of other playlists, a link\n * to its parent folder, and its sort order.\n */\n\n var PlaylistTreeRow = RekordboxPdb.PlaylistTreeRow = (function() {\n function PlaylistTreeRow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n PlaylistTreeRow.prototype._read = function() {\n this.parentId = this._io.readU4le();\n this._unnamed1 = this._io.readBytes(4);\n this.sortOrder = this._io.readU4le();\n this.id = this._io.readU4le();\n this.rawIsFolder = this._io.readU4le();\n this.name = new DeviceSqlString(this._io, this, this._root);\n }\n Object.defineProperty(PlaylistTreeRow.prototype, 'isFolder', {\n get: function() {\n if (this._m_isFolder !== undefined)\n return this._m_isFolder;\n this._m_isFolder = this.rawIsFolder != 0;\n return this._m_isFolder;\n }\n });\n\n /**\n * The ID of the `playlist_tree_row` in which this one can be\n * found, or `0` if this playlist exists at the root level.\n */\n\n /**\n * The order in which the entries of this playlist are sorted.\n */\n\n /**\n * The unique identifier by which this playlist or folder can\n * be requested and linked from other rows.\n */\n\n /**\n * Has a non-zero value if this is actually a folder rather\n * than a playlist.\n */\n\n /**\n * The variable-length string naming the playlist.\n */\n\n return PlaylistTreeRow;\n })();\n\n /**\n * A row that holds a color name and the associated ID.\n */\n\n var ColorRow = RekordboxPdb.ColorRow = (function() {\n function ColorRow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n ColorRow.prototype._read = function() {\n this._unnamed0 = this._io.readBytes(5);\n this.id = this._io.readU2le();\n this._unnamed2 = this._io.readU1();\n this.name = new DeviceSqlString(this._io, this, this._root);\n }\n\n /**\n * The unique identifier by which this color can be requested\n * and linked from other rows (such as tracks).\n */\n\n /**\n * The variable-length string naming the color.\n */\n\n return ColorRow;\n })();\n\n /**\n * An ASCII-encoded string up to 127 bytes long.\n */\n\n var DeviceSqlShortAscii = RekordboxPdb.DeviceSqlShortAscii = (function() {\n function DeviceSqlShortAscii(_io, _parent, _root, mangledLength) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n this.mangledLength = mangledLength;\n\n this._read();\n }\n DeviceSqlShortAscii.prototype._read = function() {\n if ( ((KaitaiStream.mod(this.mangledLength, 2) > 0) && (this.length >= 0)) ) {\n this.text = KaitaiStream.bytesToStr(this._io.readBytes(this.length), \"ascii\");\n }\n }\n\n /**\n * The un-mangled length of the string, in bytes.\n */\n Object.defineProperty(DeviceSqlShortAscii.prototype, 'length', {\n get: function() {\n if (this._m_length !== undefined)\n return this._m_length;\n this._m_length = (Math.floor((this.mangledLength - 1) / 2) - 1);\n return this._m_length;\n }\n });\n\n /**\n * The content of the string.\n */\n\n /**\n * Contains the actual length, incremented, doubled, and\n * incremented again. Go figure.\n */\n\n return DeviceSqlShortAscii;\n })();\n\n /**\n * A row that holds an album name and ID.\n */\n\n var AlbumRow = RekordboxPdb.AlbumRow = (function() {\n function AlbumRow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n AlbumRow.prototype._read = function() {\n this._unnamed0 = this._io.readU2le();\n this.indexShift = this._io.readU2le();\n this._unnamed2 = this._io.readU4le();\n this.artistId = this._io.readU4le();\n this.id = this._io.readU4le();\n this._unnamed5 = this._io.readU4le();\n this._unnamed6 = this._io.readU1();\n this.ofsName = this._io.readU1();\n }\n\n /**\n * The name of this album.\n */\n Object.defineProperty(AlbumRow.prototype, 'name', {\n get: function() {\n if (this._m_name !== undefined)\n return this._m_name;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsName));\n this._m_name = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_name;\n }\n });\n\n /**\n * Some kind of magic word? Usually 0x80, 0x00.\n */\n\n /**\n * TODO name from @flesniak, but what does it mean?\n */\n\n /**\n * Identifies the artist associated with the album.\n */\n\n /**\n * The unique identifier by which this album can be requested\n * and linked from other rows (such as tracks).\n */\n\n /**\n * @flesniak says: \"alwayx 0x03, maybe an unindexed empty string\"\n */\n\n /**\n * The location of the variable-length name string, relative to\n * the start of this row.\n */\n\n return AlbumRow;\n })();\n\n /**\n * A table page, consisting of a short header describing the\n * content of the page and linking to the next page, followed by a\n * heap in which row data is found. At the end of the page there is\n * an index which locates all rows present in the heap via their\n * offsets past the end of the page header.\n */\n\n var Page = RekordboxPdb.Page = (function() {\n function Page(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n Page.prototype._read = function() {\n this.gap = this._io.readBytes(4);\n if (!((KaitaiStream.byteArrayCompare(this.gap, [0, 0, 0, 0]) == 0))) {\n throw new KaitaiStream.ValidationNotEqualError([0, 0, 0, 0], this.gap, this._io, \"/types/page/seq/0\");\n }\n this.pageIndex = this._io.readU4le();\n this.type = this._io.readU4le();\n this.nextPage = new PageRef(this._io, this, this._root);\n this._unnamed4 = this._io.readU4le();\n this._unnamed5 = this._io.readBytes(4);\n this.numRowsSmall = this._io.readU1();\n this._unnamed7 = this._io.readU1();\n this._unnamed8 = this._io.readU1();\n this.pageFlags = this._io.readU1();\n this.freeSize = this._io.readU2le();\n this.usedSize = this._io.readU2le();\n this._unnamed12 = this._io.readU2le();\n this.numRowsLarge = this._io.readU2le();\n this._unnamed14 = this._io.readU2le();\n this._unnamed15 = this._io.readU2le();\n if (false) {\n this.heap = this._io.readBytesFull();\n }\n }\n\n /**\n * The number of rows on this page (controls the number of row\n * index entries there are, but some of those may not be marked\n * as present in the table due to deletion).\n */\n Object.defineProperty(Page.prototype, 'numRows', {\n get: function() {\n if (this._m_numRows !== undefined)\n return this._m_numRows;\n this._m_numRows = ( ((this.numRowsLarge > this.numRowsSmall) && (this.numRowsLarge != 8191)) ? this.numRowsLarge : this.numRowsSmall);\n return this._m_numRows;\n }\n });\n\n /**\n * The number of row groups that are present in the index. Each\n * group can hold up to sixteen rows. All but the final one\n * will hold sixteen rows.\n */\n Object.defineProperty(Page.prototype, 'numGroups', {\n get: function() {\n if (this._m_numGroups !== undefined)\n return this._m_numGroups;\n this._m_numGroups = (Math.floor((this.numRows - 1) / 16) + 1);\n return this._m_numGroups;\n }\n });\n\n /**\n * The actual row groups making up the row index. Each group\n * can hold up to sixteen rows. Non-data pages do not have\n * actual rows, and attempting to parse them can crash.\n */\n Object.defineProperty(Page.prototype, 'rowGroups', {\n get: function() {\n if (this._m_rowGroups !== undefined)\n return this._m_rowGroups;\n if (this.isDataPage) {\n this._m_rowGroups = new Array(this.numGroups);\n for (var i = 0; i < this.numGroups; i++) {\n this._m_rowGroups[i] = new RowGroup(this._io, this, this._root, i);\n }\n }\n return this._m_rowGroups;\n }\n });\n Object.defineProperty(Page.prototype, 'heapPos', {\n get: function() {\n if (this._m_heapPos !== undefined)\n return this._m_heapPos;\n this._m_heapPos = this._io.pos;\n return this._m_heapPos;\n }\n });\n Object.defineProperty(Page.prototype, 'isDataPage', {\n get: function() {\n if (this._m_isDataPage !== undefined)\n return this._m_isDataPage;\n this._m_isDataPage = (this.pageFlags & 64) == 0;\n return this._m_isDataPage;\n }\n });\n\n /**\n * Only exposed until\n * https://github.com/kaitai-io/kaitai_struct/issues/825 can be\n * fixed.\n */\n\n /**\n * Matches the index we used to look up the page, sanity check?\n */\n\n /**\n * Identifies the type of information stored in the rows of this page.\n */\n\n /**\n * Index of the next page containing this type of rows. Points past\n * the end of the file if there are no more.\n */\n\n /**\n * @flesniak said: \"sequence number (0->1: 8->13, 1->2: 22, 2->3: 27)\"\n */\n\n /**\n * Holds the value used for `num_rows` (see below) unless\n * `num_rows_large` is larger (but not equal to `0x1fff`). This\n * seems like some strange mechanism to deal with the fact that\n * lots of tiny entries, such as are found in the\n * `playlist_entries` table, are too big to count with a single\n * byte. But why not just always use `num_rows_large`, then?\n */\n\n /**\n * @flesniak said: \"a bitmask (1st track: 32)\"\n */\n\n /**\n * @flesniak said: \"often 0, sometimes larger, esp. for pages\n * with high real_entry_count (e.g. 12 for 101 entries)\"\n */\n\n /**\n * @flesniak said: \"strange pages: 0x44, 0x64; otherwise seen: 0x24, 0x34\"\n */\n\n /**\n * Unused space (in bytes) in the page heap, excluding the row\n * index at end of page.\n */\n\n /**\n * The number of bytes that are in use in the page heap.\n */\n\n /**\n * @flesniak said: \"(0->1: 2)\"\n */\n\n /**\n * Holds the value used for `num_rows` (as described above)\n * when that is too large to fit into `num_rows_small`, and\n * that situation seems to be indicated when this value is\n * larger than `num_rows_small`, but not equal to `0x1fff`.\n * This seems like some strange mechanism to deal with the fact\n * that lots of tiny entries, such as are found in the\n * `playlist_entries` table, are too big to count with a single\n * byte. But why not just always use this value, then?\n */\n\n /**\n * @flesniak said: \"1004 for strange blocks, 0 otherwise\"\n */\n\n /**\n * @flesniak said: \"always 0 except 1 for history pages, num\n * entries for strange pages?\"\n */\n\n return Page;\n })();\n\n /**\n * A group of row indices, which are built backwards from the end\n * of the page. Holds up to sixteen row offsets, along with a bit\n * mask that indicates whether each row is actually present in the\n * table.\n */\n\n var RowGroup = RekordboxPdb.RowGroup = (function() {\n function RowGroup(_io, _parent, _root, groupIndex) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n this.groupIndex = groupIndex;\n\n this._read();\n }\n RowGroup.prototype._read = function() {\n }\n\n /**\n * The starting point of this group of row indices.\n */\n Object.defineProperty(RowGroup.prototype, 'base', {\n get: function() {\n if (this._m_base !== undefined)\n return this._m_base;\n this._m_base = (this._root.lenPage - (this.groupIndex * 36));\n return this._m_base;\n }\n });\n\n /**\n * Each bit specifies whether a particular row is present. The\n * low order bit corresponds to the first row in this index,\n * whose offset immediately precedes these flag bits. The\n * second bit corresponds to the row whose offset precedes\n * that, and so on.\n */\n Object.defineProperty(RowGroup.prototype, 'rowPresentFlags', {\n get: function() {\n if (this._m_rowPresentFlags !== undefined)\n return this._m_rowPresentFlags;\n var _pos = this._io.pos;\n this._io.seek((this.base - 4));\n this._m_rowPresentFlags = this._io.readU2le();\n this._io.seek(_pos);\n return this._m_rowPresentFlags;\n }\n });\n\n /**\n * The row offsets in this group.\n */\n Object.defineProperty(RowGroup.prototype, 'rows', {\n get: function() {\n if (this._m_rows !== undefined)\n return this._m_rows;\n this._m_rows = new Array((this.groupIndex < (this._parent.numGroups - 1) ? 16 : (KaitaiStream.mod((this._parent.numRows - 1), 16) + 1)));\n for (var i = 0; i < (this.groupIndex < (this._parent.numGroups - 1) ? 16 : (KaitaiStream.mod((this._parent.numRows - 1), 16) + 1)); i++) {\n this._m_rows[i] = new RowRef(this._io, this, this._root, i);\n }\n return this._m_rows;\n }\n });\n\n /**\n * Identifies which group is being generated. They build backwards\n * from the end of the page.\n */\n\n return RowGroup;\n })();\n\n /**\n * A row that holds a genre name and the associated ID.\n */\n\n var GenreRow = RekordboxPdb.GenreRow = (function() {\n function GenreRow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n GenreRow.prototype._read = function() {\n this.id = this._io.readU4le();\n this.name = new DeviceSqlString(this._io, this, this._root);\n }\n\n /**\n * The unique identifier by which this genre can be requested\n * and linked from other rows (such as tracks).\n */\n\n /**\n * The variable-length string naming the genre.\n */\n\n return GenreRow;\n })();\n\n /**\n * A row that holds the path to an album art image file and the\n * associated artwork ID.\n */\n\n var ArtworkRow = RekordboxPdb.ArtworkRow = (function() {\n function ArtworkRow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n ArtworkRow.prototype._read = function() {\n this.id = this._io.readU4le();\n this.path = new DeviceSqlString(this._io, this, this._root);\n }\n\n /**\n * The unique identifier by which this art can be requested\n * and linked from other rows (such as tracks).\n */\n\n /**\n * The variable-length file path string at which the art file\n * can be found.\n */\n\n return ArtworkRow;\n })();\n\n /**\n * An ASCII-encoded string preceded by a two-byte length field.\n */\n\n var DeviceSqlLongAscii = RekordboxPdb.DeviceSqlLongAscii = (function() {\n function DeviceSqlLongAscii(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n DeviceSqlLongAscii.prototype._read = function() {\n this.length = this._io.readU2le();\n this.text = KaitaiStream.bytesToStr(this._io.readBytes(this.length), \"ascii\");\n }\n\n /**\n * Contains the length of the string in bytes.\n */\n\n /**\n * The content of the string.\n */\n\n return DeviceSqlLongAscii;\n })();\n\n /**\n * A row that holds an artist name and ID.\n */\n\n var ArtistRow = RekordboxPdb.ArtistRow = (function() {\n function ArtistRow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n ArtistRow.prototype._read = function() {\n this.subtype = this._io.readU2le();\n this.indexShift = this._io.readU2le();\n this.id = this._io.readU4le();\n this._unnamed3 = this._io.readU1();\n this.ofsNameNear = this._io.readU1();\n }\n\n /**\n * For names that might be further than 0xff bytes from the\n * start of this row, this holds a two-byte offset, and is\n * signalled by the subtype value.\n */\n Object.defineProperty(ArtistRow.prototype, 'ofsNameFar', {\n get: function() {\n if (this._m_ofsNameFar !== undefined)\n return this._m_ofsNameFar;\n if (this.subtype == 100) {\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + 10));\n this._m_ofsNameFar = this._io.readU2le();\n this._io.seek(_pos);\n }\n return this._m_ofsNameFar;\n }\n });\n\n /**\n * The name of this artist.\n */\n Object.defineProperty(ArtistRow.prototype, 'name', {\n get: function() {\n if (this._m_name !== undefined)\n return this._m_name;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + (this.subtype == 100 ? this.ofsNameFar : this.ofsNameNear)));\n this._m_name = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_name;\n }\n });\n\n /**\n * Usually 0x60, but 0x64 means we have a long name offset\n * embedded in the row.\n */\n\n /**\n * TODO name from @flesniak, but what does it mean?\n */\n\n /**\n * The unique identifier by which this artist can be requested\n * and linked from other rows (such as tracks).\n */\n\n /**\n * @flesniak says: \"always 0x03, maybe an unindexed empty string\"\n */\n\n /**\n * The location of the variable-length name string, relative to\n * the start of this row, unless subtype is 0x64.\n */\n\n return ArtistRow;\n })();\n\n /**\n * An index which points to a table page (its offset can be found\n * by multiplying the index by the `page_len` value in the file\n * header). This type allows the linked page to be lazy loaded.\n */\n\n var PageRef = RekordboxPdb.PageRef = (function() {\n function PageRef(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n PageRef.prototype._read = function() {\n this.index = this._io.readU4le();\n }\n\n /**\n * When referenced, loads the specified page and parses its\n * contents appropriately for the type of data it contains.\n */\n Object.defineProperty(PageRef.prototype, 'body', {\n get: function() {\n if (this._m_body !== undefined)\n return this._m_body;\n var io = this._root._io;\n var _pos = io.pos;\n io.seek((this._root.lenPage * this.index));\n this._raw__m_body = io.readBytes(this._root.lenPage);\n var _io__raw__m_body = new KaitaiStream(this._raw__m_body);\n this._m_body = new Page(_io__raw__m_body, this, this._root);\n io.seek(_pos);\n return this._m_body;\n }\n });\n\n /**\n * Identifies the desired page number.\n */\n\n return PageRef;\n })();\n\n /**\n * A row that describes a track that can be played, with many\n * details about the music, and links to other tables like artists,\n * albums, keys, etc.\n */\n\n var TrackRow = RekordboxPdb.TrackRow = (function() {\n function TrackRow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n TrackRow.prototype._read = function() {\n this._unnamed0 = this._io.readU2le();\n this.indexShift = this._io.readU2le();\n this.bitmask = this._io.readU4le();\n this.sampleRate = this._io.readU4le();\n this.composerId = this._io.readU4le();\n this.fileSize = this._io.readU4le();\n this._unnamed6 = this._io.readU4le();\n this._unnamed7 = this._io.readU2le();\n this._unnamed8 = this._io.readU2le();\n this.artworkId = this._io.readU4le();\n this.keyId = this._io.readU4le();\n this.originalArtistId = this._io.readU4le();\n this.labelId = this._io.readU4le();\n this.remixerId = this._io.readU4le();\n this.bitrate = this._io.readU4le();\n this.trackNumber = this._io.readU4le();\n this.tempo = this._io.readU4le();\n this.genreId = this._io.readU4le();\n this.albumId = this._io.readU4le();\n this.artistId = this._io.readU4le();\n this.id = this._io.readU4le();\n this.discNumber = this._io.readU2le();\n this.playCount = this._io.readU2le();\n this.year = this._io.readU2le();\n this.sampleDepth = this._io.readU2le();\n this.duration = this._io.readU2le();\n this._unnamed26 = this._io.readU2le();\n this.colorId = this._io.readU1();\n this.rating = this._io.readU1();\n this._unnamed29 = this._io.readU2le();\n this._unnamed30 = this._io.readU2le();\n this.ofsStrings = new Array(21);\n for (var i = 0; i < 21; i++) {\n this.ofsStrings[i] = this._io.readU2le();\n }\n }\n\n /**\n * A string of unknown purpose, usually empty.\n */\n Object.defineProperty(TrackRow.prototype, 'unknownString8', {\n get: function() {\n if (this._m_unknownString8 !== undefined)\n return this._m_unknownString8;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[18]));\n this._m_unknownString8 = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_unknownString8;\n }\n });\n\n /**\n * A string of unknown purpose, usually empty.\n */\n Object.defineProperty(TrackRow.prototype, 'unknownString6', {\n get: function() {\n if (this._m_unknownString6 !== undefined)\n return this._m_unknownString6;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[9]));\n this._m_unknownString6 = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_unknownString6;\n }\n });\n\n /**\n * A string containing the date this track was analyzed by rekordbox.\n */\n Object.defineProperty(TrackRow.prototype, 'analyzeDate', {\n get: function() {\n if (this._m_analyzeDate !== undefined)\n return this._m_analyzeDate;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[15]));\n this._m_analyzeDate = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_analyzeDate;\n }\n });\n\n /**\n * The file path of the track audio file.\n */\n Object.defineProperty(TrackRow.prototype, 'filePath', {\n get: function() {\n if (this._m_filePath !== undefined)\n return this._m_filePath;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[20]));\n this._m_filePath = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_filePath;\n }\n });\n\n /**\n * A string whose value is always either empty or \"ON\", and\n * which apparently for some insane reason is used, rather than\n * a single bit somewhere, to control whether hot-cues are\n * auto-loaded for the track.\n */\n Object.defineProperty(TrackRow.prototype, 'autoloadHotcues', {\n get: function() {\n if (this._m_autoloadHotcues !== undefined)\n return this._m_autoloadHotcues;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[7]));\n this._m_autoloadHotcues = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_autoloadHotcues;\n }\n });\n\n /**\n * A string containing the date this track was added to the collection.\n */\n Object.defineProperty(TrackRow.prototype, 'dateAdded', {\n get: function() {\n if (this._m_dateAdded !== undefined)\n return this._m_dateAdded;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[10]));\n this._m_dateAdded = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_dateAdded;\n }\n });\n\n /**\n * A string of unknown purpose; @flesniak said \"strange\n * strings, often zero length, sometimes low binary values\n * 0x01/0x02 as content\"\n */\n Object.defineProperty(TrackRow.prototype, 'unknownString3', {\n get: function() {\n if (this._m_unknownString3 !== undefined)\n return this._m_unknownString3;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[3]));\n this._m_unknownString3 = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_unknownString3;\n }\n });\n\n /**\n * A string of unknown purpose, which @flesnik named.\n */\n Object.defineProperty(TrackRow.prototype, 'texter', {\n get: function() {\n if (this._m_texter !== undefined)\n return this._m_texter;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[1]));\n this._m_texter = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_texter;\n }\n });\n\n /**\n * A string whose value is always either empty or \"ON\", and\n * which apparently for some insane reason is used, rather than\n * a single bit somewhere, to control whether the track\n * information is visible on Kuvo.\n */\n Object.defineProperty(TrackRow.prototype, 'kuvoPublic', {\n get: function() {\n if (this._m_kuvoPublic !== undefined)\n return this._m_kuvoPublic;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[6]));\n this._m_kuvoPublic = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_kuvoPublic;\n }\n });\n\n /**\n * A string naming the remix of the track, if known.\n */\n Object.defineProperty(TrackRow.prototype, 'mixName', {\n get: function() {\n if (this._m_mixName !== undefined)\n return this._m_mixName;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[12]));\n this._m_mixName = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_mixName;\n }\n });\n\n /**\n * A string of unknown purpose.\n */\n Object.defineProperty(TrackRow.prototype, 'unknownString5', {\n get: function() {\n if (this._m_unknownString5 !== undefined)\n return this._m_unknownString5;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[8]));\n this._m_unknownString5 = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_unknownString5;\n }\n });\n\n /**\n * A string of unknown purpose; @flesniak said \"strange\n * strings, often zero length, sometimes low binary values\n * 0x01/0x02 as content\"\n */\n Object.defineProperty(TrackRow.prototype, 'unknownString4', {\n get: function() {\n if (this._m_unknownString4 !== undefined)\n return this._m_unknownString4;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[4]));\n this._m_unknownString4 = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_unknownString4;\n }\n });\n\n /**\n * A string of unknown purpose, which @flesnik named.\n */\n Object.defineProperty(TrackRow.prototype, 'message', {\n get: function() {\n if (this._m_message !== undefined)\n return this._m_message;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[5]));\n this._m_message = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_message;\n }\n });\n\n /**\n * A string of unknown purpose; @flesniak said \"thought\n * tracknumber -> wrong!\"\n */\n Object.defineProperty(TrackRow.prototype, 'unknownString2', {\n get: function() {\n if (this._m_unknownString2 !== undefined)\n return this._m_unknownString2;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[2]));\n this._m_unknownString2 = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_unknownString2;\n }\n });\n\n /**\n * International Standard Recording Code of track\n * when known (in mangled format).\n */\n Object.defineProperty(TrackRow.prototype, 'isrc', {\n get: function() {\n if (this._m_isrc !== undefined)\n return this._m_isrc;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[0]));\n this._m_isrc = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_isrc;\n }\n });\n\n /**\n * A string of unknown purpose, usually empty.\n */\n Object.defineProperty(TrackRow.prototype, 'unknownString7', {\n get: function() {\n if (this._m_unknownString7 !== undefined)\n return this._m_unknownString7;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[13]));\n this._m_unknownString7 = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_unknownString7;\n }\n });\n\n /**\n * The file name of the track audio file.\n */\n Object.defineProperty(TrackRow.prototype, 'filename', {\n get: function() {\n if (this._m_filename !== undefined)\n return this._m_filename;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[19]));\n this._m_filename = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_filename;\n }\n });\n\n /**\n * The file path of the track analysis, which allows rapid\n * seeking to particular times in variable bit-rate files,\n * jumping to particular beats, visual waveform previews, and\n * stores cue points and loops.\n */\n Object.defineProperty(TrackRow.prototype, 'analyzePath', {\n get: function() {\n if (this._m_analyzePath !== undefined)\n return this._m_analyzePath;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[14]));\n this._m_analyzePath = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_analyzePath;\n }\n });\n\n /**\n * The comment assigned to the track by the DJ, if any.\n */\n Object.defineProperty(TrackRow.prototype, 'comment', {\n get: function() {\n if (this._m_comment !== undefined)\n return this._m_comment;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[16]));\n this._m_comment = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_comment;\n }\n });\n\n /**\n * A string containing the date this track was released, if known.\n */\n Object.defineProperty(TrackRow.prototype, 'releaseDate', {\n get: function() {\n if (this._m_releaseDate !== undefined)\n return this._m_releaseDate;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[11]));\n this._m_releaseDate = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_releaseDate;\n }\n });\n\n /**\n * The title of the track.\n */\n Object.defineProperty(TrackRow.prototype, 'title', {\n get: function() {\n if (this._m_title !== undefined)\n return this._m_title;\n var _pos = this._io.pos;\n this._io.seek((this._parent.rowBase + this.ofsStrings[17]));\n this._m_title = new DeviceSqlString(this._io, this, this._root);\n this._io.seek(_pos);\n return this._m_title;\n }\n });\n\n /**\n * Some kind of magic word? Usually 0x24, 0x00.\n */\n\n /**\n * TODO name from @flesniak, but what does it mean?\n */\n\n /**\n * TODO what do the bits mean?\n */\n\n /**\n * Playback sample rate of the audio file.\n */\n\n /**\n * References a row in the artist table if the composer is\n * known.\n */\n\n /**\n * The length of the audio file, in bytes.\n */\n\n /**\n * Some ID? Purpose as yet unknown.\n */\n\n /**\n * From @flesniak: \"always 19048?\"\n */\n\n /**\n * From @flesniak: \"always 30967?\"\n */\n\n /**\n * References a row in the artwork table if there is album art.\n */\n\n /**\n * References a row in the keys table if the track has a known\n * main musical key.\n */\n\n /**\n * References a row in the artwork table if this is a cover\n * performance and the original artist is known.\n */\n\n /**\n * References a row in the labels table if the track has a\n * known record label.\n */\n\n /**\n * References a row in the artists table if the track has a\n * known remixer.\n */\n\n /**\n * Playback bit rate of the audio file.\n */\n\n /**\n * The position of the track within an album.\n */\n\n /**\n * The tempo at the start of the track in beats per minute,\n * multiplied by 100.\n */\n\n /**\n * References a row in the genres table if the track has a\n * known musical genre.\n */\n\n /**\n * References a row in the albums table if the track has a\n * known album.\n */\n\n /**\n * References a row in the artists table if the track has a\n * known performer.\n */\n\n /**\n * The id by which this track can be looked up; players will\n * report this value in their status packets when they are\n * playing the track.\n */\n\n /**\n * The number of the disc on which this track is found, if it\n * is known to be part of a multi-disc album.\n */\n\n /**\n * The number of times this track has been played.\n */\n\n /**\n * The year in which this track was released.\n */\n\n /**\n * The number of bits per sample of the audio file.\n */\n\n /**\n * The length, in seconds, of the track when played at normal\n * speed.\n */\n\n /**\n * From @flesniak: \"always 41?\"\n */\n\n /**\n * References a row in the colors table if the track has been\n * assigned a color.\n */\n\n /**\n * The number of stars to display for the track, 0 to 5.\n */\n\n /**\n * From @flesniak: \"always 1?\"\n */\n\n /**\n * From @flesniak: \"alternating 2 or 3\"\n */\n\n /**\n * The location, relative to the start of this row, of a\n * variety of variable-length strings.\n */\n\n return TrackRow;\n })();\n\n /**\n * A row that holds a musical key and the associated ID.\n */\n\n var KeyRow = RekordboxPdb.KeyRow = (function() {\n function KeyRow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n KeyRow.prototype._read = function() {\n this.id = this._io.readU4le();\n this.id2 = this._io.readU4le();\n this.name = new DeviceSqlString(this._io, this, this._root);\n }\n\n /**\n * The unique identifier by which this key can be requested\n * and linked from other rows (such as tracks).\n */\n\n /**\n * Seems to be a second copy of the ID?\n */\n\n /**\n * The variable-length string naming the key.\n */\n\n return KeyRow;\n })();\n\n /**\n * A row that associates a track with a position in a playlist.\n */\n\n var PlaylistEntryRow = RekordboxPdb.PlaylistEntryRow = (function() {\n function PlaylistEntryRow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n PlaylistEntryRow.prototype._read = function() {\n this.entryIndex = this._io.readU4le();\n this.trackId = this._io.readU4le();\n this.playlistId = this._io.readU4le();\n }\n\n /**\n * The position within the playlist represented by this entry.\n */\n\n /**\n * The track found at this position in the playlist.\n */\n\n /**\n * The playlist to which this entry belongs.\n */\n\n return PlaylistEntryRow;\n })();\n\n /**\n * A row that holds a label name and the associated ID.\n */\n\n var LabelRow = RekordboxPdb.LabelRow = (function() {\n function LabelRow(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n LabelRow.prototype._read = function() {\n this.id = this._io.readU4le();\n this.name = new DeviceSqlString(this._io, this, this._root);\n }\n\n /**\n * The unique identifier by which this label can be requested\n * and linked from other rows (such as tracks).\n */\n\n /**\n * The variable-length string naming the label.\n */\n\n return LabelRow;\n })();\n\n /**\n * A UTF-16LE-encoded string preceded by a two-byte length field.\n */\n\n var DeviceSqlLongUtf16le = RekordboxPdb.DeviceSqlLongUtf16le = (function() {\n function DeviceSqlLongUtf16le(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n DeviceSqlLongUtf16le.prototype._read = function() {\n this.length = this._io.readU2le();\n this._unnamed1 = this._io.readU1();\n this.text = KaitaiStream.bytesToStr(this._io.readBytes((this.length - 4)), \"utf-16le\");\n }\n\n /**\n * Contains the length of the string in bytes, including two trailing nulls.\n */\n\n /**\n * The content of the string.\n */\n\n return DeviceSqlLongUtf16le;\n })();\n\n /**\n * Each table is a linked list of pages containing rows of a single\n * type. This header describes the nature of the table and links to\n * its pages by index.\n */\n\n var Table = RekordboxPdb.Table = (function() {\n function Table(_io, _parent, _root) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n\n this._read();\n }\n Table.prototype._read = function() {\n this.type = this._io.readU4le();\n this.emptyCandidate = this._io.readU4le();\n this.firstPage = new PageRef(this._io, this, this._root);\n this.lastPage = new PageRef(this._io, this, this._root);\n }\n\n /**\n * Identifies the kind of rows that are found in this table.\n */\n\n /**\n * Links to the chain of pages making up that table. The first\n * page seems to always contain similar garbage patterns and\n * zero rows, but the next page it links to contains the start\n * of the meaningful data rows.\n */\n\n /**\n * Holds the index of the last page that makes up this table.\n * When following the linked list of pages of the table, you\n * either need to stop when you reach this page, or when you\n * notice that the `next_page` link you followed took you to a\n * page of a different `type`.\n */\n\n return Table;\n })();\n\n /**\n * An offset which points to a row in the table, whose actual\n * presence is controlled by one of the bits in\n * `row_present_flags`. This instance allows the row itself to be\n * lazily loaded, unless it is not present, in which case there is\n * no content to be loaded.\n */\n\n var RowRef = RekordboxPdb.RowRef = (function() {\n function RowRef(_io, _parent, _root, rowIndex) {\n this._io = _io;\n this._parent = _parent;\n this._root = _root || this;\n this.rowIndex = rowIndex;\n\n this._read();\n }\n RowRef.prototype._read = function() {\n }\n\n /**\n * The offset of the start of the row (in bytes past the end of\n * the page header).\n */\n Object.defineProperty(RowRef.prototype, 'ofsRow', {\n get: function() {\n if (this._m_ofsRow !== undefined)\n return this._m_ofsRow;\n var _pos = this._io.pos;\n this._io.seek((this._parent.base - (6 + (2 * this.rowIndex))));\n this._m_ofsRow = this._io.readU2le();\n this._io.seek(_pos);\n return this._m_ofsRow;\n }\n });\n\n /**\n * The location of this row relative to the start of the page.\n * A variety of pointers (such as all device_sql_string values)\n * are calculated with respect to this position.\n */\n Object.defineProperty(RowRef.prototype, 'rowBase', {\n get: function() {\n if (this._m_rowBase !== undefined)\n return this._m_rowBase;\n this._m_rowBase = (this.ofsRow + this._parent._parent.heapPos);\n return this._m_rowBase;\n }\n });\n\n /**\n * Indicates whether the row index considers this row to be\n * present in the table. Will be `false` if the row has been\n * deleted.\n */\n Object.defineProperty(RowRef.prototype, 'present', {\n get: function() {\n if (this._m_present !== undefined)\n return this._m_present;\n this._m_present = (((this._parent.rowPresentFlags >>> this.rowIndex) & 1) != 0 ? true : false);\n return this._m_present;\n }\n });\n\n /**\n * The actual content of the row, as long as it is present.\n */\n Object.defineProperty(RowRef.prototype, 'body', {\n get: function() {\n if (this._m_body !== undefined)\n return this._m_body;\n if (this.present) {\n var _pos = this._io.pos;\n this._io.seek(this.rowBase);\n switch (this._parent._parent.type) {\n case RekordboxPdb.PageType.PLAYLIST_TREE:\n this._m_body = new PlaylistTreeRow(this._io, this, this._root);\n break;\n case RekordboxPdb.PageType.KEYS:\n this._m_body = new KeyRow(this._io, this, this._root);\n break;\n case RekordboxPdb.PageType.ARTISTS:\n this._m_body = new ArtistRow(this._io, this, this._root);\n break;\n case RekordboxPdb.PageType.ALBUMS:\n this._m_body = new AlbumRow(this._io, this, this._root);\n break;\n case RekordboxPdb.PageType.GENRES:\n this._m_body = new GenreRow(this._io, this, this._root);\n break;\n case RekordboxPdb.PageType.ARTWORK:\n this._m_body = new ArtworkRow(this._io, this, this._root);\n break;\n case RekordboxPdb.PageType.PLAYLIST_ENTRIES:\n this._m_body = new PlaylistEntryRow(this._io, this, this._root);\n break;\n case RekordboxPdb.PageType.LABELS:\n this._m_body = new LabelRow(this._io, this, this._root);\n break;\n case RekordboxPdb.PageType.TRACKS:\n this._m_body = new TrackRow(this._io, this, this._root);\n break;\n case RekordboxPdb.PageType.COLORS:\n this._m_body = new ColorRow(this._io, this, this._root);\n break;\n }\n this._io.seek(_pos);\n }\n return this._m_body;\n }\n });\n\n /**\n * Identifies which row within the row index this reference\n * came from, so the correct flag can be checked for the row\n * presence and the correct row offset can be found.\n */\n\n return RowRef;\n })();\n\n /**\n * Unknown purpose, perhaps an unoriginal signature, seems to\n * always have the value 0.\n */\n\n /**\n * The database page size, in bytes. Pages are referred to by\n * index, so this size is needed to calculate their offset, and\n * table pages have a row index structure which is built from the\n * end of the page backwards, so finding that also requires this\n * value.\n */\n\n /**\n * Determines the number of table entries that are present. Each\n * table is a linked list of pages containing rows of a particular\n * type.\n */\n\n /**\n * @flesinak said: \"Not used as any `empty_candidate`, points\n * past the end of the file.\"\n */\n\n /**\n * @flesniak said: \"Always incremented by at least one,\n * sometimes by two or three.\"\n */\n\n /**\n * Only exposed until\n * https://github.com/kaitai-io/kaitai_struct/issues/825 can be\n * fixed.\n */\n\n /**\n * Describes and links to the tables present in the database.\n */\n\n return RekordboxPdb;\n})();\nreturn RekordboxPdb;\n}));\n","/**\n * OneLibrary Database Adapter\n *\n * Re-exports from onelibrary-connect for backward compatibility.\n */\n\nexport type {\n Category,\n DeviceProperty,\n HistorySession,\n HotCueBankList,\n MenuItem,\n MyTag,\n SortOption,\n} from 'onelibrary-connect';\nexport {getEncryptionKey, OneLibraryAdapter, openOneLibraryDb} from 'onelibrary-connect';\n","import sqlite3 from 'better-sqlite3-multiple-ciphers';\nimport {camelCase, mapKeys, mapValues, partition, snakeCase} from 'lodash';\n\nimport {EntityFK, Playlist, PlaylistEntry, Track} from 'src/entities';\n\nimport {DatabaseAdapter, DatabaseType} from './database-adapter';\nimport {generateSchema} from './schema';\n\n/**\n * Table names available\n */\nexport enum Table {\n Artist = 'artist',\n Album = 'album',\n Genre = 'genre',\n Color = 'color',\n Label = 'label',\n Key = 'key',\n Artwork = 'artwork',\n Playlist = 'playlist',\n PlaylistEntry = 'playlist_entry',\n Track = 'track',\n}\n\nconst trackRelations = [\n 'artwork',\n 'artist',\n 'originalArtist',\n 'remixer',\n 'composer',\n 'album',\n 'label',\n 'genre',\n 'color',\n 'key',\n];\n\nconst trackRelationTableMap: Record<string, string> = {\n originalArtist: 'artist',\n remixer: 'artist',\n composer: 'artist',\n};\n\n/**\n * Object Relation Mapper as an abstraction ontop of a local database\n * connection.\n *\n * May be used to populate a metadata database and query objects.\n */\nexport class MetadataORM implements DatabaseAdapter {\n readonly type: DatabaseType = 'pdb';\n\n #conn: sqlite3.Database;\n #stmtCache = new Map<string, sqlite3.Statement>();\n #inTransaction = false;\n\n constructor() {\n this.#conn = sqlite3(':memory:');\n this.#conn.exec(generateSchema());\n }\n\n close() {\n this.#stmtCache.clear();\n this.#conn.close();\n }\n\n /**\n * Begin a transaction for bulk inserts. Call commit() when done.\n */\n beginTransaction() {\n if (!this.#inTransaction) {\n this.#conn.exec('BEGIN TRANSACTION');\n this.#inTransaction = true;\n }\n }\n\n /**\n * Commit the current transaction.\n */\n commit() {\n if (this.#inTransaction) {\n this.#conn.exec('COMMIT');\n this.#inTransaction = false;\n }\n }\n\n /**\n * Insert a entity object into the database.\n * For bulk inserts, call beginTransaction() first and commit() when done.\n */\n insertEntity(table: Table, object: Record<string, any>) {\n const fields = Object.entries<any>(object);\n const fieldNames = fields\n .map(f => f[0])\n .sort()\n .join(',');\n const cacheKey = `${table}:${fieldNames}`;\n\n // Reuse prepared statement for same table+fields combination\n let stmt = this.#stmtCache.get(cacheKey);\n if (!stmt) {\n const slots = fields.map(f => `:${f[0]}`).join(', ');\n const columns = fields.map(f => snakeCase(f[0])).join(', ');\n stmt = this.#conn.prepare(`insert into ${table} (${columns}) values (${slots})`);\n this.#stmtCache.set(cacheKey, stmt);\n }\n\n // Translate date and booleans\n const data = mapValues(object, value =>\n value instanceof Date\n ? value.toISOString()\n : typeof value === 'boolean'\n ? Number(value)\n : value\n );\n\n stmt.run(data);\n }\n\n /**\n * Locate a track by ID in the database\n */\n findTrack(id: number): Track | null {\n const row: Record<string, any> | undefined = this.#conn\n .prepare<any, any>(`select * from ${Table.Track} where id = ?`)\n .get(id);\n\n if (!row) {\n return null;\n }\n\n // Map row columns to camel case compatibility\n const trackRow = mapKeys(row, (_, k) => camelCase(k)) as Track<EntityFK.WithFKs>;\n\n trackRow.beatGrid = null;\n trackRow.cueAndLoops = null;\n trackRow.waveformHd = null;\n\n // Explicitly restore dates and booleans\n trackRow.autoloadHotcues = !!trackRow.autoloadHotcues;\n trackRow.kuvoPublic = !!trackRow.kuvoPublic;\n\n // Explicitly restore date objects\n trackRow.analyzeDate = new Date(trackRow.analyzeDate as any);\n trackRow.dateAdded = new Date(trackRow.dateAdded as any);\n\n // Query all track relationships\n const track = trackRow as any;\n\n for (const relation of trackRelations) {\n const fkName = `${relation}Id`;\n\n const fk = track[fkName];\n const table = snakeCase(trackRelationTableMap[relation] ?? relation);\n\n // Swap fk for relation key\n delete track[fkName];\n track[relation] = null;\n\n if (fk === null) {\n continue;\n }\n\n const relationItem: Record<string, any> = this.#conn\n .prepare<any, any>(`select * from ${table} where id = ?`)\n .get(fk);\n\n track[relation] = relationItem;\n }\n\n return track as Track;\n }\n\n /**\n * Query for a list of {folders, playlists, tracks} given a playlist ID. If\n * no ID is provided the root list is queried.\n *\n * Note that when tracks are returned there will be no folders or playslists.\n * But the API here is simpler to assume there could be.\n *\n * Tracks are returned in the order they are placed on the playlist.\n */\n findPlaylist(playlistId?: number) {\n const parentCondition = playlistId === undefined ? 'parent_id is ?' : 'parent_id = ?';\n\n // Lookup playlists / folders for this playlist ID\n const playlistRows: Array<Record<string, any>> = this.#conn\n .prepare<any, any>(`select * from ${Table.Playlist} where ${parentCondition}`)\n .all(playlistId);\n\n const [folders, playlists] = partition(\n playlistRows.map(row => mapKeys(row, (_, k) => camelCase(k)) as Playlist),\n p => p.isFolder\n );\n\n const entryRows: Array<Record<string, any>> = this.#conn\n .prepare<any, any>(`select * from ${Table.PlaylistEntry} where playlist_id = ?`)\n .all(playlistId);\n\n const trackEntries = entryRows.map(\n row => mapKeys(row, (_, k) => camelCase(k)) as PlaylistEntry<EntityFK.WithFKs>\n );\n\n return {folders, playlists, trackEntries};\n }\n}\n","/**\n * Rekordbox Database Utilities\n *\n * Re-exports from the rekordbox/ folder for backward compatibility.\n * @see ./rekordbox/index.ts for the implementation\n */\n\nexport type {\n AnlzResolver,\n AnlzResponse,\n AnlzResponse2EX,\n AnlzResponseDAT,\n AnlzResponseEXT,\n HydrationOptions,\n HydrationProgress,\n} from './rekordbox/index';\nexport {hydrateDatabase, loadAnlz} from './rekordbox/index';\n","import {makeCueLoopEntry} from 'src/localdb/utils';\nimport {\n BeatGrid,\n CueAndLoop,\n ExtendedCue,\n HotcueButton,\n Phrase,\n SongStructure,\n VocalConfig,\n Waveform3BandDetail,\n Waveform3BandPreview,\n WaveformHD,\n WaveformPreviewData,\n} from 'src/types';\nimport {convertWaveformHDData} from 'src/utils/converters';\n\n/**\n * Fill beatgrid data from the ANLZ section\n */\nexport function makeBeatGrid(data: any): BeatGrid {\n return data.body.beats.map((beat: any) => ({\n offset: beat.time,\n bpm: beat.tempo / 100,\n count: beat.beatNumber,\n }));\n}\n\n/**\n * Fill cue and loop data from the ANLZ section\n */\nexport function makeCueAndLoop(data: any): CueAndLoop[] {\n return data.body.cues.map((entry: any) => {\n // Cues with the status 0 are likely leftovers that were removed\n\n const button = entry.hotCue === 0 ? false : (entry.type as HotcueButton);\n const isCue = entry.type === 0x01;\n const isLoop = entry.type === 0x02;\n\n // NOTE: Unlike the remotedb, these entries are already in milliseconds.\n const offset = entry.time;\n const length = entry.loopTime - offset;\n\n return makeCueLoopEntry(isCue, isLoop, offset, length, button);\n });\n}\n\n/**\n * Fill waveform HD data from the ANLZ section\n */\nexport function makeWaveformHd(data: any): WaveformHD {\n return convertWaveformHDData(Buffer.from(data.body.entries));\n}\n\n/**\n * Parse extended cues (PCO2) with colors and comments\n */\nexport function makeExtendedCues(data: any): ExtendedCue[] {\n return data.body.cues.map((entry: any) => {\n const cue: ExtendedCue = {\n hotCue: entry.hotCue,\n type: entry.type,\n time: entry.time,\n };\n\n // Add loop end time if this is a loop\n if (entry.type === 2 && entry.loopTime !== undefined) {\n cue.loopTime = entry.loopTime;\n }\n\n // Add color ID for memory points/loops\n if (entry.colorId !== undefined && entry.colorId > 0) {\n cue.colorId = entry.colorId;\n }\n\n // Add hot cue color information\n if (entry.colorCode !== undefined && entry.colorCode > 0) {\n cue.colorCode = entry.colorCode;\n cue.colorRgb = {\n r: entry.colorRed ?? 0,\n g: entry.colorGreen ?? 0,\n b: entry.colorBlue ?? 0,\n };\n }\n\n // Add comment if present\n if (entry.lenComment > 0 && entry.comment) {\n cue.comment = entry.comment;\n }\n\n // Add quantized loop information if present\n if (entry.loopNumerator !== undefined && entry.loopNumerator > 0) {\n cue.loopNumerator = entry.loopNumerator;\n cue.loopDenominator = entry.loopDenominator ?? 1;\n }\n\n return cue;\n });\n}\n\n/**\n * Parse song structure (PSSI) with phrase analysis\n */\nexport function makeSongStructure(data: any): SongStructure {\n const moodMap: Record<number, 'high' | 'mid' | 'low'> = {\n 1: 'high',\n 2: 'mid',\n 3: 'low',\n };\n\n const bankMap: Record<number, SongStructure['bank']> = {\n 0: 'default',\n 1: 'cool',\n 2: 'natural',\n 3: 'hot',\n 4: 'subtle',\n 5: 'warm',\n 6: 'vivid',\n 7: 'club_1',\n 8: 'club_2',\n };\n\n // Phrase type mappings based on mood\n const phraseTypeMap: Record<'high' | 'mid' | 'low', Record<number, string>> = {\n high: {\n 1: 'Intro',\n 2: 'Up',\n 3: 'Down',\n 5: 'Chorus',\n 6: 'Outro',\n },\n mid: {\n 1: 'Intro',\n 2: 'Verse 1',\n 3: 'Verse 2',\n 4: 'Verse 3',\n 5: 'Verse 4',\n 6: 'Verse 5',\n 7: 'Verse 6',\n 8: 'Bridge',\n 9: 'Chorus',\n 10: 'Outro',\n },\n low: {\n 1: 'Intro',\n 2: 'Verse 1',\n 3: 'Verse 1',\n 4: 'Verse 1',\n 5: 'Verse 2',\n 6: 'Verse 2',\n 7: 'Verse 2',\n 8: 'Bridge',\n 9: 'Chorus',\n 10: 'Outro',\n },\n };\n\n const mood = moodMap[data.body.mood] ?? 'high';\n const bank = bankMap[data.body.rawBank] ?? 'default';\n\n const phrases: Phrase[] = data.body.entries.map((entry: any) => {\n const phrase: Phrase = {\n index: entry.index,\n beat: entry.beat,\n kind: entry.kind,\n phraseType: phraseTypeMap[mood][entry.kind] ?? 'Unknown',\n };\n\n // Add fill-in information if present\n if (entry.fill > 0) {\n phrase.fill = entry.fill;\n phrase.fillBeat = entry.beatFill;\n }\n\n return phrase;\n });\n\n return {\n mood,\n bank,\n endBeat: data.body.endBeat,\n phrases,\n };\n}\n\n/**\n * Parse waveform preview data (PWAV/PWV2)\n */\nexport function makeWaveformPreview(data: any): WaveformPreviewData {\n return {\n data: Buffer.from(data.body.data),\n };\n}\n\n/**\n * Parse 3-band color waveform preview (PWV6 from .2EX files)\n */\nexport function makeWaveform3BandPreview(data: any): Waveform3BandPreview {\n return {\n numEntries: data.body.lenEntries,\n data: Buffer.from(data.body.entries),\n };\n}\n\n/**\n * Parse 3-band color detail waveform (PWV7 from .2EX files)\n */\nexport function makeWaveform3BandDetail(data: any): Waveform3BandDetail {\n return {\n numEntries: data.body.lenEntries,\n data: Buffer.from(data.body.entries),\n };\n}\n\n/**\n * Parse vocal detection config (PWVC from .2EX files)\n */\nexport function makeVocalConfig(data: any): VocalConfig {\n return {\n thresholdLow: data.body.thresholdLow,\n thresholdMid: data.body.thresholdMid,\n thresholdHigh: data.body.thresholdHigh,\n };\n}\n","import {\n Album,\n Artist,\n Artwork,\n Color,\n EntityFK,\n Genre,\n Key,\n Label,\n Playlist,\n PlaylistEntry,\n Track,\n} from 'src/entities';\n\ninterface IdAndNameEntity {\n id: number;\n name: string;\n}\n\nconst ensureDate = (date: Date) =>\n date instanceof Date && !isNaN(date.valueOf()) ? date : undefined;\n\n/**\n * Utility to create a hydrator that hydrates the provided entity with the id\n * and name properties from the row.\n */\nexport const makeIdNameHydrator =\n <T extends IdAndNameEntity>() =>\n (row: any) =>\n ({\n id: row.id,\n name: row.name.body.text ?? '',\n }) as T;\n\n/**\n * Translates a pdb track row entry to a {@link Track} entity.\n */\nexport function createTrack(trackRow: any) {\n const analyzePath: string | undefined = trackRow.analyzePath.body.text;\n\n const track: Track<EntityFK.WithFKs> = {\n id: trackRow.id,\n title: trackRow.title.body.text,\n trackNumber: trackRow.trackNumber,\n discNumber: trackRow.discNumber,\n duration: trackRow.duration,\n sampleRate: trackRow.sampleRate,\n sampleDepth: trackRow.sampleDepth,\n bitrate: trackRow.bitrate,\n tempo: trackRow.tempo / 100,\n playCount: trackRow.playCount,\n year: trackRow.year,\n rating: trackRow.rating,\n mixName: trackRow.mixName.body.text,\n comment: trackRow.comment.body.text,\n autoloadHotcues: trackRow.autoloadHotcues.body.text === 'ON',\n kuvoPublic: trackRow.kuvoPublic.body.text === 'ON',\n filePath: trackRow.filePath.body.text,\n fileName: trackRow.filename.body.text,\n fileSize: trackRow.fileSize,\n releaseDate: trackRow.releaseDate.body.text,\n analyzeDate: ensureDate(new Date(trackRow.analyzeDate.body.text)),\n dateAdded: ensureDate(new Date(trackRow.dateAdded.body.text)),\n\n // The analyze file comes in 3 forms\n //\n // 1. A `DAT` file, which is missing some extended information, for the older\n // Pioneer equipment (likely due to memory constraints).\n //\n // 2. A `EXT` file which includes colored waveforms and other extended data.\n //\n // 3. A `EX2` file -- currently unknown\n //\n // We noramlize this path by trimming the DAT extension off. Later we will\n // try and read whatever is available.\n analyzePath: analyzePath?.substring(0, analyzePath.length - 4),\n\n artworkId: trackRow.artworkId || null,\n artistId: trackRow.artistId || null,\n originalArtistId: trackRow.originalArtistId || null,\n remixerId: trackRow.remixerId || null,\n composerId: trackRow.composerId || null,\n albumId: trackRow.albumId || null,\n labelId: trackRow.labelId || null,\n genreId: trackRow.genreId || null,\n colorId: trackRow.colorId || null,\n keyId: trackRow.keyId || null,\n\n // NOTE: There are a few additional columns that will be hydrated through\n // the analyze files (given the analyzePath) which we do not assign here.\n beatGrid: null,\n cueAndLoops: null,\n waveformHd: null,\n };\n\n return track;\n}\n\n/**\n * Translates a pdb playlist row entry into a {@link Playlist} entity.\n */\nexport function createPlaylist(playlistRow: any) {\n const playlist: Playlist = {\n id: playlistRow.id,\n name: playlistRow.name.body.text,\n isFolder: playlistRow.rawIsFolder !== 0,\n parentId: playlistRow.parentId || null,\n };\n\n return playlist;\n}\n\n/**\n * Translates a pdb playlist track entry into a {@link PlaylistTrack} entity.\n */\nexport function createPlaylistEntry(playlistTrackRow: any) {\n const entry: PlaylistEntry<EntityFK.WithFKs> = {\n id: playlistTrackRow.id,\n sortIndex: playlistTrackRow.entryIndex,\n playlistId: playlistTrackRow.playlistId,\n trackId: playlistTrackRow.trackId,\n };\n\n return entry;\n}\n\n/**\n * Translates a pdb artwork entry into a {@link Artwork} entity.\n */\nexport function createArtworkEntry(artworkRow: any) {\n const art: Artwork = {\n id: artworkRow.id,\n path: artworkRow.path.body.text,\n };\n\n return art;\n}\n\n// Re-export types for table mappings\nexport type {Album, Artist, Color, Genre, Key, Label};\n","import {KaitaiStream} from 'kaitai-struct';\n\nimport RekordboxPdb from 'src/localdb/kaitai/rekordbox_pdb.ksy';\nimport {MetadataORM} from 'src/localdb/orm';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\nimport * as Telemetry from 'src/utils/telemetry';\n\nimport {pdbEntityCreators, pdbTables} from './table-mappings';\nimport type {HydrationOptions, HydrationProgress} from './types';\n\n/**\n * This service provides utilities for translating rekordbox database (pdb_ and\n * analysis (ANLZ) files into the common entity types used in this library.\n */\nexport class RekordboxHydrator {\n #orm: MetadataORM;\n #onProgress: (progress: HydrationProgress) => void;\n\n constructor({orm, onProgress}: Omit<HydrationOptions, 'pdbData' | 'span'>) {\n this.#orm = orm;\n this.#onProgress = onProgress ?? (() => null);\n }\n\n /**\n * Extract entries from a rekordbox pdb file and hydrate the passed database\n * connection with entities derived from the rekordbox entries.\n */\n async hydrateFromPdb(pdbData: Buffer, span?: Span) {\n const tx = span\n ? span.startChild({op: 'hydrateFromPdb'})\n : Telemetry.startTransaction({name: 'hydrateFromPdb'});\n\n const parseTx = tx.startChild({op: 'parsePdbData', data: {size: pdbData.length}});\n const stream = new KaitaiStream(pdbData);\n const db = new RekordboxPdb(stream);\n parseTx.finish();\n\n const hydrateTx = tx.startChild({op: 'hydration'});\n await Promise.all(\n db.tables.map((table: any) => this.hydrateFromTable(table, hydrateTx))\n );\n hydrateTx.finish();\n\n tx.finish();\n }\n\n /**\n * Hydrate the database with entities from the provided RekordboxPdb table.\n * See pdbEntityCreators for how tables are mapped into database entities.\n */\n async hydrateFromTable(table: any, span: Span) {\n const tableName = pdbTables[table.type];\n const createObject = pdbEntityCreators[table.type];\n\n const tx = span.startChild({op: 'hydrateFromTable', description: tableName});\n\n if (createObject === undefined) {\n return;\n }\n\n let totalSaved = 0;\n let totalItems = 0;\n\n for (const _row of tableRows(table)) {\n void _row; // Intentionally unused - just counting\n totalItems++;\n }\n\n tx.setData('items', totalItems);\n\n // Use transaction for bulk inserts (10-100x faster)\n this.#orm.beginTransaction();\n\n try {\n for (const row of tableRows(table)) {\n const entity = createObject(row);\n this.#orm.insertEntity(tableName, entity);\n totalSaved++;\n\n // Report progress and yield every 100 rows (instead of every row)\n if (totalSaved % 100 === 0 || totalSaved === totalItems) {\n this.#onProgress({complete: totalSaved, table: tableName, total: totalItems});\n // Yield to event loop periodically to keep UI responsive\n await new Promise(r => setTimeout(r, 0));\n }\n }\n } finally {\n this.#orm.commit();\n }\n\n tx.finish();\n }\n}\n\n/**\n * Utility generator that pages through a table and yields every present row.\n * This flattens the concept of rowGroups and refs.\n */\nfunction* tableRows(table: any) {\n const {firstPage, lastPage} = table;\n\n let pageRef = firstPage;\n do {\n const page = pageRef.body;\n\n // Adjust our page ref for the next iteration. We do this early in our loop\n // so we can break without having to remember to update for the next iter.\n pageRef = page.nextPage;\n\n // Ignore non-data pages. Not sure what these are for?\n if (!page.isDataPage) {\n continue;\n }\n\n const rows = page.rowGroups\n .map((group: any) => group.rows)\n .flat()\n .filter((row: any) => row.present);\n\n for (const row of rows) {\n yield row.body;\n }\n } while (pageRef.index <= lastPage.index);\n}\n","import {KaitaiStream} from 'kaitai-struct';\n\nimport {Track} from 'src/entities';\nimport RekordboxAnlz from 'src/localdb/kaitai/rekordbox_anlz.ksy';\n\nimport {\n makeBeatGrid,\n makeCueAndLoop,\n makeExtendedCues,\n makeSongStructure,\n makeVocalConfig,\n makeWaveform3BandDetail,\n makeWaveform3BandPreview,\n makeWaveformHd,\n makeWaveformPreview,\n} from './anlz-parsers';\nimport {RekordboxHydrator} from './hydrator';\nimport type {\n AnlzResolver,\n AnlzResponse,\n AnlzResponse2EX,\n AnlzResponseDAT,\n AnlzResponseEXT,\n HydrationOptions,\n HydrationProgress,\n} from './types';\n\nconst {SectionTags} = RekordboxAnlz;\n\n// Re-export types\nexport type {\n AnlzResolver,\n AnlzResponse,\n AnlzResponse2EX,\n AnlzResponseDAT,\n AnlzResponseEXT,\n HydrationOptions,\n HydrationProgress,\n};\n\n/**\n * Given a rekordbox pdb file contents. This function will hydrate the provided\n * database with all entities from the Rekordbox database. This includes all\n * track metadata, including analyzed metadata (such as beatgrids and waveforms).\n */\nexport async function hydrateDatabase({pdbData, span, ...options}: HydrationOptions) {\n const hydrator = new RekordboxHydrator(options);\n await hydrator.hydrateFromPdb(pdbData, span);\n}\n\n/**\n * Loads the ANLZ data of a Track entity from the analyzePath.\n */\nexport async function loadAnlz<T extends keyof AnlzResponse>(\n track: Pick<Track, 'analyzePath'>,\n type: T,\n anlzResolver: AnlzResolver\n): Promise<AnlzResponse[T]> {\n const path = `${track.analyzePath}.${type}`;\n const anlzData = await anlzResolver(path);\n\n const stream = new KaitaiStream(anlzData);\n const anlz = new RekordboxAnlz(stream);\n\n const result = {} as AnlzResponse[T];\n const resultDat = result as AnlzResponseDAT;\n const resultExt = result as AnlzResponseEXT;\n const result2ex = result as AnlzResponse2EX;\n\n for (const section of anlz.sections) {\n switch (section.fourcc) {\n case SectionTags.BEAT_GRID:\n resultDat.beatGrid = makeBeatGrid(section);\n break;\n\n case SectionTags.CUES:\n resultDat.cueAndLoops = makeCueAndLoop(section);\n break;\n\n case SectionTags.CUES_2:\n resultExt.extendedCues = makeExtendedCues(section);\n break;\n\n case SectionTags.WAVE_PREVIEW:\n resultDat.waveformPreview = makeWaveformPreview(section);\n break;\n\n case SectionTags.WAVE_TINY:\n resultDat.waveformTiny = makeWaveformPreview(section);\n break;\n\n case SectionTags.WAVE_SCROLL:\n resultExt.waveformDetail = Buffer.from(section.body.entries);\n break;\n\n case SectionTags.WAVE_COLOR_PREVIEW:\n resultExt.waveformColorPreview = Buffer.from(section.body.entries);\n break;\n\n case SectionTags.WAVE_COLOR_SCROLL:\n resultExt.waveformHd = makeWaveformHd(section);\n break;\n\n case SectionTags.SONG_STRUCTURE:\n resultExt.songStructure = makeSongStructure(section);\n break;\n\n case SectionTags.WAVE_COLOR_3BAND_PREVIEW:\n result2ex.waveform3BandPreview = makeWaveform3BandPreview(section);\n break;\n\n case SectionTags.WAVE_COLOR_3BAND_DETAIL:\n result2ex.waveform3BandDetail = makeWaveform3BandDetail(section);\n break;\n\n case SectionTags.VOCAL_CONFIG:\n result2ex.vocalConfig = makeVocalConfig(section);\n break;\n\n // VBR and PATH tags are defined but not currently extracted\n // as they're not commonly needed in the application\n case SectionTags.VBR:\n case SectionTags.PATH:\n break;\n }\n }\n\n return result;\n}\n","import {Album, Artist, Color, Genre, Key, Label} from 'src/entities';\nimport RekordboxPdb from 'src/localdb/kaitai/rekordbox_pdb.ksy';\nimport {Table} from 'src/localdb/orm';\n\nimport {\n createArtworkEntry,\n createPlaylist,\n createPlaylistEntry,\n createTrack,\n makeIdNameHydrator,\n} from './entity-creators';\n\nconst {PageType} = RekordboxPdb;\n\n/**\n * Maps rekordbox pdb table types to orm table names.\n */\nexport const pdbTables: Record<number, Table> = {\n [PageType.TRACKS]: Table.Track,\n [PageType.ARTISTS]: Table.Artist,\n [PageType.GENRES]: Table.Genre,\n [PageType.ALBUMS]: Table.Album,\n [PageType.LABELS]: Table.Label,\n [PageType.COLORS]: Table.Color,\n [PageType.KEYS]: Table.Key,\n [PageType.ARTWORK]: Table.Artwork,\n [PageType.PLAYLIST_TREE]: Table.Playlist,\n [PageType.PLAYLIST_ENTRIES]: Table.PlaylistEntry,\n};\n\n/**\n * Maps rekordbox pdb table types to functions that create entity objects for\n * the passed pdb row.\n */\nexport const pdbEntityCreators: Record<number, (row: any) => any> = {\n [PageType.TRACKS]: createTrack,\n [PageType.ARTISTS]: makeIdNameHydrator<Artist>(),\n [PageType.GENRES]: makeIdNameHydrator<Genre>(),\n [PageType.ALBUMS]: makeIdNameHydrator<Album>(),\n [PageType.LABELS]: makeIdNameHydrator<Label>(),\n [PageType.COLORS]: makeIdNameHydrator<Color>(),\n [PageType.KEYS]: makeIdNameHydrator<Key>(),\n [PageType.ARTWORK]: createArtworkEntry,\n [PageType.PLAYLIST_TREE]: createPlaylist,\n [PageType.PLAYLIST_ENTRIES]: createPlaylistEntry,\n\n // TODO: Register PageType.HISTORY\n};\n","import {Table} from './orm';\n\nexport const generateSchema = () => `\n CREATE TABLE '${Table.Artist}' (\n 'id' integer not null primary key,\n 'name' varchar not null\n );\n CREATE TABLE '${Table.Album}' (\n 'id' integer not null primary key,\n 'name' varchar not null\n );\n CREATE TABLE '${Table.Genre}' (\n 'id' integer not null primary key,\n 'name' varchar not null\n );\n CREATE TABLE '${Table.Color}' (\n 'id' integer not null primary key,\n 'name' varchar not null\n );\n CREATE TABLE '${Table.Label}' (\n 'id' integer not null primary key,\n 'name' varchar not null\n );\n CREATE TABLE '${Table.Key}' (\n 'id' integer not null primary key,\n 'name' varchar not null\n );\n CREATE TABLE '${Table.Artwork}' (\n 'id' integer not null primary key,\n 'path' varchar not null\n );\n CREATE TABLE '${Table.Track}' (\n 'id' integer not null primary key,\n 'title' varchar not null,\n 'duration' integer not null,\n 'bitrate' integer not null,\n 'tempo' integer not null,\n 'rating' integer not null,\n 'comment' varchar not null,\n 'file_path' varchar not null,\n 'file_name' varchar not null,\n 'track_number' integer not null,\n 'disc_number' integer not null,\n 'sample_rate' integer not null,\n 'sample_depth' integer not null,\n 'play_count' integer not null,\n 'year' integer not null,\n 'mix_name' varchar not null,\n 'autoload_hotcues' integer not null,\n 'kuvo_public' integer not null,\n 'file_size' integer not null,\n 'analyze_path' varchar not null,\n 'release_date' varchar not null,\n 'analyze_date' datetime,\n 'date_added' datetime,\n 'beat_grid' text null,\n 'cue_and_loops' text null,\n 'waveform_hd' text null,\n 'artwork_id' integer null,\n 'artist_id' integer null,\n 'original_artist_id' integer null,\n 'remixer_id' integer null,\n 'composer_id' integer null,\n 'album_id' integer null,\n 'label_id' integer null,\n 'genre_id' integer null,\n 'color_id' integer null,\n 'key_id' integer null\n );\n CREATE TABLE '${Table.Playlist}' (\n 'id' integer not null primary key,\n 'is_folder' integer not null,\n 'name' varchar not null,\n 'parent_id' integer null\n );\n CREATE TABLE '${Table.PlaylistEntry}' (\n 'id' integer not null primary key,\n 'sort_index' integer not null,\n 'playlist_id' integer null,\n 'track_id' integer null\n );\n CREATE INDEX 'track_artwork_id_index' on '${Table.Track}' ('artwork_id');\n CREATE INDEX 'track_artist_id_index' on '${Table.Track}' ('artist_id');\n CREATE INDEX 'track_original_artist_id_index' on '${Table.Track}' ('original_artist_id');\n CREATE INDEX 'track_remixer_id_index' on '${Table.Track}' ('remixer_id');\n CREATE INDEX 'track_composer_id_index' on '${Table.Track}' ('composer_id');\n CREATE INDEX 'track_album_id_index' on '${Table.Track}' ('album_id');\n CREATE INDEX 'track_label_id_index' on '${Table.Track}' ('label_id');\n CREATE INDEX 'track_genre_id_index' on '${Table.Track}' ('genre_id');\n CREATE INDEX 'track_color_id_index' on '${Table.Track}' ('color_id');\n CREATE INDEX 'track_key_id_index' on '${Table.Track}' ('key_id');\n CREATE INDEX 'playlist_parent_id_index' on '${Table.Playlist}' ('parent_id');\n CREATE INDEX 'playlist_entry_playlist_id_index' on '${Table.PlaylistEntry}' ('playlist_id');\n CREATE INDEX 'playlist_entry_track_id_index' on '${Table.PlaylistEntry}' ('track_id');\n`;\n","import {CueAndLoop, HotcueButton} from 'src/types';\n\n/**\n * Create a CueAndLoop entry given common parameters\n */\nexport const makeCueLoopEntry = (\n isCue: boolean,\n isLoop: boolean,\n offset: number,\n length: number,\n button: false | HotcueButton\n): null | CueAndLoop =>\n button !== false\n ? isLoop\n ? {type: 'hot_loop', offset, length, button}\n : {type: 'hot_cue', offset, button}\n : isLoop\n ? {type: 'loop', offset, length}\n : isCue\n ? {type: 'cue_point', offset}\n : null;\n","/**\n * Logger interface for alphatheta-connect package.\n * Consumers can supply their own logger implementation.\n * If no logger is provided, a no-op logger is used (silent).\n */\nexport interface Logger {\n trace(msg: string, ...args: unknown[]): void;\n debug(msg: string, ...args: unknown[]): void;\n info(msg: string, ...args: unknown[]): void;\n warn(msg: string, ...args: unknown[]): void;\n error(msg: string, ...args: unknown[]): void;\n}\n\nexport const noopLogger: Logger = {\n trace() {},\n debug() {},\n info() {},\n warn() {},\n error() {},\n};\n","import {extractMetadata, isExtensionSupported} from 'metadata-connect';\nimport type {ExtractedMetadata, FileReader} from 'metadata-connect';\nimport {getFileInfo, NfsMediaSlot} from './nfs';\nimport {Device} from './types';\nimport {createNfsFileReader} from './artwork/reader';\n\nexport type {ExtractedMetadata} from 'metadata-connect';\n\n/**\n * Extract full metadata from an audio file using a FileReader.\n *\n * This is the low-level API that works with any FileReader implementation.\n * For extracting from a Pro DJ Link device, use extractMetadataFromDevice.\n *\n * @param reader - FileReader interface for reading file data\n * @returns Extracted metadata, or null if extraction fails\n */\nexport async function extractFullMetadata(\n reader: FileReader\n): Promise<ExtractedMetadata | null> {\n return extractMetadata(reader);\n}\n\n/**\n * Check if metadata extraction is supported for a file extension.\n *\n * @param extension - File extension (with or without leading dot)\n * @returns true if the extension is supported\n */\nexport function isMetadataExtractionSupported(extension: string): boolean {\n return isExtensionSupported(extension);\n}\n\n/**\n * Extract full metadata from an audio file on a Pro DJ Link device.\n *\n * This function reads only the necessary bytes from the file header,\n * avoiding the need to transfer entire audio files over the network.\n *\n * @param device - The Pro DJ Link device\n * @param slot - The media slot containing the file (USB, SD, etc.)\n * @param filePath - The file path on the device\n * @returns Extracted metadata, or null if extraction fails\n *\n * @example\n * ```typescript\n * // Extract metadata when a track is loaded\n * const metadata = await extractMetadataFromDevice(device, slot, filePath);\n * if (metadata) {\n * console.log(metadata.title, metadata.artist, metadata.bpm);\n * if (metadata.artwork) {\n * // Display artwork\n * }\n * }\n * ```\n */\nexport async function extractMetadataFromDevice(\n device: Device,\n slot: NfsMediaSlot,\n filePath: string\n): Promise<ExtractedMetadata | null> {\n // Get file extension and check if supported\n const extension = filePath.split('.').pop()?.toLowerCase() ?? '';\n if (!isExtensionSupported(extension)) {\n return null;\n }\n\n try {\n const fileInfo = await getFileInfo({device, slot, path: filePath});\n if (fileInfo.size === 0) {\n return null;\n }\n\n const reader = createNfsFileReader(device, slot, filePath, fileInfo.size);\n return extractMetadata(reader);\n } catch {\n // Return null on any error (file not found, network issues, etc.)\n return null;\n }\n}\n","import StrictEventEmitter from 'strict-event-emitter-types';\n\nimport {EventEmitter} from 'events';\n\nimport {CDJStatus, DeviceID, MixstatusMode} from 'src/types';\nimport {bpmToSeconds} from 'src/utils';\n\nimport {isPlaying, isStopping} from './utils';\n\nexport interface MixstatusConfig {\n /**\n * Selects the mixstatus reporting mode\n */\n mode: MixstatusMode;\n /**\n * Specifies the duration in seconds that no tracks must be on air. This can\n * be thought of as how long 'air silence' is reasonable in a set before a\n * separate one is considered have begun.\n *\n * @default 30 (half a minute)\n */\n timeBetweenSets: number;\n /**\n * Indicates if the status objects reported should have their on-air flag\n * read. Setting this to false will degrade the functionality of the processor\n * such that it will not consider the value of isOnAir and always assume CDJs\n * are live.\n *\n * @default true\n */\n useOnAirStatus: boolean;\n /**\n * Configures how many beats a track may not be live or playing for it to\n * still be considered active.\n *\n * @default 8 (two bars)\n */\n allowedInterruptBeats: number;\n /**\n * Configures how many beats the track must consecutively be playing for\n * (since the beat it was cued at) until the track is considered to be\n * active.\n *\n * Used for MixstatusMode.SmartTiming\n *\n * @default 128 (2 phrases)\n */\n beatsUntilReported: number;\n}\n\nconst defaultConfig: MixstatusConfig = {\n mode: MixstatusMode.SmartTiming,\n timeBetweenSets: 30,\n allowedInterruptBeats: 8,\n beatsUntilReported: 128,\n useOnAirStatus: true,\n};\n\n/**\n * The interface the mix status event emitter should follow\n */\ninterface MixstatusEvents {\n /**\n * Fired when a track is considered to be on-air and is being heard by the\n * audience\n */\n nowPlaying: (state: CDJStatus.State) => void;\n /**\n * Fired when a track has stopped and is completely offair\n */\n stopped: (opt: {deviceId: DeviceID}) => void;\n /**\n * Fired when a DJ set first starts\n */\n setStarted: () => void;\n /**\n * Fired when tracks have been stopped\n */\n setEnded: () => void;\n}\n\ntype Emitter = StrictEventEmitter<EventEmitter, MixstatusEvents>;\n\n/**\n * MixstatusProcessor is a configurable processor which when fed device state\n * will attempt to accurately determine events that happen within the DJ set.\n *\n * The following events are fired:\n *\n * - nowPlaying: The track is considered playing and on air to the audience.\n * - stopped: The track was stopped / paused / went off-air.\n *\n * Additionally the following non-track status are reported:\n *\n * - setStarted: The first track has begun playing.\n * - setEnded: The TimeBetweenSets has passed since any tracks were live.\n *\n * See Config for configuration options.\n *\n * Config options may be changed after the processor has been created and is\n * actively receiving state updates.\n */\nexport class MixstatusProcessor {\n /**\n * Used to fire track mix status events\n */\n #emitter: Emitter = new EventEmitter();\n /**\n * Records the most recent state of each player\n */\n #lastState = new Map<DeviceID, CDJStatus.State>();\n /**\n * Records when each device last started playing a track\n */\n #lastStartTime = new Map<DeviceID, number>();\n /**\n * Records when a device entered a 'may stop' state. If it's in the state for\n * long enough it will be reported as stopped.\n */\n #lastStoppedTimes = new Map<DeviceID, number>();\n /**\n * Records which players have been reported as 'live'\n */\n #livePlayers = new Set<DeviceID>();\n /**\n * Records the last trackId emitted as 'nowPlaying' for each device. Used to\n * suppress duplicate emissions when a deck is briefly cued/loaded and then\n * resumed on the same track (a common pattern for House/Techno DJs who\n * cue-juggle mid-track). The entry is replaced when a different trackId is\n * emitted on the same deck, so subsequent track loads still emit normally.\n */\n #lastEmittedTrackId = new Map<DeviceID, number>();\n /**\n * Incidates if we're currentiny in an active DJ set\n */\n #isSetActive = false;\n /**\n * When we are waiting for a set to end, use this to cancel the timer.\n */\n #cancelSetEnding?: () => void;\n /**\n * The configuration for this instance of the processor\n */\n #config: MixstatusConfig;\n\n constructor(config?: Partial<MixstatusConfig>) {\n this.#config = {...defaultConfig, ...config};\n }\n\n /**\n * Update the configuration\n */\n configure(config?: Partial<MixstatusConfig>) {\n this.#config = {...this.#config, ...config};\n }\n\n // Bind public event emitter interface\n on: Emitter['on'] = this.#emitter.addListener.bind(this.#emitter);\n off: Emitter['off'] = this.#emitter.removeListener.bind(this.#emitter);\n once: Emitter['once'] = this.#emitter.once.bind(this.#emitter);\n removeAllListeners = (event?: keyof MixstatusEvents) =>\n this.#emitter.removeAllListeners(event);\n\n /**\n * Helper to account for the useOnAirStatus config. If not configured\n * with this flag the state will always be determined as on air.\n */\n #onAir = (state: CDJStatus.State) =>\n this.#config.useOnAirStatus ? state.isOnAir : true;\n\n /**\n * Report a player as 'live'. Will not report the state if the player has\n * already previously been reported as live.\n */\n #promotePlayer = (state: CDJStatus.State) => {\n const {deviceId} = state;\n\n if (!this.#onAir(state) || !isPlaying(state)) {\n return;\n }\n\n if (this.#livePlayers.has(deviceId)) {\n return;\n }\n\n // Suppress duplicate nowPlaying for the same track on the same deck. This\n // can happen when a DJ cues mid-track and resumes (Cued/Loading/Ended are\n // all stoppingStates that drop the deck from livePlayers, so the next play\n // of the same trackId would otherwise re-emit). When a different track is\n // loaded, the trackId differs and the new emission proceeds normally.\n if (this.#lastEmittedTrackId.get(deviceId) === state.trackId) {\n return;\n }\n\n if (!this.#isSetActive) {\n this.#isSetActive = true;\n this.#emitter.emit('setStarted');\n }\n\n if (this.#cancelSetEnding) {\n this.#cancelSetEnding();\n }\n\n this.#livePlayers.add(deviceId);\n this.#lastEmittedTrackId.set(deviceId, state.trackId);\n\n this.#emitter.emit('nowPlaying', state);\n };\n\n /**\n * Locate the player that has been playing for the longest time and is onair,\n * and report that device as now playing.\n */\n #promoteNextPlayer = () => {\n const longestPlayingId = [...this.#lastStartTime.entries()]\n .map(([deviceId, startedAt]) => ({\n deviceId,\n startedAt,\n state: this.#lastState.get(deviceId),\n }))\n .filter(s => !this.#livePlayers.has(s.deviceId))\n .filter(s => s.state && isPlaying(s.state))\n .sort((a, b) => b.startedAt - a.startedAt)\n .pop()?.deviceId;\n\n // No other players currently playing?\n if (longestPlayingId === undefined) {\n this.#setMayStop();\n return;\n }\n\n // We know this value is available since we have a live player playing ID\n const nextPlayerState = this.#lastState.get(longestPlayingId)!;\n this.#promotePlayer(nextPlayerState);\n };\n\n #markPlayerStopped = ({deviceId}: CDJStatus.State) => {\n this.#lastStoppedTimes.delete(deviceId);\n this.#lastStartTime.delete(deviceId);\n this.#livePlayers.delete(deviceId);\n\n this.#promoteNextPlayer();\n this.#emitter.emit('stopped', {deviceId});\n };\n\n #setMayStop = async () => {\n // We handle the set ending interrupt as a async timeout as in the case with\n // a set ending, the DJ may immediately turn off the CDJs, stopping state\n // packets meaning we can't process on a heartbeat.\n if (!this.#isSetActive) {\n return;\n }\n\n // If any tracks are still playing the set has not ended\n if ([...this.#lastState.values()].some(s => isPlaying(s) && this.#onAir(s))) {\n return;\n }\n\n const shouldEnd = await new Promise<boolean>(resolve => {\n const endTimeout = setTimeout(\n () => resolve(true),\n this.#config.timeBetweenSets * 1000\n );\n this.#cancelSetEnding = () => {\n clearTimeout(endTimeout);\n resolve(false);\n };\n });\n\n this.#cancelSetEnding = undefined;\n\n if (!shouldEnd || !this.#isSetActive) {\n return;\n }\n\n this.#emitter.emit('setEnded');\n };\n\n /**\n * Called to indicate that we think this player may be the first one to start\n * playing. Will check if no other players are playing, if so it will report\n * the player as now playing.\n */\n #playerMayBeFirst = (state: CDJStatus.State) => {\n const otherPlayersPlaying = [...this.#lastState.values()]\n .filter(otherState => otherState.deviceId !== state.deviceId)\n .some(otherState => this.#onAir(otherState) && isPlaying(otherState));\n\n if (otherPlayersPlaying) {\n return;\n }\n\n this.#promotePlayer(state);\n };\n\n /**\n * Called when the player is in a state where it is no longer playing, but\n * may come back onair. Examples are slip pause, or 'cutting' a track on the\n * mixer taking it offair.\n */\n #playerMayStop = ({deviceId}: CDJStatus.State) => {\n this.#lastStoppedTimes.set(deviceId, Date.now());\n };\n\n /**\n * Called to indicate that a device has reported a different playState than\n * it had previously reported.\n */\n #handlePlaystateChange = (lastState: CDJStatus.State, state: CDJStatus.State) => {\n const {deviceId} = state;\n\n const isFollowingMaster =\n this.#config.mode === MixstatusMode.FollowsMaster && state.isMaster;\n\n const nowPlaying = isPlaying(state);\n const wasPlaying = isPlaying(lastState);\n\n const isNowPlaying = nowPlaying && !wasPlaying;\n\n // Was this device in a 'may stop' state and it has begun on-air playing\n // again?\n if (this.#lastStoppedTimes.has(deviceId) && nowPlaying && this.#onAir(state)) {\n this.#lastStoppedTimes.delete(deviceId);\n return;\n }\n\n if (isNowPlaying && isFollowingMaster) {\n this.#promotePlayer(state);\n }\n\n if (isNowPlaying) {\n this.#lastStartTime.set(deviceId, Date.now());\n this.#playerMayBeFirst(state);\n return;\n }\n\n if (wasPlaying && isStopping(state)) {\n this.#markPlayerStopped(state);\n return;\n }\n\n if (wasPlaying && !nowPlaying) {\n this.#playerMayStop(state);\n }\n };\n\n #handleOnairChange = (state: CDJStatus.State) => {\n const {deviceId} = state;\n\n // Player may have just been brought on with nothing else playing\n this.#playerMayBeFirst(state);\n\n if (!this.#livePlayers.has(deviceId)) {\n return;\n }\n\n if (!this.#onAir(state)) {\n this.#playerMayStop(state);\n return;\n }\n\n // Play has come back onair\n this.#lastStoppedTimes.delete(deviceId);\n };\n\n /**\n * Feed a CDJStatus state object to the mix state processor\n */\n handleState(state: CDJStatus.State) {\n const {deviceId, playState} = state;\n\n const lastState = this.#lastState.get(deviceId);\n this.#lastState.set(deviceId, state);\n\n // If this is the first time we've heard from this CDJ, and it is on air\n // and playing, report it immediately. This is different from reporting the\n // first playing track, as the CDJ will have already sent many states.\n if (lastState === undefined && this.#onAir(state) && isPlaying(state)) {\n this.#lastStartTime.set(deviceId, Date.now());\n this.#playerMayBeFirst(state);\n return;\n }\n\n // Play state has changed since this play last reported\n if (lastState && lastState.playState !== playState) {\n this.#handlePlaystateChange(lastState, state);\n }\n\n if (lastState && this.#onAir(lastState) !== this.#onAir(state)) {\n this.#handleOnairChange(state);\n }\n\n // Are we simply following master?\n if (\n this.#config.mode === MixstatusMode.FollowsMaster &&\n lastState?.isMaster === false &&\n state.isMaster\n ) {\n this.#promotePlayer(state);\n return;\n }\n\n // If a device has been playing for the required number of beats, we may be\n // able to report it as live\n const startedAt = this.#lastStartTime.get(deviceId);\n const requiredPlayTime =\n this.#config.beatsUntilReported *\n bpmToSeconds(state.trackBPM!, state.sliderPitch) *\n 1000;\n\n if (\n this.#config.mode === MixstatusMode.SmartTiming &&\n startedAt !== undefined &&\n requiredPlayTime <= Date.now() - startedAt\n ) {\n this.#promotePlayer(state);\n }\n\n // If a device has been in a 'potentially stopped' state for long enough,\n // we can mark the track as truly stopped.\n const stoppedAt = this.#lastStoppedTimes.get(deviceId);\n const requiredStopTime =\n this.#config.allowedInterruptBeats *\n bpmToSeconds(state.trackBPM!, state.sliderPitch) *\n 1000;\n\n if (stoppedAt !== undefined && requiredStopTime <= Date.now() - stoppedAt) {\n this.#markPlayerStopped(state);\n }\n }\n\n /**\n * Manually reports the track that has been playing the longest which has not\n * yet been reported as live.\n */\n triggerNextTrack() {\n this.#promoteNextPlayer();\n }\n}\n","import {CDJStatus} from 'src/types';\n\nconst playingStates = [CDJStatus.PlayState.Playing, CDJStatus.PlayState.Looping];\n\nconst stoppingStates = [\n CDJStatus.PlayState.Cued,\n CDJStatus.PlayState.Ended,\n CDJStatus.PlayState.Loading,\n];\n\n/**\n * Returns true if the the status reports a playing state.\n */\nexport const isPlaying = (s: CDJStatus.State) => playingStates.includes(s.playState);\n\n/**\n * Returns true if the status reports a stopping state.\n */\nexport const isStopping = (s: CDJStatus.State) => stoppingStates.includes(s.playState);\n","import {randomUUID} from 'crypto';\nimport dgram, {Socket} from 'dgram';\nimport {NetworkInterfaceInfoIPv4} from 'os';\n\nimport {ANNOUNCE_PORT, BEAT_PORT, DEFAULT_VCDJ_ID, STATUS_PORT} from 'src/constants';\nimport Control from 'src/control';\nimport Database from 'src/db';\nimport DeviceManager from 'src/devices';\nimport {type Logger, noopLogger} from 'src/logger';\nimport LocalDatabase from 'src/localdb';\nimport {DatabasePreference} from 'src/localdb/database-adapter';\nimport {MixstatusProcessor} from 'src/mixstatus';\nimport RemoteDatabase from 'src/remotedb';\nimport StatusEmitter from 'src/status';\nimport PositionEmitter from 'src/status/position';\nimport {Device, NetworkState} from 'src/types';\nimport {getMatchingInterface} from 'src/utils';\nimport * as Telemetry from 'src/utils/telemetry';\nimport {SpanStatus} from 'src/utils/telemetry';\nimport {udpBind, udpClose} from 'src/utils/udp';\nimport {Announcer, getVirtualCDJ} from 'src/virtualcdj';\n\nconst connectErrorHelp =\n 'Network must be configured. Try using `autoconfigFromPeers` or `configure`';\n\nexport interface NetworkConfig {\n /**\n * The network interface to listen for devices on the network over\n */\n iface: NetworkInterfaceInfoIPv4;\n /**\n * The ID of the virtual CDJ to pose as.\n *\n * IMPORTANT:\n *\n * You will likely want to configure this to be > 6, however it is important to\n * note, if you choose an ID within the 1-6 range, no other CDJ may exist on the\n * network using that ID. you CAN NOT have 6 CDJs if you're using one of their slots.\n *\n * However, should you want to make metadata queries to a unanalized media\n * device connected to the CDJ, or metadata queries for CD disc data, you MUST\n * use a ID within the 1-6 range, as the CDJs will not respond to metadata\n * requests outside of the range of 1-6\n *\n * Note that rekordbox analyzed media connected to the CDJ is accessed out of\n * band of the networks remote database protocol, and is not limited by this\n * restriction.\n */\n vcdjId: number;\n /**\n * The name to announce the virtual CDJ as on the network.\n *\n * This name will appear in device lists on other Pro DJ Link equipment.\n *\n * @default 'ProLink-Connect'\n */\n vcdjName?: string;\n /**\n * Enable full startup protocol for robust device negotiation.\n * When enabled, the virtual CDJ will go through the complete startup\n * sequence (stages 0x0a → 0x00 → 0x02 → 0x04 → 0x06) before regular\n * keep-alive announcements.\n *\n * This is recommended for production setups with CDJ-3000 and DJM-V10\n * hardware to ensure proper device discovery and network stability.\n */\n fullStartup?: boolean;\n /**\n * Send announcer packets to Pioneer Stagehand devices.\n *\n * Stagehand is excluded from announcer packets by default because it has\n * been observed to crash when it receives them. Enabling this also turns on\n * the cold-start subnet broadcast, which would otherwise reach Stagehand the\n * same way.\n *\n * Enable this only for diagnostic work (e.g. reproducing that crash), never\n * in production.\n *\n * @default false\n */\n announceToStagehand?: boolean;\n /**\n * Database format preference for loading rekordbox databases.\n *\n * - 'auto': Try OneLibrary first (rekordbox 7.x+), fall back to PDB (rekordbox 6.x)\n * - 'oneLibrary': Only use OneLibrary format (exportLibrary.db)\n * - 'pdb': Only use PDB format (export.pdb)\n *\n * @default 'auto'\n */\n databasePreference?: DatabasePreference;\n /**\n * Logger instance for diagnostic output.\n * If not provided, logging is silently discarded.\n */\n logger?: Logger;\n}\n\ninterface ConnectionService {\n announcer: Announcer;\n control: Control;\n remotedb: RemoteDatabase;\n localdb: LocalDatabase;\n database: Database;\n}\n\ninterface ConstructOpts {\n config?: NetworkConfig;\n announceSocket: Socket;\n beatSocket: Socket;\n statusSocket: Socket;\n deviceManager: DeviceManager;\n statusEmitter: StatusEmitter;\n positionEmitter: PositionEmitter;\n}\n\n/**\n * Services that are not accessible until connected\n */\ntype ConnectedServices =\n | 'statusEmitter'\n | 'positionEmitter'\n | 'control'\n | 'db'\n | 'localdb'\n | 'remotedb'\n | 'mixstatus';\n\nexport type ConnectedProlinkNetwork = ProlinkNetwork & {\n [P in ConnectedServices]: NonNullable<ProlinkNetwork[P]>;\n} & {\n state: NetworkState.Connected;\n isConfigured: true;\n};\n\n/**\n * Brings the Prolink network online.\n *\n * This is the primary entrypoint for connecting to the prolink network.\n */\nexport async function bringOnline(config?: NetworkConfig) {\n Telemetry.setTag('connectionId', randomUUID());\n const tx = Telemetry.startTransaction({name: 'bringOnline'});\n\n // Socket used to listen for devices on the network\n const announceSocket = dgram.createSocket({type: 'udp4', reuseAddr: true});\n\n // Socket used to listen for beat timing information\n const beatSocket = dgram.createSocket({type: 'udp4', reuseAddr: true});\n\n // Socket used to listen for status packets\n const statusSocket = dgram.createSocket({type: 'udp4', reuseAddr: true});\n\n try {\n await udpBind(announceSocket, ANNOUNCE_PORT, '0.0.0.0');\n await udpBind(beatSocket, BEAT_PORT, '0.0.0.0');\n await udpBind(statusSocket, STATUS_PORT, '0.0.0.0');\n\n // Enable broadcast so the announcer can reach the whole subnet before any\n // devices have been discovered.\n announceSocket.setBroadcast(true);\n } catch (err) {\n Telemetry.captureException(err);\n tx.setStatus(SpanStatus.Unavailable);\n tx.finish();\n\n throw err;\n }\n\n const deviceManager = new DeviceManager(announceSocket);\n const statusEmitter = new StatusEmitter(statusSocket);\n const positionEmitter = new PositionEmitter(beatSocket);\n\n tx.finish();\n\n const network = new ProlinkNetwork({\n config,\n announceSocket,\n beatSocket,\n statusSocket,\n deviceManager,\n statusEmitter,\n positionEmitter,\n });\n\n return network;\n}\n\nexport class ProlinkNetwork {\n #state: NetworkState = NetworkState.Online;\n\n #announceSocket: Socket;\n #beatSocket: Socket;\n #statusSocket: Socket;\n #deviceManager: DeviceManager;\n #statusEmitter: StatusEmitter;\n #positionEmitter: PositionEmitter;\n #logger: Logger;\n\n #config: null | NetworkConfig;\n #connection: null | ConnectionService;\n #mixstatus: null | MixstatusProcessor;\n\n /**\n * @internal\n */\n constructor({\n config,\n announceSocket,\n beatSocket,\n statusSocket,\n deviceManager,\n statusEmitter,\n positionEmitter,\n }: ConstructOpts) {\n this.#config = config ?? null;\n this.#logger = config?.logger ?? noopLogger;\n\n this.#announceSocket = announceSocket;\n this.#beatSocket = beatSocket;\n this.#statusSocket = statusSocket;\n this.#deviceManager = deviceManager;\n this.#statusEmitter = statusEmitter;\n this.#positionEmitter = positionEmitter;\n\n this.#connection = null;\n this.#mixstatus = null;\n\n // We always start online when constructing the network\n this.#state = NetworkState.Online;\n }\n\n /**\n * Configure / reconfigure the network with an explicit configuration.\n *\n * You may need to disconnect and re-connect the network after making a\n * networking configuration change.\n */\n configure(config: Partial<NetworkConfig>) {\n this.#config = {...this.#config, ...config} as NetworkConfig;\n if (config.logger !== undefined) {\n this.#logger = config.logger;\n }\n }\n\n /**\n * Wait for another device to show up on the network to determine which network\n * interface to listen on.\n *\n * Defaults the Virtual CDJ ID to 7.\n */\n async autoconfigFromPeers() {\n const tx = Telemetry.startTransaction({name: 'autoConfigure'});\n // wait for first device to appear on the network\n const firstDevice = await new Promise<Device>(resolve =>\n this.#deviceManager.once('connected', resolve)\n );\n const iface = getMatchingInterface(firstDevice.ip);\n\n // Log addr and iface addr / mask for cases where it may have matched the\n // wrong interface\n tx.setTag('deviceName', firstDevice.name);\n tx.setData('deviceAddr', firstDevice.ip.address);\n tx.setData('ifaceAddr', iface?.address);\n\n if (iface === null) {\n tx.setStatus(SpanStatus.InternalError);\n tx.setTag('noIfaceFound', 'yes');\n tx.finish();\n\n throw new Error('Unable to determine network interface');\n }\n\n this.#config = {...this.#config, vcdjId: DEFAULT_VCDJ_ID, iface};\n tx.finish();\n }\n\n /**\n * Connect to the network.\n *\n * The network must first have been configured (either with autoconfigFromPeers\n * or manual configuration). This will then initialize all the network services.\n */\n connect() {\n if (this.#config === null) {\n throw new Error(connectErrorHelp);\n }\n\n const tx = Telemetry.startTransaction({name: 'connect'});\n\n // Create VCDJ for the interface's broadcast address\n const vcdj = getVirtualCDJ(\n this.#config.iface,\n this.#config.vcdjId,\n this.#config.vcdjName\n );\n\n // Update device manager to filter out our VCDJ name\n if (this.#config.vcdjName !== undefined) {\n this.#deviceManager.reconfigure({vcdjName: this.#config.vcdjName});\n }\n\n // Start announcing\n const announcer = new Announcer(\n vcdj,\n this.#announceSocket,\n this.deviceManager,\n this.#config.iface,\n this.#config.fullStartup ?? false,\n this.#config.announceToStagehand ?? false,\n this.#logger\n );\n announcer.start();\n\n // Create remote and local databases\n const remotedb = new RemoteDatabase(this.#deviceManager, vcdj);\n const localdb = new LocalDatabase(\n vcdj,\n this.#deviceManager,\n this.#statusEmitter,\n this.#config.databasePreference ?? 'auto'\n );\n\n // Create unified database\n const database = new Database(localdb, remotedb, this.#deviceManager);\n\n // Create controller service\n const control = new Control(this.#beatSocket, vcdj);\n\n this.#state = NetworkState.Connected;\n this.#connection = {announcer, control, remotedb, localdb, database};\n\n tx.finish();\n }\n\n /**\n * Disconnect from the network\n */\n disconnect() {\n if (this.#config === null) {\n throw new Error(connectErrorHelp);\n }\n\n // Stop announcing ourself\n this.#connection?.announcer.stop();\n\n // Disconnect devices from the remote and local databases\n for (const device of this.deviceManager.devices.values()) {\n this.remotedb?.disconnectFromDevice(device);\n this.localdb?.disconnectForDevice(device);\n }\n\n return this.close;\n }\n\n /**\n * Close UDP sockets.\n */\n close() {\n return Promise.all([\n udpClose(this.#announceSocket),\n udpClose(this.#statusSocket),\n udpClose(this.#beatSocket),\n ]);\n }\n\n /**\n * Get the current NetworkState of the network.\n *\n * When the network is Online you may use the deviceManager to list and react to\n * devices on the nettwork\n *\n * Once the network is Connected you may use the statusEmitter to listen for\n * player status events, query the media databases of devices using the db\n * service (or specifically query the localdb or remotedb).\n */\n get state() {\n return this.#state;\n }\n\n /**\n * Check if the network has been configured. You cannot connect to the network\n * until it has been configured.\n */\n get isConfigured() {\n return this.#config !== null;\n }\n\n /**\n * Typescript discriminate helper. Refines the type of the network to one\n * that reflects the connected status. Useful to avoid having to gaurd the\n * service getters from nulls.\n */\n isConnected(): this is ConnectedProlinkNetwork {\n return this.#state === NetworkState.Connected;\n }\n\n /**\n * Get the {@link DeviceManager} service. This service is used to monitor and\n * react to devices connecting and disconnecting from the prolink network.\n */\n get deviceManager() {\n return this.#deviceManager;\n }\n\n /**\n * Get the {@link StatusEmitter} service. This service is used to monitor\n * status updates on each CDJ.\n */\n get statusEmitter() {\n // Even though the status emitter service does not need to wait for the\n // network to be Connected, it does not make sense to use it unless it is. So\n // we artificially return null if we are not connected\n return this.#state === NetworkState.Connected ? this.#statusEmitter : null;\n }\n\n /**\n * Get the {@link PositionEmitter} service. This service provides events with\n * absolute playhead position updates from CDJ-3000+ devices.\n *\n * Position packets are sent approximately every 30ms while a track is loaded,\n * providing precise position tracking independent of beat grids. This enables\n * accurate timecode/video sync even during scratching, reverse play, and loops.\n */\n get positionEmitter() {\n return this.#state === NetworkState.Connected ? this.#positionEmitter : null;\n }\n\n /**\n * Get the {@link Control} service. This service can be used to control the\n * Playstate of CDJs on the network.\n */\n get control() {\n return this.#connection?.control ?? null;\n }\n\n /**\n * Get the {@link Database} service. This service is used to retrieve\n * metadata and listings from devices on the network, automatically choosing the\n * best strategy to access the data.\n */\n get db() {\n return this.#connection?.database ?? null;\n }\n\n /**\n * Get the {@link LocalDatabase} service. This service is used to query and sync\n * metadata that is downloaded directly from the rekordbox database present\n * on media connected to the CDJs.\n */\n get localdb() {\n return this.#connection?.localdb ?? null;\n }\n\n /**\n * Get the {@link RemoteDatabase} service. This service is used to query\n * metadata directly from the database service running on Rekordbox and the CDJs\n * themselves.\n *\n * NOTE: To use this service to access the CDJ remote database service, the\n * Virtual CDJ must report itself as an ID between 1 and 6. This means\n * there cannot be four physical CDJs on the network to access any CDJs\n * remote database.\n */\n get remotedb() {\n return this.#connection?.remotedb ?? null;\n }\n\n /**\n * Returns a promise that resolves when the full startup protocol completes.\n * Resolves immediately if fullStartup is disabled or not connected.\n */\n get startupReady(): Promise<void> {\n return this.#connection?.announcer.ready ?? Promise.resolve();\n }\n\n /**\n * Get (and initialize) the {@link MixstatusProcessor} service. This service can\n * be used to monitor the 'status' of devices on the network as a whole.\n */\n get mixstatus() {\n if (this.#connection === null) {\n return null;\n }\n\n // Delay initialization of the mixstatus processor so that we don't consume\n // status events unless we actually want to.\n if (this.#mixstatus === null) {\n this.#mixstatus = new MixstatusProcessor();\n this.#statusEmitter.on('status', s => this.#mixstatus?.handleState(s));\n }\n\n return this.#mixstatus;\n }\n}\n","import {Device, DeviceID, DeviceType, MediaSlot} from 'src/types';\nimport {getSlotName} from 'src/utils';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\nimport * as Telemetry from 'src/utils/telemetry';\n\nimport {\n fetchFile as fetchFileCall,\n fetchFileRange as fetchFileRangeInternal,\n FileInfo,\n getExports,\n lookupPath,\n makeProgramClient,\n mountFilesystem,\n REKORDBOX_PORTMAP_PORT,\n STANDARD_PORTMAP_PORT,\n} from './programs';\n\nexport type {FileInfo} from './programs';\nimport {RetryConfig, RpcConnection, RpcProgram} from './rpc';\nimport {mount, nfs} from './xdr';\n\nexport interface FetchProgress {\n read: number;\n total: number;\n}\n\ninterface ClientSet {\n conn: RpcConnection;\n mountClient: RpcProgram;\n nfsClient: RpcProgram;\n}\n\n/**\n * The slot <-> mount name mapping is well known.\n */\nconst slotMountMapping = {\n [MediaSlot.USB]: '/C/',\n [MediaSlot.SD]: '/B/',\n} as const;\n\n/**\n * Media slots that support NFS access.\n */\nexport type NfsMediaSlot = MediaSlot.USB | MediaSlot.SD | MediaSlot.RB;\n\n/**\n * Parse a Windows absolute path (e.g. `C:\\Users\\chris\\Music\\track.mp3`)\n * into the NFS mount path and relative file path.\n *\n * @internal Exported for testing\n */\nexport function parseWindowsPath(\n filePath: string\n): {mountPath: string; nfsPath: string} | null {\n const match = filePath.match(/^([A-Za-z]):[/\\\\](.*)$/);\n if (!match) {\n return null;\n }\n return {\n mountPath: `/${match[1].toUpperCase()}/`,\n nfsPath: match[2].replace(/\\\\/g, '/'),\n };\n}\n\n/**\n * Resolve the NFS mount path and file path for a given slot.\n *\n * For USB/SD slots, the mount path is well-known (/C/ and /B/).\n * For the RB slot, the mount path is extracted from the file path returned\n * by remotedb:\n * - Windows: `C:\\Users\\chris\\Music\\track.mp3` → mount `/C/`, path `Users/chris/Music/track.mp3`\n * - macOS: `/Users/chris/Music/track.mp3` → mount `/`, path `Users/chris/Music/track.mp3`\n *\n * @internal Exported for testing\n */\nexport function resolveNfsPath(\n slot: NfsMediaSlot,\n filePath: string\n): {mountPath: string; nfsPath: string} {\n if (slot === MediaSlot.RB) {\n // Windows: C:\\Users\\chris\\Music\\track.mp3 → mount /C/, path Users/...\n const parsed = parseWindowsPath(filePath);\n if (parsed) {\n return parsed;\n }\n\n // macOS: /Users/chris/Music/track.mp3 → mount /, path Users/...\n if (filePath.startsWith('/')) {\n return {\n mountPath: '/',\n nfsPath: filePath.slice(1),\n };\n }\n }\n return {\n mountPath: slotMountMapping[slot as keyof typeof slotMountMapping],\n nfsPath: filePath,\n };\n}\n\n/**\n * The module-level retry configuration for newly created RpcConnections.\n */\nlet retryConfig: RetryConfig = {};\n\n/**\n * This module maintains a singleton cached list of player addresses -> active\n * connections. It is not guaranteed that the connections in the cache will\n * still be connected.\n */\nconst clientsCache = new Map<string, ClientSet>();\n\n/**\n * Get the portmapper port for the given device. Rekordbox software uses a\n * non-standard port (50111) while CDJs and other hardware use the standard\n * port (111).\n *\n * @internal Exported for testing\n */\nexport function getPortmapPort(device: Device): number {\n return device.type === DeviceType.Rekordbox\n ? REKORDBOX_PORTMAP_PORT\n : STANDARD_PORTMAP_PORT;\n}\n\n/**\n * Given a device address running a nfs and mountd RPC server, provide\n * RpcProgram clients that may be used to call these services.\n *\n * NOTE: This function will cache the clients for the address, recreating the\n * connections if the cached clients have disconnected.\n */\nasync function getClients(device: Device) {\n const {address} = device.ip;\n const cachedSet = clientsCache.get(address);\n\n if (cachedSet !== undefined && cachedSet.conn.connected) {\n return cachedSet;\n }\n\n // Cached socket is no longer connected. Remove and reconnect\n if (cachedSet !== undefined) {\n clientsCache.delete(address);\n }\n\n const conn = new RpcConnection(address, retryConfig);\n const portmapPort = getPortmapPort(device);\n\n const mountClient = await makeProgramClient(\n conn,\n {\n id: mount.Program,\n version: mount.Version,\n },\n portmapPort\n );\n\n const nfsClient = await makeProgramClient(\n conn,\n {\n id: nfs.Program,\n version: nfs.Version,\n },\n portmapPort\n );\n\n const set = {conn, mountClient, nfsClient};\n clientsCache.set(address, set);\n\n return set;\n}\n\ninterface GetRootHandleOptions {\n device: Device;\n mountPath: string;\n mountClient: RpcProgram;\n span?: Span;\n}\n\n/**\n * This module maintains a singleton cached list of (device address + mount path) -> file\n * handles. The file handles may become stale in this list should the devices\n * connected to the players slot change.\n */\nconst rootHandleCache = new Map<string, Map<string, Buffer>>();\n\n/**\n * Locate the root filehandle of the given device mount path.\n *\n * NOTE: This function will cache the root handle for the device + mount path. Should\n * the device have changed the slot will not longer be valid (TODO,\n * verify this). It is up to the caller to clear the cache and get the\n * new root handle in that case.\n */\nasync function getRootHandle({\n device,\n mountPath,\n mountClient,\n span,\n}: GetRootHandleOptions) {\n const tx = span?.startChild({op: 'getRootHandle'});\n\n const {address} = device.ip;\n\n const deviceMountCache = rootHandleCache.get(address) ?? new Map<string, Buffer>();\n const cachedRootHandle = deviceMountCache.get(mountPath);\n\n if (cachedRootHandle !== undefined) {\n return cachedRootHandle;\n }\n\n const exports = await getExports(mountClient, tx);\n const targetExport = exports.find(e => e.filesystem === mountPath);\n\n if (targetExport === undefined) {\n return null;\n }\n\n const rootHandle = await mountFilesystem(mountClient, targetExport, tx);\n\n deviceMountCache.set(mountPath, rootHandle);\n rootHandleCache.set(address, deviceMountCache);\n\n tx?.finish();\n\n return rootHandle;\n}\n\ninterface FetchFileOptions {\n device: Device;\n slot: NfsMediaSlot;\n path: string;\n onProgress?: Parameters<typeof fetchFileCall>[2];\n span?: Span;\n chunkSize?: number;\n}\n\nconst badRoothandleError = (slot: MediaSlot, deviceId: DeviceID) =>\n new Error(`The slot (${slot}) is not exported on Device ${deviceId}`);\n\ninterface FetchFileRangeOptions {\n device: Device;\n slot: NfsMediaSlot;\n path: string;\n offset: number;\n length: number;\n span?: Span;\n}\n\n/**\n * Fetch a range of bytes from a file on a device's NFS server.\n * Optimized for partial reads (e.g., reading file headers for metadata extraction).\n */\nexport async function fetchFileRange({\n device,\n slot,\n path,\n offset,\n length,\n span,\n}: FetchFileRangeOptions): Promise<Buffer> {\n const tx = span\n ? span.startChild({op: 'fetchFileRange'})\n : Telemetry.startTransaction({name: 'fetchFileRange'});\n\n const {mountPath, nfsPath} = resolveNfsPath(slot, path);\n const {mountClient, nfsClient} = await getClients(device);\n const rootHandle = await getRootHandle({device, mountPath, mountClient, span: tx});\n\n if (rootHandle === null) {\n throw badRoothandleError(slot, device.id);\n }\n\n let fileInfo: FileInfo | null = null;\n\n try {\n fileInfo = await lookupPath(nfsClient, rootHandle, nfsPath, tx);\n } catch {\n rootHandleCache.delete(device.ip.address);\n const newRootHandle = await getRootHandle({device, mountPath, mountClient, span: tx});\n\n if (newRootHandle === null) {\n throw badRoothandleError(slot, device.id);\n }\n\n fileInfo = await lookupPath(nfsClient, newRootHandle, nfsPath, tx);\n }\n\n const actualOffset = Math.min(offset, fileInfo.size);\n const actualLength = Math.min(length, fileInfo.size - actualOffset);\n\n if (actualLength <= 0) {\n tx.finish();\n return Buffer.alloc(0);\n }\n\n const data = await fetchFileRangeInternal(\n nfsClient,\n fileInfo,\n actualOffset,\n actualLength,\n tx\n );\n\n tx.setData('path', path);\n tx.setData('slot', getSlotName(slot));\n tx.setData('offset', actualOffset);\n tx.setData('length', actualLength);\n tx.setData('fileSize', fileInfo.size);\n tx.finish();\n\n return data;\n}\n\n/**\n * Get file info (size, handle) without fetching the file content.\n */\nexport async function getFileInfo({\n device,\n slot,\n path,\n span,\n}: Omit<FetchFileOptions, 'onProgress' | 'chunkSize'>): Promise<FileInfo> {\n const tx = span\n ? span.startChild({op: 'getFileInfo'})\n : Telemetry.startTransaction({name: 'getFileInfo'});\n\n const {mountPath, nfsPath} = resolveNfsPath(slot, path);\n const {mountClient, nfsClient} = await getClients(device);\n const rootHandle = await getRootHandle({device, mountPath, mountClient, span: tx});\n\n if (rootHandle === null) {\n throw badRoothandleError(slot, device.id);\n }\n\n let fileInfo: FileInfo;\n\n try {\n fileInfo = await lookupPath(nfsClient, rootHandle, nfsPath, tx);\n } catch {\n rootHandleCache.delete(device.ip.address);\n const newRootHandle = await getRootHandle({device, mountPath, mountClient, span: tx});\n\n if (newRootHandle === null) {\n throw badRoothandleError(slot, device.id);\n }\n\n fileInfo = await lookupPath(nfsClient, newRootHandle, nfsPath, tx);\n }\n\n tx.setData('path', path);\n tx.setData('slot', getSlotName(slot));\n tx.setData('size', fileInfo.size);\n tx.finish();\n\n return fileInfo;\n}\n\n/**\n * Fetch a file from a devices NFS server.\n *\n * NOTE: The connection and root filehandle (The 'mounted' NFS export on the\n * device) is cached to improve subsequent fetching performance. It's\n * important that when the device disconnects you call the {@link\n * resetDeviceCache} function.\n */\nexport async function fetchFile({\n device,\n slot,\n path,\n onProgress,\n span,\n chunkSize,\n}: FetchFileOptions) {\n const tx = span\n ? span.startChild({op: 'fetchFile'})\n : Telemetry.startTransaction({name: 'fetchFile'});\n\n const {mountPath, nfsPath} = resolveNfsPath(slot, path);\n const {mountClient, nfsClient} = await getClients(device);\n const rootHandle = await getRootHandle({device, mountPath, mountClient, span: tx});\n\n if (rootHandle === null) {\n throw badRoothandleError(slot, device.id);\n }\n\n // It's possible that our roothandle is no longer valid, if we fail to lookup\n // a path lets first try and clear our roothandle cache\n let fileInfo: FileInfo | null = null;\n\n try {\n fileInfo = await lookupPath(nfsClient, rootHandle, nfsPath, tx);\n } catch {\n rootHandleCache.delete(device.ip.address);\n const rootHandle = await getRootHandle({device, mountPath, mountClient, span: tx});\n\n if (rootHandle === null) {\n throw badRoothandleError(slot, device.id);\n }\n\n // Desperately try once more to lookup the file\n fileInfo = await lookupPath(nfsClient, rootHandle, nfsPath, tx);\n }\n\n const file = await fetchFileCall(nfsClient, fileInfo, onProgress, tx, chunkSize);\n\n tx.setData('path', path);\n tx.setData('slot', getSlotName(slot));\n tx.setData('size', fileInfo.size);\n tx.finish();\n\n return file;\n}\n\n/**\n * Clear the cached NFS connection and root filehandle for the given device\n */\nexport function resetDeviceCache(device: Device) {\n clientsCache.delete(device.ip.address);\n rootHandleCache.delete(device.ip.address);\n}\n\n/**\n * Configure the retry strategy for making NFS calls using this module\n */\nexport function configureRetryStrategy(config: RetryConfig) {\n retryConfig = config;\n\n for (const client of clientsCache.values()) {\n client.conn.retryConfig = config;\n }\n}\n","import {TelemetrySpan as Span} from 'src/utils/telemetry';\n\nimport {RpcConnection, RpcProgram} from './rpc';\nimport {flattenLinkedList} from './utils';\nimport {mount, nfs, portmap} from './xdr';\nimport {FetchProgress} from '.';\n\n/**\n * How many bytes of a file should we read at once.\n */\nconst READ_SIZE = 8192;\n\ninterface Program {\n id: number;\n version: number;\n}\n\n/**\n * Standard portmapper port used by CDJs and other hardware.\n */\nexport const STANDARD_PORTMAP_PORT = 111;\n\n/**\n * Non-standard portmapper port used by rekordbox software.\n * Rekordbox registers its RPC services on this port instead of 111.\n */\nexport const REKORDBOX_PORTMAP_PORT = 50111;\n\n/**\n * Queries for the listening port of a RPC program\n */\nexport async function makeProgramClient(\n conn: RpcConnection,\n program: Program,\n portmapPort: number = STANDARD_PORTMAP_PORT\n) {\n const getPortData = new portmap.GetPort({\n program: program.id,\n version: program.version,\n protocol: 17, // UDP protocol\n port: 0,\n });\n\n const data = await conn.call({\n port: portmapPort,\n program: portmap.Program,\n version: portmap.Version,\n procedure: portmap.Procedure.getPort().value,\n data: getPortData.toXDR(),\n });\n\n const port = data.readInt32BE();\n\n return new RpcProgram(conn, program.id, program.version, port);\n}\n\n/**\n * Export represents a NFS export on a remote system\n */\ninterface Export {\n /**\n * The name of the exported filesystem\n */\n filesystem: string;\n /**\n * The groups allowed to mount this filesystem\n */\n groups: string[];\n}\n\n/**\n * Attributes a remote file\n */\nexport interface FileInfo {\n handle: Buffer;\n name: string;\n size: number;\n type: 'null' | 'regular' | 'directory' | 'block' | 'char' | 'link';\n}\n\n/**\n * Request a list of export entries.\n */\nexport async function getExports(conn: RpcProgram, span?: Span) {\n const tx = span?.startChild({op: 'getExports'});\n\n const data = await conn.call({\n procedure: mount.Procedure.export().value,\n data: Buffer.alloc(0),\n });\n\n const entry = mount.ExportListResponse.fromXDR(data).next();\n if (entry === undefined) {\n return [];\n }\n\n const exports = flattenLinkedList(entry).map((entry: any) => ({\n filesystem: entry.filesystem(),\n groups: flattenLinkedList(entry.groups()).map((g: any) => g.name().toString()),\n }));\n\n tx?.finish();\n\n return exports as Export[];\n}\n\n/**\n * Mount the specified export, returning the file handle.\n */\nexport async function mountFilesystem(\n conn: RpcProgram,\n {filesystem}: Export,\n span?: Span\n) {\n const tx = span?.startChild({op: 'mountFilesystem', data: {filesystem}});\n\n const resp = await conn.call({\n procedure: mount.Procedure.mount().value,\n data: new mount.MountRequest({filesystem}).toXDR(),\n });\n\n const fileHandleResp = mount.FHStatus.fromXDR(resp);\n if (fileHandleResp.arm() !== 'success') {\n throw new Error('Failed to mount filesystem');\n }\n\n tx?.finish();\n\n return fileHandleResp.success() as Buffer;\n}\n\n/**\n * Lookup a file within the directory of the provided file handle, returning\n * the FileInfo object if the file can be located.\n */\nexport async function lookupFile(\n conn: RpcProgram,\n handle: Buffer,\n filename: string,\n span?: Span\n) {\n const tx = span?.startChild({op: 'lookupFile', description: filename});\n\n const resp = await conn.call({\n procedure: nfs.Procedure.lookup().value,\n data: new nfs.DirectoryOpArgs({handle, filename}).toXDR(),\n });\n\n const fileResp = nfs.DirectoryOpResponse.fromXDR(resp);\n if (fileResp.arm() !== 'success') {\n throw new Error(`Failed file lookup of ${filename}`);\n }\n\n const fileHandle = fileResp.success().handle();\n const attributes = fileResp.success().attributes();\n\n const info: FileInfo = {\n name: filename,\n handle: fileHandle,\n size: attributes.size(),\n type: attributes.type().name,\n };\n\n tx?.finish();\n\n return info;\n}\n\n/**\n * Lookup the absolute path to a file, given the root file handle and path,\n */\nexport async function lookupPath(\n conn: RpcProgram,\n rootHandle: Buffer,\n filepath: string,\n span?: Span\n) {\n const tx = span?.startChild({op: 'lookupPath', description: filepath});\n\n // There are times when the path includes a leading slash, sanitize that\n const pathParts = filepath.replace(/^\\//, '').split('/');\n\n let handle: Buffer = rootHandle;\n let info: FileInfo;\n\n while (pathParts.length !== 0) {\n const filename = pathParts.shift()!;\n const fileInfo = await lookupFile(conn, handle, filename, tx);\n\n info = fileInfo;\n handle = info.handle;\n }\n\n tx?.finish();\n\n // We can guarantee this will be set since we will have failed to lookup the\n // file above\n return info!;\n}\n\n/**\n * Fetch the specified file the remote NFS server. This will read the entire\n * file into memory.\n */\nexport async function fetchFile(\n conn: RpcProgram,\n file: FileInfo,\n onProgress?: (progress: FetchProgress) => void,\n span?: Span,\n readSize?: number\n) {\n readSize = readSize || READ_SIZE;\n if (readSize > 8192) {\n throw new Error(`Maximum read size for NFS is 8192. You specified: ${readSize}`);\n }\n const {handle, name, size} = file;\n const data = Buffer.alloc(size);\n\n const tx = span?.startChild({\n op: 'download',\n description: name,\n data: {size},\n });\n\n let bytesRead = 0;\n\n while (bytesRead < size) {\n const readArgs = new nfs.ReadArgs({\n handle,\n offset: bytesRead,\n count: readSize,\n totalCount: 0,\n });\n\n const resp = await conn.call({\n procedure: nfs.Procedure.read().value,\n data: readArgs.toXDR(),\n });\n\n const dataResp = nfs.ReadResponse.fromXDR(resp);\n if (dataResp.arm() !== 'success') {\n throw new Error(`Failed to read file at offset ${bytesRead} / ${size}`);\n }\n\n const buffer = dataResp.success().data();\n\n data.set(buffer, bytesRead);\n bytesRead += buffer.length;\n\n onProgress?.({read: bytesRead, total: size});\n }\n\n tx?.finish();\n\n return data;\n}\n\n/**\n * Fetch a range of bytes from a file on the remote NFS server.\n * Unlike fetchFile, this only reads the specified range.\n */\nexport async function fetchFileRange(\n conn: RpcProgram,\n file: FileInfo,\n offset: number,\n length: number,\n span?: Span\n): Promise<Buffer> {\n const {handle, name} = file;\n const data = Buffer.alloc(length);\n\n const tx = span?.startChild({\n op: 'downloadRange',\n description: name,\n data: {offset, length},\n });\n\n let bytesRead = 0;\n\n while (bytesRead < length) {\n const chunkSize = Math.min(READ_SIZE, length - bytesRead);\n const readArgs = new nfs.ReadArgs({\n handle,\n offset: offset + bytesRead,\n count: chunkSize,\n totalCount: 0,\n });\n\n const resp = await conn.call({\n procedure: nfs.Procedure.read().value,\n data: readArgs.toXDR(),\n });\n\n const dataResp = nfs.ReadResponse.fromXDR(resp);\n if (dataResp.arm() !== 'success') {\n throw new Error(`Failed to read file at offset ${offset + bytesRead}`);\n }\n\n const buffer = dataResp.success().data();\n if (buffer.length === 0) {\n break;\n }\n\n data.set(buffer, bytesRead);\n bytesRead += buffer.length;\n }\n\n tx?.finish();\n\n return bytesRead < length ? data.subarray(0, bytesRead) : data;\n}\n","import {Mutex} from 'async-mutex';\nimport promiseRetry from 'promise-retry';\nimport {timeout, TimeoutError} from 'promise-timeout';\nimport {OperationOptions} from 'retry';\n\nimport dgram, {Socket} from 'dgram';\n\nimport {udpClose, udpRead, udpSend} from 'src/utils/udp';\n\nimport {rpc} from './xdr';\n\n/**\n * The RPC auth stamp passed by the CDJs. It's unclear if this is actually\n * important, but I'm keeping the rpc calls as close to CDJ calls as I can.\n */\nconst CDJ_AUTH_STAMP = 0x967b8703;\n\nconst rpcAuthMessage = new rpc.UnixAuth({\n stamp: CDJ_AUTH_STAMP,\n name: '',\n uid: 0,\n gid: 0,\n gids: [],\n});\n\ninterface RpcCall {\n port: number;\n program: number;\n version: number;\n procedure: number;\n data: Buffer;\n}\n\n/**\n * Configuration for the retry strategy to use when making RPC calls\n *\n * @see https://www.npmjs.com/package/promise-retry#promiseretryfn-options\n */\nexport type RetryConfig = OperationOptions & {\n /**\n * Time in milliseconds to wait before a RPC transaction should timeout.\n * @default 1000\n */\n transactionTimeout?: number;\n};\n\n/**\n * Generic RPC connection. Can be used to make RPC 2 calls to any program\n * specified in the RpcCall.\n */\nexport class RpcConnection {\n address: string;\n retryConfig: RetryConfig;\n socket: Socket;\n mutex: Mutex;\n xid = 1;\n\n constructor(address: string, retryConfig?: RetryConfig) {\n this.address = address;\n this.retryConfig = retryConfig ?? {};\n this.socket = dgram.createSocket('udp4');\n this.mutex = new Mutex();\n }\n\n // TODO: Turn this into a getter and figure out what logic we can do here\n // to determine if the socket is still open.\n connected = true;\n\n setupRequest({program, version, procedure, data}: Omit<RpcCall, 'port'>) {\n const auth = new rpc.Auth({\n flavor: 1,\n body: rpcAuthMessage.toXDR(),\n });\n\n const verifier = new rpc.Auth({\n flavor: 0,\n body: Buffer.alloc(0),\n });\n\n const request = new rpc.Request({\n rpcVersion: rpc.Version,\n programVersion: version,\n program,\n procedure,\n auth,\n verifier,\n data,\n });\n\n const packet = new rpc.Packet({\n xid: this.xid,\n message: rpc.Message.request(request),\n });\n\n return packet.toXDR();\n }\n\n /**\n * Execute a RPC transaction (call and response).\n *\n * If a transaction does not complete after the configured timeout it will be\n * retried with the retry configuration.\n */\n async call({port, ...call}: RpcCall) {\n this.xid++;\n\n const callData = this.setupRequest(call);\n\n // Function to execute the transaction\n const executeCall = async () => {\n await udpSend(this.socket, callData, 0, callData.length, port, this.address);\n return udpRead(this.socket);\n };\n\n const {transactionTimeout, ...retryConfig} = this.retryConfig;\n\n // Function to execute the transaction, with timeout if the transaction\n // does not resolve after RESPONSE_RETRY_TIMEOUT.\n const executeWithTimeout = () => timeout(executeCall(), transactionTimeout ?? 1000);\n\n // Function to execute the transaction, with retries if the transaction times out.\n const executeWithRetry = () =>\n promiseRetry(retryConfig, async retry => {\n try {\n return await executeWithTimeout();\n } catch (err) {\n if (err instanceof TimeoutError) {\n retry(err);\n } else {\n throw err;\n }\n }\n return undefined;\n });\n\n // Execute the transaction exclusively to avoid async call races\n const resp = await this.mutex.runExclusive(executeWithRetry);\n\n // Decode the XDR response\n const packet = rpc.Packet.fromXDR(resp);\n\n const message = packet.message().response();\n if (message.arm() !== 'accepted') {\n throw new Error('RPC request was denied');\n }\n\n const body = message.accepted().response();\n if (body.arm() !== 'success') {\n throw new Error('RPC did not successfully return data');\n }\n\n return body.success() as Buffer;\n }\n\n async disconnect() {\n await udpClose(this.socket);\n }\n}\n\ntype RpcProgramCall = Pick<RpcCall, 'procedure' | 'data'>;\n\n/**\n * RpcProgram is constructed with specialization details for a specific RPC\n * program. This should be used to avoid having to repeat yourself for calls\n * made using the RpcConnection.\n */\nexport class RpcProgram {\n program: number;\n version: number;\n port: number;\n conn: RpcConnection;\n\n constructor(conn: RpcConnection, program: number, version: number, port: number) {\n this.conn = conn;\n this.program = program;\n this.version = version;\n this.port = port;\n }\n\n call(data: RpcProgramCall) {\n const {program, version, port} = this;\n return this.conn.call({program, version, port, ...data});\n }\n\n disconnect() {\n this.conn.disconnect();\n }\n}\n","/**\n * Helper to flatten linked list structures into an array\n */\nexport const flattenLinkedList = (item: any): any => [\n item,\n ...(item.next() ? flattenLinkedList(item.next()) : []),\n];\n","import * as XDR from 'js-xdr';\n\n/**\n * Calculate padding needed to align to 4-byte boundary (XDR requirement)\n */\nfunction calculatePadding(length: number): number {\n const remainder = length % 4;\n return remainder === 0 ? 0 : 4 - remainder;\n}\n\n/**\n * Skip padding bytes in the IO stream\n */\nfunction skipPadding(io: any, padding: number): void {\n if (padding > 0) {\n io._index += padding;\n }\n}\n\n/**\n * Read bytes from IO without automatic padding handling\n */\nfunction readBytes(io: any, length: number): Buffer {\n const from = io._index;\n io._index += length;\n if (io._length < io._index) {\n throw new Error('attempt to read outside the boundary of the buffer');\n }\n return io._buffer.subarray(from, from + length);\n}\n\n/**\n * A xdr type to read the rest of the data in the buffer\n */\nconst OpaqueData = {\n read(io: any) {\n // Read all remaining bytes from the buffer\n const remaining = io._length - io._index;\n if (remaining <= 0) {\n return Buffer.alloc(0);\n }\n // Manually read without padding handling (we want all remaining bytes)\n const from = io._index;\n io._index = io._length;\n return io._buffer.subarray(from, io._length);\n },\n\n write(value: any, io: any) {\n io.write(value, value.length);\n },\n\n isValid(value: any) {\n return Buffer.isBuffer(value);\n },\n};\n\n/**\n * In the standard NFS protocol,strings are typically ASCII. For Pioneer\n * players, it is an UTF-16LE encoded string; This type handles conversion.\n */\nclass StringUTF16LE {\n read(io: any) {\n const length = XDR.Int.read(io);\n const padding = calculatePadding(length);\n const result = readBytes(io, length);\n\n skipPadding(io, padding);\n\n return result.toString('utf16le');\n }\n\n write(value: any, io: any) {\n const data = Buffer.from(value, 'utf16le');\n XDR.Int.write(data.length, io);\n io.write(data, data.length);\n }\n\n isValid(value: any) {\n return typeof value === 'string';\n }\n}\n\n/**\n * RPC XDR data types. This implements nearly the entire XDR spec for the\n * ONC-RPC protocol.\n */\nexport const rpc = XDR.config((xdr: any) => {\n xdr.const('Version', 2);\n\n xdr.enum('MessageType', {\n request: 0,\n response: 1,\n });\n\n xdr.enum('ResponseStatus', {\n accepted: 0,\n denied: 1,\n });\n\n xdr.enum('AcceptStatus', {\n success: 0,\n programUnavailable: 1,\n programMismatch: 2,\n processUnavailable: 3,\n garbageArguments: 4,\n systemError: 5,\n });\n\n xdr.enum('RejectStatus', {\n mismatch: 0,\n authError: 1,\n });\n\n xdr.enum('AuthStatus', {\n ok: 0,\n badCredentials: 1,\n rjectedCredentials: 2,\n badVerification: 3,\n rejectedVerification: 4,\n tooWeak: 5,\n invalidResponse: 6,\n failed: 7,\n });\n\n xdr.struct('UnixAuth', [\n ['stamp', xdr.uint()],\n ['name', xdr.string(255)],\n ['uid', xdr.uint()],\n ['gid', xdr.uint()],\n ['gids', xdr.varArray(xdr.uint(), 16)],\n ]);\n\n xdr.struct('Auth', [\n ['flavor', xdr.uint()],\n ['body', xdr.varOpaque(400)],\n ]);\n\n xdr.struct('Request', [\n ['rpcVersion', xdr.uint()],\n ['program', xdr.uint()],\n ['programVersion', xdr.uint()],\n ['procedure', xdr.uint()],\n ['auth', xdr.lookup('Auth')],\n ['verifier', xdr.lookup('Auth')],\n ['data', OpaqueData],\n ]);\n\n xdr.struct('MismatchInfo', [\n ['low', xdr.uint()],\n ['high', xdr.uint()],\n ]);\n\n xdr.union('ResponseData', {\n switchOn: xdr.lookup('AcceptStatus'),\n defaultArm: xdr.void(),\n switches: [\n ['success', 'success'],\n ['programMismatch', 'programMismatch'],\n ],\n arms: {\n success: OpaqueData,\n programMismatch: xdr.lookup('MismatchInfo'),\n },\n });\n\n xdr.struct('AcceptedResponse', [\n ['verifier', xdr.lookup('Auth')],\n ['response', xdr.lookup('ResponseData')],\n ]);\n\n xdr.union('RejectedResponse', {\n switchOn: xdr.lookup('RejectStatus'),\n switches: [\n ['mismatch', 'mismatch'],\n ['authError', 'authError'],\n ],\n arms: {\n mismatch: xdr.lookup('MismatchInfo'),\n authError: xdr.lookup('AuthStatus'),\n },\n });\n\n xdr.union('Response', {\n switchOn: xdr.lookup('ResponseStatus'),\n switches: [\n ['accepted', 'accepted'],\n ['denied', 'denied'],\n ],\n arms: {\n accepted: xdr.lookup('AcceptedResponse'),\n denied: xdr.void(),\n },\n });\n\n xdr.union('Message', {\n switchOn: xdr.lookup('MessageType'),\n switches: [\n ['request', 'request'],\n ['response', 'response'],\n ],\n arms: {\n request: xdr.lookup('Request'),\n response: xdr.lookup('Response'),\n },\n });\n\n xdr.struct('Packet', [\n ['xid', xdr.uint()],\n ['message', xdr.lookup('Message')],\n ]);\n});\n\n/**\n * Portmap RPC XDR types\n */\nexport const portmap = XDR.config((xdr: any) => {\n xdr.const('Program', 100000);\n xdr.const('Version', 2);\n\n xdr.enum('Procedure', {\n getPort: 3,\n });\n\n xdr.struct('GetPort', [\n ['program', xdr.uint()],\n ['version', xdr.uint()],\n ['protocol', xdr.uint()],\n ['port', xdr.uint()],\n ]);\n});\n\n/**\n * Mount RPC XDR types\n */\nexport const mount = XDR.config((xdr: any) => {\n xdr.const('Program', 100005);\n xdr.const('Version', 1);\n\n xdr.enum('Procedure', {\n mount: 1,\n export: 5,\n });\n\n xdr.typedef('Path', new StringUTF16LE());\n xdr.typedef('Filehandle', xdr.opaque(32));\n\n xdr.struct('MountRequest', [['filesystem', xdr.lookup('Path')]]);\n\n xdr.struct('Groups', [\n ['name', xdr.string(255)],\n ['next', xdr.option(xdr.lookup('Groups'))],\n ]);\n\n xdr.struct('ExportList', [\n ['filesystem', xdr.lookup('Path')],\n ['groups', xdr.option(xdr.lookup('Groups'))],\n ['next', xdr.option(xdr.lookup('ExportList'))],\n ]);\n\n xdr.union('FHStatus', {\n switchOn: xdr.uint(),\n defaultArm: xdr.void(),\n switches: [[0, 'success']],\n arms: {\n success: xdr.lookup('Filehandle'),\n },\n });\n\n xdr.struct('ExportListResponse', [['next', xdr.option(xdr.lookup('ExportList'))]]);\n});\n\n/**\n * NFS RPC XDR types\n */\nexport const nfs = XDR.config((xdr: any) => {\n xdr.const('Program', 100003);\n xdr.const('Version', 2);\n\n xdr.enum('Procedure', {\n lookup: 4,\n read: 6,\n });\n\n xdr.typedef('Filename', new StringUTF16LE());\n xdr.typedef('Filehandle', xdr.opaque(32));\n xdr.typedef('NFSData', xdr.varOpaque(8192));\n\n xdr.enum('FileType', {\n null: 0,\n regular: 1,\n directory: 2,\n block: 3,\n char: 4,\n link: 5,\n });\n\n xdr.struct('TimeValue', [\n ['seconds', xdr.uint()],\n ['useconds', xdr.uint()],\n ]);\n\n xdr.struct('FileAttributes', [\n ['type', xdr.lookup('FileType')],\n ['mode', xdr.uint()],\n ['nlink', xdr.uint()],\n ['uid', xdr.uint()],\n ['gid', xdr.uint()],\n ['size', xdr.uint()],\n ['blocksize', xdr.uint()],\n ['rdev', xdr.uint()],\n ['blocks', xdr.uint()],\n ['fsid', xdr.uint()],\n ['fileid', xdr.uint()],\n ['atime', xdr.lookup('TimeValue')],\n ['mtime', xdr.lookup('TimeValue')],\n ['ctime', xdr.lookup('TimeValue')],\n ]);\n\n xdr.struct('DirectoryOpArgs', [\n ['handle', xdr.lookup('Filehandle')],\n ['filename', xdr.lookup('Filename')],\n ]);\n\n xdr.struct('DirectoryOpResponseBody', [\n ['handle', xdr.lookup('Filehandle')],\n ['attributes', xdr.lookup('FileAttributes')],\n ]);\n\n xdr.union('DirectoryOpResponse', {\n switchOn: xdr.uint(),\n defaultArm: xdr.void(),\n switches: [[0, 'success']],\n arms: {\n success: xdr.lookup('DirectoryOpResponseBody'),\n },\n });\n\n xdr.struct('ReadArgs', [\n ['handle', xdr.lookup('Filehandle')],\n ['offset', xdr.uint()],\n ['count', xdr.uint()],\n ['totalCount', xdr.uint()],\n ]);\n\n xdr.struct('ReadBody', [\n ['attributes', xdr.lookup('FileAttributes')],\n ['data', xdr.lookup('NFSData')],\n ]);\n\n xdr.union('ReadResponse', {\n switchOn: xdr.uint(),\n defaultArm: xdr.void(),\n switches: [[0, 'success']],\n arms: {\n success: xdr.lookup('ReadBody'),\n },\n });\n});\n","/**\n * Cross-platform utilities for detecting AlphaTheta (Pioneer DJ) network interfaces.\n * Supports both USB-connected devices (XDJ-XZ, XDJ-AZ) and Ethernet-connected devices.\n */\n\nimport {execSync} from 'child_process';\nimport {type NetworkInterfaceInfo, networkInterfaces} from 'os';\n\n/**\n * Known MAC address prefixes (OUI) for AlphaTheta/Pioneer DJ devices.\n * These are used to identify devices on the network via ARP cache.\n */\nconst ALPHATHETA_MAC_PREFIXES = [\n 'c8:3d:fc', // AlphaTheta (XDJ-XZ, etc.)\n '74:5e:1c', // Pioneer DJ\n 'ac:b5:7d', // Pioneer DJ\n 'b8:e8:56', // Pioneer DJ\n '00:e0:4c', // Realtek (used in some Pioneer devices)\n];\n\n/**\n * Check if a MAC address belongs to an AlphaTheta/Pioneer device.\n */\nfunction isAlphaThetaMac(mac: string): boolean {\n const normalizedMac = mac.toLowerCase();\n return ALPHATHETA_MAC_PREFIXES.some(prefix => normalizedMac.startsWith(prefix));\n}\n\n/**\n * Check if a network interface info is IPv4.\n * Handles both old (numeric) and new (string) Node.js family types.\n */\nfunction isIPv4(info: NetworkInterfaceInfo): boolean {\n const family = info.family as any;\n return family === 'IPv4' || family === 4;\n}\n\nexport interface AlphaThetaInterface {\n /** The interface name (e.g., \"en15\" on macOS, \"Ethernet 3\" on Windows) */\n name: string;\n /** The MAC address of the interface */\n mac: string;\n /** The IPv4 address of the host on this interface */\n ipv4?: string;\n /** The full NetworkInterfaceInfo from Node.js */\n info: NetworkInterfaceInfo;\n /** How the device is connected */\n connectionType: 'usb' | 'ethernet';\n /** IP addresses of AlphaTheta devices found on this interface */\n deviceIps?: string[];\n}\n\n/**\n * Find the network interface for an AlphaTheta device connected via USB or Ethernet.\n * Works on macOS, Windows, and Linux.\n *\n * Detection methods (tried in order):\n * 1. USB: Looks for USB-connected devices (XDJ-XZ, XDJ-AZ) via system APIs\n * 2. Ethernet: Checks ARP cache for known AlphaTheta/Pioneer MAC address prefixes\n *\n * This is useful for passive mode to automatically detect the correct interface\n * for AlphaTheta devices like XDJ-XZ, XDJ-AZ, CDJ-3000, etc.\n *\n * @example\n * ```typescript\n * import { findAlphaThetaInterface, bringOnlinePassive } from 'alphatheta-connect';\n *\n * const iface = findAlphaThetaInterface();\n * if (iface) {\n * console.log(`Found AlphaTheta device on ${iface.name} (${iface.connectionType})`);\n * const network = await bringOnlinePassive({ iface: iface.name });\n * }\n * ```\n *\n * @returns The AlphaTheta interface info, or null if not found\n */\nexport function findAlphaThetaInterface(): AlphaThetaInterface | null {\n const results = findAllAlphaThetaInterfaces();\n return results.length > 0 ? results[0] : null;\n}\n\n/**\n * Find ALL network interfaces with AlphaTheta/Pioneer DJ devices.\n * Works on macOS, Windows, and Linux.\n *\n * Detection methods:\n * 1. USB: Looks for USB-connected devices (XDJ-XZ, XDJ-AZ) via system APIs\n * 2. Ethernet: Checks ARP cache for known AlphaTheta/Pioneer MAC address prefixes\n *\n * Returns all detected interfaces, with USB interfaces listed first.\n * Use this when you want to present users with a choice of interfaces,\n * or when multiple Pro DJ Link networks are available.\n *\n * @example\n * ```typescript\n * import { findAllAlphaThetaInterfaces, bringOnlinePassive } from 'alphatheta-connect';\n *\n * const interfaces = findAllAlphaThetaInterfaces();\n * if (interfaces.length > 0) {\n * console.log('Available interfaces:');\n * for (const iface of interfaces) {\n * console.log(` ${iface.name} (${iface.connectionType}) - ${iface.ipv4 || 'no IP'}`);\n * }\n *\n * // Let user choose or use first one\n * const network = await bringOnlinePassive({ iface: interfaces[0].name });\n * }\n * ```\n *\n * @returns Array of AlphaTheta interface info, empty if none found\n */\nexport function findAllAlphaThetaInterfaces(): AlphaThetaInterface[] {\n const platform = process.platform;\n const results: AlphaThetaInterface[] = [];\n const seenInterfaces = new Set<string>();\n\n // USB detection first (more specific)\n let usbInterfaces: AlphaThetaInterface[] = [];\n\n if (platform === 'darwin') {\n usbInterfaces = findAllAlphaThetaInterfacesMacOS();\n } else if (platform === 'win32') {\n usbInterfaces = findAllAlphaThetaInterfacesWindows();\n }\n\n for (const iface of usbInterfaces) {\n results.push(iface);\n seenInterfaces.add(iface.name);\n }\n\n // Ethernet detection via ARP cache (works on all platforms)\n const ethernetInterfaces = findAllAlphaThetaViaEthernet();\n\n for (const iface of ethernetInterfaces) {\n // Avoid duplicates if same interface found via both methods\n if (!seenInterfaces.has(iface.name)) {\n results.push(iface);\n seenInterfaces.add(iface.name);\n }\n }\n\n return results;\n}\n\n/**\n * macOS implementation: Find ALL AlphaTheta USB interfaces using ioreg\n * and networksetup to map them to interface names.\n */\nfunction findAllAlphaThetaInterfacesMacOS(): AlphaThetaInterface[] {\n try {\n // Step 1: Check if AlphaTheta USB device is connected\n const ioregOutput = execSync(\n 'ioreg -p IOUSB -l -w 0 | grep -E \\'\"USB Vendor Name\"|\"USB Product Name\"\\'',\n {encoding: 'utf8', timeout: 5000}\n );\n\n if (!ioregOutput.toLowerCase().includes('alphatheta')) {\n return [];\n }\n\n // Step 2: Get all hardware ports and find USB 10/100 LAN adapters\n const networkSetupOutput = execSync('networksetup -listallhardwareports', {\n encoding: 'utf8',\n timeout: 5000,\n });\n\n // Parse the output to find USB LAN adapters\n // Format:\n // Hardware Port: USB 10/100 LAN\n // Device: en15\n // Ethernet Address: c8:3d:fc:0a:58:54\n const blocks = networkSetupOutput.split(/\\n\\n+/);\n const usbLanInterfaces: Array<{name: string; mac: string}> = [];\n\n for (const block of blocks) {\n if (block.includes('USB 10/100 LAN') || block.includes('USB 10_100 LAN')) {\n const deviceMatch = block.match(/Device:\\s*(\\S+)/);\n const macMatch = block.match(/Ethernet Address:\\s*(\\S+)/);\n\n if (deviceMatch && macMatch) {\n usbLanInterfaces.push({\n name: deviceMatch[1],\n mac: macMatch[1],\n });\n }\n }\n }\n\n if (usbLanInterfaces.length === 0) {\n return [];\n }\n\n // Step 3: Match with active network interfaces from Node.js\n const interfaces = networkInterfaces();\n const results: AlphaThetaInterface[] = [];\n\n for (const usbIface of usbLanInterfaces) {\n const nodeIface = interfaces[usbIface.name];\n if (!nodeIface) {\n continue;\n }\n\n // Find the IPv4 entry\n const ipv4Entry = nodeIface.find(isIPv4);\n\n if (ipv4Entry) {\n results.push({\n name: usbIface.name,\n mac: usbIface.mac,\n ipv4: ipv4Entry.address,\n info: ipv4Entry,\n connectionType: 'usb',\n });\n } else {\n // Even without IPv4, include the interface if it exists\n const firstEntry = nodeIface[0];\n if (firstEntry) {\n results.push({\n name: usbIface.name,\n mac: usbIface.mac,\n info: firstEntry,\n connectionType: 'usb',\n });\n }\n }\n }\n\n return results;\n } catch {\n return [];\n }\n}\n\n/**\n * Windows implementation: Find ALL AlphaTheta USB network adapters via PowerShell.\n */\nfunction findAllAlphaThetaInterfacesWindows(): AlphaThetaInterface[] {\n try {\n // Use PowerShell to find USB network adapters from AlphaTheta\n // PnP devices with AlphaTheta in the manufacturer or description\n const psCommand = `\n Get-NetAdapter | Where-Object {\n $_.InterfaceDescription -like '*AlphaTheta*' -or\n $_.InterfaceDescription -like '*Pioneer*' -or\n $_.InterfaceDescription -like '*USB 10/100 LAN*'\n } | Select-Object -Property Name, MacAddress, InterfaceDescription | ConvertTo-Json\n `;\n\n const output = execSync(`powershell -Command \"${psCommand.replace(/\\n/g, ' ')}\"`, {\n encoding: 'utf8',\n timeout: 10000,\n });\n\n if (!output.trim()) {\n return [];\n }\n\n const adapters = JSON.parse(output);\n const adapterList = Array.isArray(adapters) ? adapters : [adapters];\n\n if (adapterList.length === 0) {\n return [];\n }\n\n const interfaces = networkInterfaces();\n const results: AlphaThetaInterface[] = [];\n\n for (const adapter of adapterList) {\n // Windows interface names in Node.js might differ from PowerShell names\n // Try to match by MAC address\n const targetMac = adapter.MacAddress?.replace(/-/g, ':').toLowerCase();\n let found = false;\n\n for (const [ifaceName, ifaceInfos] of Object.entries(interfaces)) {\n if (!ifaceInfos) {\n continue;\n }\n\n for (const info of ifaceInfos) {\n if (info.mac.toLowerCase() === targetMac) {\n const ipv4Entry = ifaceInfos.find(isIPv4);\n\n results.push({\n name: ifaceName,\n mac: info.mac,\n ipv4: ipv4Entry?.address,\n info: ipv4Entry || info,\n connectionType: 'usb',\n });\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n\n // Fallback: try matching by name directly\n if (!found) {\n const nodeIface = interfaces[adapter.Name];\n if (nodeIface) {\n const ipv4Entry = nodeIface.find(isIPv4);\n\n results.push({\n name: adapter.Name,\n mac: adapter.MacAddress,\n ipv4: ipv4Entry?.address,\n info: ipv4Entry || nodeIface[0],\n connectionType: 'usb',\n });\n }\n }\n }\n\n return results;\n } catch {\n return [];\n }\n}\n\n/**\n * Get the device IP address from a link-local interface.\n *\n * When connected via USB, the device typically uses a link-local address\n * in the 169.254.x.x range. The device's IP can often be inferred from\n * the host's IP (they're usually on the same /16 subnet).\n *\n * @param hostIp - The host's IP address on the interface\n * @returns The likely device IP, or null if not determinable\n */\nexport function inferDeviceIpFromHost(hostIp: string): string | null {\n if (!hostIp.startsWith('169.254.')) {\n return null;\n }\n\n // The device is typically at a different address in the same subnet\n // Common patterns observed:\n // - Host: 169.254.82.203, Device: 169.254.88.83\n // - The device often has a lower IP in the range\n // Without ARP cache or actual discovery, we can't know for sure\n return null;\n}\n\n/**\n * Try to find the device IP by checking the ARP cache.\n * Works on macOS and Linux.\n *\n * @param interfaceName - The interface name to check\n * @returns Array of IP addresses found in ARP cache for this interface\n */\nexport function getArpCacheForInterface(interfaceName: string): string[] {\n try {\n if (process.platform === 'darwin' || process.platform === 'linux') {\n const arpOutput = execSync('arp -an', {encoding: 'utf8', timeout: 5000});\n\n const ips: string[] = [];\n const lines = arpOutput.split('\\n');\n\n for (const line of lines) {\n // macOS format: ? (169.254.88.83) at c8:3d:fc:a:58:55 on en15 ifscope [ethernet]\n // Linux format: ? (169.254.88.83) at c8:3d:fc:a:58:55 [ether] on en15\n if (line.includes(interfaceName)) {\n const ipMatch = line.match(/\\((\\d+\\.\\d+\\.\\d+\\.\\d+)\\)/);\n if (ipMatch) {\n ips.push(ipMatch[1]);\n }\n }\n }\n\n return ips;\n }\n } catch {\n // ARP command failed\n }\n\n return [];\n}\n\n/**\n * Parse the ARP cache and return entries with AlphaTheta MAC addresses.\n * Returns a map of interface name to array of {ip, mac} entries.\n */\nfunction getAlphaThetaArpEntries(): Map<string, Array<{ip: string; mac: string}>> {\n const result = new Map<string, Array<{ip: string; mac: string}>>();\n\n try {\n if (process.platform === 'darwin' || process.platform === 'linux') {\n const arpOutput = execSync('arp -an', {encoding: 'utf8', timeout: 5000});\n const lines = arpOutput.split('\\n');\n\n for (const line of lines) {\n // macOS format: ? (169.254.88.83) at c8:3d:fc:a:58:55 on en15 ifscope [ethernet]\n // Linux format: ? (169.254.88.83) at c8:3d:fc:a:58:55 [ether] on en15\n const ipMatch = line.match(/\\((\\d+\\.\\d+\\.\\d+\\.\\d+)\\)/);\n const macMatch = line.match(/at\\s+([0-9a-f:]+)/i);\n const ifaceMatch = line.match(/on\\s+(\\S+)/);\n\n if (ipMatch && macMatch && ifaceMatch) {\n const mac = macMatch[1];\n if (isAlphaThetaMac(mac)) {\n const ifaceName = ifaceMatch[1];\n const entries = result.get(ifaceName) || [];\n entries.push({ip: ipMatch[1], mac});\n result.set(ifaceName, entries);\n }\n }\n }\n } else if (process.platform === 'win32') {\n // Windows: use arp -a\n const arpOutput = execSync('arp -a', {encoding: 'utf8', timeout: 5000});\n const lines = arpOutput.split('\\n');\n\n let currentInterface = '';\n for (const line of lines) {\n // Interface header: Interface: 192.168.1.100 --- 0x5\n const ifaceHeaderMatch = line.match(/Interface:\\s+(\\d+\\.\\d+\\.\\d+\\.\\d+)/);\n if (ifaceHeaderMatch) {\n currentInterface = ifaceHeaderMatch[1];\n continue;\n }\n\n // Entry: 192.168.1.1 00-11-22-33-44-55 dynamic\n const entryMatch = line.match(/(\\d+\\.\\d+\\.\\d+\\.\\d+)\\s+([0-9a-f-]+)/i);\n if (entryMatch && currentInterface) {\n const mac = entryMatch[2].replace(/-/g, ':');\n if (isAlphaThetaMac(mac)) {\n const entries = result.get(currentInterface) || [];\n entries.push({ip: entryMatch[1], mac});\n result.set(currentInterface, entries);\n }\n }\n }\n }\n } catch {\n // ARP command failed\n }\n\n return result;\n}\n\n/**\n * Find ALL AlphaTheta devices connected via Ethernet by checking the ARP cache\n * for known MAC address prefixes.\n */\nfunction findAllAlphaThetaViaEthernet(): AlphaThetaInterface[] {\n const alphaThetaEntries = getAlphaThetaArpEntries();\n\n if (alphaThetaEntries.size === 0) {\n return [];\n }\n\n const interfaces = networkInterfaces();\n const results: AlphaThetaInterface[] = [];\n\n // Find all interfaces that have AlphaTheta devices\n for (const [arpIfaceName, devices] of alphaThetaEntries) {\n // On Windows, ARP uses IP addresses as interface identifiers\n // We need to find the matching Node.js interface\n let nodeIfaceName = arpIfaceName;\n let nodeIface = interfaces[arpIfaceName];\n\n if (!nodeIface) {\n // Try to find interface by IP address (Windows case)\n for (const [ifName, infos] of Object.entries(interfaces)) {\n if (!infos) {\n continue;\n }\n for (const info of infos) {\n if (isIPv4(info) && info.address === arpIfaceName) {\n nodeIfaceName = ifName;\n nodeIface = infos;\n break;\n }\n }\n if (nodeIface) {\n break;\n }\n }\n }\n\n if (!nodeIface) {\n continue;\n }\n\n const ipv4Entry = nodeIface.find(isIPv4);\n if (!ipv4Entry) {\n continue;\n }\n\n results.push({\n name: nodeIfaceName,\n mac: ipv4Entry.mac,\n ipv4: ipv4Entry.address,\n info: ipv4Entry,\n connectionType: 'ethernet',\n deviceIps: devices.map(d => d.ip),\n });\n }\n\n return results;\n}\n","import * as ip from 'ip-address';\nimport StrictEventEmitter from 'strict-event-emitter-types';\n\nimport {EventEmitter} from 'events';\n\nimport {PROLINK_HEADER} from 'src/constants';\nimport {Device, DeviceID, DeviceType} from 'src/types';\n\nimport {PacketInfo, PcapAdapter} from './pcap-adapter';\n\n/**\n * Parse a device from an announce packet, using the source IP from PacketInfo\n * when the packet payload doesn't contain the full IP address.\n *\n * This handles both standard and short-format announce packets (46 bytes)\n * that some devices like XDJ-XZ send.\n */\nfunction deviceFromPacketWithInfo(packet: Buffer, info: PacketInfo): Device | null {\n // Check for Pro DJ Link header\n if (packet.indexOf(PROLINK_HEADER) !== 0) {\n return null;\n }\n\n // Check for stage 3 announce (type 0x06 at offset 0x0a)\n if (packet[0x0a] !== 0x06) {\n return null;\n }\n\n // Extract device name (20 bytes starting at offset 0x0c)\n const name = packet\n .slice(0x0c, 0x0c + 20)\n .toString()\n .replace(/\\0/g, '');\n\n // Short-format packets (46 bytes) have different offsets\n const isShortFormat = packet.length < 0x35;\n\n let deviceId: number;\n let deviceType: DeviceType;\n let macAddr: Uint8Array;\n let deviceIp: ip.Address4;\n\n if (isShortFormat) {\n // Short format (46 bytes) - XDJ-XZ, etc.\n // Device ID at 0x24\n deviceId = packet[0x24];\n\n // Short-format packets don't have device type at the usual offset.\n // Use device ID heuristic: 1-6 are CDJ slots, 17 is Rekordbox, 33+ are mixer\n if (deviceId >= 1 && deviceId <= 6) {\n deviceType = DeviceType.CDJ;\n } else if (deviceId === 17) {\n deviceType = DeviceType.Rekordbox;\n } else {\n deviceType = DeviceType.Mixer;\n }\n\n // MAC address at 0x26 (6 bytes)\n macAddr = new Uint8Array(packet.slice(0x26, Math.min(0x2c, packet.length)));\n\n // Use source IP from packet info (payload may be truncated)\n deviceIp = new ip.Address4(info.srcAddr);\n } else {\n // Standard format\n deviceId = packet[0x24];\n deviceType = packet[0x34];\n macAddr = new Uint8Array(packet.slice(0x26, 0x26 + 6));\n deviceIp = ip.Address4.fromInteger(packet.readUInt32BE(0x2c));\n }\n\n return {\n name,\n id: deviceId,\n type: deviceType,\n macAddr,\n ip: deviceIp,\n };\n}\n\ninterface Config {\n /**\n * Time in milliseconds after which a device is considered to have\n * disconnected if it has not broadcast an announcement.\n *\n * @default 10000 ms\n */\n deviceTimeout?: number;\n}\n\nconst defaultConfig: Required<Config> = {\n deviceTimeout: 10000,\n};\n\n/**\n * The upper bound in milliseconds to wait when looking for a device to be on\n * the network when using the `getDeviceEnsured` method.\n */\nconst ENSURED_TIMEOUT = 2000;\n\n/**\n * The interface the passive device manager event emitter should follow\n */\ninterface DeviceEvents {\n /**\n * Fired when a new device becomes available on the network\n */\n connected: (device: Device) => void;\n /**\n * Fired when a device has not announced itself on the network for the\n * specified timeout.\n */\n disconnected: (device: Device) => void;\n /**\n * Fired every time the device announces itself on the network\n */\n announced: (device: Device) => void;\n}\n\ntype Emitter = StrictEventEmitter<EventEmitter, DeviceEvents>;\n\n/**\n * PassiveDeviceManager tracks devices on the Pro DJ Link network using\n * passive packet capture instead of UDP sockets.\n *\n * It provides the same API as the active DeviceManager, making it easy\n * to swap between active and passive modes.\n */\nexport class PassiveDeviceManager {\n #config: Required<Config>;\n /**\n * The map of all active devices currently available on the network.\n */\n #devices = new Map<DeviceID, Device>();\n /**\n * Tracks device timeout handlers, as devices announce themselves these\n * timeouts will be updated.\n */\n #deviceTimeouts = new Map<DeviceID, NodeJS.Timeout>();\n /**\n * The EventEmitter which will be used to trigger device lifecycle events\n */\n #emitter: Emitter = new EventEmitter();\n /**\n * Reference to the pcap adapter for cleanup\n */\n #adapter: PcapAdapter;\n\n constructor(adapter: PcapAdapter, config?: Config) {\n this.#config = {...defaultConfig, ...config};\n this.#adapter = adapter;\n\n // Listen for announce packets from the pcap adapter\n adapter.on('announce', this.#handleAnnounce as any);\n }\n\n // Bind public event emitter interface\n on: Emitter['on'] = this.#emitter.addListener.bind(this.#emitter);\n off: Emitter['off'] = this.#emitter.removeListener.bind(this.#emitter);\n once: Emitter['once'] = this.#emitter.once.bind(this.#emitter);\n\n /**\n * Get active devices on the network.\n */\n get devices() {\n return this.#devices;\n }\n\n /**\n * Waits for a specific device ID to appear on the network, with a\n * configurable timeout, in which case it will resolve with null.\n */\n async getDeviceEnsured(id: DeviceID, timeout: number = ENSURED_TIMEOUT) {\n const existingDevice = this.devices.get(id);\n\n if (existingDevice !== undefined) {\n return existingDevice;\n }\n\n let handler: ((device: Device) => void) | undefined;\n\n // Wait for the device to be connected\n const devicePromise = new Promise<Device>(resolve => {\n handler = (device: Device) => device.id === id && resolve(device);\n this.on('connected', handler);\n });\n\n const device = await Promise.race([\n devicePromise,\n new Promise<null>(r => setTimeout(() => r(null), timeout)),\n ]);\n this.off('connected', handler!);\n\n return device;\n }\n\n /**\n * Reconfigure the device manager.\n */\n reconfigure(config: Config) {\n this.#config = {...this.#config, ...config};\n }\n\n /**\n * Stop listening to the pcap adapter and clean up timeouts.\n */\n stop() {\n this.#adapter.off('announce', this.#handleAnnounce as any);\n\n // Clear all timeouts\n for (const timeout of this.#deviceTimeouts.values()) {\n clearTimeout(timeout);\n }\n this.#deviceTimeouts.clear();\n }\n\n #handleAnnounce = (message: Buffer, info: PacketInfo) => {\n let device;\n try {\n device = deviceFromPacketWithInfo(message, info);\n } catch {\n // Ignore malformed packets\n return;\n }\n\n if (device === null) {\n return;\n }\n\n // Device has not checked in before\n if (!this.#devices.has(device.id)) {\n this.#devices.set(device.id, device);\n this.#emitter.emit('connected', device);\n }\n\n this.#emitter.emit('announced', device);\n\n // Reset the device timeout handler\n const activeTimeout = this.#deviceTimeouts.get(device.id);\n if (activeTimeout) {\n clearTimeout(activeTimeout);\n }\n\n const timeout = this.#config.deviceTimeout;\n const newTimeout = setTimeout(this.#handleDisconnect, timeout, device);\n this.#deviceTimeouts.set(device.id, newTimeout);\n };\n\n #handleDisconnect = (removedDevice: Device) => {\n this.#devices.delete(removedDevice.id);\n this.#deviceTimeouts.delete(removedDevice.id);\n\n this.#emitter.emit('disconnected', removedDevice);\n };\n}\n\nexport default PassiveDeviceManager;\n","import {type NetworkInterfaceInfo, networkInterfaces} from 'os';\n\nimport {DatabasePreference} from 'src/localdb/database-adapter';\nimport {MixstatusProcessor} from 'src/mixstatus';\n\nimport {PassiveDeviceManager} from './devices';\nimport {PassiveLocalDatabase} from './localdb';\nimport {PcapAdapter} from './pcap-adapter';\nimport {PassivePositionEmitter} from './position';\nimport {PassiveRemoteDatabase} from './remotedb';\nimport {PassiveStatusEmitter} from './status';\n\nexport {\n AlphaThetaInterface,\n findAllAlphaThetaInterfaces,\n findAlphaThetaInterface,\n getArpCacheForInterface,\n} from './alphatheta';\nexport {PassiveDeviceManager} from './devices';\nexport {PassiveLocalDatabase} from './localdb';\nexport {PacketInfo, PcapAdapter, PcapAdapterConfig} from './pcap-adapter';\nexport {PassivePositionEmitter} from './position';\nexport {PassiveRemoteDatabase} from './remotedb';\nexport {PassiveStatusEmitter} from './status';\n\nexport interface PassiveNetworkConfig {\n /**\n * Network interface name (e.g., 'en0', 'eth0', 'en15' for USB-connected devices)\n */\n iface: string;\n /**\n * Buffer size for packet capture in bytes\n * @default 10485760 (10MB)\n */\n bufferSize?: number;\n /**\n * Time in milliseconds after which a device is considered disconnected\n * @default 10000\n */\n deviceTimeout?: number;\n /**\n * Database format preference for loading rekordbox databases.\n *\n * - 'auto': Try OneLibrary first (rekordbox 7.x+), fall back to PDB (rekordbox 6.x)\n * - 'oneLibrary': Only use OneLibrary format (exportLibrary.db)\n * - 'pdb': Only use PDB format (export.pdb)\n *\n * @default 'auto'\n */\n databasePreference?: DatabasePreference;\n}\n\n/**\n * PassiveProlinkNetwork provides a passive monitoring interface to the\n * Pro DJ Link network using pcap packet capture.\n *\n * Unlike the active ProlinkNetwork, passive mode:\n * - Does not bind to UDP ports (no conflicts with Rekordbox)\n * - Does not announce a virtual CDJ (devices don't know we exist)\n * - Cannot send packets (no CDJ control, no queryMediaSlot)\n * - Works with USB-connected devices (XDJ-AZ, XDJ-XZ)\n *\n * Requirements:\n * - Root/sudo privileges for packet capture\n * - libpcap (Linux) or Npcap/WinPcap (Windows)\n * - The 'cap' npm module\n */\nexport class PassiveProlinkNetwork {\n #adapter: PcapAdapter;\n #deviceManager: PassiveDeviceManager;\n #statusEmitter: PassiveStatusEmitter;\n #positionEmitter: PassivePositionEmitter;\n #localdb: PassiveLocalDatabase;\n #remotedb: PassiveRemoteDatabase | null = null;\n #mixstatus: MixstatusProcessor | null = null;\n\n constructor(config: PassiveNetworkConfig) {\n this.#adapter = new PcapAdapter({\n iface: config.iface,\n bufferSize: config.bufferSize,\n });\n\n // Only pass defined config values to avoid overwriting defaults with undefined\n this.#deviceManager = new PassiveDeviceManager(\n this.#adapter,\n config.deviceTimeout !== undefined\n ? {deviceTimeout: config.deviceTimeout}\n : undefined\n );\n\n this.#statusEmitter = new PassiveStatusEmitter(this.#adapter);\n this.#positionEmitter = new PassivePositionEmitter(this.#adapter);\n this.#localdb = new PassiveLocalDatabase(\n this.#deviceManager,\n this.#statusEmitter,\n config.databasePreference ?? 'auto'\n );\n }\n\n /**\n * Start passive packet capture.\n * Requires root/sudo privileges.\n */\n start() {\n this.#adapter.start();\n }\n\n /**\n * Stop packet capture and clean up all resources.\n */\n stop() {\n this.#deviceManager.stop();\n this.#statusEmitter.stop();\n this.#positionEmitter.stop();\n this.#localdb.stop();\n this.#remotedb?.stop();\n this.#adapter.stop();\n }\n\n /**\n * Check if packet capture is active.\n */\n get isCapturing() {\n return this.#adapter.isCapturing;\n }\n\n /**\n * Get the network interface being monitored.\n */\n get interfaceName() {\n return this.#adapter.interfaceName;\n }\n\n /**\n * Get the pcap adapter for advanced usage.\n */\n get adapter() {\n return this.#adapter;\n }\n\n /**\n * Get the PassiveDeviceManager service. Tracks devices on the network\n * by listening to announcement packets.\n */\n get deviceManager() {\n return this.#deviceManager;\n }\n\n /**\n * Get the PassiveStatusEmitter service. Reports CDJ status updates\n * received via packet capture.\n */\n get statusEmitter() {\n return this.#statusEmitter;\n }\n\n /**\n * Get the PassivePositionEmitter service. Reports absolute playhead\n * position updates from CDJ-3000+ devices.\n */\n get positionEmitter() {\n return this.#positionEmitter;\n }\n\n /**\n * Get the PassiveLocalDatabase service. Provides access to rekordbox\n * databases on devices using NFS (works without announcing a VCDJ).\n */\n get localdb() {\n return this.#localdb;\n }\n\n /**\n * Get (and initialize) the PassiveRemoteDatabase service. Provides access\n * to track metadata via RemoteDB queries.\n *\n * Note: This sends TCP packets to devices, so it's not fully \"passive\",\n * but it avoids UDP announcements that would conflict with Rekordbox.\n *\n * Useful for getting metadata for Rekordbox Link tracks where NFS\n * access is not available.\n */\n get remotedb() {\n if (this.#remotedb === null) {\n this.#remotedb = new PassiveRemoteDatabase(this.#deviceManager);\n }\n return this.#remotedb;\n }\n\n /**\n * Get (and initialize) the MixstatusProcessor service. Can be used to\n * monitor the 'status' of devices on the network as a whole.\n */\n get mixstatus() {\n if (this.#mixstatus === null) {\n this.#mixstatus = new MixstatusProcessor();\n this.#statusEmitter.on('status', s => this.#mixstatus?.handleState(s));\n }\n return this.#mixstatus;\n }\n}\n\n/**\n * Create and start a passive Pro DJ Link network monitor.\n *\n * This is the primary entrypoint for passive mode. It captures Pro DJ Link\n * packets via pcap without binding to UDP ports or announcing a virtual CDJ.\n *\n * @example\n * ```typescript\n * import { bringOnlinePassive } from 'alphatheta-connect';\n *\n * // Start passive monitoring on en15 (XDJ-XZ USB interface)\n * const network = await bringOnlinePassive({ iface: 'en15' });\n *\n * // Listen for devices\n * network.deviceManager.on('connected', device => {\n * console.log('Device connected:', device.name);\n * });\n *\n * // Listen for track changes\n * network.statusEmitter.on('status', status => {\n * console.log('Track:', status.trackId);\n * });\n *\n * // Get track metadata via NFS\n * const track = await network.localdb.get(device.id, MediaSlot.USB);\n *\n * // Cleanup\n * network.stop();\n * ```\n *\n * @param config - Configuration including network interface name\n * @returns PassiveProlinkNetwork instance\n */\nexport function bringOnlinePassive(config: PassiveNetworkConfig): PassiveProlinkNetwork {\n const network = new PassiveProlinkNetwork(config);\n network.start();\n return network;\n}\n\n/**\n * List available network interfaces that can be used for packet capture.\n * Useful for finding USB-connected DJ hardware interfaces.\n *\n * @example\n * ```typescript\n * import { listInterfaces } from 'alphatheta-connect/passive';\n *\n * const interfaces = listInterfaces();\n * console.log(interfaces);\n * // [{ name: 'en0', address: '192.168.1.100' }, { name: 'en15', address: '169.254.x.x' }]\n * ```\n */\nexport function listInterfaces(): Array<{\n name: string;\n address: string;\n description?: string;\n}> {\n const interfaces = networkInterfaces();\n const result: Array<{name: string; address: string; description?: string}> = [];\n\n for (const [name, infos] of Object.entries(interfaces)) {\n if (!infos) {\n continue;\n }\n\n for (const info of infos as NetworkInterfaceInfo[]) {\n // Only include IPv4, non-internal interfaces\n if (info.family === 'IPv4' && !info.internal) {\n result.push({\n name,\n address: info.address,\n // USB-connected DJ hardware typically uses link-local addresses\n description: info.address.startsWith('169.254.')\n ? 'Link-local (USB device?)'\n : undefined,\n });\n }\n }\n }\n\n return result;\n}\n","import {Mutex} from 'async-mutex';\nimport StrictEventEmitter from 'strict-event-emitter-types';\n\nimport {createHash} from 'crypto';\nimport {EventEmitter} from 'events';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\n\nimport {MAX_CDJ_DEVICE_ID, MIN_CDJ_DEVICE_ID} from 'src/constants';\nimport {DatabaseAdapter, DatabasePreference} from 'src/localdb/database-adapter';\nimport {OneLibraryAdapter} from 'src/localdb/onelibrary';\nimport {MetadataORM} from 'src/localdb/orm';\nimport {hydrateDatabase, HydrationProgress} from 'src/localdb/rekordbox';\nimport {fetchFile, FetchProgress} from 'src/nfs';\nimport {\n Device,\n DeviceID,\n DeviceType,\n MediaSlot,\n MediaSlotInfo,\n TrackType,\n} from 'src/types';\nimport {getSlotName} from 'src/utils';\nimport * as Telemetry from 'src/utils/telemetry';\n\nimport {PassiveDeviceManager} from './devices';\nimport {PassiveStatusEmitter} from './status';\n\n/**\n * Rekordbox databases will only exist within these two slots\n */\ntype DatabaseSlot = MediaSlot.USB | MediaSlot.SD;\n\ninterface CommonProgressOpts {\n device: Device;\n slot: MediaSlot;\n}\n\ntype DownloadProgressOpts = CommonProgressOpts & {\n progress: FetchProgress;\n};\n\ntype HydrationProgressOpts = CommonProgressOpts & {\n progress: HydrationProgress;\n};\n\ntype HydrationDoneOpts = CommonProgressOpts;\n\n/**\n * Events that may be triggered by the PassiveLocalDatabase emitter\n */\ninterface DatabaseEvents {\n /**\n * Triggered when we are fetching a database from a CDJ\n */\n fetchProgress: (opts: DownloadProgressOpts) => void;\n /**\n * Triggered when we are hydrating a rekordbox database into the in-memory\n * sqlite database.\n */\n hydrationProgress: (opts: HydrationProgressOpts) => void;\n /**\n * Triggered when the database has been fully hydrated.\n */\n hydrationDone: (opts: HydrationDoneOpts) => void;\n}\n\ntype Emitter = StrictEventEmitter<EventEmitter, DatabaseEvents>;\n\ninterface DatabaseItem {\n id: string;\n media: MediaSlotInfo;\n adapter: DatabaseAdapter;\n tempFile?: string;\n}\n\n/**\n * Compute the identifier for media device in a CDJ. This is used to determine\n * if we have already hydrated the device or not into our local database.\n */\nconst getMediaId = (info: MediaSlotInfo) => {\n const inputs = [\n info.deviceId,\n info.slot,\n info.name,\n info.freeBytes,\n info.totalBytes,\n info.trackCount,\n info.createdDate,\n ];\n\n return createHash('sha256').update(inputs.join('.'), 'utf8').digest('hex');\n};\n\n/**\n * PassiveLocalDatabase provides access to rekordbox databases on devices\n * using passive packet capture.\n *\n * Unlike the active LocalDatabase, this version:\n * - Cannot query for media slot info (no queryMediaSlot)\n * - Listens for mediaSlot broadcasts to cache media info\n * - Provides getWithMedia() method when media info is known\n *\n * NFS access to fetch rekordbox databases works without announcing a VCDJ.\n */\nexport class PassiveLocalDatabase {\n #deviceManager: PassiveDeviceManager;\n #statusEmitter: PassiveStatusEmitter;\n #emitter: Emitter = new EventEmitter();\n #slotLocks = new Map<string, Mutex>();\n #dbs: DatabaseItem[] = [];\n /**\n * Cache of media slot info received from broadcast packets\n */\n #mediaCache = new Map<string, MediaSlotInfo>();\n /**\n * Database format preference\n */\n #preference: DatabasePreference = 'auto';\n\n constructor(\n deviceManager: PassiveDeviceManager,\n statusEmitter: PassiveStatusEmitter,\n preference: DatabasePreference = 'auto'\n ) {\n this.#deviceManager = deviceManager;\n this.#statusEmitter = statusEmitter;\n this.#preference = preference;\n\n deviceManager.on('disconnected', this.#handleDeviceRemoved);\n statusEmitter.on('mediaSlot', this.#handleMediaSlot);\n }\n\n /**\n * Get the current database preference\n */\n get preference(): DatabasePreference {\n return this.#preference;\n }\n\n /**\n * Set the database preference. Only affects newly loaded databases.\n */\n set preference(value: DatabasePreference) {\n this.#preference = value;\n }\n\n // Bind public event emitter interface\n on: Emitter['on'] = this.#emitter.addListener.bind(this.#emitter);\n off: Emitter['off'] = this.#emitter.removeListener.bind(this.#emitter);\n once: Emitter['once'] = this.#emitter.once.bind(this.#emitter);\n\n /**\n * Get cached media slot info for a device and slot.\n * Returns undefined if no media slot info has been received.\n */\n getCachedMedia(deviceId: DeviceID, slot: DatabaseSlot): MediaSlotInfo | undefined {\n const key = `${deviceId}-${slot}`;\n return this.#mediaCache.get(key);\n }\n\n /**\n * Get all cached media slot info.\n */\n getAllCachedMedia(): MediaSlotInfo[] {\n return Array.from(this.#mediaCache.values());\n }\n\n /**\n * Disconnects the local database connection for the specified device\n */\n disconnectForDevice(device: Device) {\n this.#handleDeviceRemoved(device);\n }\n\n /**\n * Stop listening to events and clean up.\n */\n stop() {\n this.#deviceManager.off('disconnected', this.#handleDeviceRemoved);\n this.#statusEmitter.off('mediaSlot', this.#handleMediaSlot);\n\n // Close all database connections and clean up temp files\n for (const db of this.#dbs) {\n db.adapter.close();\n if (db.tempFile) {\n try {\n fs.unlinkSync(db.tempFile);\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n this.#dbs = [];\n this.#mediaCache.clear();\n }\n\n #handleMediaSlot = (info: MediaSlotInfo) => {\n const key = `${info.deviceId}-${info.slot}`;\n this.#mediaCache.set(key, info);\n };\n\n #handleDeviceRemoved = (device: Device) => {\n const db = this.#dbs.find(db => db.media.deviceId === device.id);\n if (db) {\n db.adapter.close();\n if (db.tempFile) {\n try {\n fs.unlinkSync(db.tempFile);\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n this.#dbs = this.#dbs.filter(db => db.media.deviceId !== device.id);\n\n // Clear cached media for this device\n for (const key of this.#mediaCache.keys()) {\n if (key.startsWith(`${device.id}-`)) {\n this.#mediaCache.delete(key);\n }\n }\n };\n\n /**\n * Helper to fetch a file from device, trying both dotted and non-dotted paths\n */\n #fetchFileWithFallback = async (\n device: Device,\n slot: DatabaseSlot,\n basePath: string,\n tx: Telemetry.TelemetrySpan\n ): Promise<Buffer> => {\n const attemptOrder =\n process.platform === 'win32'\n ? [basePath, `.${basePath}`]\n : [`.${basePath}`, basePath];\n\n try {\n return await fetchFile({\n device,\n slot,\n path: attemptOrder[0],\n span: tx,\n onProgress: progress =>\n this.#emitter.emit('fetchProgress', {device, slot, progress}),\n });\n } catch {\n return fetchFile({\n device,\n slot,\n path: attemptOrder[1],\n span: tx,\n onProgress: progress =>\n this.#emitter.emit('fetchProgress', {device, slot, progress}),\n });\n }\n };\n\n /**\n * Try to load OneLibrary database (exportLibrary.db).\n */\n #tryLoadOneLibrary = async (\n device: Device,\n slot: DatabaseSlot,\n tx: Telemetry.TelemetrySpan\n ): Promise<{adapter: OneLibraryAdapter; tempFile: string} | null> => {\n const oneLibraryPath = 'PIONEER/rekordbox/exportLibrary.db';\n\n try {\n const dbData = await this.#fetchFileWithFallback(device, slot, oneLibraryPath, tx);\n\n const tempDir = os.tmpdir();\n const tempFile = path.join(\n tempDir,\n `prolink-onelibrary-${device.id}-${slot}-${Date.now()}.db`\n );\n fs.writeFileSync(tempFile, dbData);\n\n const adapter = new OneLibraryAdapter(tempFile);\n return {adapter, tempFile};\n } catch {\n return null;\n }\n };\n\n /**\n * Load PDB database (export.pdb) and hydrate into MetadataORM.\n */\n #loadPdbDatabase = async (\n device: Device,\n slot: DatabaseSlot,\n tx: Telemetry.TelemetrySpan\n ): Promise<MetadataORM> => {\n const pdbPath = 'PIONEER/rekordbox/export.pdb';\n const pdbData = await this.#fetchFileWithFallback(device, slot, pdbPath, tx);\n\n const dbCreateTx = tx.startChild({op: 'setupDatabase'});\n const orm = new MetadataORM();\n dbCreateTx.finish();\n\n await hydrateDatabase({\n orm,\n pdbData,\n span: tx,\n onProgress: progress =>\n this.#emitter.emit('hydrationProgress', {device, slot, progress}),\n });\n\n return orm;\n };\n\n #hydrateDatabase = async (device: Device, slot: DatabaseSlot, media: MediaSlotInfo) => {\n const tx = Telemetry.startTransaction({name: 'hydrateDatabase'});\n\n tx.setTag('slot', getSlotName(media.slot));\n tx.setData('numTracks', media.trackCount.toString());\n tx.setTag('preference', this.#preference);\n\n let adapter: DatabaseAdapter;\n let tempFile: string | undefined;\n\n if (this.#preference === 'pdb') {\n adapter = await this.#loadPdbDatabase(device, slot, tx);\n tx.setTag('dbType', 'pdb');\n } else if (this.#preference === 'oneLibrary') {\n const oneLibraryResult = await this.#tryLoadOneLibrary(device, slot, tx);\n if (!oneLibraryResult) {\n throw new Error(\n 'OneLibrary database not found and preference is set to oneLibrary only'\n );\n }\n adapter = oneLibraryResult.adapter;\n tempFile = oneLibraryResult.tempFile;\n tx.setTag('dbType', 'oneLibrary');\n } else {\n // Auto: Try OneLibrary first, fall back to PDB\n const oneLibraryResult = await this.#tryLoadOneLibrary(device, slot, tx);\n\n if (oneLibraryResult) {\n adapter = oneLibraryResult.adapter;\n tempFile = oneLibraryResult.tempFile;\n tx.setTag('dbType', 'oneLibrary');\n } else {\n adapter = await this.#loadPdbDatabase(device, slot, tx);\n tx.setTag('dbType', 'pdb');\n }\n }\n\n this.#emitter.emit('hydrationDone', {device, slot});\n\n const db: DatabaseItem = {adapter, media, id: getMediaId(media), tempFile};\n this.#dbs.push(db);\n\n tx.finish();\n\n return db;\n };\n\n /**\n * Gets the database adapter for the media metadata in the provided device slot,\n * using cached media info.\n *\n * This method uses cached media slot info that was received from\n * broadcast packets. If no media info is cached for this slot,\n * it will attempt to fetch the database without media info (useful\n * for all-in-one units like XDJ-XZ that don't broadcast mediaSlot).\n *\n * @returns null if no rekordbox media present or fetch fails\n */\n get(deviceId: DeviceID, slot: DatabaseSlot): Promise<DatabaseAdapter | null> {\n const cachedMedia = this.getCachedMedia(deviceId, slot);\n const device = this.#deviceManager.devices.get(deviceId);\n\n if (!device) {\n return Promise.resolve(null);\n }\n\n if (cachedMedia) {\n return this.getWithMedia(device, slot, cachedMedia);\n }\n\n // No cached media - try fetching without media info\n // This is needed for all-in-one units (XDJ-XZ, XDJ-RX) that don't\n // broadcast mediaSlot info packets\n return this.getWithoutMedia(device, slot);\n }\n\n /**\n * Gets the database adapter for the media metadata using provided media slot info.\n *\n * Use this method when you have media slot info from another source\n * (e.g., parsed from status packets or provided manually).\n *\n * @returns null if no rekordbox media present\n */\n async getWithMedia(\n device: Device,\n slot: DatabaseSlot,\n media: MediaSlotInfo\n ): Promise<DatabaseAdapter | null> {\n const lockKey = `${device.id}-${slot}`;\n const lock =\n this.#slotLocks.get(lockKey) ??\n this.#slotLocks.set(lockKey, new Mutex()).get(lockKey)!;\n\n if (\n device.type !== DeviceType.CDJ ||\n device.id < MIN_CDJ_DEVICE_ID ||\n device.id > MAX_CDJ_DEVICE_ID\n ) {\n return null;\n }\n\n if (media.tracksType !== TrackType.RB) {\n return null;\n }\n\n const id = getMediaId(media);\n\n const db = await lock.runExclusive(() => {\n const cached = this.#dbs.find(db => db.id === id);\n if (cached) {\n return cached;\n }\n return this.#hydrateDatabase(device, slot, media);\n });\n\n return db.adapter;\n }\n\n /**\n * Attempts to get/hydrate a database without cached media slot info.\n * This is used for all-in-one units (XDJ-XZ, XDJ-RX, etc.) that don't\n * broadcast mediaSlot info packets.\n *\n * The method will try to fetch the rekordbox export.pdb file directly\n * via NFS. If successful, the database is hydrated and cached.\n *\n * @returns null if no rekordbox database found or fetch fails\n */\n async getWithoutMedia(device: Device, slot: DatabaseSlot) {\n const lockKey = `${device.id}-${slot}-nomedia`;\n const lock =\n this.#slotLocks.get(lockKey) ??\n this.#slotLocks.set(lockKey, new Mutex()).get(lockKey)!;\n\n if (\n device.type !== DeviceType.CDJ ||\n device.id < MIN_CDJ_DEVICE_ID ||\n device.id > MAX_CDJ_DEVICE_ID\n ) {\n return null;\n }\n\n // Check if we already have a cached database for this device/slot\n const existingDb = this.#dbs.find(\n db => db.media.deviceId === device.id && db.media.slot === slot\n );\n if (existingDb) {\n return existingDb.adapter;\n }\n\n try {\n const db = await lock.runExclusive(() => {\n // Double-check cache inside lock\n const cached = this.#dbs.find(\n db => db.media.deviceId === device.id && db.media.slot === slot\n );\n if (cached) {\n return cached;\n }\n\n // Create synthetic media info - we assume rekordbox since we're\n // attempting to fetch a rekordbox database\n const syntheticMedia: MediaSlotInfo = {\n deviceId: device.id,\n slot,\n name: 'Unknown Media',\n color: 0,\n createdDate: new Date(0),\n freeBytes: BigInt(0),\n totalBytes: BigInt(0),\n tracksType: TrackType.RB,\n trackCount: 0,\n playlistCount: 0,\n hasSettings: false,\n };\n\n return this.#hydrateDatabase(device, slot, syntheticMedia);\n });\n\n return db.adapter;\n } catch {\n return null;\n }\n }\n\n /**\n * Preload the databases for all connected devices using cached media info.\n */\n async preload() {\n const allDevices = [...this.#deviceManager.devices.values()];\n const cdjDevices = allDevices.filter(\n device =>\n device.type === DeviceType.CDJ &&\n device.id >= MIN_CDJ_DEVICE_ID &&\n device.id <= MAX_CDJ_DEVICE_ID\n );\n\n if (cdjDevices.length === 0) {\n return;\n }\n\n const loaders = cdjDevices.map(device =>\n Promise.all([this.get(device.id, MediaSlot.USB), this.get(device.id, MediaSlot.SD)])\n );\n\n await Promise.all(loaders);\n }\n}\n\nexport default PassiveLocalDatabase;\n","import StrictEventEmitter from 'strict-event-emitter-types';\n\nimport {EventEmitter} from 'events';\nimport {networkInterfaces} from 'os';\n\nimport {ANNOUNCE_PORT, BEAT_PORT, STATUS_PORT} from 'src/constants';\n\n// Cap module types - this is a native pcap module\n// Type definitions are inline since @types/cap doesn't exist\ninterface CapInstance {\n on(event: 'packet', handler: (nbytes: number, truncated: boolean) => void): void;\n on(event: 'error', handler: (err: Error) => void): void;\n setMinBytes(bytes: number): void;\n close(): void;\n open(\n device: string,\n filter: string,\n bufSize: number,\n buffer: Buffer,\n linkType?: string\n ): void;\n send(buffer: Buffer, len: number): boolean;\n linkType: string;\n}\n\n// Protocol constants for packet decoding\ninterface ProtocolConstants {\n ETHERNET: {IPV4: number};\n IP: {UDP: number};\n}\n\ninterface CapDeviceListEntry {\n name: string;\n description: string;\n addresses: Array<{addr: string}>;\n}\n\ninterface CapConstructor {\n new (): CapInstance;\n deviceList(): CapDeviceListEntry[];\n}\n\ninterface CapModule {\n Cap: CapConstructor;\n decoders: {\n PROTOCOL: ProtocolConstants;\n Ethernet: (buf: Buffer) => {info: {type: number}; offset: number};\n IPV4: (\n buf: Buffer,\n offset: number\n ) => {\n info: {protocol: number; srcaddr: string; dstaddr: string; totallen: number};\n offset: number;\n };\n UDP: (\n buf: Buffer,\n offset: number\n ) => {\n info: {srcport: number; dstport: number; length: number};\n offset: number;\n };\n };\n}\n\n/**\n * Packet info including source IP (useful for short-format packets\n * where the IP may not be fully present in the payload).\n */\nexport interface PacketInfo {\n /** The UDP payload */\n payload: Buffer;\n /** Source IP address (e.g., '169.254.88.83') */\n srcAddr: string;\n}\n\ninterface PcapAdapterEvents {\n /**\n * Fired when a device announcement packet is received (port 50000)\n */\n announce: (packet: Buffer, info: PacketInfo) => void;\n /**\n * Fired when a status packet is received (port 50002)\n */\n status: (packet: Buffer, info: PacketInfo) => void;\n /**\n * Fired when a beat/position packet is received (port 50001)\n */\n beat: (packet: Buffer, info: PacketInfo) => void;\n /**\n * Fired when an error occurs\n */\n error: (error: Error) => void;\n}\n\ntype Emitter = StrictEventEmitter<EventEmitter, PcapAdapterEvents>;\n\nexport interface PcapAdapterConfig {\n /**\n * Network interface name (e.g., 'en0', 'eth0', 'en15')\n */\n iface: string;\n /**\n * Buffer size for packet capture in bytes\n * @default 10485760 (10MB)\n */\n bufferSize?: number;\n}\n\n/**\n * PcapAdapter captures Pro DJ Link packets via pcap (libpcap).\n * It extracts UDP payloads and emits them to event listeners based on\n * destination port.\n *\n * This allows passive monitoring of the Pro DJ Link network without\n * binding to UDP ports or announcing a virtual CDJ.\n *\n * NOTE: Requires root/sudo privileges for packet capture.\n */\nexport class PcapAdapter {\n #emitter: Emitter = new EventEmitter();\n #cap: CapInstance | null = null;\n #buffer: Buffer;\n #iface: string;\n #started = false;\n\n constructor(config: PcapAdapterConfig) {\n this.#iface = config.iface;\n this.#buffer = Buffer.alloc(config.bufferSize ?? 10 * 1024 * 1024); // 10MB default\n }\n\n // Bind public event emitter interface\n on: Emitter['on'] = this.#emitter.addListener.bind(this.#emitter);\n off: Emitter['off'] = this.#emitter.removeListener.bind(this.#emitter);\n once: Emitter['once'] = this.#emitter.once.bind(this.#emitter);\n\n /**\n * Start capturing packets on the configured interface.\n * Requires root/sudo privileges.\n */\n start() {\n if (this.#started) {\n return;\n }\n\n // Dynamic require to avoid bundling issues and allow optional dependency\n let cap: CapModule;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n cap = require('cap') as CapModule;\n } catch {\n throw new Error(\n 'The \"cap\" module is required for passive mode. ' +\n 'Install it with: npm install cap\\n' +\n 'Note: Requires libpcap-dev on Linux or Npcap/WinPcap on Windows.'\n );\n }\n\n const {Cap, decoders} = cap;\n const PROTOCOL = decoders.PROTOCOL;\n\n this.#cap = new Cap();\n\n // On Windows, translate Node.js interface name (e.g. \"Ethernet\") to Npcap\n // device path (e.g. \"\\Device\\NPF_{GUID}\") by matching IPv4 addresses.\n let deviceName = this.#iface;\n if (process.platform === 'win32' && !deviceName.startsWith('\\\\Device\\\\')) {\n const resolved = resolveWindowsInterface(this.#iface, Cap);\n if (resolved) {\n deviceName = resolved;\n }\n }\n\n // BPF filter for Pro DJ Link UDP ports\n const filter = `udp and (port ${ANNOUNCE_PORT} or port ${BEAT_PORT} or port ${STATUS_PORT})`;\n\n try {\n this.#cap.open(deviceName, filter, 65535, this.#buffer);\n } catch (err) {\n throw new Error(\n `Failed to open interface \"${this.#iface}\" (device: ${deviceName}) for packet capture. ` +\n `Ensure you have root/sudo privileges and the interface exists.\\n` +\n `Original error: ${err}`\n );\n }\n\n // setMinBytes may not be available on all platforms\n if (typeof this.#cap.setMinBytes === 'function') {\n this.#cap.setMinBytes(0);\n }\n\n this.#cap.on('packet', (nbytes: number, truncated: boolean) => {\n if (truncated) {\n return;\n }\n\n try {\n // Parse Ethernet header\n const ethResult = decoders.Ethernet(this.#buffer);\n if (ethResult.info.type !== PROTOCOL.ETHERNET.IPV4) {\n return;\n }\n\n // Parse IPv4 header\n const ipResult = decoders.IPV4(this.#buffer, ethResult.offset);\n if (ipResult.info.protocol !== PROTOCOL.IP.UDP) {\n return;\n }\n\n // Parse UDP header\n const udpResult = decoders.UDP(this.#buffer, ipResult.offset);\n const dstPort = udpResult.info.dstport;\n const udpPayloadOffset = udpResult.offset;\n const udpPayloadLen = udpResult.info.length - 8; // UDP header is 8 bytes\n\n if (udpPayloadLen <= 0) {\n return;\n }\n\n // Extract the UDP payload as a new Buffer (copy to avoid overwrite)\n const payload = Buffer.alloc(udpPayloadLen);\n this.#buffer.copy(payload, 0, udpPayloadOffset, udpPayloadOffset + udpPayloadLen);\n\n // Build packet info with source IP (useful when payload doesn't contain full IP)\n const info: PacketInfo = {\n payload,\n srcAddr: ipResult.info.srcaddr,\n };\n\n // Emit to appropriate handler based on destination port\n switch (dstPort) {\n case ANNOUNCE_PORT:\n this.#emitter.emit('announce', payload, info);\n break;\n case BEAT_PORT:\n this.#emitter.emit('beat', payload, info);\n break;\n case STATUS_PORT:\n this.#emitter.emit('status', payload, info);\n break;\n }\n } catch (err) {\n this.#emitter.emit('error', err as Error);\n }\n });\n\n this.#cap.on('error', (err: Error) => {\n this.#emitter.emit('error', err);\n });\n\n this.#started = true;\n }\n\n /**\n * Stop capturing packets and release resources.\n */\n stop() {\n if (this.#cap) {\n this.#cap.close();\n this.#cap = null;\n }\n this.#started = false;\n }\n\n /**\n * Check if the adapter is currently capturing.\n */\n get isCapturing() {\n return this.#started;\n }\n\n /**\n * Get the interface name being captured.\n */\n get interfaceName() {\n return this.#iface;\n }\n}\n\n/**\n * Resolve a Node.js network interface name (e.g. \"Ethernet\") to an Npcap\n * device path (e.g. \"\\Device\\NPF_{GUID}\") on Windows.\n *\n * Node.js os.networkInterfaces() returns friendly names, but the cap module\n * requires Npcap device paths. This function matches by comparing IPv4\n * addresses between os.networkInterfaces() and Cap.deviceList().\n */\nfunction resolveWindowsInterface(ifaceName: string, Cap: CapConstructor): string | null {\n // Get the IPv4 addresses for the requested Node.js interface\n const nodeInterfaces = networkInterfaces();\n const nodeIface = nodeInterfaces[ifaceName];\n if (!nodeIface) {\n return null;\n }\n\n const nodeIpv4Addresses = new Set(\n nodeIface\n .filter(i => (i.family as any) === 'IPv4' || (i.family as any) === 4)\n .map(i => i.address)\n );\n\n if (nodeIpv4Addresses.size === 0) {\n return null;\n }\n\n // Find the cap device whose addresses overlap with the Node.js interface\n const capDevices = Cap.deviceList();\n for (const device of capDevices) {\n if (!device.addresses) {\n continue;\n }\n for (const addr of device.addresses) {\n if (addr.addr && nodeIpv4Addresses.has(addr.addr)) {\n return device.name;\n }\n }\n }\n\n return null;\n}\n\nexport default PcapAdapter;\n","import StrictEventEmitter from 'strict-event-emitter-types';\n\nimport {EventEmitter} from 'events';\n\nimport {positionFromPacket} from 'src/status/utils';\nimport {CDJStatus} from 'src/types';\n\nimport {PacketInfo, PcapAdapter} from './pcap-adapter';\n\ninterface PositionEvents {\n /**\n * Fired when an absolute position packet is received from a CDJ-3000+.\n * These packets are sent approximately every 30ms while a track is loaded.\n */\n position: (position: CDJStatus.PositionState) => void;\n}\n\ntype Emitter = StrictEventEmitter<EventEmitter, PositionEvents>;\n\n/**\n * PassivePositionEmitter reports absolute playhead position updates from\n * CDJ-3000+ devices using passive packet capture.\n *\n * Position packets provide precise track position independent of beat grids,\n * enabling accurate timecode, lighting cue, and video synchronization even\n * during scratching, reverse play, loops, and needle jumps.\n */\nexport class PassivePositionEmitter {\n #emitter: Emitter = new EventEmitter();\n #adapter: PcapAdapter;\n\n constructor(adapter: PcapAdapter) {\n this.#adapter = adapter;\n adapter.on('beat', this.#handlePosition as any);\n }\n\n // Bind public event emitter interface\n on: Emitter['on'] = this.#emitter.addListener.bind(this.#emitter);\n off: Emitter['off'] = this.#emitter.removeListener.bind(this.#emitter);\n once: Emitter['once'] = this.#emitter.once.bind(this.#emitter);\n\n /**\n * Stop listening to the pcap adapter.\n */\n stop() {\n this.#adapter.off('beat', this.#handlePosition as any);\n }\n\n #handlePosition = (message: Buffer, _info: PacketInfo) => {\n const position = positionFromPacket(message);\n\n if (position !== undefined) {\n this.#emitter.emit('position', position);\n }\n };\n}\n\nexport default PassivePositionEmitter;\n","import {Mutex} from 'async-mutex';\nimport PromiseSocket from 'promise-socket';\n\nimport {Socket} from 'net';\n\nimport {Connection, MenuTarget, Query, QueryInterface} from 'src/remotedb';\nimport {REMOTEDB_SERVER_QUERY_PORT} from 'src/remotedb/constants';\nimport {readField, UInt32} from 'src/remotedb/fields';\nimport {Message} from 'src/remotedb/message';\nimport {MessageType} from 'src/remotedb/message/types';\nimport {Device, DeviceID, MediaSlot, TrackType} from 'src/types';\nimport * as Telemetry from 'src/utils/telemetry';\n\nimport {PassiveDeviceManager} from './devices';\n\n/**\n * Queries the remote device for the port that the remote database server is\n * listening on for requests.\n */\nasync function getRemoteDBServerPort(deviceIp: string): Promise<number> {\n const conn = new PromiseSocket(new Socket());\n await conn.connect(REMOTEDB_SERVER_QUERY_PORT, deviceIp);\n\n // Magic request packet asking the device to report its remoteDB port\n const data = Buffer.from([\n ...[0x00, 0x00, 0x00, 0x0f],\n ...Buffer.from('RemoteDBServer', 'ascii'),\n 0x00,\n ]);\n\n await conn.write(data);\n const resp = await conn.read();\n\n await conn.destroy();\n\n if (typeof resp !== 'object') {\n throw new Error('Invalid response from remotedb');\n }\n\n if (resp.length !== 2) {\n throw new Error(`Expected 2 bytes, got ${resp.length}`);\n }\n\n return resp.readUInt16BE();\n}\n\n/**\n * PassiveRemoteDatabase provides RemoteDB query support for passive mode.\n *\n * This allows querying track metadata from Rekordbox Link without fully\n * announcing a virtual CDJ on the network. It uses a \"virtual\" device ID\n * (default: 5) for the introduction handshake.\n *\n * Note: This makes the mode not fully \"passive\" since we're sending TCP\n * packets, but we still avoid UDP announcements that would conflict with\n * Rekordbox.\n */\nexport class PassiveRemoteDatabase {\n #deviceManager: PassiveDeviceManager;\n #virtualDeviceId: number;\n\n /**\n * Active device connection map\n */\n #connections = new Map<DeviceID, Connection>();\n /**\n * Locks for each device when locating the connection\n */\n #deviceLocks = new Map<DeviceID, Mutex>();\n\n constructor(deviceManager: PassiveDeviceManager, virtualDeviceId = 5) {\n this.#deviceManager = deviceManager;\n this.#virtualDeviceId = virtualDeviceId;\n }\n\n /**\n * Open a connection to the specified device for querying\n */\n async connectToDevice(device: Device): Promise<void> {\n const tx = Telemetry.startTransaction({\n name: 'passiveConnectRemotedb',\n data: {device},\n });\n\n const {ip} = device;\n const dbPort = await getRemoteDBServerPort(ip.address);\n\n const socket = new PromiseSocket(new Socket());\n await socket.connect(dbPort, ip.address);\n\n // Send required preamble to open communications with the device\n const preamble = new UInt32(0x01);\n await socket.write(preamble.buffer);\n\n // Read the response. It should be a UInt32 field with the value 0x01.\n const data = await readField(socket, UInt32.type);\n\n if (data.value !== 0x01) {\n throw new Error(`Expected 0x01 during preamble handshake. Got ${data.value}`);\n }\n\n // Send introduction message with our virtual device ID\n const intro = new Message({\n transactionId: 0xfffffffe,\n type: MessageType.Introduce,\n args: [new UInt32(this.#virtualDeviceId)],\n });\n\n await socket.write(intro.buffer);\n const resp = await Message.fromStream(socket, MessageType.Success, tx);\n\n if (resp.type !== MessageType.Success) {\n throw new Error(`Failed to introduce self to device ID: ${device.id}`);\n }\n\n this.#connections.set(device.id, new Connection(device, socket));\n tx.finish();\n }\n\n /**\n * Disconnect from the specified device\n */\n async disconnectFromDevice(device: Device): Promise<void> {\n const conn = this.#connections.get(device.id);\n\n if (conn === undefined) {\n return;\n }\n\n try {\n const tx = Telemetry.startTransaction({\n name: 'passiveDisconnectFromDevice',\n data: {device},\n });\n\n const goodbye = new Message({\n transactionId: 0xfffffffe,\n type: MessageType.Disconnect,\n args: [],\n });\n\n await conn.writeMessage(goodbye, tx);\n tx.finish();\n } catch {\n // Ignore errors during disconnect\n }\n\n conn.close();\n this.#connections.delete(device.id);\n }\n\n /**\n * Gets the remote database query interface for the given device.\n *\n * If we have not already established a connection with the specified device,\n * we will attempt to first connect.\n *\n * @returns null if the device is not found\n */\n async get(deviceId: DeviceID): Promise<QueryInterface | null> {\n const device = this.#deviceManager.devices.get(deviceId);\n if (device === undefined) {\n return null;\n }\n\n const lock =\n this.#deviceLocks.get(device.id) ??\n this.#deviceLocks.set(device.id, new Mutex()).get(device.id)!;\n\n const releaseLock = await lock.acquire();\n\n let conn = this.#connections.get(deviceId);\n if (conn === undefined) {\n try {\n await this.connectToDevice(device);\n conn = this.#connections.get(deviceId);\n } catch (err) {\n releaseLock();\n throw err;\n }\n }\n\n releaseLock();\n\n if (conn === undefined) {\n return null;\n }\n\n // Create a virtual host device for the query interface\n const virtualHostDevice: Device = {\n id: this.#virtualDeviceId,\n name: 'alphatheta-connect',\n type: 0x01, // CDJ type\n macAddr: new Uint8Array([0, 0, 0, 0, 0, 0]),\n ip: device.ip, // Not really used, just needs to be valid\n };\n\n return new QueryInterface(conn, lock, virtualHostDevice);\n }\n\n /**\n * Query track metadata from a device.\n *\n * @param deviceId - The device to query (e.g., 17 for Rekordbox)\n * @param trackSlot - The media slot (e.g., MediaSlot.RB for Rekordbox Link)\n * @param trackType - The track type (e.g., TrackType.RB)\n * @param trackId - The track ID to look up\n */\n async getTrackMetadata(\n deviceId: DeviceID,\n trackSlot: MediaSlot,\n trackType: TrackType,\n trackId: number\n ) {\n const conn = await this.get(deviceId);\n if (conn === null) {\n return null;\n }\n\n const queryDescriptor = {\n trackSlot,\n trackType,\n menuTarget: MenuTarget.Main,\n };\n\n try {\n const track = await conn.query({\n queryDescriptor,\n query: Query.GetMetadata,\n args: {trackId},\n });\n\n // File path is not available for streaming tracks (Beatport, etc.)\n try {\n track.filePath = await conn.query({\n queryDescriptor,\n query: Query.GetTrackInfo,\n args: {trackId},\n });\n } catch {\n // No-op — streaming tracks don't have a local file\n }\n\n return track;\n } catch (err) {\n // Connection may have been closed, remove it\n this.#connections.delete(deviceId);\n throw err;\n }\n }\n\n /**\n * Query metadata for an unanalyzed track (loaded directly from USB without\n * Rekordbox analysis). Uses GetGenericMetadata which reads ID3 tags from the\n * audio file via the CDJ.\n *\n * @param deviceId - The CDJ device to query\n * @param trackSlot - The media slot (USB or SD)\n * @param trackType - Should be TrackType.Unanalyzed\n * @param trackId - The track ID to look up\n */\n async getGenericTrackMetadata(\n deviceId: DeviceID,\n trackSlot: MediaSlot,\n trackType: TrackType,\n trackId: number\n ) {\n const conn = await this.get(deviceId);\n if (conn === null) {\n return null;\n }\n\n const queryDescriptor = {\n trackSlot,\n trackType,\n menuTarget: MenuTarget.Main,\n };\n\n try {\n const track = await conn.query({\n queryDescriptor,\n query: Query.GetGenericMetadata,\n args: {trackId},\n });\n\n // Try to get file path for artwork extraction\n try {\n track.filePath = await conn.query({\n queryDescriptor,\n query: Query.GetTrackInfo,\n args: {trackId},\n });\n } catch {\n // GetTrackInfo may not be available for unanalyzed tracks\n }\n\n return track;\n } catch (err) {\n this.#connections.delete(deviceId);\n throw err;\n }\n }\n\n /**\n * Stop all connections\n */\n stop() {\n for (const conn of this.#connections.values()) {\n conn.close();\n }\n this.#connections.clear();\n }\n}\n\nexport default PassiveRemoteDatabase;\n","import StrictEventEmitter from 'strict-event-emitter-types';\n\nimport {EventEmitter} from 'events';\n\nimport {mediaSlotFromPacket, onAirFromPacket, statusFromPacket} from 'src/status/utils';\nimport {CDJStatus, MediaSlotInfo} from 'src/types';\n\nimport {PacketInfo, PcapAdapter} from './pcap-adapter';\n\ninterface StatusEvents {\n /**\n * Fired each time the CDJ reports its status\n */\n status: (status: CDJStatus.State) => void;\n /**\n * Fired when the CDJ reports its media slot status\n */\n mediaSlot: (info: MediaSlotInfo) => void;\n /**\n * Fired when the mixer broadcasts on-air channel status\n */\n onAir: (status: CDJStatus.OnAirStatus) => void;\n}\n\ntype Emitter = StrictEventEmitter<EventEmitter, StatusEvents>;\n\n/**\n * PassiveStatusEmitter reports CDJ status updates received via passive\n * packet capture instead of UDP sockets.\n *\n * It provides the same event API as the active StatusEmitter, but does\n * NOT support the queryMediaSlot method since that requires sending packets.\n *\n * In passive mode, media slot information is received when CDJs broadcast\n * it naturally (e.g., when media is inserted or at startup).\n */\nexport class PassiveStatusEmitter {\n #emitter: Emitter = new EventEmitter();\n #adapter: PcapAdapter;\n\n constructor(adapter: PcapAdapter) {\n this.#adapter = adapter;\n adapter.on('status', this.#handleStatus as any);\n }\n\n // Bind public event emitter interface\n on: Emitter['on'] = this.#emitter.addListener.bind(this.#emitter);\n off: Emitter['off'] = this.#emitter.removeListener.bind(this.#emitter);\n once: Emitter['once'] = this.#emitter.once.bind(this.#emitter);\n\n /**\n * Stop listening to the pcap adapter.\n */\n stop() {\n this.#adapter.off('status', this.#handleStatus as any);\n }\n\n #handleStatus = (message: Buffer, _info: PacketInfo) => {\n try {\n const status = statusFromPacket(message);\n\n if (status !== undefined) {\n return this.#emitter.emit('status', status);\n }\n\n // Media slot status is also reported on this socket\n const mediaSlot = mediaSlotFromPacket(message);\n\n if (mediaSlot !== undefined) {\n return this.#emitter.emit('mediaSlot', mediaSlot);\n }\n\n // On-air status from mixer is also reported on this socket\n const onAir = onAirFromPacket(message);\n\n if (onAir !== undefined) {\n return this.#emitter.emit('onAir', onAir);\n }\n } catch {\n // Ignore malformed packets\n }\n\n return undefined;\n };\n}\n\nexport default PassiveStatusEmitter;\n","/**\n * All remote database messages include this 4 byte magic value.\n */\nexport const REMOTEDB_MAGIC = 0x872349ae;\n\n/**\n * The consistent port on which we can query the remote db server for the port\n */\nexport const REMOTEDB_SERVER_QUERY_PORT = 12523;\n","import {PromiseReadable} from 'promise-readable';\n\nconst NULL_CHAR = '\\0';\n\n/**\n * Field type is a leading byte that indicates what the field is.\n */\nexport enum FieldType {\n UInt8 = 0x0f,\n UInt16 = 0x10,\n UInt32 = 0x11,\n Binary = 0x14,\n String = 0x26,\n}\n\nexport abstract class BaseField {\n // The constructor property (which is used to access the class from an\n // instance of it) must be set to the BaseClass object so we can access the\n // `.type` property.\n //\n // @see https://github.com/Microsoft/TypeScript/issues/3841#issuecomment-337560146\n declare ['constructor']: typeof BaseField;\n\n /**\n * The raw field data\n */\n declare data: Buffer;\n /**\n * Corce the field into a buffer. This differs from reading the data\n * property in that it will include the field type header.\n */\n abstract buffer: Buffer;\n\n /**\n * Declares the type of field this class represents\n */\n static type: FieldType;\n\n /**\n * The number of bytes to read for this field. If the field is not a fixed size,\n * set this to a function which will receive the UInt32 value just after\n * reading the field type, returning the next number of bytes to read.\n */\n static bytesToRead: number | ((reportedLength: number) => number);\n}\n\nexport type NumberField<T extends number = number> = BaseField & {\n /**\n * The fields number value\n */\n value: T;\n};\n\nexport type StringField<T extends string = string> = BaseField & {\n /**\n * The fields decoded string value\n */\n value: T;\n};\n\nexport type BinaryField = BaseField & {\n /**\n * The binary value encapsulated in the field\n */\n value: Buffer;\n};\n\nexport type Field = NumberField | StringField | BinaryField;\n\ntype NumberFieldType = FieldType.UInt32 | FieldType.UInt16 | FieldType.UInt8;\n\nconst numberNameMap = Object.fromEntries(\n Object.entries(FieldType).map(e => [e[1], e[0]])\n);\n\nconst numberBufferInfo = {\n [FieldType.UInt8]: [1, 'writeUInt8', 'readUInt8'],\n [FieldType.UInt16]: [2, 'writeUInt16BE', 'readUInt16BE'],\n [FieldType.UInt32]: [4, 'writeUInt32BE', 'readUInt32BE'],\n} as const;\n\nfunction parseNumber(value: number | Buffer, type: NumberFieldType): [number, Buffer] {\n const [bytes, writeFn, readFn] = numberBufferInfo[type];\n const data = Buffer.alloc(bytes);\n\n if (typeof value === 'number') {\n data[writeFn](value);\n return [value, data];\n }\n\n return [value[readFn](), value];\n}\n\nfunction makeVariableBuffer(type: FieldType, fieldData: Buffer, lengthHeader?: number) {\n // Add 4 bytes for length header and 1 byte for type header.\n const data = Buffer.alloc(fieldData.length + 4 + 1);\n data.writeUInt8(type);\n data.writeUInt32BE(lengthHeader ?? fieldData.length, 0x01);\n\n fieldData.copy(data, 0x05);\n\n return data;\n}\n\nconst makeNumberField = (type: NumberFieldType) => {\n const Number = class extends BaseField implements NumberField {\n static type = type;\n static bytesToRead = numberBufferInfo[type][0];\n\n value: number;\n\n constructor(value: number | Buffer) {\n super();\n const [number, data] = parseNumber(value, type);\n this.data = data;\n this.value = number;\n }\n\n get buffer() {\n return Buffer.from([type, ...this.data]);\n }\n };\n\n // We use the name property in readField to create helpful error messages\n Object.defineProperty(Number, 'name', {value: numberNameMap[type]});\n\n return Number;\n};\n\n/**\n * Field representing a UInt8\n */\nexport const UInt8 = makeNumberField(FieldType.UInt8);\n\n/**\n * Field representing a UInt16\n */\nexport const UInt16 = makeNumberField(FieldType.UInt16);\n\n/**\n * Field representing a UInt32\n */\nexport const UInt32 = makeNumberField(FieldType.UInt32);\n\n/**\n * Field representing a null-terminated big endian UTF-16 string\n */\nexport class String extends BaseField implements StringField {\n static type = FieldType.String as const;\n\n // Compute the number of bytes in the string given the length of the string.\n // A UTF-16 string takes 2 bytes per character.\n static bytesToRead = (length: number) => length * 2;\n\n value: string;\n\n constructor(value: Buffer | string) {\n super();\n if (typeof value === 'string') {\n this.value = value;\n this.data = Buffer.from(value + NULL_CHAR, 'utf16le').swap16();\n return;\n }\n\n // Slice off the last two bytes to remove the trailing null bytes\n this.value = Buffer.from(value).swap16().slice(0, -2).toString('utf16le');\n this.data = value;\n }\n\n get buffer() {\n return makeVariableBuffer(FieldType.String, this.data, this.data.length / 2);\n }\n}\n\n/**\n * Field representing binary data\n */\nexport class Binary extends BaseField implements BinaryField {\n static type = FieldType.Binary as const;\n static bytesToRead = (bytes: number) => bytes;\n\n value: Buffer;\n\n constructor(value: Buffer) {\n super();\n this.value = this.data = value;\n }\n\n get buffer() {\n return makeVariableBuffer(FieldType.Binary, this.data);\n }\n}\n\nconst fieldMap = {\n [FieldType.UInt8]: UInt8,\n [FieldType.UInt16]: UInt16,\n [FieldType.UInt32]: UInt32,\n [FieldType.Binary]: Binary,\n [FieldType.String]: String,\n} as const;\n\n/**\n * Helper to read from stream.\n *\n * NOTE: I suspect the typescript interface on PromiseReadable may be wrong, as\n * I'm not sure when this would return a string. We'll play it safe for now.\n */\nasync function read(stream: PromiseReadable<any>, bytes: number) {\n const data = await stream.read(bytes);\n\n if (data instanceof Buffer) {\n return data;\n }\n\n throw new Error('Expected buffer from stream read');\n}\n\n/**\n * Read a single field from a socket stream.\n */\nexport async function readField<\n T extends FieldType,\n F extends InstanceType<(typeof fieldMap)[T]>,\n>(stream: PromiseReadable<any>, expect: T): Promise<F> {\n const typeData = await read(stream, 1);\n const Field = fieldMap[typeData[0] as FieldType];\n\n if (Field.type !== expect) {\n throw new Error(`Expected ${fieldMap[expect].name} but got ${Field.name}`);\n }\n\n let nextByteCount: number;\n\n if (typeof Field.bytesToRead === 'number') {\n nextByteCount = Field.bytesToRead;\n } else {\n // Read the field length as a UInt32 when we do not know the field length\n // from the type\n const lengthData = await read(stream, 4);\n nextByteCount = Field.bytesToRead(lengthData.readUInt32BE());\n }\n\n const data = nextByteCount === 0 ? Buffer.alloc(0) : await read(stream, nextByteCount);\n\n return new Field(data) as F;\n}\n","import {Mutex} from 'async-mutex';\nimport * as ip from 'ip-address';\nimport PromiseSocket from 'promise-socket';\n\nimport {Socket} from 'net';\n\nimport DeviceManager from 'src/devices';\nimport {Device, DeviceID, MediaSlot, TrackType} from 'src/types';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\nimport * as Telemetry from 'src/utils/telemetry';\n\nimport {getMessageName, MessageType, Request, Response} from './message/types';\nimport {REMOTEDB_SERVER_QUERY_PORT} from './constants';\nimport {readField, UInt32} from './fields';\nimport {Message} from './message';\nimport {HandlerArgs, HandlerReturn, queryHandlers} from './queries';\n\ntype Await<T> = T extends PromiseLike<infer U> ? U : T;\n\n/**\n * Menu target specifies where a menu should be \"rendered\" This differs based\n * on the request being made.\n */\nexport enum MenuTarget {\n Main = 0x01,\n}\n\n/**\n * Used to specify where to lookup data when making queries\n */\nexport interface QueryDescriptor {\n menuTarget: MenuTarget;\n trackSlot: MediaSlot;\n trackType: TrackType;\n}\n\n/**\n * Used internally when making queries.\n */\nexport type LookupDescriptor = QueryDescriptor & {\n targetDevice: Device;\n hostDevice: Device;\n};\n\n/**\n * Used to specify the query type that is being made\n */\nexport type Query = keyof typeof queryHandlers;\nexport const Query = Request;\n\nconst QueryInverse = Object.fromEntries(Object.entries(Query).map(e => [e[1], e[0]]));\n\n/**\n * Returns a string representation of a remote query\n */\nexport function getQueryName(query: Query) {\n return QueryInverse[query];\n}\n\n/**\n * Options used to make a remotedb query\n */\ninterface QueryOpts<T extends Query> {\n queryDescriptor: QueryDescriptor;\n /**\n * The query type to make\n */\n query: T;\n /**\n * Arguments to pass to the query. These are query specific\n */\n args: HandlerArgs<T>;\n /**\n * The sentry span to associate the query with\n */\n span?: Span;\n}\n\n/**\n * Queries the remote device for the port that the remote database server is\n * listening on for requests.\n */\nasync function getRemoteDBServerPort(deviceIp: ip.Address4) {\n const conn = new PromiseSocket(new Socket());\n await conn.connect(REMOTEDB_SERVER_QUERY_PORT, deviceIp.address);\n\n // Magic request packet asking the device to report it's remoteDB port\n const data = Buffer.from([\n ...[0x00, 0x00, 0x00, 0x0f],\n ...Buffer.from('RemoteDBServer', 'ascii'),\n 0x00,\n ]);\n\n await conn.write(data);\n const resp = await conn.read();\n\n if (typeof resp !== 'object') {\n throw new Error('Invalid response from remotedb');\n }\n\n if (resp.length !== 2) {\n throw new Error(`Expected 2 bytes, got ${resp.length}`);\n }\n\n return resp.readUInt16BE();\n}\n\n/**\n * Manages a connection to a single device\n */\nexport class Connection {\n #socket: PromiseSocket<Socket>;\n #txId = 0;\n #lock = new Mutex();\n\n device: Device;\n\n constructor(device: Device, socket: PromiseSocket<Socket>) {\n this.#socket = socket;\n this.device = device;\n }\n\n async writeMessage(message: Message, span: Span) {\n const tx = span.startChild({\n op: 'writeMessage',\n description: getMessageName(message.type),\n });\n\n message.transactionId = ++this.#txId;\n await this.#socket.write(message.buffer);\n tx.finish();\n }\n\n readMessage<T extends Response>(expect: T, span: Span) {\n return this.#lock.runExclusive(() => Message.fromStream(this.#socket, expect, span));\n }\n\n close() {\n this.#socket.destroy();\n }\n}\n\nexport class QueryInterface {\n #conn: Connection;\n #hostDevice: Device;\n #lock: Mutex;\n\n constructor(conn: Connection, lock: Mutex, hostDevice: Device) {\n this.#conn = conn;\n this.#lock = lock;\n this.#hostDevice = hostDevice;\n }\n\n /**\n * Make a query to the remote database connection.\n */\n async query<T extends Query>(opts: QueryOpts<T>): Promise<Await<HandlerReturn<T>>> {\n const {query, queryDescriptor, args, span} = opts;\n const conn = this.#conn;\n\n const queryName = getQueryName(opts.query);\n\n const tx = span\n ? span.startChild({op: 'remoteQuery', description: queryName})\n : Telemetry.startTransaction({name: 'remoteQuery', description: queryName});\n\n const lookupDescriptor: LookupDescriptor = {\n ...queryDescriptor,\n hostDevice: this.#hostDevice,\n targetDevice: this.#conn.device,\n };\n\n // TODO: Figure out why typescirpt can't understand our query type discriminate\n // for args here. The interface for this actual query function discrimites just\n // fine.\n const anyArgs = args as any;\n\n const handler = queryHandlers[query];\n\n const releaseLock = await this.#lock.acquire();\n try {\n const response = await handler({conn, lookupDescriptor, span: tx, args: anyArgs});\n tx.finish();\n return response as Await<HandlerReturn<T>>;\n } finally {\n releaseLock();\n }\n }\n}\n\n/**\n * Service that maintains remote database connections with devices on the network.\n */\nexport default class RemoteDatabase {\n #hostDevice: Device;\n #deviceManager: DeviceManager;\n\n /**\n * Active device connection map\n */\n #connections = new Map<DeviceID, Connection>();\n /**\n * Locks for each device when locating the connection\n */\n #deviceLocks = new Map<DeviceID, Mutex>();\n\n constructor(deviceManager: DeviceManager, hostDevice: Device) {\n this.#deviceManager = deviceManager;\n this.#hostDevice = hostDevice;\n }\n\n /**\n * Open a connection to the specified device for querying\n */\n connectToDevice = async (device: Device) => {\n const tx = Telemetry.startTransaction({name: 'connectRemotedb', data: {device}});\n\n const {ip} = device;\n\n const dbPort = await getRemoteDBServerPort(ip);\n\n const socket = new PromiseSocket(new Socket());\n\n // Set a connection timeout to prevent hanging forever\n (socket.stream as Socket).setTimeout(10_000);\n (socket.stream as Socket).once('timeout', () => {\n (socket.stream as Socket).destroy(\n new Error(`RemoteDB connection to ${ip.address}:${dbPort} timed out`)\n );\n });\n\n await socket.connect(dbPort, ip.address);\n\n // Send required preamble to open communications with the device\n const preamble = new UInt32(0x01);\n await socket.write(preamble.buffer);\n\n // Read the response. It should be a UInt32 field with the value 0x01.\n // There is some kind of problem if not.\n const data = await readField(socket, UInt32.type);\n\n if (data.value !== 0x01) {\n throw new Error(`Expected 0x01 during preamble handshake. Got ${data.value}`);\n }\n\n // Send introduction message to set context for querying\n const intro = new Message({\n transactionId: 0xfffffffe,\n type: MessageType.Introduce,\n args: [new UInt32(this.#hostDevice.id)],\n });\n\n await socket.write(intro.buffer);\n const resp = await Message.fromStream(socket, MessageType.Success, tx);\n\n if (resp.type !== MessageType.Success) {\n throw new Error(`Failed to introduce self to device ID: ${device.id}`);\n }\n\n // Clear socket timeout after successful connection — the per-device mutex\n // and application-level Promise.race timeouts handle query timeouts\n (socket.stream as Socket).setTimeout(0);\n\n this.#connections.set(device.id, new Connection(device, socket));\n tx.finish();\n };\n\n /**\n * Disconnect from the specified device\n */\n disconnectFromDevice = async (device: Device) => {\n const tx = Telemetry.startTransaction({name: 'disconnectFromDevice', data: {device}});\n\n const conn = this.#connections.get(device.id);\n\n if (conn === undefined) {\n return;\n }\n\n const goodbye = new Message({\n transactionId: 0xfffffffe,\n type: MessageType.Disconnect,\n args: [],\n });\n\n await conn.writeMessage(goodbye, tx);\n\n conn.close();\n this.#connections.delete(device.id);\n tx.finish();\n };\n\n /**\n * Gets the remote database query interface for the given device.\n *\n * If we have not already established a connection with the specified device,\n * we will attempt to first connect.\n *\n * @returns null if the device does not export a remote database service\n */\n async get(deviceId: DeviceID) {\n const device = this.#deviceManager.devices.get(deviceId);\n if (device === undefined) {\n return null;\n }\n\n const lock =\n this.#deviceLocks.get(device.id) ??\n this.#deviceLocks.set(device.id, new Mutex()).get(device.id)!;\n\n const releaseLock = await lock.acquire();\n\n try {\n let conn = this.#connections.get(deviceId);\n if (conn === undefined) {\n await this.connectToDevice(device);\n }\n\n conn = this.#connections.get(deviceId)!;\n\n // NOTE: We pass the same lock we use for this device to the query\n // interface to ensure all query interfaces use the same lock.\n\n return new QueryInterface(conn, lock, this.#hostDevice);\n } finally {\n releaseLock();\n }\n }\n}\n","import {TelemetrySpan as Span, SpanStatus} from 'src/utils/telemetry';\nimport {PromiseReadable} from 'promise-readable';\n\nimport {REMOTEDB_MAGIC} from 'src/remotedb/constants';\nimport {\n Binary,\n Field,\n FieldType,\n readField,\n UInt8,\n UInt16,\n UInt32,\n} from 'src/remotedb/fields';\nimport {responseTransform} from 'src/remotedb/message/response';\nimport {getMessageName, MessageType, Response} from 'src/remotedb/message/types';\n\n/**\n * Argument types are used in argument list fields. This is essentially\n * duplicating the field type, but has different values for whatever reason.\n *\n * There do not appear to be argument types for UInt8 and UInt16. At least, no\n * messages include these field types as arguments as far as we know.\n */\nenum ArgumentType {\n String = 0x02,\n Binary = 0x03,\n UInt32 = 0x06,\n}\n\n/**\n * The message argument list always contains 12 slots\n */\nconst ARG_COUNT = 12;\n\nconst fieldArgsMap = {\n [FieldType.UInt32]: ArgumentType.UInt32,\n [FieldType.String]: ArgumentType.String,\n [FieldType.Binary]: ArgumentType.Binary,\n\n // The following two field types do not have associated argument types (see\n // the note in ArgumentType), but we declare them here to make typescript happy\n // when mapping these values over.\n [FieldType.UInt8]: 0x00,\n [FieldType.UInt16]: 0x00,\n};\n\nconst argsFieldMap = {\n [ArgumentType.UInt32]: FieldType.UInt32,\n [ArgumentType.String]: FieldType.String,\n [ArgumentType.Binary]: FieldType.Binary,\n};\n\ninterface Options<T extends MessageType> {\n transactionId?: number;\n type: T;\n args: Field[];\n}\n\ntype ResponseType<T> = T extends Response ? T : never;\ntype Data<T> = ReturnType<(typeof responseTransform)[ResponseType<T>]>;\n\n/**\n * Representation of a set of fields sequenced into a known message format.\n */\nexport class Message<T extends MessageType = MessageType> {\n /**\n * Read a single mesasge via a readable stream\n */\n static async fromStream<T extends Response>(\n stream: PromiseReadable<any>,\n expect: T,\n span: Span\n ) {\n const tx = span.startChild({\n op: 'readFromStream',\n description: getMessageName(expect),\n });\n\n // 01. Read magic bytes\n const magicHeader = await readField(stream, FieldType.UInt32);\n\n if (magicHeader.value !== REMOTEDB_MAGIC) {\n throw new Error('Did not receive expected magic value. Corrupt message');\n }\n\n // 02. Read transaction ID\n const txId = await readField(stream, FieldType.UInt32);\n\n // 03. Read message type\n const messageType = await readField(stream, FieldType.UInt16);\n\n // 04. Read argument count\n const argCount = await readField(stream, FieldType.UInt8);\n\n // 05. Read argument list\n const argList = await readField(stream, FieldType.Binary);\n\n // 06. Read all argument fields in\n const args: Field[] = new Array(argCount.value);\n\n for (let i = 0; i < argCount.value; ++i) {\n // XXX: There is a small quirk in a few message response types that send\n // binary data, but if the binary data is empty the field will not\n // be sent.\n if (argList.value[i] === ArgumentType.Binary && args[i - 1]?.value === 0) {\n args[i] = new Binary(Buffer.alloc(0));\n continue;\n }\n\n args[i] = await readField(stream, argsFieldMap[argList.value[i] as ArgumentType]);\n }\n\n if (messageType.value !== expect) {\n const expected = expect.toString(16);\n const actual = messageType.value.toString(16);\n\n tx.setStatus(SpanStatus.FailedPrecondition);\n tx.finish();\n\n throw new Error(`Expected message type 0x${expected}, got 0x${actual}`);\n }\n\n tx.finish();\n\n return new Message({\n transactionId: txId.value,\n type: messageType.value as T,\n args,\n });\n }\n\n /**\n * The transaction ID is used to associate responses to their requests.\n */\n transactionId?: number;\n\n readonly type: T;\n readonly args: Field[];\n\n constructor({transactionId, type, args}: Options<T>) {\n this.transactionId = transactionId;\n this.type = type;\n this.args = args;\n }\n\n /**\n * The byte serialization of the message\n */\n get buffer() {\n // Determine the argument list from the list of fields\n const argList = Buffer.alloc(ARG_COUNT, 0x00);\n argList.set(this.args.map(arg => fieldArgsMap[arg.constructor.type]));\n\n // XXX: Following the parsing quirk for messages that contain binary data\n // but are _empty_, we check for binary fields with UInt32 fields\n // before with the value of 0 (indicating \"an empty binary field\").\n const args = this.args.reduce<Field[]>((args, arg, i) => {\n const prevArg = this.args[i - 1];\n\n const isEmptyBuffer =\n arg.constructor.type === FieldType.Binary &&\n i !== 0 &&\n prevArg.constructor.type === FieldType.UInt32 &&\n prevArg.value === 0;\n\n return isEmptyBuffer ? args : [...args, arg];\n }, []);\n\n const fields = [\n new UInt32(REMOTEDB_MAGIC),\n new UInt32(this.transactionId ?? 0),\n new UInt16(this.type),\n new UInt8(this.args.length),\n new Binary(argList),\n ...args,\n ];\n\n return Buffer.concat(fields.map(f => f.buffer));\n }\n\n /**\n * The JS representation of the message.\n *\n * Currently only supports representing response messages.\n */\n get data(): Data<T> {\n const type = this.type as ResponseType<T>;\n\n if (!Object.values(Response).includes(type)) {\n throw new Error('Representation of non-responses is not currently supported');\n }\n\n return responseTransform[type](this.args) as Data<T>;\n }\n}\n","import * as Telemetry from 'src/utils/telemetry';\n\nimport {Field, NumberField, StringField} from 'src/remotedb/fields';\n\n/**\n * Item types associated to the MenuItem message type.\n */\nexport enum ItemType {\n Path = 0x0000,\n Folder = 0x0001,\n AlbumTitle = 0x0002,\n Disc = 0x0003,\n TrackTitle = 0x0004,\n Genre = 0x0006,\n Artist = 0x0007,\n Playlist = 0x0008,\n Rating = 0x000a,\n Duration = 0x000b,\n Tempo = 0x000d,\n Label = 0x000e,\n Key = 0x000f,\n BitRate = 0x0010,\n Year = 0x0011,\n Comment = 0x0023,\n HistoryPlaylist = 0x0024,\n OriginalArtist = 0x0028,\n Remixer = 0x0029,\n DateAdded = 0x002e,\n Unknown01 = 0x002f,\n Unknown02 = 0x002a,\n\n ColorNone = 0x0013,\n ColorPink = 0x0014,\n ColorRed = 0x0015,\n ColorOrange = 0x0016,\n ColorYellow = 0x0017,\n ColorGreen = 0x0018,\n ColorAqua = 0x0019,\n ColorBlue = 0x001a,\n ColorPurple = 0x001b,\n\n MenuGenre = 0x0080,\n MenuArtist = 0x0081,\n MenuAlbum = 0x0082,\n MenuTrack = 0x0083,\n MenuPlaylist = 0x0084,\n MenuBPM = 0x0085,\n MenuRating = 0x0086,\n MenuYear = 0x0087,\n MenuRemixer = 0x0088,\n MenuLabel = 0x0089,\n MenuOriginal = 0x008a,\n MenuKey = 0x008b,\n MenuColor = 0x008e,\n MenuFolder = 0x0090,\n MenuSearch = 0x0091,\n MenuTime = 0x0092,\n MenuBit = 0x0093,\n MenuFilename = 0x0094,\n MenuHistory = 0x0095,\n MenuAll = 0x00a0,\n\n TrackTitleAlbum = 0x0204,\n TrackTitleGenre = 0x0604,\n TrackTitleArtist = 0x0704,\n TrackTitleRating = 0x0a04,\n TrackTitleTime = 0x0b04,\n TrackTitleBPM = 0x0d04,\n TrackTitleLabel = 0x0e04,\n TrackTitleKey = 0x0f04,\n TrackTitleBitRate = 0x1004,\n TrackTitleColor = 0x1a04,\n TrackTitleComment = 0x2304,\n TrackTitleOriginalArtist = 0x2804,\n TrackTitleRemixer = 0x2904,\n TrackTitleDJPlayCount = 0x2a04,\n MenuTrackTitleDateAdded = 0x2e04,\n}\n\n/**\n * All items have 12 arguments of these types\n */\ntype ItemArgs = [\n NumberField, // Parent ID, such as an artist for a track item.\n NumberField, // Main ID, such as rekordbox for a track item.\n NumberField, // Length in bytes of Label 1.\n StringField, // Label 1 main text\n NumberField, // Length in bytes of Label 2.\n StringField, // Label 2 (secondary text, e.g. artist name for playlist entries)\n NumberField<ItemType>,\n NumberField, // Some type of flags\n NumberField, // Only holds artwork ID?\n NumberField,\n NumberField,\n NumberField,\n];\n\n/**\n * Convert a message item argument lists to a structured intermediate object\n * for more clear access.\n */\nconst makeItemData = (args: ItemArgs) => ({\n parentId: args[0].value,\n mainId: args[1].value,\n label1: args[3].value,\n label2: args[5].value,\n type: args[6].value,\n artworkId: args[8].value,\n});\n\ntype ItemData = ReturnType<typeof makeItemData>;\n\n/**\n * Generic transformer for items that include just an id and label\n */\nconst mapIdName = (a: ItemData) => ({\n id: a.mainId,\n name: a.label1,\n});\n\n/**\n * Maps item types to structured objects\n */\nconst transformItem = {\n [ItemType.Path]: (a: ItemData) => ({path: a.label1}),\n [ItemType.TrackTitle]: (a: ItemData) => ({\n id: a.mainId,\n title: a.label1,\n artworkId: a.artworkId,\n }),\n [ItemType.AlbumTitle]: mapIdName,\n [ItemType.Artist]: mapIdName,\n [ItemType.Genre]: mapIdName,\n [ItemType.Label]: mapIdName,\n [ItemType.Key]: mapIdName,\n [ItemType.OriginalArtist]: mapIdName,\n [ItemType.Remixer]: mapIdName,\n [ItemType.BitRate]: (a: ItemData) => ({bitrate: a.mainId}),\n [ItemType.Comment]: (a: ItemData) => ({comment: a.label1}),\n [ItemType.Year]: (a: ItemData) => ({year: Number(a.label1)}),\n [ItemType.Rating]: (a: ItemData) => ({rating: a.mainId}),\n [ItemType.Tempo]: (a: ItemData) => ({bpm: a.mainId / 100}),\n [ItemType.Duration]: (a: ItemData) => ({duration: a.mainId}),\n [ItemType.Unknown01]: (_: ItemData) => null,\n [ItemType.Unknown02]: (_: ItemData) => null,\n\n [ItemType.ColorNone]: mapIdName,\n [ItemType.ColorPink]: mapIdName,\n [ItemType.ColorRed]: mapIdName,\n [ItemType.ColorOrange]: mapIdName,\n [ItemType.ColorYellow]: mapIdName,\n [ItemType.ColorGreen]: mapIdName,\n [ItemType.ColorAqua]: mapIdName,\n [ItemType.ColorBlue]: mapIdName,\n [ItemType.ColorPurple]: mapIdName,\n\n [ItemType.Folder]: mapIdName,\n [ItemType.Playlist]: mapIdName,\n\n // TODO: All of these item types are missing\n [ItemType.Disc]: (a: ItemData) => a,\n\n [ItemType.HistoryPlaylist]: (a: ItemData) => a,\n [ItemType.DateAdded]: (a: ItemData) => a,\n [ItemType.MenuGenre]: (a: ItemData) => a,\n [ItemType.MenuArtist]: (a: ItemData) => a,\n [ItemType.MenuAlbum]: (a: ItemData) => a,\n [ItemType.MenuTrack]: (a: ItemData) => a,\n [ItemType.MenuPlaylist]: (a: ItemData) => a,\n [ItemType.MenuBPM]: (a: ItemData) => a,\n [ItemType.MenuRating]: (a: ItemData) => a,\n [ItemType.MenuYear]: (a: ItemData) => a,\n [ItemType.MenuRemixer]: (a: ItemData) => a,\n [ItemType.MenuLabel]: (a: ItemData) => a,\n [ItemType.MenuOriginal]: (a: ItemData) => a,\n [ItemType.MenuKey]: (a: ItemData) => a,\n [ItemType.MenuColor]: (a: ItemData) => a,\n [ItemType.MenuFolder]: (a: ItemData) => a,\n [ItemType.MenuSearch]: (a: ItemData) => a,\n [ItemType.MenuTime]: (a: ItemData) => a,\n [ItemType.MenuBit]: (a: ItemData) => a,\n [ItemType.MenuFilename]: (a: ItemData) => a,\n [ItemType.MenuHistory]: (a: ItemData) => a,\n [ItemType.MenuAll]: (a: ItemData) => a,\n [ItemType.TrackTitleAlbum]: (a: ItemData) => a,\n [ItemType.TrackTitleGenre]: (a: ItemData) => a,\n [ItemType.TrackTitleArtist]: (a: ItemData) => a,\n [ItemType.TrackTitleRating]: (a: ItemData) => a,\n [ItemType.TrackTitleTime]: (a: ItemData) => a,\n [ItemType.TrackTitleBPM]: (a: ItemData) => a,\n [ItemType.TrackTitleLabel]: (a: ItemData) => a,\n [ItemType.TrackTitleKey]: (a: ItemData) => a,\n [ItemType.TrackTitleBitRate]: (a: ItemData) => a,\n [ItemType.TrackTitleColor]: (a: ItemData) => a,\n [ItemType.TrackTitleComment]: (a: ItemData) => a,\n [ItemType.TrackTitleOriginalArtist]: (a: ItemData) => a,\n [ItemType.TrackTitleRemixer]: (a: ItemData) => a,\n [ItemType.TrackTitleDJPlayCount]: (a: ItemData) => a,\n [ItemType.MenuTrackTitleDateAdded]: (a: ItemData) => a,\n};\n\n/**\n * Represents a generic Item, specialized to a specific item by providing a\n * ItemType to the template.\n */\nexport type Item<T extends ItemType> = ReturnType<(typeof transformItem)[T]> & {type: T};\n\n/**\n * Maps ItemTypes to Items\n */\nexport type Items = {\n [T in keyof typeof transformItem]: Item<T>;\n};\n\n/**\n * Translate a list of fields for an item response into a structure object,\n * making items more clear to work with.\n */\nexport const fieldsToItem = (args: Field[]) => {\n const itemData = makeItemData(args as ItemArgs);\n const {type} = itemData;\n\n let transformer = transformItem[type];\n\n // Typescript gives us safety, but it is possible there is an itemType we're\n // not aware of yet.\n if (transformer === undefined) {\n transformer = () => null;\n\n Telemetry.captureMessage(\n `No item transformer registered for item type ${type}`,\n Telemetry.Severity.Error\n );\n }\n\n return {...transformer(itemData), type} as Items[ItemType];\n};\n","import {makeCueLoopEntry} from 'src/localdb/utils';\nimport {Field} from 'src/remotedb/fields';\nimport {fieldsToItem} from 'src/remotedb/message/item';\nimport {Response} from 'src/remotedb/message/types';\nimport {\n BeatGrid,\n CueAndLoop,\n HotcueButton,\n WaveformDetailed,\n WaveformHD,\n WaveformPreview,\n} from 'src/types';\nimport {\n convertWaveformHDData,\n extractBitMask,\n extractColor,\n makeOffsetArray,\n} from 'src/utils/converters';\n\n/**\n * Generic null converter, for responses with no data.\n */\nconst nullConverter = (_args: Field[]) => null;\n\n/**\n * Converts setup success messages, which primarily includes the number of\n * items available upon the next request.\n */\nconst convertSuccess = (args: Field[]) => ({\n itemsAvailable: args[1].value as number,\n});\n\n/**\n * Converts artwork to a buffer. Will be mempty for empty artwork\n */\nconst convertArtwork = (args: Field[]) => args[3].value as Buffer;\n\n/**\n * Converts the beat grid binary response to a BeatGrid array.\n */\nconst convertBeatGrid = (args: Field[]): BeatGrid => {\n const BEATGRID_START = 0x14;\n const data = (args[3].value as Buffer).slice(BEATGRID_START);\n\n type Count = BeatGrid[number]['count'];\n\n return makeOffsetArray(data.length, 0x10).map(byteOffset => ({\n offset: data.readUInt32LE(byteOffset + 4),\n bpm: data.readUInt16LE(byteOffset + 2) / 100,\n count: data[byteOffset] as Count,\n }));\n};\n\n/**\n * Converts preview waveform data\n */\nconst convertWaveformPreview = (args: Field[]): WaveformPreview => {\n const data = args[3].value as Buffer;\n\n // TODO: The last 100 bytes in the data array is a tiny waveform preview\n const PREVIEW_DATA_LEN = 800;\n\n return makeOffsetArray(PREVIEW_DATA_LEN, 0x02).map(byteOffset => ({\n height: data[byteOffset],\n whiteness: data[byteOffset + 1] / 7,\n }));\n};\n\n/**\n * Converts detailed waveform data.\n */\nconst convertWaveformDetailed = (args: Field[]): WaveformDetailed => {\n const data = args[3].value as Buffer;\n\n // Every byte represents one segment of the waveform, and there are 150\n // segments per second of audio. (These seem to correspond to 'half frames'\n // following the seconds in the player display.) Each byte encodes both a\n // color and height.\n //\n // | 7 6 5 | 4 3 2 1 0 |\n // [ whiteness | height ]\n const whitenessMask = 0b11100000; // prettier-ignore\n const heightMask = 0b00011111; // prettier-ignore\n\n return Array.from(data).map(b => ({\n height: extractBitMask(b, heightMask),\n whiteness: extractColor(b, whitenessMask),\n }));\n};\n\n/**\n * Converts HD waveform data.\n */\nconst convertWaveformHD = (args: Field[]): WaveformHD => {\n // TODO: Verify this 0x34 offset is correct\n const WAVEFORM_START = 0x34;\n const data = (args[3].value as Buffer).slice(WAVEFORM_START);\n\n // TODO: This response is also used for the HD waveform previews, however\n // those have a much more complex data structure.\n\n return convertWaveformHDData(data);\n};\n\n/**\n * Converts old-style cue / loop / hotcue / hotloop data.\n */\nconst convertCueAndLoops = (args: Field[]): CueAndLoop[] => {\n const data = args[3].value as Buffer;\n\n return makeOffsetArray(data.length, 0x24)\n .map(byteOffset => {\n const entry = data.slice(byteOffset, byteOffset + 0x24);\n\n const isLoop = !!entry[0];\n const isCue = !!entry[1];\n const button = entry[2] === 0 ? false : (entry[2] as HotcueButton);\n\n const offsetInFrames = entry.readUInt32LE(0x0c);\n const lengthInFrames = entry.readUInt32LE(0x10) - offsetInFrames;\n\n // NOTE: The offset and length are reported as 1/150th second increments.\n // We convert these to milliseconds here.\n const offset = (offsetInFrames / 150) * 1000;\n const length = (lengthInFrames / 150) * 1000;\n\n return makeCueLoopEntry(isCue, isLoop, offset, length, button);\n })\n .filter((c): c is CueAndLoop => c !== null);\n};\n\n/**\n * Converts new-style cue / loop / hotcue / hotloop data, including labels and\n * colors.\n */\nconst convertAdvCueAndLoops = (args: Field[]): CueAndLoop[] => {\n const data = args[3].value as Buffer;\n const entries = [];\n\n for (let offset = 0; offset < data.length; ) {\n const length = data.readUInt32LE(offset);\n entries.push(data.slice(offset, offset + length));\n offset += length;\n }\n\n return entries\n .map(entry => {\n // Deleted cue point\n if (entry[6] === 0x00) {\n return null;\n }\n\n // The layout here is minorly different from the basic cue and loops,\n // so we unfortunately cannot reuse that logic.\n const button = entry[4] === 0 ? false : (entry[4] as HotcueButton);\n const isCue = entry[6] === 0x01;\n const isLoop = entry[6] === 0x02;\n\n const offsetInFrames = entry.readUInt32LE(0x0c);\n const lengthInFrames = entry.readUInt32LE(0x10) - offsetInFrames;\n\n // NOTE: The offset and length are reported as 1/150th second increments.\n // We convert these to milliseconds here.\n const offset = (offsetInFrames / 150) * 1000;\n const length = (lengthInFrames / 150) * 1000;\n\n const basicEntry = makeCueLoopEntry(isCue, isLoop, offset, length, button);\n\n // It seems the label may not always be included, if the entry is only 0x38\n // bytes long, exclude color and comment\n if (entry.length === 0x38) {\n return basicEntry;\n }\n\n const labelByteLength = entry.readUInt16LE(0x48);\n const label = entry\n .slice(0x4a, 0x4a + labelByteLength)\n .slice(0, -2)\n .toString('utf16le');\n\n const color = entry[0x4a + labelByteLength + 0x04];\n\n return {...basicEntry, color, label};\n })\n .filter((c): c is CueAndLoop => c !== null);\n};\n\nexport const responseTransform = {\n [Response.Success]: convertSuccess,\n [Response.Error]: nullConverter,\n [Response.MenuHeader]: nullConverter,\n [Response.MenuFooter]: nullConverter,\n\n [Response.MenuItem]: fieldsToItem,\n [Response.Artwork]: convertArtwork,\n [Response.BeatGrid]: convertBeatGrid,\n [Response.CueAndLoop]: convertCueAndLoops,\n [Response.WaveformPreview]: convertWaveformPreview,\n [Response.WaveformDetailed]: convertWaveformDetailed,\n [Response.WaveformHD]: convertWaveformHD,\n [Response.AdvCueAndLoops]: convertAdvCueAndLoops,\n} as const;\n","/**\n * Used for control messages with the remote database\n */\nexport enum ControlRequest {\n Introduce = 0x0000,\n Disconnect = 0x0100,\n RenderMenu = 0x3000,\n}\n\n/**\n * Used to setup renders for specific Menus\n */\nexport enum MenuRequest {\n MenuRoot = 0x1000,\n MenuGenre = 0x1001,\n MenuArtist = 0x1002,\n MenuAlbum = 0x1003,\n MenuTrack = 0x1004,\n MenuBPM = 0x1006,\n MenuRating = 0x1007,\n MenuYear = 0x1008,\n MenuLabel = 0x100a,\n MenuColor = 0x100d,\n MenuTime = 0x1010,\n MenuBitrate = 0x1011,\n MenuHistory = 0x1012,\n MenuFilename = 0x1013,\n MenuKey = 0x1014,\n MenuOriginalArtist = 0x1302,\n MenuRemixer = 0x1602,\n MenuPlaylist = 0x1105,\n MenuArtistsOfGenre = 0x1101,\n MenuAlbumsOfArtist = 0x1102,\n MenuTracksOfAlbum = 0x1103,\n MenuTracksOfRating = 0x1107,\n MenuYearsOfDecade = 0x1108,\n MenuArtistsOfLabel = 0x110a,\n MenuTracksOfColor = 0x110d,\n MenuTracksOfTime = 0x1110,\n MenuTracksOfHistory = 0x1112,\n MenuDistancesOfKey = 0x1114,\n MenuAlbumsOfOriginalArtist = 0x1402,\n MenuAlbumsOfRemixer = 0x1702,\n MenuAlbumsOfGenreAndArtist = 0x1201,\n MenuTracksOfArtistAndAlbum = 0x1202,\n MenuTracksOfBPMPercentRange = 0x1206,\n MenuTracksOfDecadeAndYear = 0x1208,\n MenuAlbumsOfLabelAndArtist = 0x120a,\n MenuTracksNearKey = 0x1214,\n MenuTracksOfOriginalArtistAndAlbum = 0x1502,\n MenuTracksOfRemixerAndAlbum = 0x1802,\n MenuTracksOfGenreArtistAndAlbum = 0x1301,\n MenuTracksOfLabelArtistAndAlbum = 0x130a,\n MenuSearch = 0x1300,\n MenuFolder = 0x2006,\n}\n\n/**\n * Request message types used to obtain specfiic track information\n */\nexport enum DataRequest {\n GetMetadata = 0x2002,\n GetArtwork = 0x2003,\n GetWaveformPreview = 0x2004,\n GetTrackInfo = 0x2102,\n GetGenericMetadata = 0x2202,\n GetCueAndLoops = 0x2104,\n GetBeatGrid = 0x2204,\n GetWaveformDetailed = 0x2904,\n GetAdvCueAndLoops = 0x2b04,\n GetWaveformHD = 0x2c04,\n}\n\n/**\n * Response message types for messages sent back by the server.\n */\nexport enum Response {\n Success = 0x4000,\n Error = 0x4003,\n Artwork = 0x4002,\n MenuItem = 0x4101,\n MenuHeader = 0x4001,\n MenuFooter = 0x4201,\n BeatGrid = 0x4602,\n CueAndLoop = 0x4702,\n WaveformPreview = 0x4402,\n WaveformDetailed = 0x4a02,\n AdvCueAndLoops = 0x4e02,\n WaveformHD = 0x4f02,\n}\n\n/**\n * Request message types, only sent to the device.\n */\nexport type Request = ControlRequest | MenuRequest | DataRequest;\n\nexport const Request = {\n ...ControlRequest,\n ...MenuRequest,\n ...DataRequest,\n} as const;\n\n/**\n * All Known message types. These are used for both request and response messages.\n */\nexport type MessageType = ControlRequest | MenuRequest | DataRequest | Response;\n\nexport const MessageType = {\n ...ControlRequest,\n ...MenuRequest,\n ...DataRequest,\n ...Response,\n} as const;\n\nconst MessageTypeInverse = Object.fromEntries(\n Object.entries(MessageType).map(e => [e[1], e[0]])\n);\n\n/**\n * Returns a string representation of a message type\n */\nexport function getMessageName(type: MessageType) {\n return MessageTypeInverse[type];\n}\n","import * as entities from 'src/entities';\nimport {TelemetrySpan as Span} from 'src/utils/telemetry';\n\nimport {Item, Items, ItemType} from './message/item';\nimport {Request, Response} from './message/types';\nimport {Binary, UInt32} from './fields';\nimport {Message} from './message';\nimport {fieldFromDescriptor, findColor, renderItems} from './utils';\nimport {Connection, LookupDescriptor, Query} from '.';\n\n/**\n * This module contains logic for each type of query to understand what\n * arguments are required, and how to transform the resulting Items into\n * something useful.\n */\n\ninterface HandlerOpts<A extends Record<string, unknown> = Record<string, unknown>> {\n conn: Connection;\n lookupDescriptor: LookupDescriptor;\n span: Span;\n args: A;\n}\n\n// Track lookups are so common that we specify an alias specifically for track\n// lookup query options.\n\ntype TrackQueryOpts = HandlerOpts<{\n /**\n * The ID of the track to query for\n */\n trackId: number;\n}>;\n\n/**\n * Lookup track metadata from rekordbox and coerce it into a Track entity\n */\nasync function getMetadata(opts: TrackQueryOpts) {\n const {conn, lookupDescriptor, span, args} = opts;\n const {trackId} = args;\n\n const request = new Message({\n type: Request.GetMetadata,\n args: [fieldFromDescriptor(lookupDescriptor), new UInt32(trackId)],\n });\n\n await conn.writeMessage(request, span);\n const resp = await conn.readMessage(Response.Success, span);\n\n // We'll get back these specific items when rendering out the items\n //\n // NOTE: We actually also get back a color, but we'll find that one later,\n // since each color is it's own item type.\n type MetadataItems =\n | ItemType.AlbumTitle\n | ItemType.TrackTitle\n | ItemType.Genre\n | ItemType.Artist\n | ItemType.Rating\n | ItemType.Duration\n | ItemType.Tempo\n | ItemType.Label\n | ItemType.Key\n | ItemType.Comment\n | ItemType.BitRate\n | ItemType.Remixer\n | ItemType.Year\n | ItemType.OriginalArtist;\n\n const items = renderItems<MetadataItems>(\n conn,\n lookupDescriptor,\n resp.data.itemsAvailable,\n span\n );\n\n // NOTE: We do a bit of any-ing here to help typescript understand we're\n // discriminating the type by our object key\n const trackItems: Pick<Items, MetadataItems> = {} as any;\n for await (const item of items) {\n trackItems[item.type] = item as any;\n }\n\n // Translate our trackItems into a (partial) Track entity.\n // Use optional chaining for all fields since streaming tracks may omit some.\n const track: entities.Track = {\n id: trackItems[ItemType.TrackTitle]?.id ?? 0,\n title: trackItems[ItemType.TrackTitle]?.title ?? '',\n duration: trackItems[ItemType.Duration]?.duration ?? 0,\n tempo: trackItems[ItemType.Tempo]?.bpm ?? 0,\n comment: trackItems[ItemType.Comment]?.comment ?? '',\n rating: trackItems[ItemType.Rating]?.rating ?? 0,\n year: trackItems?.[ItemType.Year]?.year,\n bitrate: trackItems?.[ItemType.BitRate]?.bitrate,\n\n artwork: {id: trackItems[ItemType.TrackTitle]?.artworkId ?? 0},\n album: trackItems[ItemType.AlbumTitle] ?? null,\n artist: trackItems[ItemType.Artist] ?? null,\n genre: trackItems[ItemType.Genre] ?? null,\n key: trackItems[ItemType.Key] ?? null,\n color: findColor(Object.values(trackItems)) ?? null,\n label: trackItems[ItemType.Label] ?? null,\n remixer: trackItems?.[ItemType.Remixer] ?? null,\n originalArtist: trackItems?.[ItemType.OriginalArtist] ?? null,\n composer: null,\n\n fileName: '',\n filePath: '',\n\n beatGrid: null,\n cueAndLoops: null,\n waveformHd: null,\n };\n\n return track;\n}\n\n/**\n * Lookup generic metadata for an unanalyzed track\n */\nasync function getGenericMetadata(opts: TrackQueryOpts) {\n const {conn, lookupDescriptor, span, args} = opts;\n const {trackId} = args;\n\n const request = new Message({\n type: Request.GetGenericMetadata,\n args: [fieldFromDescriptor(lookupDescriptor), new UInt32(trackId)],\n });\n\n await conn.writeMessage(request, span);\n const resp = await conn.readMessage(Response.Success, span);\n\n // NOTE: We actually also get back a color, but we'll find that one later,\n // since each color is it's own item type.\n type GenericMetadataItems =\n | ItemType.AlbumTitle\n | ItemType.TrackTitle\n | ItemType.Genre\n | ItemType.Artist\n | ItemType.Rating\n | ItemType.Duration\n | ItemType.Tempo\n | ItemType.BitRate\n | ItemType.Comment;\n\n const items = renderItems<GenericMetadataItems>(\n conn,\n lookupDescriptor,\n resp.data.itemsAvailable,\n span\n );\n\n // NOTE: We do a bit of any-ing here to help typescript understand we're\n // discriminating the type by our object key\n const fileItems: Pick<Items, GenericMetadataItems> = {} as any;\n for await (const item of items) {\n fileItems[item.type] = item as any;\n }\n\n // Translate our fileItems into a (partial) Track entity.\n const track: entities.Track = {\n id: fileItems[ItemType.TrackTitle].id,\n title: fileItems[ItemType.TrackTitle].title,\n duration: fileItems[ItemType.Duration].duration,\n tempo: fileItems[ItemType.Tempo].bpm,\n comment: fileItems[ItemType.Comment].comment,\n rating: fileItems[ItemType.Rating].rating,\n bitrate: fileItems[ItemType.BitRate].bitrate,\n\n artwork: {id: fileItems[ItemType.TrackTitle].artworkId},\n album: fileItems?.[ItemType.AlbumTitle],\n artist: fileItems[ItemType.Artist],\n genre: fileItems[ItemType.Genre],\n color: findColor(Object.values(fileItems))!,\n\n fileName: '',\n filePath: '',\n\n key: null,\n label: null,\n remixer: null,\n originalArtist: null,\n composer: null,\n\n beatGrid: null,\n cueAndLoops: null,\n waveformHd: null,\n };\n\n return track;\n}\n\n/**\n * Lookup the artwork image given the artworkId obtained from a track\n */\nasync function getArtwork(opts: HandlerOpts<{artworkId: number}>) {\n const {conn, lookupDescriptor, span, args} = opts;\n const {artworkId} = args;\n\n const request = new Message({\n type: Request.GetArtwork,\n args: [fieldFromDescriptor(lookupDescriptor), new UInt32(artworkId)],\n });\n\n await conn.writeMessage(request, span);\n const art = await conn.readMessage(Response.Artwork, span);\n\n return art.data;\n}\n\n/**\n * Lookup the beatgrid for the specified trackId\n */\nasync function getBeatgrid(opts: TrackQueryOpts) {\n const {conn, lookupDescriptor, span, args} = opts;\n const {trackId} = args;\n\n const request = new Message({\n type: Request.GetBeatGrid,\n args: [fieldFromDescriptor(lookupDescriptor), new UInt32(trackId)],\n });\n\n await conn.writeMessage(request, span);\n const grid = await conn.readMessage(Response.BeatGrid, span);\n\n return grid.data;\n}\n\n/**\n * Lookup the waveform preview for the specified trackId\n */\nasync function getWaveformPreview(opts: TrackQueryOpts) {\n const {conn, lookupDescriptor, span, args} = opts;\n const {trackId} = args;\n\n const request = new Message({\n type: Request.GetWaveformPreview,\n args: [\n fieldFromDescriptor(lookupDescriptor),\n new UInt32(0),\n new UInt32(trackId),\n new UInt32(0),\n new Binary(Buffer.alloc(0)),\n ],\n });\n\n await conn.writeMessage(request, span);\n const waveformPreview = await conn.readMessage(Response.WaveformPreview, span);\n\n return waveformPreview.data;\n}\n\n/**\n * Lookup the detailed waveform for the specified trackId\n */\nasync function getWaveformDetailed(opts: TrackQueryOpts) {\n const {conn, lookupDescriptor, span, args} = opts;\n const {trackId} = args;\n\n const request = new Message({\n type: Request.GetWaveformDetailed,\n args: [fieldFromDescriptor(lookupDescriptor), new UInt32(trackId), new UInt32(0)],\n });\n\n await conn.writeMessage(request, span);\n const waveformDetailed = await conn.readMessage(Response.WaveformDetailed, span);\n\n return waveformDetailed.data;\n}\n\n/**\n * Lookup the HD (nexus2) waveform for the specified trackId\n */\nasync function getWaveformHD(opts: TrackQueryOpts) {\n const {conn, lookupDescriptor, span, args} = opts;\n const {trackId} = args;\n\n const request = new Message({\n type: Request.GetWaveformHD,\n args: [\n fieldFromDescriptor(lookupDescriptor),\n new UInt32(trackId),\n new UInt32(Buffer.from('PWV5').readUInt32LE()),\n new UInt32(Buffer.from('EXT\\0').readUInt32LE()),\n ],\n });\n\n await conn.writeMessage(request, span);\n const waveformHD = await conn.readMessage(Response.WaveformHD, span);\n\n return waveformHD.data;\n}\n\n/**\n * Lookup the [hot]cue points and [hot]loops for a track\n */\nasync function getCueAndLoops(opts: TrackQueryOpts) {\n const {conn, lookupDescriptor, span, args} = opts;\n const {trackId} = args;\n\n const request = new Message({\n type: Request.GetCueAndLoops,\n args: [fieldFromDescriptor(lookupDescriptor), new UInt32(trackId)],\n });\n\n await conn.writeMessage(request, span);\n const cueAndLoops = await conn.readMessage(Response.CueAndLoop, span);\n\n return cueAndLoops.data;\n}\n\n/**\n * Lookup the \"advanced\" (nexus2) [hot]cue points and [hot]loops for a track\n */\nasync function getCueAndLoopsAdv(opts: TrackQueryOpts) {\n const {conn, lookupDescriptor, span, args} = opts;\n const {trackId} = args;\n\n const request = new Message({\n type: Request.GetAdvCueAndLoops,\n args: [fieldFromDescriptor(lookupDescriptor), new UInt32(trackId), new UInt32(0)],\n });\n\n await conn.writeMessage(request, span);\n const advCueAndLoops = await conn.readMessage(Response.AdvCueAndLoops, span);\n\n return advCueAndLoops.data;\n}\n\n/**\n * Lookup the track information, currently just returns the track path\n */\nasync function getTrackInfo(opts: TrackQueryOpts) {\n const {conn, lookupDescriptor, span, args} = opts;\n const {trackId} = args;\n\n const request = new Message({\n type: Request.GetTrackInfo,\n args: [fieldFromDescriptor(lookupDescriptor), new UInt32(trackId)],\n });\n\n await conn.writeMessage(request, span);\n const resp = await conn.readMessage(Response.Success, span);\n\n type TrackInfoItems =\n | ItemType.TrackTitle\n | ItemType.Path\n | ItemType.Duration\n | ItemType.Tempo\n | ItemType.Comment\n | ItemType.Unknown01;\n\n const items = renderItems<TrackInfoItems>(\n conn,\n lookupDescriptor,\n resp.data.itemsAvailable,\n span\n );\n\n const infoItems: Pick<Items, TrackInfoItems> = {} as any;\n for await (const item of items) {\n infoItems[item.type] = item as any;\n }\n\n return infoItems[ItemType.Path].path;\n}\n\ntype PlaylistQueryOpts = HandlerOpts<{\n /**\n * The ID of the playlist to query for. May be left blank to query the root\n * playlist folder.\n */\n id?: number;\n /**\n * When querying for a playlist folder this must be true.\n */\n isFolderRequest: boolean;\n}>;\n\n/**\n * Lookup playlist entries\n */\nasync function getPlaylist(opts: PlaylistQueryOpts) {\n const {conn, lookupDescriptor, span, args} = opts;\n\n // XXX: The or operator is correct here to coerece `0` into null to keep a\n // consistent representation of parentId.\n const parentId = args.id || null;\n\n // TODO: Maybe sort could become a parameter\n const sort = new UInt32(0);\n const id = new UInt32(parentId ?? 0);\n const isFolder = new UInt32(args.isFolderRequest ? 0x1 : 0x0);\n\n const request = new Message({\n type: Request.MenuPlaylist,\n args: [fieldFromDescriptor(lookupDescriptor), sort, id, isFolder],\n });\n\n await conn.writeMessage(request, span);\n const resp = await conn.readMessage(Response.Success, span);\n\n type PlaylistItemTypes = ItemType.Folder | ItemType.Playlist | ItemType.TrackTitle;\n\n const items = renderItems<PlaylistItemTypes>(\n conn,\n lookupDescriptor,\n resp.data.itemsAvailable,\n span\n );\n\n const playlistItems: Array<Item<PlaylistItemTypes>> = [];\n for await (const item of items) {\n playlistItems.push(item);\n }\n\n const folders: entities.Playlist[] = (playlistItems as Array<Item<ItemType.Folder>>)\n .filter(item => item.type === ItemType.Folder)\n .map(({id, name}) => ({isFolder: true, id, name, parentId}));\n\n const playlists: entities.Playlist[] = (playlistItems as Array<Item<ItemType.Playlist>>)\n .filter(item => item.type === ItemType.Playlist)\n .map(({id, name}) => ({isFolder: false, id, name, parentId}));\n\n const trackEntries = (playlistItems as Array<Item<ItemType.TrackTitle>>).filter(\n item => item.type === ItemType.TrackTitle\n );\n\n return {folders, playlists, trackEntries};\n}\n\nexport const queryHandlers = {\n [Request.GetMetadata]: getMetadata,\n [Request.GetArtwork]: getArtwork,\n [Request.GetWaveformPreview]: getWaveformPreview,\n [Request.GetTrackInfo]: getTrackInfo,\n [Request.GetGenericMetadata]: getGenericMetadata,\n [Request.GetCueAndLoops]: getCueAndLoops,\n [Request.GetBeatGrid]: getBeatgrid,\n [Request.GetWaveformDetailed]: getWaveformDetailed,\n [Request.GetAdvCueAndLoops]: getCueAndLoopsAdv,\n [Request.GetWaveformHD]: getWaveformHD,\n [Request.MenuPlaylist]: getPlaylist,\n\n // TODO: Add queries for all different kinds of menu requests\n};\n\nexport type Handler<T extends Query> = (typeof queryHandlers)[T];\n\nexport type HandlerArgs<T extends Query> = Parameters<Handler<T>>[0]['args'];\nexport type HandlerReturn<T extends Query> = ReturnType<Handler<T>>;\n","import {TelemetrySpan as Span} from 'src/utils/telemetry';\n\nimport {Items, ItemType} from './message/item';\nimport {MessageType} from './message/types';\nimport {UInt32} from './fields';\nimport {Message} from './message';\nimport {Connection, LookupDescriptor} from '.';\n\n/**\n * Specifies the number of items we should request at a time in menu render\n * requests.\n */\nconst LIMIT = 64;\n\nexport const fieldFromDescriptor = ({\n hostDevice,\n menuTarget,\n trackSlot,\n trackType,\n}: LookupDescriptor) =>\n new UInt32(Buffer.of(hostDevice.id, menuTarget, trackSlot, trackType));\n\nexport const makeRenderMessage = (\n descriptor: LookupDescriptor,\n offset: number,\n count: number,\n total: number\n) =>\n new Message({\n type: MessageType.RenderMenu,\n args: [\n fieldFromDescriptor(descriptor),\n new UInt32(offset),\n new UInt32(count),\n new UInt32(0),\n new UInt32(total),\n new UInt32(0x0c),\n ],\n });\n\n/**\n * Async generator to page through menu results after a successful lookup\n * request.\n */\nexport async function* renderItems<T extends ItemType = ItemType>(\n conn: Connection,\n descriptor: LookupDescriptor,\n total: number,\n span: Span\n) {\n let itemsRead = 0;\n\n while (itemsRead < total) {\n // Request another page of items\n if (itemsRead % LIMIT === 0) {\n // XXX: itemsRead + count should NOT exceed the total. A larger value\n // will push the offset back to accommodate for the extra items, ensuring\n // we always receive count items.\n const count = Math.min(LIMIT, total - itemsRead);\n const message = makeRenderMessage(descriptor, itemsRead, count, total);\n\n await conn.writeMessage(message, span);\n await conn.readMessage(MessageType.MenuHeader, span);\n }\n\n // Read each item. Ignoring headers and footers, we will determine when to\n // stop by counting the items read until we reach the total items.\n const resp = await conn.readMessage(MessageType.MenuItem, span);\n\n yield resp.data as Items[T];\n itemsRead++;\n\n // When we've reached the end of a page we must read the footer\n if (itemsRead % LIMIT === 0 || itemsRead === total) {\n await conn.readMessage(MessageType.MenuFooter, span);\n }\n }\n}\n\nconst colors = [\n ItemType.ColorNone,\n ItemType.ColorPink,\n ItemType.ColorRed,\n ItemType.ColorOrange,\n ItemType.ColorYellow,\n ItemType.ColorGreen,\n ItemType.ColorAqua,\n ItemType.ColorBlue,\n ItemType.ColorPurple,\n] as const;\n\nconst colorSet = new Set(colors);\n\ntype ColorType = (typeof colors)[number];\n\n/**\n * Locate the color item in an item list\n */\nexport const findColor = (items: Array<Items[ItemType]>) =>\n items.filter(item => colorSet.has(item.type as any)).pop() as Items[ColorType];\n","import {Mutex} from 'async-mutex';\nimport StrictEventEmitter from 'strict-event-emitter-types';\n\nimport {Socket} from 'dgram';\nimport {EventEmitter} from 'events';\n\nimport {STATUS_PORT} from 'src/constants';\nimport {CDJStatus, MediaSlotInfo} from 'src/types';\nimport {udpSend} from 'src/utils/udp';\n\nimport {makeMediaSlotRequest} from './media';\nimport {mediaSlotFromPacket, onAirFromPacket, statusFromPacket} from './utils';\n\ninterface StatusEvents {\n /**\n * Fired each time the CDJ reports its status\n */\n status: (status: CDJStatus.State) => void;\n /**\n * Fired when the CDJ reports its media slot status\n */\n mediaSlot: (info: MediaSlotInfo) => void;\n /**\n * Fired when the mixer broadcasts on-air channel status\n */\n onAir: (status: CDJStatus.OnAirStatus) => void;\n}\n\ntype Emitter = StrictEventEmitter<EventEmitter, StatusEvents>;\n\ntype MediaSlotOptions = Parameters<typeof makeMediaSlotRequest>[0];\n\n/**\n * The status emitter will report every time a device status is received\n */\nclass StatusEmitter {\n #statusSocket: Socket;\n /**\n * The EventEmitter which reports the device status\n */\n #emitter: Emitter = new EventEmitter();\n /**\n * Lock used to avoid media slot query races\n */\n #mediaSlotQueryLock = new Mutex();\n\n /**\n * @param statusSocket A UDP socket to receive CDJ status packets on\n */\n constructor(statusSocket: Socket) {\n this.#statusSocket = statusSocket;\n statusSocket.on('message', this.#handleStatus);\n }\n\n // Bind public event emitter interface\n on: Emitter['on'] = this.#emitter.addListener.bind(this.#emitter);\n off: Emitter['off'] = this.#emitter.removeListener.bind(this.#emitter);\n once: Emitter['once'] = this.#emitter.once.bind(this.#emitter);\n\n #handleStatus = (message: Buffer) => {\n const status = statusFromPacket(message);\n\n if (status !== undefined) {\n return this.#emitter.emit('status', status);\n }\n\n // Media slot status is also reported on this socket\n const mediaSlot = mediaSlotFromPacket(message);\n\n if (mediaSlot !== undefined) {\n return this.#emitter.emit('mediaSlot', mediaSlot);\n }\n\n // On-air status from mixer is also reported on this socket\n const onAir = onAirFromPacket(message);\n\n if (onAir !== undefined) {\n return this.#emitter.emit('onAir', onAir);\n }\n\n return undefined;\n };\n\n /**\n * Retrieve media slot status information.\n */\n async queryMediaSlot(options: MediaSlotOptions) {\n const request = makeMediaSlotRequest(options);\n\n const media = await this.#mediaSlotQueryLock.runExclusive(async () => {\n await udpSend(this.#statusSocket, request, STATUS_PORT, options.device.ip.address);\n\n return new Promise<MediaSlotInfo>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.off('mediaSlot', handler);\n reject(\n new Error(\n `Timeout waiting for media slot response from device ${options.device.id}`\n )\n );\n }, 10000);\n\n const handler = (info: MediaSlotInfo) => {\n // Only resolve if this is for our device and slot\n if (info.deviceId === options.device.id && info.slot === options.slot) {\n clearTimeout(timeout);\n resolve(info);\n } else {\n // Re-register for the next event\n this.once('mediaSlot', handler);\n }\n };\n\n this.once('mediaSlot', handler);\n });\n });\n\n return media;\n }\n}\n\nexport default StatusEmitter;\n","import {PROLINK_HEADER} from 'src/constants';\nimport {Device, MediaSlot} from 'src/types';\nimport {buildName} from 'src/utils';\n\ninterface Options {\n /**\n * The device asking for media info\n */\n hostDevice: Device;\n /**\n * The target device. This is the device we'll be querying for details of\n * it's media slot.\n */\n device: Device;\n /**\n * The specific slot\n */\n slot: MediaSlot;\n}\n\n/**\n * Get information about the media connected to the specified slot on the\n * device.\n */\nexport const makeMediaSlotRequest = ({hostDevice, device, slot}: Options) =>\n Uint8Array.from([\n ...PROLINK_HEADER,\n ...[0x05],\n ...buildName(hostDevice),\n ...[0x01, 0x00],\n ...[hostDevice.id],\n ...[0x00, 0x0c],\n ...hostDevice.ip.toArray(),\n ...[0x00, 0x00, 0x00, device.id],\n ...[0x00, 0x00, 0x00, slot],\n ]);\n","import StrictEventEmitter from 'strict-event-emitter-types';\n\nimport {Socket} from 'dgram';\nimport {EventEmitter} from 'events';\n\nimport {CDJStatus} from 'src/types';\n\nimport {positionFromPacket} from './utils';\n\ninterface PositionEvents {\n /**\n * Fired when an absolute position packet is received from a CDJ-3000+.\n * These packets are sent approximately every 30ms while a track is loaded.\n */\n position: (position: CDJStatus.PositionState) => void;\n}\n\ntype Emitter = StrictEventEmitter<EventEmitter, PositionEvents>;\n\n/**\n * The position emitter reports absolute playhead position updates from CDJ-3000+ devices.\n * These packets provide precise track position independent of beat grids, enabling\n * accurate timecode, lighting cue, and video synchronization even during scratching,\n * reverse play, loops, and needle jumps.\n */\nclass PositionEmitter {\n /**\n * The EventEmitter which reports position updates\n */\n #emitter: Emitter = new EventEmitter();\n\n /**\n * @param beatSocket A UDP socket to receive position packets on port 50001\n */\n constructor(beatSocket: Socket) {\n beatSocket.on('message', this.#handlePosition);\n }\n\n // Bind public event emitter interface\n on: Emitter['on'] = this.#emitter.addListener.bind(this.#emitter);\n off: Emitter['off'] = this.#emitter.removeListener.bind(this.#emitter);\n once: Emitter['once'] = this.#emitter.once.bind(this.#emitter);\n\n #handlePosition = (message: Buffer) => {\n const position = positionFromPacket(message);\n\n if (position !== undefined) {\n this.#emitter.emit('position', position);\n }\n };\n}\n\nexport default PositionEmitter;\n","import {DeviceID, MediaSlot, TrackType} from 'src/types';\n\n/**\n * Status flag bitmasks\n */\nexport enum StatusFlag {\n OnAir = 1 << 3,\n Sync = 1 << 4,\n Master = 1 << 5,\n Playing = 1 << 6,\n}\n\n/**\n * Play state flags\n */\nexport enum PlayState {\n Empty = 0x00,\n Loading = 0x02,\n Playing = 0x03,\n Looping = 0x04,\n Paused = 0x05,\n Cued = 0x06,\n Cuing = 0x07,\n PlatterHeld = 0x08,\n Searching = 0x09,\n SpunDown = 0x0e,\n Ended = 0x11,\n}\n\n/**\n * Represents various details about the current state of the CDJ.\n */\nexport interface State {\n /**\n * The device reporting this status.\n */\n deviceId: number;\n /**\n * The ID of the track loaded on the device.\n *\n * 0 When no track is loaded.\n */\n trackId: number;\n /**\n * The device ID the track is loaded from.\n *\n * For example if you have two CDJs and you've loaded a track over the 'LINK',\n * this will be the ID of the player with the USB media device connected to it.\n */\n trackDeviceId: DeviceID;\n /**\n * The MediaSlot the track is loaded from. For example a SD card or USB device.\n */\n trackSlot: MediaSlot;\n /**\n * The TrackType of the track, for example a CD or Rekordbox analyzed track.\n */\n trackType: TrackType;\n /**\n * The current play state of the CDJ.\n */\n playState: PlayState;\n /**\n * Whether the CDJ is currently reporting itself as 'on-air'.\n *\n * This is indicated by the red ring around the platter on the CDJ Nexus models.\n * A DJM mixer must be ont he network for the CDJ to report this as true.\n */\n isOnAir: boolean;\n /**\n * Whether the CDJ is synced.\n */\n isSync: boolean;\n /**\n * Whether the CDJ is the master player.\n */\n isMaster: boolean;\n /**\n * Whether the CDJ is in an emergency state (emergecy loop / emergency mode\n * on newer players)\n */\n isEmergencyMode: boolean;\n /**\n * The BPM of the loaded track. null if no track is loaded or the BPM is unknown.\n */\n trackBPM: number | null;\n /**\n * The \"effective\" pitch of the plyaer. This is reported anytime the jogwheel is\n * nudged, the CDJ spins down by pausing with the vinyl stop knob not at 0, or\n * by holding the platter.\n */\n effectivePitch: number;\n /**\n * The current slider pitch\n */\n sliderPitch: number;\n /**\n * The current beat within the measure. 1-4. 0 when no track is loaded.\n */\n beatInMeasure: number;\n /**\n * Number of beats remaining until the next cue point is reached. Null if there\n * is no next cue point\n */\n beatsUntilCue: number | null;\n /**\n * The beat 'timestamp' of the track. Can be used to compute absolute track time\n * given the slider pitch.\n */\n beat: number | null;\n /**\n * A counter that increments for every status packet sent.\n */\n packetNum: number;\n}\n\n/**\n * Absolute position information from CDJ-3000+ devices.\n * Sent every 30ms on port 50001 while a track is loaded.\n * Provides precise playhead position independent of beat grid.\n */\nexport interface PositionState {\n /**\n * The device ID sending this position update.\n */\n deviceId: number;\n /**\n * Track length in seconds (rounded down to nearest second).\n */\n trackLength: number;\n /**\n * Absolute playhead position in milliseconds.\n */\n playhead: number;\n /**\n * Pitch slider value as shown on screen.\n * For example, 3.26% is represented as 3.26.\n */\n pitch: number;\n /**\n * Effective BPM (track BPM adjusted by pitch) as shown on screen.\n * null if BPM is unknown.\n */\n bpm: number | null;\n}\n\n/**\n * On-Air status from DJM mixer.\n * Broadcast by the mixer to indicate which channels are currently audible.\n * Supports both 4-channel (DJM-900/1000) and 6-channel (DJM-V10) mixers.\n */\nexport interface OnAirStatus {\n /**\n * The mixer device ID (typically 33 / 0x21).\n */\n deviceId: number;\n /**\n * On-air flags for channels 1-4 (always present).\n * 0x00 = channel is off-air (silenced)\n * 0x01 = channel is on-air (audible)\n */\n channels: {\n 1: boolean;\n 2: boolean;\n 3: boolean;\n 4: boolean;\n 5?: boolean;\n 6?: boolean;\n };\n /**\n * Whether this is a 6-channel variant (CDJ-3000 + DJM-V10).\n * Determined by packet subtype (0x00 = 4-channel, 0x03 = 6-channel).\n */\n isSixChannel: boolean;\n}\n","import {PROLINK_HEADER} from 'src/constants';\nimport {CDJStatus, MediaSlotInfo} from 'src/types';\n\nconst MAX_INT32 = Math.pow(2, 32) - 1;\nconst MAX_INT16 = Math.pow(2, 16) - 1;\nconst MAX_INT9 = Math.pow(2, 9) - 1;\n\nexport function statusFromPacket(packet: Buffer) {\n if (packet.indexOf(PROLINK_HEADER) !== 0) {\n throw new Error('CDJ status packet does not start with the expected header');\n }\n\n // Rekordbox sends some short status packets that we can just ignore.\n if (packet.length < 0xc8) {\n return undefined;\n }\n\n // No track loaded: BPM = MAX_INT16\n const rawBPM = packet.readUInt16BE(0x92);\n const trackBPM = rawBPM === MAX_INT16 ? null : rawBPM / 100;\n\n // No next cue: beatsUntilCue = MAX_INT9\n const rawBeatsUntilCue = packet.readUInt16BE(0xa4);\n const beatsUntilCue = rawBeatsUntilCue === MAX_INT9 ? null : rawBeatsUntilCue;\n\n // No track loaded: beat = MAX_INT32\n const rawBeat = packet.readUInt32BE(0xa0);\n const beat = rawBeat === MAX_INT32 ? null : rawBeat;\n\n const status: CDJStatus.State = {\n deviceId: packet[0x21],\n trackId: packet.readUInt32BE(0x2c),\n trackDeviceId: packet[0x28],\n trackSlot: packet[0x29],\n trackType: packet[0x2a],\n playState: packet[0x7b],\n isOnAir: (packet[0x89] & CDJStatus.StatusFlag.OnAir) !== 0,\n isSync: (packet[0x89] & CDJStatus.StatusFlag.Sync) !== 0,\n isMaster: (packet[0x89] & CDJStatus.StatusFlag.Master) !== 0,\n isEmergencyMode: !!packet[0xba],\n trackBPM,\n sliderPitch: calcPitch(packet.slice(0x8d, 0x8d + 3)),\n effectivePitch: calcPitch(packet.slice(0x99, 0x99 + 3)),\n beatInMeasure: packet[0xa6],\n beatsUntilCue,\n beat,\n packetNum: packet.readUInt32BE(0xc8),\n };\n\n return status;\n}\n\nexport function mediaSlotFromPacket(packet: Buffer) {\n if (packet.indexOf(PROLINK_HEADER) !== 0) {\n throw new Error('CDJ media slot packet does not start with the expected header');\n }\n\n if (packet[0x0a] !== 0x06) {\n return undefined;\n }\n\n const name = packet\n .slice(0x2c, 0x2c + 40)\n .toString()\n .replace(/\\0/g, '');\n\n const createdDate = new Date(\n packet\n .slice(0x6c, 0x6c + 24)\n .toString()\n .replace(/\\0/g, '')\n );\n\n const deviceId = packet[0x27];\n const slot = packet[0x2b];\n\n const trackCount = packet.readUInt16BE(0xa6);\n const tracksType = packet[0xaa];\n const hasSettings = !!packet[0xab];\n const playlistCount = packet.readUInt16BE(0xae);\n const color = packet.readUInt8(0xa8);\n const totalBytes = packet.readBigUInt64BE(0xb0);\n const freeBytes = packet.readBigUInt64BE(0xb8);\n\n const info: MediaSlotInfo = {\n deviceId,\n slot,\n name,\n color,\n createdDate,\n freeBytes,\n totalBytes,\n tracksType,\n trackCount,\n playlistCount,\n hasSettings,\n };\n\n return info;\n}\n\n/**\n * calcPitch converts a uint24 byte value into a float32 pitch.\n *\n * The pitch information ranges from 0x000000 (meaning -100%, complete stop) to\n * 0x200000 (+100%).\n */\nfunction calcPitch(pitch: Buffer) {\n const value = Buffer.from([0x0, ...pitch]).readUInt32BE();\n const relativeZero = 0x100000;\n\n const computed = ((value - relativeZero) / relativeZero) * 100;\n\n return +computed.toFixed(2);\n}\n\n/**\n * Parse absolute position packet from CDJ-3000+ devices.\n * These packets are sent every 30ms on port 50001 while a track is loaded.\n * Packet structure: subtype 0x00, lenr varies based on device.\n */\nexport function positionFromPacket(packet: Buffer): CDJStatus.PositionState | undefined {\n if (packet.indexOf(PROLINK_HEADER) !== 0) {\n return undefined;\n }\n\n // Check if this is a position packet (subtype 0x00)\n if (packet[0x20] !== 0x00) {\n return undefined;\n }\n\n // Check minimum length for position packet\n const lenr = packet.readUInt16BE(0x22);\n if (lenr < 0x0c || packet.length < 0x34) {\n return undefined;\n }\n\n const deviceId = packet[0x21];\n const trackLength = packet.readUInt32BE(0x24);\n const playhead = packet.readUInt32BE(0x28);\n\n // Parse pitch: 32-bit signed integer representing pitch × 64 × 100\n // To get percentage: divide by 6400\n const rawPitch = packet.readInt32BE(0x2c);\n const pitch = rawPitch / 6400;\n\n // Parse BPM: multiply by 10, or null if 0xffffffff\n const rawBPM = packet.readUInt32BE(0x30);\n const bpm = rawBPM === 0xffffffff ? null : rawBPM / 10;\n\n const position: CDJStatus.PositionState = {\n deviceId,\n trackLength,\n playhead,\n pitch,\n bpm,\n };\n\n return position;\n}\n\n/**\n * Parse on-air status packet from DJM mixer.\n * The mixer broadcasts which channels are currently audible.\n * Supports both 4-channel (subtype 0x00) and 6-channel (subtype 0x03) variants.\n *\n * Packet structure:\n * - 4-channel: subtype 0x00, length 0x0009 (9 data bytes: F1 F2 F3 F4 00 00 00 00 00)\n * - 6-channel: subtype 0x03, length 0x0011 (17 data bytes: F1 F2 F3 F4 00 00 00 00 00 F5 F6 00 30 00 00 00 00 00)\n */\nexport function onAirFromPacket(packet: Buffer): CDJStatus.OnAirStatus | undefined {\n if (packet.indexOf(PROLINK_HEADER) !== 0) {\n return undefined;\n }\n\n const subtype = packet[0x20];\n const lenr = packet.readUInt16BE(0x22);\n\n // Check for 4-channel variant (subtype 0x00, length 0x0009)\n if (subtype === 0x00 && lenr === 0x0009 && packet.length >= 0x2e) {\n const deviceId = packet[0x21];\n const channels = {\n 1: packet[0x24] !== 0x00,\n 2: packet[0x25] !== 0x00,\n 3: packet[0x26] !== 0x00,\n 4: packet[0x27] !== 0x00,\n };\n\n const onAir: CDJStatus.OnAirStatus = {\n deviceId,\n channels,\n isSixChannel: false,\n };\n\n return onAir;\n }\n\n // Check for 6-channel variant (subtype 0x03, length 0x0011)\n if (subtype === 0x03 && lenr === 0x0011 && packet.length >= 0x36) {\n const deviceId = packet[0x21];\n const channels = {\n 1: packet[0x24] !== 0x00,\n 2: packet[0x25] !== 0x00,\n 3: packet[0x26] !== 0x00,\n 4: packet[0x27] !== 0x00,\n 5: packet[0x2e] !== 0x00,\n 6: packet[0x2f] !== 0x00,\n };\n\n const onAir: CDJStatus.OnAirStatus = {\n deviceId,\n channels,\n isSixChannel: true,\n };\n\n return onAir;\n }\n\n return undefined;\n}\n","import type {Address4} from 'ip-address';\n\nimport type {Playlist, Track} from './entities';\n\nexport * as CDJStatus from 'src/status/types';\n\n/**\n * Re-export various types for the types only compile target\n */\n\nexport type {\n Album,\n Artist,\n Artwork,\n Color,\n Genre,\n Key,\n Label,\n Playlist,\n Track,\n} from './entities';\nexport type {TrackAnalysis} from './db/getTrackAnalysis';\nexport type {HydrationProgress} from './localdb/rekordbox';\nexport type {MixstatusConfig, MixstatusProcessor} from './mixstatus';\n// Note: ProlinkNetwork is exported as a class from ./network, not re-exported here as type-only\n// to preserve method signatures like close()\nexport type {ConnectedProlinkNetwork, NetworkConfig} from './network';\nexport type {FetchProgress} from './nfs';\n\n/**\n * Known device types on the network\n */\nexport enum DeviceType {\n CDJ = 0x01,\n Mixer = 0x03,\n Rekordbox = 0x04,\n}\n\n/**\n * The 8-bit identifier of the device on the network\n */\nexport type DeviceID = number;\n\n/**\n * Represents a device on the prolink network.\n */\nexport interface Device {\n name: string;\n id: DeviceID;\n type: DeviceType;\n macAddr: Uint8Array;\n ip: Address4;\n lastActive?: Date;\n}\n\n/**\n * Details of a particular media slot on the CDJ\n */\nexport interface MediaSlotInfo {\n /**\n * The device the slot physically exists on\n */\n deviceId: DeviceID;\n /**\n * The slot type\n */\n slot: MediaSlot;\n /**\n * The name of the media connected\n */\n name: string;\n /**\n * The rekordbox configured color of the media connected\n */\n color: MediaColor;\n /**\n * Creation date\n */\n createdDate: Date;\n /**\n * Number of free bytes available on the media\n */\n freeBytes: bigint;\n /**\n * Number of bytes used on the media\n */\n totalBytes: bigint;\n /**\n * Specifies the available tracks type on the media\n */\n tracksType: TrackType;\n /**\n * Total number of rekordbox tracks on the media. Will be zero if there is\n * no rekordbox database on the media\n */\n trackCount: number;\n /**\n * Same as track count, except for playlists\n */\n playlistCount: number;\n /**\n * True when a rekordbox 'my settings' file has been exported to the media\n */\n hasSettings: boolean;\n}\n\nexport enum MediaColor {\n Default = 0x00,\n Pink = 0x01,\n Red = 0x02,\n Orange = 0x03,\n Yellow = 0x04,\n Green = 0x05,\n Aqua = 0x06,\n Blue = 0x07,\n Purple = 0x08,\n}\n\n/**\n * A slot where media is present on the CDJ\n */\nexport enum MediaSlot {\n Empty = 0x00,\n CD = 0x01,\n SD = 0x02,\n USB = 0x03,\n RB = 0x04,\n Unknown05 = 0x05, // Possibly TIDAL, Apple Music, or other streaming\n StreamingDirectPlay = 0x06,\n Unknown07 = 0x07, // Possibly TIDAL, Apple Music, or other streaming\n Unknown08 = 0x08, // Possibly TIDAL, Apple Music, or other streaming\n Beatport = 0x09,\n}\n\n/**\n * Track type flags\n */\nexport enum TrackType {\n None = 0x00,\n RB = 0x01,\n Unanalyzed = 0x02,\n AudioCD = 0x05,\n Streaming = 0x06,\n}\n\n/**\n * A beat grid is a series of offsets from the start of the track. Each offset\n * indicates what count within the measure it is along with the BPM.\n */\nexport type BeatGrid = Array<{\n /**\n * Offset from the beginning of track in milliseconds of this beat.\n */\n offset: number;\n /**\n * The count of this particular beat within the measure\n */\n count: 1 | 2 | 3 | 4;\n /**\n * The BPM at this beat.\n */\n bpm: number;\n}>;\n\n/**\n * A waveform segment contains a height and 'whiteness' value.\n */\ninterface WaveformSegment {\n /**\n * The height this segment in the waveform. Ranges from 0 - 31.\n */\n height: number;\n /**\n * The level of \"whiteness\" of the waveform. 0 being completely blue, and 1\n * being completely white.\n */\n whiteness: number;\n}\n\n/**\n * A HD waveform segment contains the height of the waveform, and it's color\n * represented as RGB values.\n */\ninterface WaveformHDSegment {\n /**\n * The height this segment in the waveform. Ranges from 0 - 31.\n */\n height: number;\n /**\n * the RGB value, each channel ranges from 0-1 for the segment.\n */\n color: [number, number, number];\n}\n\n/**\n * The waveform preview will be 400 segments of data.\n */\nexport type WaveformPreview = WaveformSegment[];\n\n/**\n * Detailed waveforms have 150 segments per second of audio (150 'half frames'\n * per second of audio).\n */\nexport type WaveformDetailed = WaveformSegment[];\n\n/**\n * HD waveforms have 150 segments per second of audio (150 'half frames' per\n * second of audio).\n */\nexport type WaveformHD = WaveformHDSegment[];\n\n/**\n * The result of looking up track waveforms\n */\nexport interface Waveforms {\n /**\n * The full-size and full-color waveform\n */\n waveformHd: WaveformHD;\n\n /**\n * Color waveform preview (PWV4 tag).\n * Raw bytes: 1200 columns × 6 bytes per column (3 frequency bands × 2 bytes each).\n */\n waveformColorPreview?: Uint8Array;\n\n /**\n * Standard waveform preview (400 entries). Available for streaming tracks.\n */\n waveformPreview?: WaveformPreview;\n\n /**\n * Full detailed waveform. Available for streaming tracks.\n */\n waveformDetailed?: WaveformDetailed;\n}\n\n/**\n * Re-export cue types from onelibrary-connect\n */\nexport {CueColor, HotcueButton} from 'onelibrary-connect';\nexport type {CueAndLoop, CuePoint, Hotcue, Hotloop, Loop} from 'onelibrary-connect';\n\n/**\n * Extended cue with color and comment support (PCO2 tag from rekordbox).\n * Includes additional metadata like RGB colors, comments, and quantized loop information.\n */\nexport interface ExtendedCue {\n /**\n * Hot cue number (0 for memory points, 1-8 for hot cues A-H)\n */\n hotCue: number;\n /**\n * Type of cue: 1 = simple position/cue, 2 = loop\n */\n type: 1 | 2;\n /**\n * Position in milliseconds from the start of the track\n */\n time: number;\n /**\n * For loops, the end position in milliseconds\n */\n loopTime?: number;\n /**\n * Color ID referencing the color table (for memory points/loops)\n */\n colorId?: number;\n /**\n * Color code for the hot cue palette (0x00 = default green, 0x01-0x3e = palette colors)\n */\n colorCode?: number;\n /**\n * RGB color values used to illuminate the player's RGB LEDs\n */\n colorRgb?: {r: number; g: number; b: number};\n /**\n * User-assigned comment text for the cue\n */\n comment?: string;\n /**\n * For quantized loops, the numerator of the loop size fraction (e.g., 4 for a 4-beat loop)\n */\n loopNumerator?: number;\n /**\n * For quantized loops, the denominator of the loop size fraction (e.g., 1 for a 4-beat loop)\n */\n loopDenominator?: number;\n}\n\n/**\n * A phrase within a track's song structure\n */\nexport interface Phrase {\n /**\n * Sequential phrase number starting from 1\n */\n index: number;\n /**\n * Beat number where this phrase begins\n */\n beat: number;\n /**\n * Raw phrase kind value from rekordbox\n */\n kind: number;\n /**\n * Human-readable phrase type (e.g., \"Intro\", \"Verse 1\", \"Chorus\")\n */\n phraseType: string;\n /**\n * Whether this phrase has a fill-in section (non-zero if present)\n */\n fill?: number;\n /**\n * Beat number where the fill-in begins (if present)\n */\n fillBeat?: number;\n}\n\n/**\n * Song structure / phrase analysis (PSSI tag from rekordbox).\n * Used by CDJ-3000 players for phrase-based navigation and lighting control.\n */\nexport interface SongStructure {\n /**\n * Overall mood classification of the track\n */\n mood: 'high' | 'mid' | 'low';\n /**\n * Stylistic bank assigned for lighting control\n */\n bank:\n | 'default'\n | 'cool'\n | 'natural'\n | 'hot'\n | 'subtle'\n | 'warm'\n | 'vivid'\n | 'club_1'\n | 'club_2';\n /**\n * Beat number where the last phrase ends (track may continue after this)\n */\n endBeat: number;\n /**\n * List of identified phrases in the track\n */\n phrases: Phrase[];\n}\n\n/**\n * 3-band color waveform preview (PWV6 tag from .2EX files).\n * Same resolution as PWV4 (typically 1200 entries) but with separate\n * low, mid, and high frequency band amplitudes.\n *\n * @see https://djl-analysis.deepsymmetry.org/djl-analysis/track-metadata.html#color-3band-preview-waveform\n */\nexport interface Waveform3BandPreview {\n numEntries: number;\n /** Raw interleaved bytes: numEntries × 3 (low, mid, high per entry) */\n data: Uint8Array;\n}\n\n/**\n * 3-band color detail waveform (PWV7 tag from .2EX files).\n * Higher resolution than PWV6, approximately 150 entries per second.\n *\n * @see https://djl-analysis.deepsymmetry.org/djl-analysis/track-metadata.html#color-3band-detail-waveform\n */\nexport interface Waveform3BandDetail {\n numEntries: number;\n /** Raw interleaved bytes: numEntries × 3 (low, mid, high per entry) */\n data: Uint8Array;\n}\n\n/**\n * Vocal detection configuration (PWVC tag from .2EX files).\n * Threshold values used to classify frequency content as vocal or non-vocal.\n *\n * Values are u16 but observed range across 192 real files is 80-159,\n * matching the 0-255 byte scale used by waveform band values.\n * Observed ranges: low 80-114, mid 80-146, high 98-159.\n */\nexport interface VocalConfig {\n thresholdLow: number;\n thresholdMid: number;\n thresholdHigh: number;\n}\n\n/**\n * Monochrome waveform preview data (PWAV/PWV2 tags).\n * PWAV contains 400 bytes, PWV2 contains 100 bytes.\n */\nexport interface WaveformPreviewData {\n /**\n * Raw waveform data - each byte encodes height and whiteness\n */\n data: Uint8Array;\n}\n\n/**\n * Represents the contents of a playlist\n */\nexport interface PlaylistContents {\n /**\n * The playlists in this playlist.\n */\n playlists: Playlist[];\n /**\n * The folders in this playlist.\n */\n folders: Playlist[];\n /**\n * The tracks in this playlist. This is an AsyncIterator as looking up track\n * metadata may be slow when connected to the remote database.\n */\n tracks: AsyncIterable<Track>;\n /**\n * The total number of tracks in this playlist.\n */\n totalTracks: number;\n}\n\nexport enum NetworkState {\n /**\n * The network is offline when we don't have an open connection to the network\n * (no connection to the announcement and or status UDP socket is present).\n */\n Offline,\n /**\n * The network is online when we have opened sockets to the network, but have\n * not yet started announcing ourselves as a virtual CDJ.\n */\n Online,\n /**\n * The network is connected once we have heard from another device on the network\n */\n Connected,\n /**\n * The network may have failed to connect if we aren't able to open the\n * announcement and or status UDP socket.\n */\n Failed,\n}\n\n/**\n * Mixstatus reporting modes specify how the mixstatus processor will determine when a new\n * track is 'now playing'.\n */\nexport enum MixstatusMode {\n /**\n * Tracks will be smartly marked as playing following rules:\n *\n * - The track that has been in the play state with the CDJ in the \"on air\" state\n * for the longest period of time (allowing for a configurable length of\n * interruption with allowedInterruptBeats) is considered to be the active\n * track that incoming tracks will be compared against.\n *\n * - A incoming track will immediately be reported as nowPlaying if it is on\n * air, playing, and the last active track has been cued.\n *\n * - A incoming track will be reported as nowPlaying if the active track has\n * not been on air or has not been playing for the configured\n * allowedInterruptBeats.\n *\n * - A incoming track will be reported as nowPlaying if it has played\n * consecutively (with allowedInterruptBeats honored for the incoming track)\n * for the configured beatsUntilReported.\n */\n SmartTiming,\n /**\n * Tracks will not be reported after the beatsUntilReported AND will ONLY\n * be reported if the other track has gone into a non-playing play state, or\n * taken off air (when useOnAirStatus is enabled).\n */\n WaitsForSilence,\n /**\n * The track will simply be reported only after the player becomes master.\n */\n FollowsMaster,\n}\n","import {WaveformHD} from 'src/types';\n\n/**\n * Extracts a specific bitmask, shifting it to the bitmask.\n */\nexport const extractBitMask = (val: number, mask: number): number =>\n (val & mask) >> Math.log2(mask & -mask);\n\n/**\n * Pioneer colors are 3 bits, convert this to a percentage.\n */\nexport const extractColor = (val: number, mask: number): number =>\n extractBitMask(val, mask) / 0b111;\n\n/**\n * Utility to generate an filled with byte offsets for each segment\n */\nexport const makeOffsetArray = (byteLength: number, segmentSize: number) =>\n new Array(byteLength / segmentSize).fill(null).map((_, i) => i * segmentSize);\n\n/**\n * Convert raw waveform HD data into the structured WaveformHD type\n */\nexport const convertWaveformHDData = (data: Buffer): WaveformHD => {\n // Two byte bit representation for the color waveform.\n //\n // | f e d | c b a | 9 8 7 | 6 5 4 3 2 | 1 0 |\n // [ red | green | blue | height | ~ | ~ ]\n const redMask = 0b11100000_00000000; // prettier-ignore\n const greenMask = 0b00011100_00000000; // prettier-ignore\n const blueMask = 0b00000011_10000000; // prettier-ignore\n const heightMask = 0b00000000_01111100; // prettier-ignore\n\n const ec = extractColor;\n\n return makeOffsetArray(data.length, 0x02)\n .map(byteOffset => data.readUInt16BE(byteOffset))\n .map(v => ({\n height: extractBitMask(v, heightMask),\n color: [ec(v, redMask), ec(v, greenMask), ec(v, blueMask)],\n }));\n};\n","import * as ip from 'ip-address';\n\nimport {NetworkInterfaceInfo, NetworkInterfaceInfoIPv4, networkInterfaces} from 'os';\n\nimport {Device, MediaSlot, TrackType} from 'src/types';\n\n/**\n * Get the byte representation of the device name\n */\nexport function buildName(device: Device): Uint8Array {\n const name = new Uint8Array(20);\n name.set(Buffer.from(device.name, 'ascii'));\n\n return name;\n}\n\n/**\n * Determines the interface that routes the given address by comparing the\n * masked addresses. This type of information is generally determined through\n * the kernels routing table, but for sake of cross-platform compatibility, we\n * do some rudimentary lookup.\n */\nexport function getMatchingInterface(ipAddr: ip.Address4) {\n const flatList = Object.entries(networkInterfaces()).reduce(\n (acc, [name, info]) =>\n info !== undefined ? acc.concat(info.map(i => ({...i, name}))) : acc,\n [] as Array<{name: string} & NetworkInterfaceInfo>\n );\n\n let matchedIface: (NetworkInterfaceInfoIPv4 & {name: string}) | null = null;\n let matchedSubnet = 0;\n\n for (const iface of flatList) {\n const {internal, cidr} = iface;\n\n if (iface.family !== 'IPv4' || internal || cidr === null) {\n continue;\n }\n\n const ifaceAddr = new ip.Address4(cidr);\n\n if (ipAddr.isInSubnet(ifaceAddr) && ifaceAddr.subnetMask > matchedSubnet) {\n matchedIface = iface;\n matchedSubnet = ifaceAddr.subnetMask;\n }\n }\n\n return matchedIface;\n}\n\n/**\n * Computes the IPv4 subnet broadcast address for a network interface.\n *\n * Builds the address from the interface CIDR so the broadcast covers the whole\n * subnet (e.g. x.x.x.255 for a /24). Falls back to the bare interface address\n * when no CIDR is available, which only reaches the host itself but avoids\n * throwing.\n */\nexport function getBroadcastAddress(iface: NetworkInterfaceInfoIPv4): string {\n return new ip.Address4(iface.cidr ?? iface.address).endAddress().address;\n}\n\n/**\n * Given a BPM and pitch value, compute how many seconds per beat\n */\nexport function bpmToSeconds(bpm: number, pitch: number) {\n const bps = ((pitch / 100) * bpm + bpm) / 60;\n return 1 / bps;\n}\n\nconst slotNames = Object.fromEntries(\n Object.entries(MediaSlot).map(e => [e[1], e[0].toLowerCase()])\n);\n\n/**\n * Returns a string representation of a media slot\n */\nexport function getSlotName(slot: MediaSlot) {\n return slotNames[slot];\n}\n\nconst trackTypeNames = Object.fromEntries(\n Object.entries(TrackType).map(e => [e[1], e[0].toLowerCase()])\n);\n\n/**\n * Returns a string representation of a track type\n */\nexport function getTrackTypeName(type: TrackType) {\n return trackTypeNames[type];\n}\n","/**\n * Telemetry utility - Sentry removed, now a no-op implementation.\n */\n\n/**\n * Check if telemetry is enabled - always false now.\n */\nexport const isTelemetryEnabled = (): boolean => false;\n\n/**\n * Span status values for telemetry.\n */\nexport const SpanStatus = {\n Ok: 'ok',\n Cancelled: 'cancelled',\n Unknown: 'unknown',\n InvalidArgument: 'invalid_argument',\n DeadlineExceeded: 'deadline_exceeded',\n NotFound: 'not_found',\n AlreadyExists: 'already_exists',\n PermissionDenied: 'permission_denied',\n ResourceExhausted: 'resource_exhausted',\n FailedPrecondition: 'failed_precondition',\n Aborted: 'aborted',\n OutOfRange: 'out_of_range',\n Unimplemented: 'unimplemented',\n InternalError: 'internal_error',\n Unavailable: 'unavailable',\n DataLoss: 'data_loss',\n Unauthenticated: 'unauthenticated',\n} as const;\n\nexport type SpanStatusType = (typeof SpanStatus)[keyof typeof SpanStatus];\n\n/**\n * Context for starting a child span.\n */\nexport interface SpanContext {\n name?: string;\n op?: string;\n description?: string;\n data?: Record<string, unknown>;\n}\n\n/**\n * Interface for span-like objects returned by telemetry functions.\n */\nexport interface TelemetrySpan {\n startChild(context?: SpanContext): TelemetrySpan;\n setData(key: string, value: unknown): TelemetrySpan;\n setTag(key: string, value: string): TelemetrySpan;\n setStatus(status: SpanStatusType): TelemetrySpan;\n end(): void;\n /** @deprecated Use end() instead */\n finish(): void;\n}\n\n/**\n * No-op span implementation.\n */\nconst noopSpan: TelemetrySpan = {\n startChild(_context?: SpanContext) {\n return noopSpan;\n },\n setData(_key: string, _value: unknown) {\n return noopSpan;\n },\n setTag(_key: string, _value: string) {\n return noopSpan;\n },\n setStatus(_status: SpanStatusType) {\n return noopSpan;\n },\n end() {\n // Intentional no-op\n },\n finish() {\n // Intentional no-op\n },\n};\n\n/**\n * Initialize telemetry - no-op.\n */\nexport function init(_options?: unknown): void {\n // Intentional no-op\n}\n\n/**\n * Start a transaction/span - returns no-op.\n */\nexport function startTransaction(_context: SpanContext): TelemetrySpan {\n return noopSpan;\n}\n\n/**\n * Capture an exception - no-op.\n */\nexport function captureException(_exception: unknown, _hint?: unknown): string {\n return '';\n}\n\n/**\n * Capture a message - no-op.\n */\nexport function captureMessage(_message: string, _level?: unknown): string {\n return '';\n}\n\n/**\n * Set a tag - no-op.\n */\nexport function setTag(_key: string, _value: string): void {\n // Intentional no-op\n}\n\n/**\n * Severity levels for messages.\n */\nexport const Severity = {\n Fatal: 'fatal',\n Error: 'error',\n Warning: 'warning',\n Log: 'log',\n Info: 'info',\n Debug: 'debug',\n} as const;\n","import {BindOptions, Socket} from 'dgram';\nimport {AddressInfo} from 'net';\n\n/**\n * Async version of upd socket bind\n */\nexport function udpBind(\n conn: Socket,\n port?: number,\n address?: string\n): Promise<AddressInfo>;\nexport function udpBind(conn: Socket, options: BindOptions): Promise<AddressInfo>;\nexport function udpBind(conn: Socket, arg1?: any, arg2?: any): Promise<AddressInfo> {\n return new Promise((resolve, reject) => {\n conn.once('error', reject);\n conn.once('listening', () => {\n conn.off('error', reject);\n resolve(conn.address());\n });\n\n if (arg2 !== undefined) {\n conn.bind(arg1, arg2);\n } else {\n conn.bind(arg1);\n }\n });\n}\n\n/**\n * Async version of udp socket read\n */\nexport function udpRead(conn: Socket) {\n return new Promise<Buffer>(resolve => conn.once('message', resolve));\n}\n\n/**\n * Async version of udp socket send\n */\nexport function udpSend(\n conn: Socket,\n msg: Buffer | string | Uint8Array | any[],\n port: number,\n address: string\n): Promise<number>;\nexport function udpSend(\n conn: Socket,\n msg: Buffer | string | Uint8Array,\n offset: number,\n length: number,\n port: number,\n address: string\n): Promise<number>;\nexport function udpSend(\n conn: Socket,\n arg1: any,\n arg2: any,\n arg3: any,\n arg4?: any,\n arg5?: any\n): Promise<number> {\n return new Promise((resolve, reject) => {\n try {\n if (arg4 !== undefined) {\n conn.send(arg1, arg2, arg3, arg4, arg5, (err, sent) =>\n err ? reject(err) : resolve(sent)\n );\n } else {\n conn.send(arg1, arg2, arg3, (err, sent) => (err ? reject(err) : resolve(sent)));\n }\n } catch (err) {\n reject(err);\n }\n });\n}\n\n/**\n * Async version of udp socket close\n */\nexport function udpClose(conn: Socket) {\n return new Promise((resolve, reject) => {\n try {\n conn.once('close', resolve);\n conn.close();\n } catch (err) {\n reject(err);\n }\n });\n}\n","import * as ip from 'ip-address';\n\nimport {Socket} from 'dgram';\nimport {NetworkInterfaceInfoIPv4} from 'os';\n\nimport {\n ANNOUNCE_INTERVAL,\n ANNOUNCE_PORT,\n PROLINK_HEADER,\n STARTUP_STAGE_INTERVAL,\n VIRTUAL_CDJ_FIRMWARE,\n VIRTUAL_CDJ_NAME,\n} from 'src/constants';\nimport DeviceManager from 'src/devices';\nimport {type Logger, noopLogger} from 'src/logger';\nimport {Device, DeviceID, DeviceType} from 'src/types';\nimport {buildName, getBroadcastAddress} from 'src/utils';\n\n/**\n * Constructs a virtual CDJ Device.\n *\n * @param iface - The network interface to use\n * @param id - The device ID to use\n * @param name - Optional custom name (defaults to VIRTUAL_CDJ_NAME constant)\n */\nexport const getVirtualCDJ = (\n iface: NetworkInterfaceInfoIPv4,\n id: DeviceID,\n name: string = VIRTUAL_CDJ_NAME\n): Device => ({\n id,\n name,\n type: DeviceType.CDJ,\n ip: new ip.Address4(iface.address),\n macAddr: new Uint8Array(iface.mac.split(':').map(s => parseInt(s, 16))),\n});\n\n/**\n * Returns a mostly empty-state status packet. This is currently used to report\n * the virtual CDJs status, which *seems* to be required for the CDJ to send\n * metadata about some unanalyzed mp3 files.\n */\nexport function makeStatusPacket(device: Device): Uint8Array {\n // NOTE: It seems that byte 0x68 and 0x75 MUST be 1 in order for the CDJ to\n // correctly report mp3 metadata (again, only for some files).\n // See https://github.com/brunchboy/dysentery/issues/15\n // NOTE: Byte 0xb6 MUST be 1 in order for the CDJ to not think that our\n // device is \"running an older firmware\"\n //\n // prettier-ignore\n const b = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n 0x03, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0xff, 0xfe, 0x00, 0x10, 0x00, 0x00,\n 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,\n 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n ]);\n\n // The following items get replaced in this format:\n //\n // - 0x00: 10 byte header\n // - 0x0B: 20 byte device name\n // - 0x21: 01 byte device ID\n // - 0x24: 01 byte device ID\n // - 0x7C: 04 byte firmware string\n\n b.set(PROLINK_HEADER, 0x0b);\n b.set(Buffer.from(device.name, 'ascii'), 0x0b);\n b.set(new Uint8Array([device.id]), 0x21);\n b.set(new Uint8Array([device.id]), 0x24);\n b.set(Buffer.from(VIRTUAL_CDJ_FIRMWARE, 'ascii'), 0x7c);\n\n return b;\n}\n\n/**\n * constructs the announce packet that is sent on the prolink network to\n * announce a devices existence.\n */\nexport function makeAnnouncePacket(deviceToAnnounce: Device): Uint8Array {\n const d = deviceToAnnounce;\n\n // unknown padding bytes\n const unknown1 = [0x01, 0x02];\n // Updated on 2024-04-27 to be compatible with CDJ-3000 players that use player number 5 or 6.\n const unknown2 = [0x02, 0x00, 0x00, 0x00];\n\n // The packet below is constructed in the following format:\n //\n // - 0x00: 10 byte header\n // - 0x0A: 02 byte announce packet type\n // - 0x0c: 20 byte device name\n // - 0x20: 02 byte unknown\n // - 0x22: 02 byte packet length\n // - 0x24: 01 byte for the player ID\n // - 0x25: 01 byte for the player type\n // - 0x26: 06 byte mac address\n // - 0x2C: 04 byte IP address\n // - 0x30: 04 byte unknown\n // - 0x34: 01 byte for the player type\n // - 0x35: 01 byte final padding\n\n const parts = [\n ...PROLINK_HEADER,\n ...[0x06, 0x00],\n ...buildName(d),\n ...unknown1,\n ...[0x00, 0x36],\n ...[d.id],\n ...[d.type],\n ...d.macAddr,\n ...d.ip.toArray(),\n ...unknown2,\n ...[d.type],\n // Updated on 2024-04-27 to be compatible with CDJ-3000 players that use player number 5 or 6.\n ...[0x64],\n ];\n\n return Uint8Array.from(parts);\n}\n\n/**\n * Startup stages for the full startup protocol.\n */\nenum StartupStage {\n /** Initial announcement packets (0x0a) */\n InitialAnnounce = 0x0a,\n /** First-stage device number claim (0x00) */\n FirstStageClaim = 0x00,\n /** Second-stage device number claim (0x02) */\n SecondStageClaim = 0x02,\n /** Final-stage device number claim (0x04) */\n FinalStageClaim = 0x04,\n /** Keep-alive packets (0x06) */\n KeepAlive = 0x06,\n}\n\n/**\n * Build stage 0x0a packet: Initial announcement (CDJ-3000 compatible).\n * Sent 3 times at 300ms intervals.\n */\nfunction makeStage0aPacket(device: Device): Uint8Array {\n const isHighPlayerNumber = device.id >= 5;\n const parts = [\n ...PROLINK_HEADER,\n ...[0x0a, 0x00],\n ...buildName(device),\n ...[0x01],\n ...[isHighPlayerNumber ? 0x04 : 0x02],\n ...[0x00, isHighPlayerNumber ? 0x26 : 0x25],\n ...[0x01],\n ];\n\n if (isHighPlayerNumber) {\n parts.push(0x40);\n }\n\n return Uint8Array.from(parts);\n}\n\n/**\n * Build stage 0x00 packet: First-stage device number claim (CDJ-3000 compatible).\n * Sent 3 times at 300ms intervals with counter N (1, 2, 3).\n */\nfunction makeStage00Packet(device: Device, counter: number): Uint8Array {\n const isHighPlayerNumber = device.id >= 5;\n const parts = [\n ...PROLINK_HEADER,\n ...[0x00, 0x00],\n ...buildName(device),\n ...[0x01],\n ...[isHighPlayerNumber ? 0x03 : 0x02],\n ...[0x00, 0x2c],\n ...[counter],\n ...[0x01],\n ...device.macAddr,\n ];\n\n return Uint8Array.from(parts);\n}\n\n/**\n * Build stage 0x02 packet: Second-stage device number claim (CDJ-3000 compatible).\n * Sent 3 times at 300ms intervals with counter N (1, 2, 3).\n */\nfunction makeStage02Packet(device: Device, counter: number): Uint8Array {\n const isHighPlayerNumber = device.id >= 5;\n const parts = [\n ...PROLINK_HEADER,\n ...[0x02, 0x00],\n ...buildName(device),\n ...[0x01],\n ...[isHighPlayerNumber ? 0x03 : 0x02],\n ...[0x00, 0x32],\n ...device.ip.toArray(),\n ...device.macAddr,\n ...[device.id],\n ...[counter],\n ...[0x30, 0x01, 0x01], // auto-assign mode\n ];\n\n return Uint8Array.from(parts);\n}\n\n/**\n * Build stage 0x04 packet: Final-stage device number claim (CDJ-3000 compatible).\n * Sent 1-3 times at 300ms intervals with counter N.\n */\nfunction makeStage04Packet(device: Device, counter: number): Uint8Array {\n const isHighPlayerNumber = device.id >= 5;\n const parts = [\n ...PROLINK_HEADER,\n ...[0x04, 0x00],\n ...buildName(device),\n ...[0x01],\n ...[isHighPlayerNumber ? 0x03 : 0x02],\n ...[0x00, 0x26],\n ...[device.id],\n ...[counter],\n ];\n\n return Uint8Array.from(parts);\n}\n\n/**\n * Build stage 0x06 packet: Keep-alive (CDJ-3000 compatible).\n * Sent every 1.5s after startup complete.\n */\nfunction makeStage06Packet(device: Device, peerCount: number): Uint8Array {\n const isHighPlayerNumber = device.id >= 5;\n const parts = [\n ...PROLINK_HEADER,\n ...[0x06, 0x00],\n ...buildName(device),\n ...[0x01, 0x02],\n ...[0x00, 0x36],\n ...[device.id],\n ...[0x01],\n ...device.macAddr,\n ...device.ip.toArray(),\n ...[0x30],\n ...[peerCount],\n ...[0x00, 0x00, 0x00, 0x01],\n ...[isHighPlayerNumber ? 0x64 : 0x00],\n ];\n\n return Uint8Array.from(parts);\n}\n\n/**\n * Check if a packet is a channel conflict (0x08) packet.\n * Returns the conflicting device ID if this is a conflict packet, null otherwise.\n */\nfunction parseConflictPacket(packet: Buffer): number | null {\n // Conflict packets are 0x29 (41) bytes long with packet type 0x08 at byte 0x0a\n if (packet.length !== 0x29) {\n return null;\n }\n\n // Check for PROLINK_HEADER\n if (!packet.subarray(0, 10).equals(Buffer.from(PROLINK_HEADER))) {\n return null;\n }\n\n // Check packet type byte (0x0a)\n if (packet[0x0a] !== 0x08) {\n return null;\n }\n\n // Extract the device ID being defended (byte 0x24)\n return packet[0x24];\n}\n\n/**\n * the announcer service is used to report our fake CDJ to the prolink network,\n * as if it was a real CDJ.\n */\nexport class Announcer {\n /**\n * The announce socket to use to make the announcements\n */\n #announceSocket: Socket;\n /**\n * The device manager service used to determine which devices to announce\n * ourselves to.\n */\n #deviceManager: DeviceManager;\n /**\n * The virtual CDJ device to announce\n */\n #vcdj: Device;\n /**\n * The interval handle used to stop announcing\n */\n #intervalHandle?: NodeJS.Timeout;\n /**\n * Whether to use full startup protocol\n */\n #fullStartup: boolean;\n /**\n * Whether to send announcer packets to Pioneer Stagehand devices, which are\n * normally excluded because they crash on our packets\n */\n #announceToStagehand: boolean;\n /**\n * Current startup stage (only used when fullStartup is enabled)\n */\n #currentStage: StartupStage = StartupStage.InitialAnnounce;\n /**\n * Packet counter within current stage (1, 2, 3)\n */\n #stageCounter = 0;\n /**\n * Listener for incoming conflict packets\n */\n #conflictListener?: (msg: Buffer) => void;\n /**\n * Network interface for the virtual CDJ\n */\n #iface: NetworkInterfaceInfoIPv4;\n /**\n * Logger instance for diagnostic output\n */\n #logger: Logger;\n /**\n * Callback invoked when the full startup protocol completes\n */\n #onStartupComplete?: () => void;\n\n constructor(\n vcdj: Device,\n announceSocket: Socket,\n deviceManager: DeviceManager,\n iface: NetworkInterfaceInfoIPv4,\n fullStartup = false,\n announceToStagehand = false,\n logger: Logger = noopLogger\n ) {\n this.#vcdj = vcdj;\n this.#announceSocket = announceSocket;\n this.#deviceManager = deviceManager;\n this.#iface = iface;\n this.#fullStartup = fullStartup;\n this.#announceToStagehand = announceToStagehand;\n this.#logger = logger;\n }\n\n /**\n * Returns a promise that resolves when the startup protocol completes.\n * Resolves immediately if fullStartup is disabled.\n */\n get ready(): Promise<void> {\n if (!this.#fullStartup) {\n return Promise.resolve();\n }\n if (this.#currentStage === StartupStage.KeepAlive) {\n return Promise.resolve();\n }\n return new Promise(resolve => {\n this.#onStartupComplete = resolve;\n });\n }\n\n start() {\n if (this.#fullStartup) {\n this.#startFullStartup();\n } else {\n this.#startKeepAlive();\n }\n }\n\n /**\n * Start the full startup protocol with stage progression.\n */\n #startFullStartup() {\n this.#currentStage = StartupStage.InitialAnnounce;\n this.#stageCounter = 0;\n\n // Set up conflict detection listener\n this.#conflictListener = (msg: Buffer) => {\n const conflictDeviceId = parseConflictPacket(msg);\n if (conflictDeviceId === this.#vcdj.id) {\n this.#logger.warn(\n `Device ID ${this.#vcdj.id} is already in use. Finding alternative...`\n );\n this.#handleConflict();\n }\n };\n this.#announceSocket.on('message', this.#conflictListener);\n\n this.#sendStagePackets();\n }\n\n /**\n * Handle a device ID conflict by finding an available ID and restarting.\n */\n #handleConflict() {\n // Stop current startup\n if (this.#intervalHandle) {\n clearTimeout(this.#intervalHandle);\n this.#intervalHandle = undefined;\n }\n\n // Find an available device ID\n const usedIds = new Set([...this.#deviceManager.devices.values()].map(d => d.id));\n let newId: number | null = null;\n\n // Try IDs from 7-32 first (recommended range), then 1-6 if needed\n for (let id = 7; id <= 32; id++) {\n if (!usedIds.has(id)) {\n newId = id;\n break;\n }\n }\n if (newId === null) {\n for (let id = 1; id <= 6; id++) {\n if (!usedIds.has(id)) {\n newId = id;\n break;\n }\n }\n }\n\n if (newId === null) {\n this.#logger.error('No available device IDs. All 32 slots are occupied.');\n this.stop();\n return;\n }\n\n this.#logger.info(`Switching to device ID ${newId}`);\n\n // Update virtual CDJ with new ID\n this.#vcdj = getVirtualCDJ(this.#iface, newId as DeviceID);\n\n // Restart startup sequence\n this.#currentStage = StartupStage.InitialAnnounce;\n this.#stageCounter = 0;\n this.#sendStagePackets();\n }\n\n /**\n * Sends a packet by unicast to every discovered device.\n *\n * Pioneer Stagehand is excluded by default (it crashes on our packets)\n * unless announceToStagehand is enabled.\n *\n * When nothing has been discovered yet, falls back to a subnet broadcast —\n * but only when announceToStagehand is enabled, because a broadcast reaches\n * every host including Stagehand. In normal operation the virtual CDJ is\n * found via unicast replies to peers' own announce broadcasts, so skipping\n * this cold-start broadcast costs nothing.\n */\n #sendPacket(packet: Uint8Array) {\n const devices = [...this.#deviceManager.devices.values()].filter(\n d => this.#announceToStagehand || !d.name.toLowerCase().includes('stagehand')\n );\n devices.forEach(device =>\n this.#announceSocket.send(packet, ANNOUNCE_PORT, device.ip.address)\n );\n\n // Cold-start discovery broadcast — gated; see the method doc above.\n if (devices.length === 0 && this.#announceToStagehand) {\n const broadcastAddr = getBroadcastAddress(this.#iface);\n this.#announceSocket.send(packet, ANNOUNCE_PORT, broadcastAddr);\n }\n }\n\n /**\n * Send packets for the current startup stage and progress to next stage.\n */\n #sendStagePackets() {\n this.#stageCounter++;\n\n // Build packet for current stage\n let packet: Uint8Array;\n switch (this.#currentStage) {\n case StartupStage.InitialAnnounce:\n packet = makeStage0aPacket(this.#vcdj);\n break;\n case StartupStage.FirstStageClaim:\n packet = makeStage00Packet(this.#vcdj, this.#stageCounter);\n break;\n case StartupStage.SecondStageClaim:\n packet = makeStage02Packet(this.#vcdj, this.#stageCounter);\n break;\n case StartupStage.FinalStageClaim:\n packet = makeStage04Packet(this.#vcdj, this.#stageCounter);\n break;\n case StartupStage.KeepAlive:\n // Transition to keep-alive mode\n this.#startKeepAlive();\n this.#onStartupComplete?.();\n this.#onStartupComplete = undefined;\n return;\n }\n\n this.#sendPacket(packet);\n\n // Progress to next packet or stage\n if (this.#stageCounter >= 3) {\n // Move to next stage\n this.#advanceStage();\n }\n\n // Schedule next packet (300ms for startup stages)\n this.#intervalHandle = setTimeout(\n () => this.#sendStagePackets(),\n STARTUP_STAGE_INTERVAL\n );\n }\n\n /**\n * Advance to the next startup stage.\n */\n #advanceStage() {\n this.#stageCounter = 0;\n\n switch (this.#currentStage) {\n case StartupStage.InitialAnnounce:\n this.#currentStage = StartupStage.FirstStageClaim;\n break;\n case StartupStage.FirstStageClaim:\n this.#currentStage = StartupStage.SecondStageClaim;\n break;\n case StartupStage.SecondStageClaim:\n this.#currentStage = StartupStage.FinalStageClaim;\n break;\n case StartupStage.FinalStageClaim:\n this.#currentStage = StartupStage.KeepAlive;\n break;\n }\n }\n\n /**\n * Start sending keep-alive packets (final stage or when fullStartup is disabled).\n */\n #startKeepAlive() {\n if (this.#intervalHandle) {\n clearTimeout(this.#intervalHandle);\n this.#intervalHandle = undefined;\n }\n\n // Remove conflict listener once we're in keep-alive mode\n if (this.#conflictListener) {\n this.#announceSocket.off('message', this.#conflictListener);\n this.#conflictListener = undefined;\n }\n\n const sendKeepAlive = () => {\n const peerCount = this.#deviceManager.devices.size + 1; // +1 for ourselves\n const packet = this.#fullStartup\n ? makeStage06Packet(this.#vcdj, peerCount)\n : makeAnnouncePacket(this.#vcdj);\n\n this.#sendPacket(packet);\n };\n\n // Send first keep-alive immediately\n sendKeepAlive();\n\n // Then schedule regular keep-alives\n this.#intervalHandle = setInterval(sendKeepAlive, ANNOUNCE_INTERVAL);\n }\n\n stop() {\n if (this.#intervalHandle !== undefined) {\n clearInterval(this.#intervalHandle);\n clearTimeout(this.#intervalHandle);\n this.#intervalHandle = undefined;\n }\n\n // Remove conflict listener if active\n if (this.#conflictListener) {\n this.#announceSocket.off('message', this.#conflictListener);\n this.#conflictListener = undefined;\n }\n }\n}\n","module.exports = require(\"async-mutex\");","module.exports = require(\"better-sqlite3-multiple-ciphers\");","module.exports = require(\"child_process\");","module.exports = require(\"crypto\");","module.exports = require(\"dgram\");","module.exports = require(\"events\");","module.exports = require(\"fs\");","module.exports = require(\"ip-address\");","module.exports = require(\"js-xdr\");","module.exports = require(\"kaitai-struct\");","module.exports = require(\"kaitai-struct/KaitaiStream\");","module.exports = require(\"lodash\");","module.exports = require(\"metadata-connect\");","module.exports = require(\"net\");","module.exports = require(\"onelibrary-connect\");","module.exports = require(\"os\");","module.exports = require(\"path\");","module.exports = require(\"promise-retry\");","module.exports = require(\"promise-socket\");","module.exports = require(\"promise-timeout\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Check if module exists (development only)\n\tif (__webpack_modules__[moduleId] === undefined) {\n\t\tvar e = new Error(\"Cannot find module '\" + moduleId + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(\"./src/index.ts\");\n",""],"names":[],"ignoreList":[],"sourceRoot":""}
|