--- /home/fdroid/fdroiddata/tmp/com.superproductivity.superproductivity_1403040000.apk +++ /home/fdroid/fdroiddata/tmp/sigcp_com.superproductivity.superproductivity_1403040000.apk ├── zipinfo {} │ @@ -121,48 +121,52 @@ │ -rw-r--r-- 0.0 unx 1480 b- defN 81-Jan-01 01:01 assets/public/boards.component-36NZA3NM.css.map │ -rw-r--r-- 0.0 unx 1092 b- defN 81-Jan-01 01:01 assets/public/breathing-dot.component-2NKMQ2Q5.css.map │ -rw-r--r-- 0.0 unx 756 b- defN 81-Jan-01 01:01 assets/public/chip-list-input.component-GQQYZYBD.css.map │ -rw-r--r-- 0.0 unx 97658 b- defN 81-Jan-01 01:01 assets/public/chunk-23TMGEW6.js │ -rw-r--r-- 0.0 unx 357387 b- defN 81-Jan-01 01:01 assets/public/chunk-23TMGEW6.js.map │ -rw-r--r-- 0.0 unx 55071 b- defN 81-Jan-01 01:01 assets/public/chunk-2FU63URL.js │ -rw-r--r-- 0.0 unx 403411 b- defN 81-Jan-01 01:01 assets/public/chunk-2FU63URL.js.map │ +-rw-r--r-- 0.0 unx 1015 b- defN 81-Jan-01 01:01 assets/public/chunk-2KZHDGJ4.js │ +-rw-r--r-- 0.0 unx 93 b- defN 81-Jan-01 01:01 assets/public/chunk-2KZHDGJ4.js.map │ -rw-r--r-- 0.0 unx 2044 b- defN 81-Jan-01 01:01 assets/public/chunk-2NYJ54WT.js │ -rw-r--r-- 0.0 unx 93 b- defN 81-Jan-01 01:01 assets/public/chunk-2NYJ54WT.js.map │ -rw-r--r-- 0.0 unx 10634 b- defN 81-Jan-01 01:01 assets/public/chunk-2QOQ2EYE.js │ -rw-r--r-- 0.0 unx 15729 b- defN 81-Jan-01 01:01 assets/public/chunk-2QOQ2EYE.js.map │ -rw-r--r-- 0.0 unx 3030 b- defN 81-Jan-01 01:01 assets/public/chunk-2UCFOZRF.js │ -rw-r--r-- 0.0 unx 10699 b- defN 81-Jan-01 01:01 assets/public/chunk-2UCFOZRF.js.map │ -rw-r--r-- 0.0 unx 212584 b- defN 81-Jan-01 01:01 assets/public/chunk-34HIK4DR.js │ -rw-r--r-- 0.0 unx 664332 b- defN 81-Jan-01 01:01 assets/public/chunk-34HIK4DR.js.map │ -rw-r--r-- 0.0 unx 24109 b- defN 81-Jan-01 01:01 assets/public/chunk-366J2TQY.js │ -rw-r--r-- 0.0 unx 98149 b- defN 81-Jan-01 01:01 assets/public/chunk-366J2TQY.js.map │ -rw-r--r-- 0.0 unx 9276 b- defN 81-Jan-01 01:01 assets/public/chunk-3E43H4SH.js │ -rw-r--r-- 0.0 unx 32056 b- defN 81-Jan-01 01:01 assets/public/chunk-3E43H4SH.js.map │ -rw-r--r-- 0.0 unx 11667 b- defN 81-Jan-01 01:01 assets/public/chunk-3MDSNHPO.js │ -rw-r--r-- 0.0 unx 18636 b- defN 81-Jan-01 01:01 assets/public/chunk-3MDSNHPO.js.map │ +-rw-r--r-- 0.0 unx 118944 b- defN 81-Jan-01 01:01 assets/public/chunk-3R6CM3NH.js │ +-rw-r--r-- 0.0 unx 180097 b- defN 81-Jan-01 01:01 assets/public/chunk-3R6CM3NH.js.map │ -rw-r--r-- 0.0 unx 1966 b- defN 81-Jan-01 01:01 assets/public/chunk-3RGW2GE5.js │ -rw-r--r-- 0.0 unx 8032 b- defN 81-Jan-01 01:01 assets/public/chunk-3RGW2GE5.js.map │ -rw-r--r-- 0.0 unx 615 b- defN 81-Jan-01 01:01 assets/public/chunk-3UB54IM4.js │ -rw-r--r-- 0.0 unx 2240 b- defN 81-Jan-01 01:01 assets/public/chunk-3UB54IM4.js.map │ --rw-r--r-- 0.0 unx 63528 b- defN 81-Jan-01 01:01 assets/public/chunk-3XZTXRJN.js │ --rw-r--r-- 0.0 unx 160634 b- defN 81-Jan-01 01:01 assets/public/chunk-3XZTXRJN.js.map │ -rw-r--r-- 0.0 unx 19791 b- defN 81-Jan-01 01:01 assets/public/chunk-3Y2SDFCL.js │ -rw-r--r-- 0.0 unx 79950 b- defN 81-Jan-01 01:01 assets/public/chunk-3Y2SDFCL.js.map │ -rw-r--r-- 0.0 unx 22325 b- defN 81-Jan-01 01:01 assets/public/chunk-44APA3YG.js │ -rw-r--r-- 0.0 unx 54165 b- defN 81-Jan-01 01:01 assets/public/chunk-44APA3YG.js.map │ -rw-r--r-- 0.0 unx 2001 b- defN 81-Jan-01 01:01 assets/public/chunk-4DU5POMW.js │ -rw-r--r-- 0.0 unx 3277 b- defN 81-Jan-01 01:01 assets/public/chunk-4DU5POMW.js.map │ -rw-r--r-- 0.0 unx 3415 b- defN 81-Jan-01 01:01 assets/public/chunk-4E2S5VHM.js │ -rw-r--r-- 0.0 unx 16186 b- defN 81-Jan-01 01:01 assets/public/chunk-4E2S5VHM.js.map │ -rw-r--r-- 0.0 unx 4853 b- defN 81-Jan-01 01:01 assets/public/chunk-4WKVJOAH.js │ -rw-r--r-- 0.0 unx 56024 b- defN 81-Jan-01 01:01 assets/public/chunk-4WKVJOAH.js.map │ -rw-r--r-- 0.0 unx 33015 b- defN 81-Jan-01 01:01 assets/public/chunk-5CCOWBRQ.js │ -rw-r--r-- 0.0 unx 112433 b- defN 81-Jan-01 01:01 assets/public/chunk-5CCOWBRQ.js.map │ -rw-r--r-- 0.0 unx 20589 b- defN 81-Jan-01 01:01 assets/public/chunk-5EJEBDGG.js │ -rw-r--r-- 0.0 unx 35313 b- defN 81-Jan-01 01:01 assets/public/chunk-5EJEBDGG.js.map │ +-rw-r--r-- 0.0 unx 29977 b- defN 81-Jan-01 01:01 assets/public/chunk-5KTYML3O.js │ +-rw-r--r-- 0.0 unx 109075 b- defN 81-Jan-01 01:01 assets/public/chunk-5KTYML3O.js.map │ -rw-r--r-- 0.0 unx 19119 b- defN 81-Jan-01 01:01 assets/public/chunk-5WGRVPAX.js │ -rw-r--r-- 0.0 unx 53621 b- defN 81-Jan-01 01:01 assets/public/chunk-5WGRVPAX.js.map │ -rw-r--r-- 0.0 unx 43128 b- defN 81-Jan-01 01:01 assets/public/chunk-66RKCJ2D.js │ -rw-r--r-- 0.0 unx 158051 b- defN 81-Jan-01 01:01 assets/public/chunk-66RKCJ2D.js.map │ -rw-r--r-- 0.0 unx 1956 b- defN 81-Jan-01 01:01 assets/public/chunk-6XVDHFD6.js │ -rw-r--r-- 0.0 unx 7789 b- defN 81-Jan-01 01:01 assets/public/chunk-6XVDHFD6.js.map │ -rw-r--r-- 0.0 unx 8837 b- defN 81-Jan-01 01:01 assets/public/chunk-7FP2R733.js │ @@ -171,34 +175,36 @@ │ -rw-r--r-- 0.0 unx 81980 b- defN 81-Jan-01 01:01 assets/public/chunk-7Y36D5N7.js.map │ -rw-r--r-- 0.0 unx 10796 b- defN 81-Jan-01 01:01 assets/public/chunk-A5MBRGPF.js │ -rw-r--r-- 0.0 unx 41610 b- defN 81-Jan-01 01:01 assets/public/chunk-A5MBRGPF.js.map │ -rw-r--r-- 0.0 unx 335 b- defN 81-Jan-01 01:01 assets/public/chunk-A6QD6H33.js │ -rw-r--r-- 0.0 unx 680 b- defN 81-Jan-01 01:01 assets/public/chunk-A6QD6H33.js.map │ -rw-r--r-- 0.0 unx 4733 b- defN 81-Jan-01 01:01 assets/public/chunk-ARG5E3HE.js │ -rw-r--r-- 0.0 unx 18666 b- defN 81-Jan-01 01:01 assets/public/chunk-ARG5E3HE.js.map │ --rw-r--r-- 0.0 unx 59706 b- defN 81-Jan-01 01:01 assets/public/chunk-AWET6OFF.js │ --rw-r--r-- 0.0 unx 171342 b- defN 81-Jan-01 01:01 assets/public/chunk-AWET6OFF.js.map │ -rw-r--r-- 0.0 unx 23637 b- defN 81-Jan-01 01:01 assets/public/chunk-AX45DQLU.js │ -rw-r--r-- 0.0 unx 41275 b- defN 81-Jan-01 01:01 assets/public/chunk-AX45DQLU.js.map │ -rw-r--r-- 0.0 unx 1560 b- defN 81-Jan-01 01:01 assets/public/chunk-AYNA622M.js │ -rw-r--r-- 0.0 unx 4533 b- defN 81-Jan-01 01:01 assets/public/chunk-AYNA622M.js.map │ -rw-r--r-- 0.0 unx 1214 b- defN 81-Jan-01 01:01 assets/public/chunk-BESLMJLA.js │ -rw-r--r-- 0.0 unx 3481 b- defN 81-Jan-01 01:01 assets/public/chunk-BESLMJLA.js.map │ -rw-r--r-- 0.0 unx 867 b- defN 81-Jan-01 01:01 assets/public/chunk-BG3RWF4E.js │ -rw-r--r-- 0.0 unx 1567 b- defN 81-Jan-01 01:01 assets/public/chunk-BG3RWF4E.js.map │ +-rw-r--r-- 0.0 unx 254518 b- defN 81-Jan-01 01:01 assets/public/chunk-BJMTRQ2H.js │ +-rw-r--r-- 0.0 unx 796799 b- defN 81-Jan-01 01:01 assets/public/chunk-BJMTRQ2H.js.map │ -rw-r--r-- 0.0 unx 997 b- defN 81-Jan-01 01:01 assets/public/chunk-BOROUNNF.js │ -rw-r--r-- 0.0 unx 93 b- defN 81-Jan-01 01:01 assets/public/chunk-BOROUNNF.js.map │ -rw-r--r-- 0.0 unx 49220 b- defN 81-Jan-01 01:01 assets/public/chunk-C3UU6BY7.js │ -rw-r--r-- 0.0 unx 184328 b- defN 81-Jan-01 01:01 assets/public/chunk-C3UU6BY7.js.map │ -rw-r--r-- 0.0 unx 3323 b- defN 81-Jan-01 01:01 assets/public/chunk-C4WSYK2Z.js │ -rw-r--r-- 0.0 unx 22451 b- defN 81-Jan-01 01:01 assets/public/chunk-C4WSYK2Z.js.map │ -rw-r--r-- 0.0 unx 2220 b- defN 81-Jan-01 01:01 assets/public/chunk-CGVTLF4M.js │ -rw-r--r-- 0.0 unx 4787 b- defN 81-Jan-01 01:01 assets/public/chunk-CGVTLF4M.js.map │ -rw-r--r-- 0.0 unx 4100 b- defN 81-Jan-01 01:01 assets/public/chunk-D337F4ZA.js │ -rw-r--r-- 0.0 unx 10651 b- defN 81-Jan-01 01:01 assets/public/chunk-D337F4ZA.js.map │ +-rw-r--r-- 0.0 unx 3098 b- defN 81-Jan-01 01:01 assets/public/chunk-DVXLHQ52.js │ +-rw-r--r-- 0.0 unx 9576 b- defN 81-Jan-01 01:01 assets/public/chunk-DVXLHQ52.js.map │ -rw-r--r-- 0.0 unx 437457 b- defN 81-Jan-01 01:01 assets/public/chunk-DZTG6EPO.js │ -rw-r--r-- 0.0 unx 1585895 b- defN 81-Jan-01 01:01 assets/public/chunk-DZTG6EPO.js.map │ -rw-r--r-- 0.0 unx 23445 b- defN 81-Jan-01 01:01 assets/public/chunk-E6T6JGUV.js │ -rw-r--r-- 0.0 unx 62232 b- defN 81-Jan-01 01:01 assets/public/chunk-E6T6JGUV.js.map │ -rw-r--r-- 0.0 unx 2829 b- defN 81-Jan-01 01:01 assets/public/chunk-EMGLNL65.js │ -rw-r--r-- 0.0 unx 11992 b- defN 81-Jan-01 01:01 assets/public/chunk-EMGLNL65.js.map │ -rw-r--r-- 0.0 unx 1162 b- defN 81-Jan-01 01:01 assets/public/chunk-F6FG5G6Y.js │ @@ -207,22 +213,22 @@ │ -rw-r--r-- 0.0 unx 11590 b- defN 81-Jan-01 01:01 assets/public/chunk-F6JR3SI6.js.map │ -rw-r--r-- 0.0 unx 42689 b- defN 81-Jan-01 01:01 assets/public/chunk-F7SOYNIY.js │ -rw-r--r-- 0.0 unx 170408 b- defN 81-Jan-01 01:01 assets/public/chunk-F7SOYNIY.js.map │ -rw-r--r-- 0.0 unx 2069 b- defN 81-Jan-01 01:01 assets/public/chunk-FREOXMLF.js │ -rw-r--r-- 0.0 unx 11211 b- defN 81-Jan-01 01:01 assets/public/chunk-FREOXMLF.js.map │ -rw-r--r-- 0.0 unx 2210 b- defN 81-Jan-01 01:01 assets/public/chunk-GLJ2XEKJ.js │ -rw-r--r-- 0.0 unx 3017 b- defN 81-Jan-01 01:01 assets/public/chunk-GLJ2XEKJ.js.map │ +-rw-r--r-- 0.0 unx 11454 b- defN 81-Jan-01 01:01 assets/public/chunk-IOD4LE5B.js │ +-rw-r--r-- 0.0 unx 22568 b- defN 81-Jan-01 01:01 assets/public/chunk-IOD4LE5B.js.map │ -rw-r--r-- 0.0 unx 2450 b- defN 81-Jan-01 01:01 assets/public/chunk-IUNL6TT7.js │ -rw-r--r-- 0.0 unx 5082 b- defN 81-Jan-01 01:01 assets/public/chunk-IUNL6TT7.js.map │ -rw-r--r-- 0.0 unx 9190 b- defN 81-Jan-01 01:01 assets/public/chunk-JDPRH2TW.js │ -rw-r--r-- 0.0 unx 20947 b- defN 81-Jan-01 01:01 assets/public/chunk-JDPRH2TW.js.map │ -rw-r--r-- 0.0 unx 54604 b- defN 81-Jan-01 01:01 assets/public/chunk-JEX3ETUW.js │ -rw-r--r-- 0.0 unx 183846 b- defN 81-Jan-01 01:01 assets/public/chunk-JEX3ETUW.js.map │ --rw-r--r-- 0.0 unx 29977 b- defN 81-Jan-01 01:01 assets/public/chunk-JLCYLO4B.js │ --rw-r--r-- 0.0 unx 109075 b- defN 81-Jan-01 01:01 assets/public/chunk-JLCYLO4B.js.map │ -rw-r--r-- 0.0 unx 511 b- defN 81-Jan-01 01:01 assets/public/chunk-JYCVFVA4.js │ -rw-r--r-- 0.0 unx 1526 b- defN 81-Jan-01 01:01 assets/public/chunk-JYCVFVA4.js.map │ -rw-r--r-- 0.0 unx 6602 b- defN 81-Jan-01 01:01 assets/public/chunk-KFIX4BML.js │ -rw-r--r-- 0.0 unx 27239 b- defN 81-Jan-01 01:01 assets/public/chunk-KFIX4BML.js.map │ -rw-r--r-- 0.0 unx 7075 b- defN 81-Jan-01 01:01 assets/public/chunk-LOLEDR3S.js │ -rw-r--r-- 0.0 unx 25025 b- defN 81-Jan-01 01:01 assets/public/chunk-LOLEDR3S.js.map │ -rw-r--r-- 0.0 unx 291 b- defN 81-Jan-01 01:01 assets/public/chunk-MASHVMAF.js │ @@ -235,26 +241,28 @@ │ -rw-r--r-- 0.0 unx 637374 b- defN 81-Jan-01 01:01 assets/public/chunk-MSQU4SW3.js.map │ -rw-r--r-- 0.0 unx 2524 b- defN 81-Jan-01 01:01 assets/public/chunk-OGBGE5Z5.js │ -rw-r--r-- 0.0 unx 10258 b- defN 81-Jan-01 01:01 assets/public/chunk-OGBGE5Z5.js.map │ -rw-r--r-- 0.0 unx 3929 b- defN 81-Jan-01 01:01 assets/public/chunk-OVAWK6DV.js │ -rw-r--r-- 0.0 unx 9310 b- defN 81-Jan-01 01:01 assets/public/chunk-OVAWK6DV.js.map │ -rw-r--r-- 0.0 unx 202242 b- defN 81-Jan-01 01:01 assets/public/chunk-OXDOKNTF.js │ -rw-r--r-- 0.0 unx 824865 b- defN 81-Jan-01 01:01 assets/public/chunk-OXDOKNTF.js.map │ +-rw-r--r-- 0.0 unx 63528 b- defN 81-Jan-01 01:01 assets/public/chunk-PB3ZXSJW.js │ +-rw-r--r-- 0.0 unx 160634 b- defN 81-Jan-01 01:01 assets/public/chunk-PB3ZXSJW.js.map │ -rw-r--r-- 0.0 unx 8263 b- defN 81-Jan-01 01:01 assets/public/chunk-PEJGMLLQ.js │ -rw-r--r-- 0.0 unx 32372 b- defN 81-Jan-01 01:01 assets/public/chunk-PEJGMLLQ.js.map │ -rw-r--r-- 0.0 unx 602 b- defN 81-Jan-01 01:01 assets/public/chunk-PHMHLQUD.js │ -rw-r--r-- 0.0 unx 2080 b- defN 81-Jan-01 01:01 assets/public/chunk-PHMHLQUD.js.map │ -rw-r--r-- 0.0 unx 51919 b- defN 81-Jan-01 01:01 assets/public/chunk-PIGYGPDI.js │ -rw-r--r-- 0.0 unx 187498 b- defN 81-Jan-01 01:01 assets/public/chunk-PIGYGPDI.js.map │ -rw-r--r-- 0.0 unx 48427 b- defN 81-Jan-01 01:01 assets/public/chunk-PUVAJD27.js │ -rw-r--r-- 0.0 unx 133326 b- defN 81-Jan-01 01:01 assets/public/chunk-PUVAJD27.js.map │ -rw-r--r-- 0.0 unx 2173 b- defN 81-Jan-01 01:01 assets/public/chunk-Q3C4NXB3.js │ -rw-r--r-- 0.0 unx 8779 b- defN 81-Jan-01 01:01 assets/public/chunk-Q3C4NXB3.js.map │ --rw-r--r-- 0.0 unx 118944 b- defN 81-Jan-01 01:01 assets/public/chunk-R4P47OGM.js │ --rw-r--r-- 0.0 unx 180097 b- defN 81-Jan-01 01:01 assets/public/chunk-R4P47OGM.js.map │ +-rw-r--r-- 0.0 unx 59706 b- defN 81-Jan-01 01:01 assets/public/chunk-Q5UDDBBV.js │ +-rw-r--r-- 0.0 unx 171342 b- defN 81-Jan-01 01:01 assets/public/chunk-Q5UDDBBV.js.map │ -rw-r--r-- 0.0 unx 4604 b- defN 81-Jan-01 01:01 assets/public/chunk-RFL3SZU3.js │ -rw-r--r-- 0.0 unx 8705 b- defN 81-Jan-01 01:01 assets/public/chunk-RFL3SZU3.js.map │ -rw-r--r-- 0.0 unx 1982 b- defN 81-Jan-01 01:01 assets/public/chunk-RHMYOTJZ.js │ -rw-r--r-- 0.0 unx 3516 b- defN 81-Jan-01 01:01 assets/public/chunk-RHMYOTJZ.js.map │ -rw-r--r-- 0.0 unx 46053 b- defN 81-Jan-01 01:01 assets/public/chunk-RHU3AIGY.js │ -rw-r--r-- 0.0 unx 232748 b- defN 81-Jan-01 01:01 assets/public/chunk-RHU3AIGY.js.map │ -rw-r--r-- 0.0 unx 84482 b- defN 81-Jan-01 01:01 assets/public/chunk-RKSXE4SK.js │ @@ -269,52 +277,44 @@ │ -rw-r--r-- 0.0 unx 72134 b- defN 81-Jan-01 01:01 assets/public/chunk-TXDWX6DX.js.map │ -rw-r--r-- 0.0 unx 32087 b- defN 81-Jan-01 01:01 assets/public/chunk-U233VVFY.js │ -rw-r--r-- 0.0 unx 143700 b- defN 81-Jan-01 01:01 assets/public/chunk-U233VVFY.js.map │ -rw-r--r-- 0.0 unx 4447 b- defN 81-Jan-01 01:01 assets/public/chunk-UGLRX622.js │ -rw-r--r-- 0.0 unx 6897 b- defN 81-Jan-01 01:01 assets/public/chunk-UGLRX622.js.map │ -rw-r--r-- 0.0 unx 15719 b- defN 81-Jan-01 01:01 assets/public/chunk-UICRIEWG.js │ -rw-r--r-- 0.0 unx 30612 b- defN 81-Jan-01 01:01 assets/public/chunk-UICRIEWG.js.map │ --rw-r--r-- 0.0 unx 11454 b- defN 81-Jan-01 01:01 assets/public/chunk-USPS5AYJ.js │ --rw-r--r-- 0.0 unx 22568 b- defN 81-Jan-01 01:01 assets/public/chunk-USPS5AYJ.js.map │ -rw-r--r-- 0.0 unx 903 b- defN 81-Jan-01 01:01 assets/public/chunk-VALZJMB4.js │ -rw-r--r-- 0.0 unx 1735 b- defN 81-Jan-01 01:01 assets/public/chunk-VALZJMB4.js.map │ -rw-r--r-- 0.0 unx 35728 b- defN 81-Jan-01 01:01 assets/public/chunk-VAYAHN5M.js │ -rw-r--r-- 0.0 unx 149383 b- defN 81-Jan-01 01:01 assets/public/chunk-VAYAHN5M.js.map │ -rw-r--r-- 0.0 unx 14084 b- defN 81-Jan-01 01:01 assets/public/chunk-VDGO6IHD.js │ -rw-r--r-- 0.0 unx 35622 b- defN 81-Jan-01 01:01 assets/public/chunk-VDGO6IHD.js.map │ --rw-r--r-- 0.0 unx 933 b- defN 81-Jan-01 01:01 assets/public/chunk-VHOVANZ5.js │ --rw-r--r-- 0.0 unx 93 b- defN 81-Jan-01 01:01 assets/public/chunk-VHOVANZ5.js.map │ -rw-r--r-- 0.0 unx 1116397 b- defN 81-Jan-01 01:01 assets/public/chunk-VMQ3W6PM.js │ -rw-r--r-- 0.0 unx 4970454 b- defN 81-Jan-01 01:01 assets/public/chunk-VMQ3W6PM.js.map │ -rw-r--r-- 0.0 unx 965 b- defN 81-Jan-01 01:01 assets/public/chunk-W3EHXDVY.js │ -rw-r--r-- 0.0 unx 3891 b- defN 81-Jan-01 01:01 assets/public/chunk-W3EHXDVY.js.map │ -rw-r--r-- 0.0 unx 2830 b- defN 81-Jan-01 01:01 assets/public/chunk-W6JV32PQ.js │ -rw-r--r-- 0.0 unx 4560 b- defN 81-Jan-01 01:01 assets/public/chunk-W6JV32PQ.js.map │ -rw-r--r-- 0.0 unx 3941 b- defN 81-Jan-01 01:01 assets/public/chunk-X3IS2OXN.js │ -rw-r--r-- 0.0 unx 10584 b- defN 81-Jan-01 01:01 assets/public/chunk-X3IS2OXN.js.map │ +-rw-r--r-- 0.0 unx 933 b- defN 81-Jan-01 01:01 assets/public/chunk-XE7IYWZ3.js │ +-rw-r--r-- 0.0 unx 93 b- defN 81-Jan-01 01:01 assets/public/chunk-XE7IYWZ3.js.map │ -rw-r--r-- 0.0 unx 2086 b- defN 81-Jan-01 01:01 assets/public/chunk-XEMS4CV6.js │ -rw-r--r-- 0.0 unx 6640 b- defN 81-Jan-01 01:01 assets/public/chunk-XEMS4CV6.js.map │ -rw-r--r-- 0.0 unx 5592 b- defN 81-Jan-01 01:01 assets/public/chunk-XPMSZPLA.js │ -rw-r--r-- 0.0 unx 20482 b- defN 81-Jan-01 01:01 assets/public/chunk-XPMSZPLA.js.map │ -rw-r--r-- 0.0 unx 411 b- defN 81-Jan-01 01:01 assets/public/chunk-XSBQS7RE.js │ -rw-r--r-- 0.0 unx 920 b- defN 81-Jan-01 01:01 assets/public/chunk-XSBQS7RE.js.map │ -rw-r--r-- 0.0 unx 770 b- defN 81-Jan-01 01:01 assets/public/chunk-XU2E3I7U.js │ -rw-r--r-- 0.0 unx 2780 b- defN 81-Jan-01 01:01 assets/public/chunk-XU2E3I7U.js.map │ --rw-r--r-- 0.0 unx 1015 b- defN 81-Jan-01 01:01 assets/public/chunk-XUIFSHYO.js │ --rw-r--r-- 0.0 unx 93 b- defN 81-Jan-01 01:01 assets/public/chunk-XUIFSHYO.js.map │ -rw-r--r-- 0.0 unx 9966 b- defN 81-Jan-01 01:01 assets/public/chunk-XZGPSUHF.js │ -rw-r--r-- 0.0 unx 27757 b- defN 81-Jan-01 01:01 assets/public/chunk-XZGPSUHF.js.map │ -rw-r--r-- 0.0 unx 255 b- defN 81-Jan-01 01:01 assets/public/chunk-Y2INYPC2.js │ -rw-r--r-- 0.0 unx 816 b- defN 81-Jan-01 01:01 assets/public/chunk-Y2INYPC2.js.map │ -rw-r--r-- 0.0 unx 15031 b- defN 81-Jan-01 01:01 assets/public/chunk-Y2KWFJAP.js │ -rw-r--r-- 0.0 unx 37882 b- defN 81-Jan-01 01:01 assets/public/chunk-Y2KWFJAP.js.map │ --rw-r--r-- 0.0 unx 3098 b- defN 81-Jan-01 01:01 assets/public/chunk-Y7X6DNMX.js │ --rw-r--r-- 0.0 unx 9576 b- defN 81-Jan-01 01:01 assets/public/chunk-Y7X6DNMX.js.map │ --rw-r--r-- 0.0 unx 254518 b- defN 81-Jan-01 01:01 assets/public/chunk-YQVQI5K6.js │ --rw-r--r-- 0.0 unx 796799 b- defN 81-Jan-01 01:01 assets/public/chunk-YQVQI5K6.js.map │ -rw-r--r-- 0.0 unx 3538 b- defN 81-Jan-01 01:01 assets/public/chunk-Z3X3FSVS.js │ -rw-r--r-- 0.0 unx 10230 b- defN 81-Jan-01 01:01 assets/public/chunk-Z3X3FSVS.js.map │ -rw-r--r-- 0.0 unx 1344 b- defN 81-Jan-01 01:01 assets/public/collapsible.component-CBYP37WQ.css.map │ -rw-r--r-- 0.0 unx 1622 b- defN 81-Jan-01 01:01 assets/public/config-form.component-QOD2VNLM.css.map │ -rw-r--r-- 0.0 unx 3389 b- defN 81-Jan-01 01:01 assets/public/config-page.component-ZO7NE7NA.css.map │ -rw-r--r-- 0.0 unx 3326 b- defN 81-Jan-01 01:01 assets/public/config-section.component-DNMSTOIT.css.map │ -rw-r--r-- 0.0 unx 1343 b- defN 81-Jan-01 01:01 assets/public/config-sound-form.component-SGP4LNG3.css.map │ @@ -386,16 +386,16 @@ │ -rw-r--r-- 0.0 unx 3561 b- defN 81-Jan-01 01:01 assets/public/issue-panel.component-GOP3ZPSQ.css.map │ -rw-r--r-- 0.0 unx 895 b- defN 81-Jan-01 01:01 assets/public/issue-preview-item.component-56RJZCNX.css.map │ -rw-r--r-- 0.0 unx 1761 b- defN 81-Jan-01 01:01 assets/public/issue-provider-setup-overview.component-YTYDZG3E.css.map │ -rw-r--r-- 0.0 unx 1899 b- defN 81-Jan-01 01:01 assets/public/issue-provider-tab.component-IAK65AKV.css.map │ -rw-r--r-- 0.0 unx 325 b- defN 81-Jan-01 01:01 assets/public/jira-additional-cfg.component-42ZCNEAB.css.map │ -rw-r--r-- 0.0 unx 393 b- defN 81-Jan-01 01:01 assets/public/jira-link.component-AKJUVRHV.css.map │ -rw-r--r-- 0.0 unx 891 b- defN 81-Jan-01 01:01 assets/public/lazy-chart.component-S7BZ22QP.css.map │ --rw-r--r-- 0.0 unx 597734 b- defN 81-Jan-01 01:01 assets/public/main-UWQROBKP.js │ --rw-r--r-- 0.0 unx 2140660 b- defN 81-Jan-01 01:01 assets/public/main-UWQROBKP.js.map │ +-rw-r--r-- 0.0 unx 597734 b- defN 81-Jan-01 01:01 assets/public/main-3RR5IWHZ.js │ +-rw-r--r-- 0.0 unx 2140660 b- defN 81-Jan-01 01:01 assets/public/main-3RR5IWHZ.js.map │ -rw-r--r-- 0.0 unx 15283 b- defN 81-Jan-01 01:01 assets/public/main-header.component-JG5JQ5CV.css.map │ -rw-r--r-- 0.0 unx 926 b- defN 81-Jan-01 01:01 assets/public/manifest.json │ -rw-r--r-- 0.0 unx 356840 b- defN 81-Jan-01 01:01 assets/public/media/MaterialIcons-Regular-5HNTTCIU.ttf │ -rw-r--r-- 0.0 unx 65164 b- defN 81-Jan-01 01:01 assets/public/media/roboto-all-300-normal-HGW5R6ZP.woff │ -rw-r--r-- 0.0 unx 69672 b- defN 81-Jan-01 01:01 assets/public/media/roboto-all-400-italic-HV3SWHL5.woff │ -rw-r--r-- 0.0 unx 65456 b- defN 81-Jan-01 01:01 assets/public/media/roboto-all-400-normal-F2PJIADI.woff │ -rw-r--r-- 0.0 unx 65556 b- defN 81-Jan-01 01:01 assets/public/media/roboto-all-700-normal-ZI6Q7W36.woff │ @@ -1270,8 +1270,8 @@ │ -rw---- 0.0 fat 308 b- defN 81-Jan-01 01:01 res/zn.xml │ -rw---- 0.0 fat 448 b- defN 81-Jan-01 01:01 res/zp.xml │ -rw---- 0.0 fat 464 b- defN 81-Jan-01 01:01 res/zq.xml │ -rw---- 0.0 fat 503540 b- stor 81-Jan-01 01:01 resources.arsc │ -rw---- 2.0 fat 127435 b- defN 81-Jan-01 01:01 META-INF/F4E24334.SF │ -rw---- 2.0 fat 1342 b- defN 81-Jan-01 01:01 META-INF/F4E24334.RSA │ -rw---- 2.0 fat 127308 b- defN 81-Jan-01 01:01 META-INF/MANIFEST.MF │ -1275 files, 41611505 bytes uncompressed, 14176113 bytes compressed: 65.9% │ +1275 files, 41611505 bytes uncompressed, 14176114 bytes compressed: 65.9% ├── assets/public/ngsw.json │ ├── Pretty-printed │ │┄ Similarity: 0.9313378298098984% │ │┄ Differences: {"'assetGroups'": "{0: {'urls': {insert: [(2, '/chunk-2KZHDGJ4.js'), (10, '/chunk-3R6CM3NH.js'), " │ │┄ "(20, '/chunk-5KTYML3O.js'), (33, '/chunk-BJMTRQ2H.js'), (39, " │ │┄ "'/chunk-DVXLHQ52.js'), (48, '/chunk-IOD4LE5B.js'), (62, '/chunk-PB3ZXSJW.js'), " │ │┄ "(68, '/chunk-Q5UDDBBV.js'), (87, '/chunk-XE7IYWZ3.js'), (98, " │ │┄ "'/main-3RR5IWHZ.js')], delete: [98, 94, 93, 89, 80, 76, 64, 48, 27, 11]}}}", │ │┄ "'hashTable'": "{'/index.html': 'c2de5ab568b6315bc81 […] │ │ @@ -7,111 +7,111 @@ │ │ "installMode": "prefetch", │ │ "name": "app", │ │ "patterns": [], │ │ "updateMode": "prefetch", │ │ "urls": [ │ │ "/chunk-23TMGEW6.js", │ │ "/chunk-2FU63URL.js", │ │ + "/chunk-2KZHDGJ4.js", │ │ "/chunk-2NYJ54WT.js", │ │ "/chunk-2QOQ2EYE.js", │ │ "/chunk-2UCFOZRF.js", │ │ "/chunk-34HIK4DR.js", │ │ "/chunk-366J2TQY.js", │ │ "/chunk-3E43H4SH.js", │ │ "/chunk-3MDSNHPO.js", │ │ + "/chunk-3R6CM3NH.js", │ │ "/chunk-3RGW2GE5.js", │ │ "/chunk-3UB54IM4.js", │ │ - "/chunk-3XZTXRJN.js", │ │ "/chunk-3Y2SDFCL.js", │ │ "/chunk-44APA3YG.js", │ │ "/chunk-4DU5POMW.js", │ │ "/chunk-4E2S5VHM.js", │ │ "/chunk-4WKVJOAH.js", │ │ "/chunk-5CCOWBRQ.js", │ │ "/chunk-5EJEBDGG.js", │ │ + "/chunk-5KTYML3O.js", │ │ "/chunk-5WGRVPAX.js", │ │ "/chunk-66RKCJ2D.js", │ │ "/chunk-6XVDHFD6.js", │ │ "/chunk-7FP2R733.js", │ │ "/chunk-7Y36D5N7.js", │ │ "/chunk-A5MBRGPF.js", │ │ "/chunk-A6QD6H33.js", │ │ "/chunk-ARG5E3HE.js", │ │ - "/chunk-AWET6OFF.js", │ │ "/chunk-AX45DQLU.js", │ │ "/chunk-AYNA622M.js", │ │ "/chunk-BESLMJLA.js", │ │ "/chunk-BG3RWF4E.js", │ │ + "/chunk-BJMTRQ2H.js", │ │ "/chunk-BOROUNNF.js", │ │ "/chunk-C3UU6BY7.js", │ │ "/chunk-C4WSYK2Z.js", │ │ "/chunk-CGVTLF4M.js", │ │ "/chunk-D337F4ZA.js", │ │ + "/chunk-DVXLHQ52.js", │ │ "/chunk-DZTG6EPO.js", │ │ "/chunk-E6T6JGUV.js", │ │ "/chunk-EMGLNL65.js", │ │ "/chunk-F6FG5G6Y.js", │ │ "/chunk-F6JR3SI6.js", │ │ "/chunk-F7SOYNIY.js", │ │ "/chunk-FREOXMLF.js", │ │ "/chunk-GLJ2XEKJ.js", │ │ + "/chunk-IOD4LE5B.js", │ │ "/chunk-IUNL6TT7.js", │ │ "/chunk-JDPRH2TW.js", │ │ "/chunk-JEX3ETUW.js", │ │ - "/chunk-JLCYLO4B.js", │ │ "/chunk-JYCVFVA4.js", │ │ "/chunk-KFIX4BML.js", │ │ "/chunk-LOLEDR3S.js", │ │ "/chunk-MASHVMAF.js", │ │ "/chunk-MBPADQWM.js", │ │ "/chunk-MKQ5S2AR.js", │ │ "/chunk-MSQU4SW3.js", │ │ "/chunk-OGBGE5Z5.js", │ │ "/chunk-OVAWK6DV.js", │ │ "/chunk-OXDOKNTF.js", │ │ + "/chunk-PB3ZXSJW.js", │ │ "/chunk-PEJGMLLQ.js", │ │ "/chunk-PHMHLQUD.js", │ │ "/chunk-PIGYGPDI.js", │ │ "/chunk-PUVAJD27.js", │ │ "/chunk-Q3C4NXB3.js", │ │ - "/chunk-R4P47OGM.js", │ │ + "/chunk-Q5UDDBBV.js", │ │ "/chunk-RFL3SZU3.js", │ │ "/chunk-RHMYOTJZ.js", │ │ "/chunk-RHU3AIGY.js", │ │ "/chunk-RKSXE4SK.js", │ │ "/chunk-SOAJT2AH.js", │ │ "/chunk-SY3V5BWR.js", │ │ "/chunk-TLEFF72J.js", │ │ "/chunk-TXDWX6DX.js", │ │ "/chunk-U233VVFY.js", │ │ "/chunk-UGLRX622.js", │ │ "/chunk-UICRIEWG.js", │ │ - "/chunk-USPS5AYJ.js", │ │ "/chunk-VALZJMB4.js", │ │ "/chunk-VAYAHN5M.js", │ │ "/chunk-VDGO6IHD.js", │ │ - "/chunk-VHOVANZ5.js", │ │ "/chunk-VMQ3W6PM.js", │ │ "/chunk-W3EHXDVY.js", │ │ "/chunk-W6JV32PQ.js", │ │ "/chunk-X3IS2OXN.js", │ │ + "/chunk-XE7IYWZ3.js", │ │ "/chunk-XEMS4CV6.js", │ │ "/chunk-XPMSZPLA.js", │ │ "/chunk-XSBQS7RE.js", │ │ "/chunk-XU2E3I7U.js", │ │ - "/chunk-XUIFSHYO.js", │ │ "/chunk-XZGPSUHF.js", │ │ "/chunk-Y2INYPC2.js", │ │ "/chunk-Y2KWFJAP.js", │ │ - "/chunk-Y7X6DNMX.js", │ │ - "/chunk-YQVQI5K6.js", │ │ "/chunk-Z3X3FSVS.js", │ │ "/favicon.ico", │ │ "/index.html", │ │ - "/main-UWQROBKP.js", │ │ + "/main-3RR5IWHZ.js", │ │ "/manifest.json", │ │ "/polyfills-D4CWKFPZ.js", │ │ "/styles-YGMGLQYI.css", │ │ "/worker-VAIP3XN2.js" │ │ ] │ │ }, │ │ { │ │ @@ -372,111 +372,111 @@ │ │ "/assets/themes/glass.css": "76e655b02a197fd55aa92df4ab3a04201da78eeb", │ │ "/assets/themes/nord-polar-night.css": "1a2c7771f9ba66ff2404fcb7e91585df198735e0", │ │ "/assets/themes/nord-snow-storm.css": "c402e6a53c388e4c04f99af3fba0ed465a25d240", │ │ "/assets/themes/rainbow.css": "186baf9b9791daff9c3b1a973e4a4e29b1f6536b", │ │ "/assets/unicorn.png": "0326afe4a8f85faa5c3a01fd38efeafeb58094a2", │ │ "/chunk-23TMGEW6.js": "1ce735f1737df852ac81ab5f5e354f3c8d197fcb", │ │ "/chunk-2FU63URL.js": "7902b5d391df8df0d8c0fa34b1d71823531ff18f", │ │ + "/chunk-2KZHDGJ4.js": "d03b3a38f1fe6d1f073c96d47ffa075b324218fa", │ │ "/chunk-2NYJ54WT.js": "6b2058100c2940dca4d746dd3f5d18ab6c115902", │ │ "/chunk-2QOQ2EYE.js": "cc24be53457693c3fac30a6cecb2e6a11c729279", │ │ "/chunk-2UCFOZRF.js": "9efc6380cdc8718931c96cec604c0a71a58776a8", │ │ "/chunk-34HIK4DR.js": "ce638dac1c94d8ba75c592a5d0840aa6f249b9ea", │ │ "/chunk-366J2TQY.js": "ab6a266bd61befb6dd2f79418d785d701cb092d3", │ │ "/chunk-3E43H4SH.js": "33caa87bbac6b8a44c021550f0bba30292886b0d", │ │ "/chunk-3MDSNHPO.js": "a15dbcd39797c85f0557c645d97ecdf0bf89da9e", │ │ + "/chunk-3R6CM3NH.js": "56d4ed5a501b308296b2f7e69dd450b1f700dbf5", │ │ "/chunk-3RGW2GE5.js": "83a447c623aa634206837d2b0c35d5a6ca683d8d", │ │ "/chunk-3UB54IM4.js": "6dd0205087c3166a305b1af5ec8ad771cd5ce0e3", │ │ - "/chunk-3XZTXRJN.js": "931c0ed357ccc0246a7db55e304499d3a93e985a", │ │ "/chunk-3Y2SDFCL.js": "01937f8ee2fec789675baaccf39e2109292326e9", │ │ "/chunk-44APA3YG.js": "070cf081a114701e5bda96eb620b63baf0d494e3", │ │ "/chunk-4DU5POMW.js": "cbaf21fa04a32538659b056994fa321f8ac9ad1a", │ │ "/chunk-4E2S5VHM.js": "5006cc5a3866b4bf70d771fb4530702a2c83ab91", │ │ "/chunk-4WKVJOAH.js": "755c38ce168a294972eb8d09e0b4d2ee35e45efa", │ │ "/chunk-5CCOWBRQ.js": "cb8a7d12f1ef56d96994614907c6c1fa86234d6d", │ │ "/chunk-5EJEBDGG.js": "dc0ffe4f2c2e2fcc1cf884711064cc110bd96429", │ │ + "/chunk-5KTYML3O.js": "440c55fcf8597dac65d5b3a864800443edcec4b1", │ │ "/chunk-5WGRVPAX.js": "1217d30a9d65ee639ef208437ffe369d52d6491c", │ │ "/chunk-66RKCJ2D.js": "fd218578ce54a082af28129c211a3293046ef9ac", │ │ "/chunk-6XVDHFD6.js": "ffced40281c62a5b4de6c25ff29e1579d5bdc559", │ │ "/chunk-7FP2R733.js": "099e681d3c3b9f5f91410dc432d3bcb119f9d219", │ │ "/chunk-7Y36D5N7.js": "c93948070f6a51cf53561b5429c2e36c50f108a2", │ │ "/chunk-A5MBRGPF.js": "1370eaa81f6ec887d8231e675fe4147619b78acd", │ │ "/chunk-A6QD6H33.js": "ec517b8d910ffcac343b58e04d3dbc538e2fd731", │ │ "/chunk-ARG5E3HE.js": "0a3a476f5ad7d0c5188e375de60c3ead6a30d7e6", │ │ - "/chunk-AWET6OFF.js": "c35d919f3fca8ef0a2fdfd6a70ba5848ee0be341", │ │ "/chunk-AX45DQLU.js": "4b94fec3ee53cfc6cab4943f52c43b0bbeeff0af", │ │ "/chunk-AYNA622M.js": "16ebf1b04bad7c7e5458c3873484e76f60ff7d57", │ │ "/chunk-BESLMJLA.js": "8fc33c290b740d0d93b18c4be6bded871584cd74", │ │ "/chunk-BG3RWF4E.js": "853bd035cb516760b1cbac87905d54e78d13a666", │ │ + "/chunk-BJMTRQ2H.js": "fca46d92a91fe8ff15de531dc37779bc766d2be4", │ │ "/chunk-BOROUNNF.js": "459f904bd4a5c44bc789798d548ad8a666e2f15c", │ │ "/chunk-C3UU6BY7.js": "4da00859579b8deb731f6b569480d3477a501a65", │ │ "/chunk-C4WSYK2Z.js": "9394a69e75df501e3617448fd09a2fb004651dd9", │ │ "/chunk-CGVTLF4M.js": "cf7f2f522123e51e151913ff5fa8811fd4854d6d", │ │ "/chunk-D337F4ZA.js": "6926a91e7b2796ae351c6ae36cf338eaf05d484e", │ │ + "/chunk-DVXLHQ52.js": "e6efb4fdf175c9a99e0fe7051cfecf9518647013", │ │ "/chunk-DZTG6EPO.js": "3f54800335a0981c44cd32ab27941eb97719bd79", │ │ "/chunk-E6T6JGUV.js": "f3c02d32ae86ac5093a02a65352152c5a1a669a3", │ │ "/chunk-EMGLNL65.js": "657a36c39ebeb80cb8a69740db5801bf1e469847", │ │ "/chunk-F6FG5G6Y.js": "8488116a0f873693028b87c76098562369169504", │ │ "/chunk-F6JR3SI6.js": "0bd1f3a05e0560a93b554db9f2ecef1b94c7eed5", │ │ "/chunk-F7SOYNIY.js": "8b2fbc83cc6416e1e39cfa873abc5448da437085", │ │ "/chunk-FREOXMLF.js": "243482241afedf96a6917c54a78b983261f1598f", │ │ "/chunk-GLJ2XEKJ.js": "693506dafb789fe5e5c806582e7f203b39dcd30e", │ │ + "/chunk-IOD4LE5B.js": "19d79fcbbb3c04f01a77bd43bb21d7be3d54df13", │ │ "/chunk-IUNL6TT7.js": "a7468907d66c19cdfe0630cdd3a1a391f78c17cc", │ │ "/chunk-JDPRH2TW.js": "8704a92270cb1bfd53b093e8c2a281f43fa1b4e6", │ │ "/chunk-JEX3ETUW.js": "88b9e50f12252d4992f62a0d0043e593601a30d9", │ │ - "/chunk-JLCYLO4B.js": "86aea91cae275c2385b8e85593b20e725a41afcf", │ │ "/chunk-JYCVFVA4.js": "eb530b9fc0d00d0a2488622dec090e34404382ff", │ │ "/chunk-KFIX4BML.js": "4fb4015e862e53942858122520972c2010349e6c", │ │ "/chunk-LOLEDR3S.js": "64c4f4d73d0eba5dafcf849ba32b61e87ca55d46", │ │ "/chunk-MASHVMAF.js": "c3e060e28a228fc25d8d7a1a90983cfc33f80afa", │ │ "/chunk-MBPADQWM.js": "43256cf620e0caa9cc23a663a51f2f3b43b3bb76", │ │ "/chunk-MKQ5S2AR.js": "9368b54b4f102d5c8000a30747eda3da95a162a5", │ │ "/chunk-MSQU4SW3.js": "a302f011363675300ae4bf32e9639b62757216d8", │ │ "/chunk-OGBGE5Z5.js": "ae8feae9b111dca3169b0cee088161fea2489b2e", │ │ "/chunk-OVAWK6DV.js": "4361aa6648b214c9f6cc6a5bc622280f547db7f0", │ │ "/chunk-OXDOKNTF.js": "501996a33f7f3e92729fcabc7c0b3cad82f22134", │ │ + "/chunk-PB3ZXSJW.js": "263a21e1b105a4285b89f49996f4427fa6e40149", │ │ "/chunk-PEJGMLLQ.js": "fe6775dde0b3e793079d9c7be74b708dd45a79ea", │ │ "/chunk-PHMHLQUD.js": "00ad640b455111777dec39fdc41460dbb45f023d", │ │ "/chunk-PIGYGPDI.js": "17699875073de6411b211c208f0ce43913b637a6", │ │ "/chunk-PUVAJD27.js": "095fb6534c0a39eeaaea5304b234318e01c3570f", │ │ "/chunk-Q3C4NXB3.js": "046c0115f035d45cdf91fb091d042c4106d0aa5e", │ │ - "/chunk-R4P47OGM.js": "9ff93267bb9831d42397835c350f1ad1e731cb31", │ │ + "/chunk-Q5UDDBBV.js": "b7dcb0b656f67eba6ca5943b7ab495b735764332", │ │ "/chunk-RFL3SZU3.js": "291d679dcae2342b87767abaa437ff0a756a2a4f", │ │ "/chunk-RHMYOTJZ.js": "033c95992bb9de6ea179c293f7b1b677315a46de", │ │ "/chunk-RHU3AIGY.js": "70f3005532610e087402505fa642745a0759fb44", │ │ "/chunk-RKSXE4SK.js": "8b8c88fd16d0682841e340cbab86e1e191b48d24", │ │ "/chunk-SOAJT2AH.js": "f22420655a99101a98b4784cb5ec6316002666c6", │ │ "/chunk-SY3V5BWR.js": "5547d230c6affe0c5b8addea1ddb7c95bfbb4215", │ │ "/chunk-TLEFF72J.js": "7cc250c379b1d45fbfe5818856b516f84f410321", │ │ "/chunk-TXDWX6DX.js": "ad47c317f50b6f67e44127167c6ebf816b08c3f4", │ │ "/chunk-U233VVFY.js": "51f1f8a1d3f2ed2951838a10456ad42172522001", │ │ "/chunk-UGLRX622.js": "7f26106546911574e3a1832a03bb01f3080fbfb0", │ │ "/chunk-UICRIEWG.js": "2056954b752244ed95525f8d5a868acf52d13c78", │ │ - "/chunk-USPS5AYJ.js": "1912e43b8242dfaf382b1a9c27dcefb0e35328e0", │ │ "/chunk-VALZJMB4.js": "3178219d2e9a366851c6f9c278783f9c5628bdc6", │ │ "/chunk-VAYAHN5M.js": "37d0cf6b309e047829398c74ee4d2205c0937bb9", │ │ "/chunk-VDGO6IHD.js": "ab363c48f93f9812b86a30e9801e6f4a3efbb6f3", │ │ - "/chunk-VHOVANZ5.js": "ce34083de327f86c422f76c83ea28d6f62620950", │ │ "/chunk-VMQ3W6PM.js": "09321dd2a1539a0fac4b61fe64cee7e42300acf9", │ │ "/chunk-W3EHXDVY.js": "23e1348651bae932954b8eb0918f95913e86d7bd", │ │ "/chunk-W6JV32PQ.js": "952790c0784f090cccd9afad1b932d5d8b888aa4", │ │ "/chunk-X3IS2OXN.js": "c1dff282f283d6c28f174679119aded952c9fb77", │ │ + "/chunk-XE7IYWZ3.js": "ae969f401f2cc2333f1403fffe3bae808c4abb6a", │ │ "/chunk-XEMS4CV6.js": "badd9ab2c68c1db0cde2a49299d9ada0d8de6acd", │ │ "/chunk-XPMSZPLA.js": "21639e67ea77d5808402ca569c15ab4c2a81d4c3", │ │ "/chunk-XSBQS7RE.js": "a3ad16548430fa7bf58cb4a28bcb6096b023a90a", │ │ "/chunk-XU2E3I7U.js": "42be333379abd934534b707aa2e0824a038af868", │ │ - "/chunk-XUIFSHYO.js": "e035791293256dcb28355341bf8d2b6048895160", │ │ "/chunk-XZGPSUHF.js": "0c954a3b53328fadf5d931b1c95b9d54b3e87687", │ │ "/chunk-Y2INYPC2.js": "586151de17718c4b62ea40444530cad1a01f82fc", │ │ "/chunk-Y2KWFJAP.js": "1ddc690bda2b720874ea78eb19cf2a951b30e724", │ │ - "/chunk-Y7X6DNMX.js": "249aa37bc4d864a5b891ebf42a1b000f4a6c09ac", │ │ - "/chunk-YQVQI5K6.js": "994dd8bad3a2acd319ec389c1ebcc0d9927b971a", │ │ "/chunk-Z3X3FSVS.js": "f4a6bea5969513eed91603c1a7e9af97f859598c", │ │ "/favicon.ico": "041b337586bb0e48da6f4fdfc846ef3594373009", │ │ - "/index.html": "55f4a51611a56557fa33d6df7063941367589285", │ │ - "/main-UWQROBKP.js": "d7ae3270b3cdbb0a00024151a8462ba1b40f6296", │ │ + "/index.html": "c2de5ab568b6315bc811d43e68c944876f212dee", │ │ + "/main-3RR5IWHZ.js": "7a4e705896e35896e0ed21efd3f2099b6827d0b0", │ │ "/manifest.json": "94d39d23fcd194a0c89eb3bcd838730cec7cabee", │ │ "/polyfills-D4CWKFPZ.js": "be63e19dcbf7539a31849701283857d1ebe28b56", │ │ "/styles-YGMGLQYI.css": "181aa2324379ebf66d51d6dfb1d7852b3b5de65e", │ │ "/worker-VAIP3XN2.js": "55e4cd02f28969cf6e1fceddfd1db0d6b985a5a6" │ │ }, │ │ "index": "/index.html", │ │ "navigationRequestStrategy": "performance", │ │ @@ -494,9 +494,9 @@ │ │ "regex": "^\\/(?:.+\\/)?[^/]*__[^/]*$" │ │ }, │ │ { │ │ "positive": false, │ │ "regex": "^\\/(?:.+\\/)?[^/]*__[^/]*\\/.*$" │ │ } │ │ ], │ │ - "timestamp": 1756188607110 │ │ + "timestamp": 1756453067388 │ │ } ├── assets/public/index.html │ @@ -6455,29 +6455,29 @@ │ 00019360: 2068 7265 663d 2263 6875 6e6b 2d50 5556 href="chunk-PUV │ 00019370: 414a 4432 372e 6a73 223e 3c6c 696e 6b20 AJD27.js">
  • │ +000193d0: 6e6b 2d49 4f44 344c 4535 422e 6a73 223e nk-IOD4LE5B.js"> │ 000193e0: 3c6c 696e 6b20 7265 6c3d 226d 6f64 756c .. │ --- assets/public/chunk-AWET6OFF.js ├── +++ assets/public/chunk-Q5UDDBBV.js │┄ Files 0% similar despite different names │ ├── js-beautify {} │ │ @@ -11,28 +11,28 @@ │ │ b as rn, │ │ c as Se, │ │ d as Vt, │ │ e as Ht, │ │ f as bn, │ │ g as ai, │ │ h as Dn │ │ -} from "./chunk-Y7X6DNMX.js"; │ │ +} from "./chunk-DVXLHQ52.js"; │ │ import { │ │ a as X, │ │ b as st │ │ } from "./chunk-3UB54IM4.js"; │ │ import { │ │ a as qt, │ │ b as Nn, │ │ c as zt, │ │ d as Pn, │ │ e as Rn, │ │ f as jt, │ │ g as kn │ │ -} from "./chunk-JLCYLO4B.js"; │ │ +} from "./chunk-5KTYML3O.js"; │ │ import { │ │ a as Qt, │ │ b as ei, │ │ c as ti, │ │ d as ii, │ │ e as ni, │ │ f as oi, │ │ @@ -50,15 +50,15 @@ │ │ import { │ │ e as Wt, │ │ f as yn, │ │ g as Xt, │ │ h as Fn, │ │ k as $t, │ │ l as Mn │ │ -} from "./chunk-R4P47OGM.js"; │ │ +} from "./chunk-3R6CM3NH.js"; │ │ import { │ │ A as Bt, │ │ B as Kt, │ │ C as In, │ │ H as wt, │ │ I as hn, │ │ L as Yt, │ │ @@ -68,15 +68,15 @@ │ │ o as Pt, │ │ p as On, │ │ s as kt, │ │ t as xt, │ │ v as Sn, │ │ y as Lt, │ │ z as Ut │ │ -} from "./chunk-YQVQI5K6.js"; │ │ +} from "./chunk-BJMTRQ2H.js"; │ │ import "./chunk-F6JR3SI6.js"; │ │ import "./chunk-JEX3ETUW.js"; │ │ import { │ │ U as vt, │ │ X as Gt, │ │ aa as Tn │ │ } from "./chunk-MSQU4SW3.js"; │ │ @@ -2571,8 +2571,8 @@ │ │ return i │ │ })() │ │ }); │ │ go(); │ │ export { │ │ Pl as ConfigPageComponent │ │ }; │ │ -//# sourceMappingURL=chunk-AWET6OFF.js.map │ │ +//# sourceMappingURL=chunk-Q5UDDBBV.js.map │ --- assets/public/chunk-YQVQI5K6.js.map ├── +++ assets/public/chunk-BJMTRQ2H.js.map │┄ Files 0% similar despite different names │ ├── Pretty-printed │ │┄ Similarity: 0.9981684981684982% │ │┄ Differences: {"'sourcesContent'": "{insert: [(60, '// This file is auto-generated by tools/load-env.js\\n// Do " │ │┄ 'not modify directly - edit .env file instead\\n// Generated at: ' │ │┄ '2025-08-29T07:36:08.448Z\\n\\n/**\\n * Environment variables loaded from ' │ │┄ '.env file\\n * Access these constants instead of process.env in your Angular ' │ │┄ 'app\\n */\\nexport const ENV = {\\n\\n} as const;\\n\\n// Type-safe helper ' │ │┄ 'to en […] │ │ @@ -4076,15 +4076,15 @@ │ │ "\n @for (innerField of field.fieldGroup; track trackByFn(i, innerField); let i = $index) {\n
    \n \n \n more_vert\n \n\n \n\n \n @if (i > 0) {\n \n arrow_backward\n {{ T.G.MOVE_BACKWARD | translate }}\n \n }\n @if (i < field.fieldGroup?.length - 1) {\n \n arrow_forward\n {{ T.G.MOVE_FORWARD | translate }}\n \n }\n \n delete_forever\n {{ T.G.DELETE | translate }}\n \n \n
    \n }\n\n\n
    \n \n add\n {{ to.addText | translate }}\n \n
    \n", │ │ "import { Directionality } from '@angular/cdk/bidi';\nimport { Platform } from '@angular/cdk/platform';\nimport * as i0 from '@angular/core';\nimport { InjectionToken, inject, ChangeDetectorRef, NgZone, Renderer2, ElementRef, Component, ChangeDetectionStrategy, ViewEncapsulation, Input, ViewChild, booleanAttribute, numberAttribute, ViewChildren, ContentChild, ContentChildren, forwardRef, EventEmitter, signal, Directive, Output, NgModule } from '@angular/core';\nimport { b as RippleState, M as MatRipple, a as MAT_RIPPLE_GLOBAL_OPTIONS } from './ripple-BMyyyLz2.mjs';\nimport { _CdkPrivateStyleLoader } from '@angular/cdk/private';\nimport { _ as _animationsDisabled } from './animation-ChQ1vjiF.mjs';\nimport { _ as _StructuralStylesLoader } from './structural-styles-CObeNzjn.mjs';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { Subject } from 'rxjs';\nimport { M as MatCommonModule } from './common-module-cKSwHniA.mjs';\nimport { M as MatRippleModule } from './index-BRImSAOu.mjs';\nimport '@angular/cdk/a11y';\nimport '@angular/cdk/coercion';\nimport '@angular/cdk/layout';\n\n/**\n * Thumb types: range slider has two thumbs (START, END) whereas single point\n * slider only has one thumb (END).\n */\nconst _c0 = [\"knob\"];\nconst _c1 = [\"valueIndicatorContainer\"];\nfunction MatSliderVisualThumb_Conditional_0_Template(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275elementStart(0, \"div\", 2, 1)(2, \"div\", 5)(3, \"span\", 6);\n i0.\u0275\u0275text(4);\n i0.\u0275\u0275elementEnd()()();\n }\n if (rf & 2) {\n const ctx_r0 = i0.\u0275\u0275nextContext();\n i0.\u0275\u0275advance(4);\n i0.\u0275\u0275textInterpolate(ctx_r0.valueIndicatorText);\n }\n}\nconst _c2 = [\"trackActive\"];\nconst _c3 = [\"*\"];\nfunction MatSlider_Conditional_6_Conditional_2_For_1_Template(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275element(0, \"div\");\n }\n if (rf & 2) {\n const tickMark_r1 = ctx.$implicit;\n const \u0275$index_14_r2 = ctx.$index;\n const ctx_r2 = i0.\u0275\u0275nextContext(3);\n i0.\u0275\u0275classMap(tickMark_r1 === 0 ? \"mdc-slider__tick-mark--active\" : \"mdc-slider__tick-mark--inactive\");\n i0.\u0275\u0275styleProp(\"transform\", ctx_r2._calcTickMarkTransform(\u0275$index_14_r2));\n }\n}\nfunction MatSlider_Conditional_6_Conditional_2_Template(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275repeaterCreate(0, MatSlider_Conditional_6_Conditional_2_For_1_Template, 1, 4, \"div\", 8, i0.\u0275\u0275repeaterTrackByIndex);\n }\n if (rf & 2) {\n const ctx_r2 = i0.\u0275\u0275nextContext(2);\n i0.\u0275\u0275repeater(ctx_r2._tickMarks);\n }\n}\nfunction MatSlider_Conditional_6_Template(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275elementStart(0, \"div\", 6, 1);\n i0.\u0275\u0275conditionalCreate(2, MatSlider_Conditional_6_Conditional_2_Template, 2, 0);\n i0.\u0275\u0275elementEnd();\n }\n if (rf & 2) {\n const ctx_r2 = i0.\u0275\u0275nextContext();\n i0.\u0275\u0275advance(2);\n i0.\u0275\u0275conditional(ctx_r2._cachedWidth ? 2 : -1);\n }\n}\nfunction MatSlider_Conditional_7_Template(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275element(0, \"mat-slider-visual-thumb\", 7);\n }\n if (rf & 2) {\n const ctx_r2 = i0.\u0275\u0275nextContext();\n i0.\u0275\u0275property(\"discrete\", ctx_r2.discrete)(\"thumbPosition\", 1)(\"valueIndicatorText\", ctx_r2.startValueIndicatorText);\n }\n}\nvar _MatThumb = /*#__PURE__*/function (_MatThumb) {\n _MatThumb[_MatThumb[\"START\"] = 1] = \"START\";\n _MatThumb[_MatThumb[\"END\"] = 2] = \"END\";\n return _MatThumb;\n}(_MatThumb || {});\n/** Tick mark enum, for discrete sliders. */\nvar _MatTickMark = /*#__PURE__*/function (_MatTickMark) {\n _MatTickMark[_MatTickMark[\"ACTIVE\"] = 0] = \"ACTIVE\";\n _MatTickMark[_MatTickMark[\"INACTIVE\"] = 1] = \"INACTIVE\";\n return _MatTickMark;\n}(_MatTickMark || {});\n/**\n * Injection token that can be used for a `MatSlider` to provide itself as a\n * parent to the `MatSliderThumb` and `MatSliderRangeThumb`.\n * Used primarily to avoid circular imports.\n * @docs-private\n */\nconst MAT_SLIDER = /*#__PURE__*/new InjectionToken('_MatSlider');\n/**\n * Injection token that can be used to query for a `MatSliderThumb`.\n * Used primarily to avoid circular imports.\n * @docs-private\n */\nconst MAT_SLIDER_THUMB = /*#__PURE__*/new InjectionToken('_MatSliderThumb');\n/**\n * Injection token that can be used to query for a `MatSliderRangeThumb`.\n * Used primarily to avoid circular imports.\n * @docs-private\n */\nconst MAT_SLIDER_RANGE_THUMB = /*#__PURE__*/new InjectionToken('_MatSliderRangeThumb');\n/**\n * Injection token that can be used to query for a `MatSliderVisualThumb`.\n * Used primarily to avoid circular imports.\n * @docs-private\n */\nconst MAT_SLIDER_VISUAL_THUMB = /*#__PURE__*/new InjectionToken('_MatSliderVisualThumb');\n/**\n * A simple change event emitted by the MatSlider component.\n * @deprecated Use event bindings directly on the MatSliderThumbs for `change` and `input` events. See https://v17.material.angular.dev/guide/mdc-migration for information about migrating.\n * @breaking-change 17.0.0\n */\nclass MatSliderChange {\n /** The MatSliderThumb that was interacted with. */\n source;\n /** The MatSlider that was interacted with. */\n parent;\n /** The new value of the source slider. */\n value;\n}\n\n/**\n * The visual slider thumb.\n *\n * Handles the slider thumb ripple states (hover, focus, and active),\n * and displaying the value tooltip on discrete sliders.\n * @docs-private\n */\nlet MatSliderVisualThumb = /*#__PURE__*/(() => {\n class MatSliderVisualThumb {\n _cdr = inject(ChangeDetectorRef);\n _ngZone = inject(NgZone);\n _slider = inject(MAT_SLIDER);\n _renderer = inject(Renderer2);\n _listenerCleanups;\n /** Whether the slider displays a numeric value label upon pressing the thumb. */\n discrete;\n /** Indicates which slider thumb this input corresponds to. */\n thumbPosition;\n /** The display value of the slider thumb. */\n valueIndicatorText;\n /** The MatRipple for this slider thumb. */\n _ripple;\n /** The slider thumb knob. */\n _knob;\n /** The slider thumb value indicator container. */\n _valueIndicatorContainer;\n /** The slider input corresponding to this slider thumb. */\n _sliderInput;\n /** The native html element of the slider input corresponding to this thumb. */\n _sliderInputEl;\n /** The RippleRef for the slider thumbs hover state. */\n _hoverRippleRef;\n /** The RippleRef for the slider thumbs focus state. */\n _focusRippleRef;\n /** The RippleRef for the slider thumbs active state. */\n _activeRippleRef;\n /** Whether the slider thumb is currently being hovered. */\n _isHovered = false;\n /** Whether the slider thumb is currently being pressed. */\n _isActive = false;\n /** Whether the value indicator tooltip is visible. */\n _isValueIndicatorVisible = false;\n /** The host native HTML input element. */\n _hostElement = inject(ElementRef).nativeElement;\n _platform = inject(Platform);\n constructor() {}\n ngAfterViewInit() {\n const sliderInput = this._slider._getInput(this.thumbPosition);\n // No-op if the slider isn't configured properly. `MatSlider` will\n // throw an error instructing the user how to set up the slider.\n if (!sliderInput) {\n return;\n }\n this._ripple.radius = 24;\n this._sliderInput = sliderInput;\n this._sliderInputEl = this._sliderInput._hostElement;\n // These listeners don't update any data bindings so we bind them outside\n // of the NgZone to prevent Angular from needlessly running change detection.\n this._ngZone.runOutsideAngular(() => {\n const input = this._sliderInputEl;\n const renderer = this._renderer;\n this._listenerCleanups = [renderer.listen(input, 'pointermove', this._onPointerMove), renderer.listen(input, 'pointerdown', this._onDragStart), renderer.listen(input, 'pointerup', this._onDragEnd), renderer.listen(input, 'pointerleave', this._onMouseLeave), renderer.listen(input, 'focus', this._onFocus), renderer.listen(input, 'blur', this._onBlur)];\n });\n }\n ngOnDestroy() {\n this._listenerCleanups?.forEach(cleanup => cleanup());\n }\n _onPointerMove = event => {\n if (this._sliderInput._isFocused) {\n return;\n }\n const rect = this._hostElement.getBoundingClientRect();\n const isHovered = this._slider._isCursorOnSliderThumb(event, rect);\n this._isHovered = isHovered;\n if (isHovered) {\n this._showHoverRipple();\n } else {\n this._hideRipple(this._hoverRippleRef);\n }\n };\n _onMouseLeave = () => {\n this._isHovered = false;\n this._hideRipple(this._hoverRippleRef);\n };\n _onFocus = () => {\n // We don't want to show the hover ripple on top of the focus ripple.\n // Happen when the users cursor is over a thumb and then the user tabs to it.\n this._hideRipple(this._hoverRippleRef);\n this._showFocusRipple();\n this._hostElement.classList.add('mdc-slider__thumb--focused');\n };\n _onBlur = () => {\n // Happens when the user tabs away while still dragging a thumb.\n if (!this._isActive) {\n this._hideRipple(this._focusRippleRef);\n }\n // Happens when the user tabs away from a thumb but their cursor is still over it.\n if (this._isHovered) {\n this._showHoverRipple();\n }\n this._hostElement.classList.remove('mdc-slider__thumb--focused');\n };\n _onDragStart = event => {\n if (event.button !== 0) {\n return;\n }\n this._isActive = true;\n this._showActiveRipple();\n };\n _onDragEnd = () => {\n this._isActive = false;\n this._hideRipple(this._activeRippleRef);\n // Happens when the user starts dragging a thumb, tabs away, and then stops dragging.\n if (!this._sliderInput._isFocused) {\n this._hideRipple(this._focusRippleRef);\n }\n // On Safari we need to immediately re-show the hover ripple because\n // sliders do not retain focus from pointer events on that platform.\n if (this._platform.SAFARI) {\n this._showHoverRipple();\n }\n };\n /** Handles displaying the hover ripple. */\n _showHoverRipple() {\n if (!this._isShowingRipple(this._hoverRippleRef)) {\n this._hoverRippleRef = this._showRipple({\n enterDuration: 0,\n exitDuration: 0\n });\n this._hoverRippleRef?.element.classList.add('mat-mdc-slider-hover-ripple');\n }\n }\n /** Handles displaying the focus ripple. */\n _showFocusRipple() {\n // Show the focus ripple event if noop animations are enabled.\n if (!this._isShowingRipple(this._focusRippleRef)) {\n this._focusRippleRef = this._showRipple({\n enterDuration: 0,\n exitDuration: 0\n }, true);\n this._focusRippleRef?.element.classList.add('mat-mdc-slider-focus-ripple');\n }\n }\n /** Handles displaying the active ripple. */\n _showActiveRipple() {\n if (!this._isShowingRipple(this._activeRippleRef)) {\n this._activeRippleRef = this._showRipple({\n enterDuration: 225,\n exitDuration: 400\n });\n this._activeRippleRef?.element.classList.add('mat-mdc-slider-active-ripple');\n }\n }\n /** Whether the given rippleRef is currently fading in or visible. */\n _isShowingRipple(rippleRef) {\n return rippleRef?.state === RippleState.FADING_IN || rippleRef?.state === RippleState.VISIBLE;\n }\n /** Manually launches the slider thumb ripple using the specified ripple animation config. */\n _showRipple(animation, ignoreGlobalRippleConfig) {\n if (this._slider.disabled) {\n return;\n }\n this._showValueIndicator();\n if (this._slider._isRange) {\n const sibling = this._slider._getThumb(this.thumbPosition === _MatThumb.START ? _MatThumb.END : _MatThumb.START);\n sibling._showValueIndicator();\n }\n if (this._slider._globalRippleOptions?.disabled && !ignoreGlobalRippleConfig) {\n return;\n }\n return this._ripple.launch({\n animation: this._slider._noopAnimations ? {\n enterDuration: 0,\n exitDuration: 0\n } : animation,\n centered: true,\n persistent: true\n });\n }\n /**\n * Fades out the given ripple.\n * Also hides the value indicator if no ripple is showing.\n */\n _hideRipple(rippleRef) {\n rippleRef?.fadeOut();\n if (this._isShowingAnyRipple()) {\n return;\n }\n if (!this._slider._isRange) {\n this._hideValueIndicator();\n }\n const sibling = this._getSibling();\n if (!sibling._isShowingAnyRipple()) {\n this._hideValueIndicator();\n sibling._hideValueIndicator();\n }\n }\n /** Shows the value indicator ui. */\n _showValueIndicator() {\n this._hostElement.classList.add('mdc-slider__thumb--with-indicator');\n }\n /** Hides the value indicator ui. */\n _hideValueIndicator() {\n this._hostElement.classList.remove('mdc-slider__thumb--with-indicator');\n }\n _getSibling() {\n return this._slider._getThumb(this.thumbPosition === _MatThumb.START ? _MatThumb.END : _MatThumb.START);\n }\n /** Gets the value indicator container's native HTML element. */\n _getValueIndicatorContainer() {\n return this._valueIndicatorContainer?.nativeElement;\n }\n /** Gets the native HTML element of the slider thumb knob. */\n _getKnob() {\n return this._knob.nativeElement;\n }\n _isShowingAnyRipple() {\n return this._isShowingRipple(this._hoverRippleRef) || this._isShowingRipple(this._focusRippleRef) || this._isShowingRipple(this._activeRippleRef);\n }\n static \u0275fac = function MatSliderVisualThumb_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || MatSliderVisualThumb)();\n };\n static \u0275cmp = /* @__PURE__ */i0.\u0275\u0275defineComponent({\n type: MatSliderVisualThumb,\n selectors: [[\"mat-slider-visual-thumb\"]],\n viewQuery: function MatSliderVisualThumb_Query(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275viewQuery(MatRipple, 5);\n i0.\u0275\u0275viewQuery(_c0, 5);\n i0.\u0275\u0275viewQuery(_c1, 5);\n }\n if (rf & 2) {\n let _t;\n i0.\u0275\u0275queryRefresh(_t = i0.\u0275\u0275loadQuery()) && (ctx._ripple = _t.first);\n i0.\u0275\u0275queryRefresh(_t = i0.\u0275\u0275loadQuery()) && (ctx._knob = _t.first);\n i0.\u0275\u0275queryRefresh(_t = i0.\u0275\u0275loadQuery()) && (ctx._valueIndicatorContainer = _t.first);\n }\n },\n hostAttrs: [1, \"mdc-slider__thumb\", \"mat-mdc-slider-visual-thumb\"],\n inputs: {\n discrete: \"discrete\",\n thumbPosition: \"thumbPosition\",\n valueIndicatorText: \"valueIndicatorText\"\n },\n features: [i0.\u0275\u0275ProvidersFeature([{\n provide: MAT_SLIDER_VISUAL_THUMB,\n useExisting: MatSliderVisualThumb\n }])],\n decls: 4,\n vars: 2,\n consts: [[\"knob\", \"\"], [\"valueIndicatorContainer\", \"\"], [1, \"mdc-slider__value-indicator-container\"], [1, \"mdc-slider__thumb-knob\"], [\"matRipple\", \"\", 1, \"mat-focus-indicator\", 3, \"matRippleDisabled\"], [1, \"mdc-slider__value-indicator\"], [1, \"mdc-slider__value-indicator-text\"]],\n template: function MatSliderVisualThumb_Template(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275conditionalCreate(0, MatSliderVisualThumb_Conditional_0_Template, 5, 1, \"div\", 2);\n i0.\u0275\u0275element(1, \"div\", 3, 0)(3, \"div\", 4);\n }\n if (rf & 2) {\n i0.\u0275\u0275conditional(ctx.discrete ? 0 : -1);\n i0.\u0275\u0275advance(3);\n i0.\u0275\u0275property(\"matRippleDisabled\", true);\n }\n },\n dependencies: [MatRipple],\n styles: [\".mat-mdc-slider-visual-thumb .mat-ripple{height:100%;width:100%}.mat-mdc-slider .mdc-slider__tick-marks{justify-content:start}.mat-mdc-slider .mdc-slider__tick-marks .mdc-slider__tick-mark--active,.mat-mdc-slider .mdc-slider__tick-marks .mdc-slider__tick-mark--inactive{position:absolute;left:2px}\\n\"],\n encapsulation: 2,\n changeDetection: 0\n });\n }\n return MatSliderVisualThumb;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n// TODO(wagnermaciel): maybe handle the following edge case:\n// 1. start dragging discrete slider\n// 2. tab to disable checkbox\n// 3. without ending drag, disable the slider\n/**\n * Allows users to select from a range of values by moving the slider thumb. It is similar in\n * behavior to the native `` element.\n */\nlet MatSlider = /*#__PURE__*/(() => {\n class MatSlider {\n _ngZone = inject(NgZone);\n _cdr = inject(ChangeDetectorRef);\n _elementRef = inject(ElementRef);\n _dir = inject(Directionality, {\n optional: true\n });\n _globalRippleOptions = inject(MAT_RIPPLE_GLOBAL_OPTIONS, {\n optional: true\n });\n /** The active portion of the slider track. */\n _trackActive;\n /** The slider thumb(s). */\n _thumbs;\n /** The sliders hidden range input(s). */\n _input;\n /** The sliders hidden range input(s). */\n _inputs;\n /** Whether the slider is disabled. */\n get disabled() {\n return this._disabled;\n }\n set disabled(v) {\n this._disabled = v;\n const endInput = this._getInput(_MatThumb.END);\n const startInput = this._getInput(_MatThumb.START);\n if (endInput) {\n endInput.disabled = this._disabled;\n }\n if (startInput) {\n startInput.disabled = this._disabled;\n }\n }\n _disabled = false;\n /** Whether the slider displays a numeric value label upon pressing the thumb. */\n get discrete() {\n return this._discrete;\n }\n set discrete(v) {\n this._discrete = v;\n this._updateValueIndicatorUIs();\n }\n _discrete = false;\n /** Whether the slider displays tick marks along the slider track. */\n get showTickMarks() {\n return this._showTickMarks;\n }\n set showTickMarks(value) {\n this._showTickMarks = value;\n if (this._hasViewInitialized) {\n this._updateTickMarkUI();\n this._updateTickMarkTrackUI();\n }\n }\n _showTickMarks = false;\n /** The minimum value that the slider can have. */\n get min() {\n return this._min;\n }\n set min(v) {\n const min = v === undefined || v === null || isNaN(v) ? this._min : v;\n if (this._min !== min) {\n this._updateMin(min);\n }\n }\n _min = 0;\n /**\n * Theme color of the slider. This API is supported in M2 themes only, it\n * has no effect in M3 themes. For color customization in M3, see https://material.angular.dev/components/slider/styling.\n *\n * For information on applying color variants in M3, see\n * https://material.angular.dev/guide/material-2-theming#optional-add-backwards-compatibility-styles-for-color-variants\n */\n color;\n /** Whether ripples are disabled in the slider. */\n disableRipple = false;\n _updateMin(min) {\n const prevMin = this._min;\n this._min = min;\n this._isRange ? this._updateMinRange({\n old: prevMin,\n new: min\n }) : this._updateMinNonRange(min);\n this._onMinMaxOrStepChange();\n }\n _updateMinRange(min) {\n const endInput = this._getInput(_MatThumb.END);\n const startInput = this._getInput(_MatThumb.START);\n const oldEndValue = endInput.value;\n const oldStartValue = startInput.value;\n startInput.min = min.new;\n endInput.min = Math.max(min.new, startInput.value);\n startInput.max = Math.min(endInput.max, endInput.value);\n startInput._updateWidthInactive();\n endInput._updateWidthInactive();\n min.new < min.old ? this._onTranslateXChangeBySideEffect(endInput, startInput) : this._onTranslateXChangeBySideEffect(startInput, endInput);\n if (oldEndValue !== endInput.value) {\n this._onValueChange(endInput);\n }\n if (oldStartValue !== startInput.value) {\n this._onValueChange(startInput);\n }\n }\n _updateMinNonRange(min) {\n const input = this._getInput(_MatThumb.END);\n if (input) {\n const oldValue = input.value;\n input.min = min;\n input._updateThumbUIByValue();\n this._updateTrackUI(input);\n if (oldValue !== input.value) {\n this._onValueChange(input);\n }\n }\n }\n /** The maximum value that the slider can have. */\n get max() {\n return this._max;\n }\n set max(v) {\n const max = v === undefined || v === null || isNaN(v) ? this._max : v;\n if (this._max !== max) {\n this._updateMax(max);\n }\n }\n _max = 100;\n _updateMax(max) {\n const prevMax = this._max;\n this._max = max;\n this._isRange ? this._updateMaxRange({\n old: prevMax,\n new: max\n }) : this._updateMaxNonRange(max);\n this._onMinMaxOrStepChange();\n }\n _updateMaxRange(max) {\n const endInput = this._getInput(_MatThumb.END);\n const startInput = this._getInput(_MatThumb.START);\n const oldEndValue = endInput.value;\n const oldStartValue = startInput.value;\n endInput.max = max.new;\n startInput.max = Math.min(max.new, endInput.value);\n endInput.min = startInput.value;\n endInput._updateWidthInactive();\n startInput._updateWidthInactive();\n max.new > max.old ? this._onTranslateXChangeBySideEffect(startInput, endInput) : this._onTranslateXChangeBySideEffect(endInput, startInput);\n if (oldEndValue !== endInput.value) {\n this._onValueChange(endInput);\n }\n if (oldStartValue !== startInput.value) {\n this._onValueChange(startInput);\n }\n }\n _updateMaxNonRange(max) {\n const input = this._getInput(_MatThumb.END);\n if (input) {\n const oldValue = input.value;\n input.max = max;\n input._updateThumbUIByValue();\n this._updateTrackUI(input);\n if (oldValue !== input.value) {\n this._onValueChange(input);\n }\n }\n }\n /** The values at which the thumb will snap. */\n get step() {\n return this._step;\n }\n set step(v) {\n const step = isNaN(v) ? this._step : v;\n if (this._step !== step) {\n this._updateStep(step);\n }\n }\n _step = 1;\n _updateStep(step) {\n this._step = step;\n this._isRange ? this._updateStepRange() : this._updateStepNonRange();\n this._onMinMaxOrStepChange();\n }\n _updateStepRange() {\n const endInput = this._getInput(_MatThumb.END);\n const startInput = this._getInput(_MatThumb.START);\n const oldEndValue = endInput.value;\n const oldStartValue = startInput.value;\n const prevStartValue = startInput.value;\n endInput.min = this._min;\n startInput.max = this._max;\n endInput.step = this._step;\n startInput.step = this._step;\n if (this._platform.SAFARI) {\n endInput.value = endInput.value;\n startInput.value = startInput.value;\n }\n endInput.min = Math.max(this._min, startInput.value);\n startInput.max = Math.min(this._max, endInput.value);\n startInput._updateWidthInactive();\n endInput._updateWidthInactive();\n endInput.value < prevStartValue ? this._onTranslateXChangeBySideEffect(startInput, endInput) : this._onTranslateXChangeBySideEffect(endInput, startInput);\n if (oldEndValue !== endInput.value) {\n this._onValueChange(endInput);\n }\n if (oldStartValue !== startInput.value) {\n this._onValueChange(startInput);\n }\n }\n _updateStepNonRange() {\n const input = this._getInput(_MatThumb.END);\n if (input) {\n const oldValue = input.value;\n input.step = this._step;\n if (this._platform.SAFARI) {\n input.value = input.value;\n }\n input._updateThumbUIByValue();\n if (oldValue !== input.value) {\n this._onValueChange(input);\n }\n }\n }\n /**\n * Function that will be used to format the value before it is displayed\n * in the thumb label. Can be used to format very large number in order\n * for them to fit into the slider thumb.\n */\n displayWith = value => `${value}`;\n /** Used to keep track of & render the active & inactive tick marks on the slider track. */\n _tickMarks;\n /** Whether animations have been disabled. */\n _noopAnimations = _animationsDisabled();\n /** Subscription to changes to the directionality (LTR / RTL) context for the application. */\n _dirChangeSubscription;\n /** Observer used to monitor size changes in the slider. */\n _resizeObserver;\n // Stored dimensions to avoid calling getBoundingClientRect redundantly.\n _cachedWidth;\n _cachedLeft;\n _rippleRadius = 24;\n // The value indicator tooltip text for the visual slider thumb(s).\n /** @docs-private */\n startValueIndicatorText = '';\n /** @docs-private */\n endValueIndicatorText = '';\n // Used to control the translateX of the visual slider thumb(s).\n _endThumbTransform;\n _startThumbTransform;\n _isRange = false;\n /** Whether the slider is rtl. */\n _isRtl = false;\n _hasViewInitialized = false;\n /**\n * The width of the tick mark track.\n * The tick mark track width is different from full track width\n */\n _tickMarkTrackWidth = 0;\n _hasAnimation = false;\n _resizeTimer = null;\n _platform = inject(Platform);\n constructor() {\n inject(_CdkPrivateStyleLoader).load(_StructuralStylesLoader);\n if (this._dir) {\n this._dirChangeSubscription = this._dir.change.subscribe(() => this._onDirChange());\n this._isRtl = this._dir.value === 'rtl';\n }\n }\n /** The radius of the native slider's knob. AFAIK there is no way to avoid hardcoding this. */\n _knobRadius = 8;\n _inputPadding;\n ngAfterViewInit() {\n if (this._platform.isBrowser) {\n this._updateDimensions();\n }\n const eInput = this._getInput(_MatThumb.END);\n const sInput = this._getInput(_MatThumb.START);\n this._isRange = !!eInput && !!sInput;\n this._cdr.detectChanges();\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n _validateInputs(this._isRange, this._getInput(_MatThumb.END), this._getInput(_MatThumb.START));\n }\n const thumb = this._getThumb(_MatThumb.END);\n this._rippleRadius = thumb._ripple.radius;\n this._inputPadding = this._rippleRadius - this._knobRadius;\n this._isRange ? this._initUIRange(eInput, sInput) : this._initUINonRange(eInput);\n this._updateTrackUI(eInput);\n this._updateTickMarkUI();\n this._updateTickMarkTrackUI();\n this._observeHostResize();\n this._cdr.detectChanges();\n }\n _initUINonRange(eInput) {\n eInput.initProps();\n eInput.initUI();\n this._updateValueIndicatorUI(eInput);\n this._hasViewInitialized = true;\n eInput._updateThumbUIByValue();\n }\n _initUIRange(eInput, sInput) {\n eInput.initProps();\n eInput.initUI();\n sInput.initProps();\n sInput.initUI();\n eInput._updateMinMax();\n sInput._updateMinMax();\n eInput._updateStaticStyles();\n sInput._updateStaticStyles();\n this._updateValueIndicatorUIs();\n this._hasViewInitialized = true;\n eInput._updateThumbUIByValue();\n sInput._updateThumbUIByValue();\n }\n ngOnDestroy() {\n this._dirChangeSubscription.unsubscribe();\n this._resizeObserver?.disconnect();\n this._resizeObserver = null;\n }\n /** Handles updating the slider ui after a dir change. */\n _onDirChange() {\n this._isRtl = this._dir?.value === 'rtl';\n this._isRange ? this._onDirChangeRange() : this._onDirChangeNonRange();\n this._updateTickMarkUI();\n }\n _onDirChangeRange() {\n const endInput = this._getInput(_MatThumb.END);\n const startInput = this._getInput(_MatThumb.START);\n endInput._setIsLeftThumb();\n startInput._setIsLeftThumb();\n endInput.translateX = endInput._calcTranslateXByValue();\n startInput.translateX = startInput._calcTranslateXByValue();\n endInput._updateStaticStyles();\n startInput._updateStaticStyles();\n endInput._updateWidthInactive();\n startInput._updateWidthInactive();\n endInput._updateThumbUIByValue();\n startInput._updateThumbUIByValue();\n }\n _onDirChangeNonRange() {\n const input = this._getInput(_MatThumb.END);\n input._updateThumbUIByValue();\n }\n /** Starts observing and updating the slider if the host changes its size. */\n _observeHostResize() {\n if (typeof ResizeObserver === 'undefined' || !ResizeObserver) {\n return;\n }\n this._ngZone.runOutsideAngular(() => {\n this._resizeObserver = new ResizeObserver(() => {\n if (this._isActive()) {\n return;\n }\n if (this._resizeTimer) {\n clearTimeout(this._resizeTimer);\n }\n this._onResize();\n });\n this._resizeObserver.observe(this._elementRef.nativeElement);\n });\n }\n /** Whether any of the thumbs are currently active. */\n _isActive() {\n return this._getThumb(_MatThumb.START)._isActive || this._getThumb(_MatThumb.END)._isActive;\n }\n _getValue(thumbPosition = _MatThumb.END) {\n const input = this._getInput(thumbPosition);\n if (!input) {\n return this.min;\n }\n return input.value;\n }\n _skipUpdate() {\n return !!(this._getInput(_MatThumb.START)?._skipUIUpdate || this._getInput(_MatThumb.END)?._skipUIUpdate);\n }\n /** Stores the slider dimensions. */\n _updateDimensions() {\n this._cachedWidth = this._elementRef.nativeElement.offsetWidth;\n this._cachedLeft = this._elementRef.nativeElement.getBoundingClientRect().left;\n }\n /** Sets the styles for the active portion of the track. */\n _setTrackActiveStyles(styles) {\n const trackStyle = this._trackActive.nativeElement.style;\n trackStyle.left = styles.left;\n trackStyle.right = styles.right;\n trackStyle.transformOrigin = styles.transformOrigin;\n trackStyle.transform = styles.transform;\n }\n /** Returns the translateX positioning for a tick mark based on it's index. */\n _calcTickMarkTransform(index) {\n // TODO(wagnermaciel): See if we can avoid doing this and just using flex to position these.\n const offset = index * (this._tickMarkTrackWidth / (this._tickMarks.length - 1));\n const translateX = this._isRtl ? this._cachedWidth - 6 - offset : offset;\n return `translateX(${translateX}px`;\n }\n // Handlers for updating the slider ui.\n _onTranslateXChange(source) {\n if (!this._hasViewInitialized) {\n return;\n }\n this._updateThumbUI(source);\n this._updateTrackUI(source);\n this._updateOverlappingThumbUI(source);\n }\n _onTranslateXChangeBySideEffect(input1, input2) {\n if (!this._hasViewInitialized) {\n return;\n }\n input1._updateThumbUIByValue();\n input2._updateThumbUIByValue();\n }\n _onValueChange(source) {\n if (!this._hasViewInitialized) {\n return;\n }\n this._updateValueIndicatorUI(source);\n this._updateTickMarkUI();\n this._cdr.detectChanges();\n }\n _onMinMaxOrStepChange() {\n if (!this._hasViewInitialized) {\n return;\n }\n this._updateTickMarkUI();\n this._updateTickMarkTrackUI();\n this._cdr.markForCheck();\n }\n _onResize() {\n if (!this._hasViewInitialized) {\n return;\n }\n this._updateDimensions();\n if (this._isRange) {\n const eInput = this._getInput(_MatThumb.END);\n const sInput = this._getInput(_MatThumb.START);\n eInput._updateThumbUIByValue();\n sInput._updateThumbUIByValue();\n eInput._updateStaticStyles();\n sInput._updateStaticStyles();\n eInput._updateMinMax();\n sInput._updateMinMax();\n eInput._updateWidthInactive();\n sInput._updateWidthInactive();\n } else {\n const eInput = this._getInput(_MatThumb.END);\n if (eInput) {\n eInput._updateThumbUIByValue();\n }\n }\n this._updateTickMarkUI();\n this._updateTickMarkTrackUI();\n this._cdr.detectChanges();\n }\n /** Whether or not the slider thumbs overlap. */\n _thumbsOverlap = false;\n /** Returns true if the slider knobs are overlapping one another. */\n _areThumbsOverlapping() {\n const startInput = this._getInput(_MatThumb.START);\n const endInput = this._getInput(_MatThumb.END);\n if (!startInput || !endInput) {\n return false;\n }\n return endInput.translateX - startInput.translateX < 20;\n }\n /**\n * Updates the class names of overlapping slider thumbs so\n * that the current active thumb is styled to be on \"top\".\n */\n _updateOverlappingThumbClassNames(source) {\n const sibling = source.getSibling();\n const sourceThumb = this._getThumb(source.thumbPosition);\n const siblingThumb = this._getThumb(sibling.thumbPosition);\n siblingThumb._hostElement.classList.remove('mdc-slider__thumb--top');\n sourceThumb._hostElement.classList.toggle('mdc-slider__thumb--top', this._thumbsOverlap);\n }\n /** Updates the UI of slider thumbs when they begin or stop overlapping. */\n _updateOverlappingThumbUI(source) {\n if (!this._isRange || this._skipUpdate()) {\n return;\n }\n if (this._thumbsOverlap !== this._areThumbsOverlapping()) {\n this._thumbsOverlap = !this._thumbsOverlap;\n this._updateOverlappingThumbClassNames(source);\n }\n }\n // _MatThumb styles update conditions\n //\n // 1. TranslateX, resize, or dir change\n // - Reason: The thumb styles need to be updated according to the new translateX.\n // 2. Min, max, or step\n // - Reason: The value may have silently changed.\n /** Updates the translateX of the given thumb. */\n _updateThumbUI(source) {\n if (this._skipUpdate()) {\n return;\n }\n const thumb = this._getThumb(source.thumbPosition === _MatThumb.END ? _MatThumb.END : _MatThumb.START);\n thumb._hostElement.style.transform = `translateX(${source.translateX}px)`;\n }\n // Value indicator text update conditions\n //\n // 1. Value\n // - Reason: The value displayed needs to be updated.\n // 2. Min, max, or step\n // - Reason: The value may have silently changed.\n /** Updates the value indicator tooltip ui for the given thumb. */\n _updateValueIndicatorUI(source) {\n if (this._skipUpdate()) {\n return;\n }\n const valuetext = this.displayWith(source.value);\n this._hasViewInitialized ? source._valuetext.set(valuetext) : source._hostElement.setAttribute('aria-valuetext', valuetext);\n if (this.discrete) {\n source.thumbPosition === _MatThumb.START ? this.startValueIndicatorText = valuetext : this.endValueIndicatorText = valuetext;\n const visualThumb = this._getThumb(source.thumbPosition);\n valuetext.length < 3 ? visualThumb._hostElement.classList.add('mdc-slider__thumb--short-value') : visualThumb._hostElement.classList.remove('mdc-slider__thumb--short-value');\n }\n }\n /** Updates all value indicator UIs in the slider. */\n _updateValueIndicatorUIs() {\n const eInput = this._getInput(_MatThumb.END);\n const sInput = this._getInput(_MatThumb.START);\n if (eInput) {\n this._updateValueIndicatorUI(eInput);\n }\n if (sInput) {\n this._updateValueIndicatorUI(sInput);\n }\n }\n // Update Tick Mark Track Width\n //\n // 1. Min, max, or step\n // - Reason: The maximum reachable value may have changed.\n // - Side note: The maximum reachable value is different from the maximum value set by the\n // user. For example, a slider with [min: 5, max: 100, step: 10] would have a maximum\n // reachable value of 95.\n // 2. Resize\n // - Reason: The position for the maximum reachable value needs to be recalculated.\n /** Updates the width of the tick mark track. */\n _updateTickMarkTrackUI() {\n if (!this.showTickMarks || this._skipUpdate()) {\n return;\n }\n const step = this._step && this._step > 0 ? this._step : 1;\n const maxValue = Math.floor(this.max / step) * step;\n const percentage = (maxValue - this.min) / (this.max - this.min);\n this._tickMarkTrackWidth = (this._cachedWidth - 6) * percentage;\n }\n // Track active update conditions\n //\n // 1. TranslateX\n // - Reason: The track active should line up with the new thumb position.\n // 2. Min or max\n // - Reason #1: The 'active' percentage needs to be recalculated.\n // - Reason #2: The value may have silently changed.\n // 3. Step\n // - Reason: The value may have silently changed causing the thumb(s) to shift.\n // 4. Dir change\n // - Reason: The track active will need to be updated according to the new thumb position(s).\n // 5. Resize\n // - Reason: The total width the 'active' tracks translateX is based on has changed.\n /** Updates the scale on the active portion of the track. */\n _updateTrackUI(source) {\n if (this._skipUpdate()) {\n return;\n }\n this._isRange ? this._updateTrackUIRange(source) : this._updateTrackUINonRange(source);\n }\n _updateTrackUIRange(source) {\n const sibling = source.getSibling();\n if (!sibling || !this._cachedWidth) {\n return;\n }\n const activePercentage = Math.abs(sibling.translateX - source.translateX) / this._cachedWidth;\n if (source._isLeftThumb && this._cachedWidth) {\n this._setTrackActiveStyles({\n left: 'auto',\n right: `${this._cachedWidth - sibling.translateX}px`,\n transformOrigin: 'right',\n transform: `scaleX(${activePercentage})`\n });\n } else {\n this._setTrackActiveStyles({\n left: `${sibling.translateX}px`,\n right: 'auto',\n transformOrigin: 'left',\n transform: `scaleX(${activePercentage})`\n });\n }\n }\n _updateTrackUINonRange(source) {\n this._isRtl ? this._setTrackActiveStyles({\n left: 'auto',\n right: '0px',\n transformOrigin: 'right',\n transform: `scaleX(${1 - source.fillPercentage})`\n }) : this._setTrackActiveStyles({\n left: '0px',\n right: 'auto',\n transformOrigin: 'left',\n transform: `scaleX(${source.fillPercentage})`\n });\n }\n // Tick mark update conditions\n //\n // 1. Value\n // - Reason: a tick mark which was once active might now be inactive or vice versa.\n // 2. Min, max, or step\n // - Reason #1: the number of tick marks may have changed.\n // - Reason #2: The value may have silently changed.\n /** Updates the dots along the slider track. */\n _updateTickMarkUI() {\n if (!this.showTickMarks || this.step === undefined || this.min === undefined || this.max === undefined) {\n return;\n }\n const step = this.step > 0 ? this.step : 1;\n this._isRange ? this._updateTickMarkUIRange(step) : this._updateTickMarkUINonRange(step);\n }\n _updateTickMarkUINonRange(step) {\n const value = this._getValue();\n let numActive = Math.max(Math.round((value - this.min) / step), 0) + 1;\n let numInactive = Math.max(Math.round((this.max - value) / step), 0) - 1;\n this._isRtl ? numActive++ : numInactive++;\n this._tickMarks = Array(numActive).fill(_MatTickMark.ACTIVE).concat(Array(numInactive).fill(_MatTickMark.INACTIVE));\n }\n _updateTickMarkUIRange(step) {\n const endValue = this._getValue();\n const startValue = this._getValue(_MatThumb.START);\n const numInactiveBeforeStartThumb = Math.max(Math.round((startValue - this.min) / step), 0);\n const numActive = Math.max(Math.round((endValue - startValue) / step) + 1, 0);\n const numInactiveAfterEndThumb = Math.max(Math.round((this.max - endValue) / step), 0);\n this._tickMarks = Array(numInactiveBeforeStartThumb).fill(_MatTickMark.INACTIVE).concat(Array(numActive).fill(_MatTickMark.ACTIVE), Array(numInactiveAfterEndThumb).fill(_MatTickMark.INACTIVE));\n }\n /** Gets the slider thumb input of the given thumb position. */\n _getInput(thumbPosition) {\n if (thumbPosition === _MatThumb.END && this._input) {\n return this._input;\n }\n if (this._inputs?.length) {\n return thumbPosition === _MatThumb.START ? this._inputs.first : this._inputs.last;\n }\n return;\n }\n /** Gets the slider thumb HTML input element of the given thumb position. */\n _getThumb(thumbPosition) {\n return thumbPosition === _MatThumb.END ? this._thumbs?.last : this._thumbs?.first;\n }\n _setTransition(withAnimation) {\n this._hasAnimation = !this._platform.IOS && withAnimation && !this._noopAnimations;\n this._elementRef.nativeElement.classList.toggle('mat-mdc-slider-with-animation', this._hasAnimation);\n }\n /** Whether the given pointer event occurred within the bounds of the slider pointer's DOM Rect. */\n _isCursorOnSliderThumb(event, rect) {\n const radius = rect.width / 2;\n const centerX = rect.x + radius;\n const centerY = rect.y + radius;\n const dx = event.clientX - centerX;\n const dy = event.clientY - centerY;\n return Math.pow(dx, 2) + Math.pow(dy, 2) < Math.pow(radius, 2);\n }\n static \u0275fac = function MatSlider_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || MatSlider)();\n };\n static \u0275cmp = /* @__PURE__ */i0.\u0275\u0275defineComponent({\n type: MatSlider,\n selectors: [[\"mat-slider\"]],\n contentQueries: function MatSlider_ContentQueries(rf, ctx, dirIndex) {\n if (rf & 1) {\n i0.\u0275\u0275contentQuery(dirIndex, MAT_SLIDER_THUMB, 5);\n i0.\u0275\u0275contentQuery(dirIndex, MAT_SLIDER_RANGE_THUMB, 4);\n }\n if (rf & 2) {\n let _t;\n i0.\u0275\u0275queryRefresh(_t = i0.\u0275\u0275loadQuery()) && (ctx._input = _t.first);\n i0.\u0275\u0275queryRefresh(_t = i0.\u0275\u0275loadQuery()) && (ctx._inputs = _t);\n }\n },\n viewQuery: function MatSlider_Query(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275viewQuery(_c2, 5);\n i0.\u0275\u0275viewQuery(MAT_SLIDER_VISUAL_THUMB, 5);\n }\n if (rf & 2) {\n let _t;\n i0.\u0275\u0275queryRefresh(_t = i0.\u0275\u0275loadQuery()) && (ctx._trackActive = _t.first);\n i0.\u0275\u0275queryRefresh(_t = i0.\u0275\u0275loadQuery()) && (ctx._thumbs = _t);\n }\n },\n hostAttrs: [1, \"mat-mdc-slider\", \"mdc-slider\"],\n hostVars: 12,\n hostBindings: function MatSlider_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.\u0275\u0275classMap(\"mat-\" + (ctx.color || \"primary\"));\n i0.\u0275\u0275classProp(\"mdc-slider--range\", ctx._isRange)(\"mdc-slider--disabled\", ctx.disabled)(\"mdc-slider--discrete\", ctx.discrete)(\"mdc-slider--tick-marks\", ctx.showTickMarks)(\"_mat-animation-noopable\", ctx._noopAnimations);\n }\n },\n inputs: {\n disabled: [2, \"disabled\", \"disabled\", booleanAttribute],\n discrete: [2, \"discrete\", \"discrete\", booleanAttribute],\n showTickMarks: [2, \"showTickMarks\", \"showTickMarks\", booleanAttribute],\n min: [2, \"min\", \"min\", numberAttribute],\n color: \"color\",\n disableRipple: [2, \"disableRipple\", \"disableRipple\", booleanAttribute],\n max: [2, \"max\", \"max\", numberAttribute],\n step: [2, \"step\", \"step\", numberAttribute],\n displayWith: \"displayWith\"\n },\n exportAs: [\"matSlider\"],\n features: [i0.\u0275\u0275ProvidersFeature([{\n provide: MAT_SLIDER,\n useExisting: MatSlider\n }])],\n ngContentSelectors: _c3,\n decls: 9,\n vars: 5,\n consts: [[\"trackActive\", \"\"], [\"tickMarkContainer\", \"\"], [1, \"mdc-slider__track\"], [1, \"mdc-slider__track--inactive\"], [1, \"mdc-slider__track--active\"], [1, \"mdc-slider__track--active_fill\"], [1, \"mdc-slider__tick-marks\"], [3, \"discrete\", \"thumbPosition\", \"valueIndicatorText\"], [3, \"class\", \"transform\"]],\n template: function MatSlider_Template(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275projectionDef();\n i0.\u0275\u0275projection(0);\n i0.\u0275\u0275elementStart(1, \"div\", 2);\n i0.\u0275\u0275element(2, \"div\", 3);\n i0.\u0275\u0275elementStart(3, \"div\", 4);\n i0.\u0275\u0275element(4, \"div\", 5, 0);\n i0.\u0275\u0275elementEnd();\n i0.\u0275\u0275conditionalCreate(6, MatSlider_Conditional_6_Template, 3, 1, \"div\", 6);\n i0.\u0275\u0275elementEnd();\n i0.\u0275\u0275conditionalCreate(7, MatSlider_Conditional_7_Template, 1, 3, \"mat-slider-visual-thumb\", 7);\n i0.\u0275\u0275element(8, \"mat-slider-visual-thumb\", 7);\n }\n if (rf & 2) {\n i0.\u0275\u0275advance(6);\n i0.\u0275\u0275conditional(ctx.showTickMarks ? 6 : -1);\n i0.\u0275\u0275advance();\n i0.\u0275\u0275conditional(ctx._isRange ? 7 : -1);\n i0.\u0275\u0275advance();\n i0.\u0275\u0275property(\"discrete\", ctx.discrete)(\"thumbPosition\", 2)(\"valueIndicatorText\", ctx.endValueIndicatorText);\n }\n },\n dependencies: [MatSliderVisualThumb],\n styles: [\".mdc-slider__track{position:absolute;top:50%;transform:translateY(-50%);width:100%;pointer-events:none;height:var(--mat-slider-inactive-track-height, 4px)}.mdc-slider__track--active,.mdc-slider__track--inactive{display:flex;height:100%;position:absolute;width:100%}.mdc-slider__track--active{overflow:hidden;border-radius:var(--mat-slider-active-track-shape, var(--mat-sys-corner-full));height:var(--mat-slider-active-track-height, 4px);top:calc((var(--mat-slider-inactive-track-height, 4px) - var(--mat-slider-active-track-height, 4px))/2)}.mdc-slider__track--active_fill{border-top-style:solid;box-sizing:border-box;height:100%;width:100%;position:relative;transform-origin:left;transition:transform 80ms ease;border-color:var(--mat-slider-active-track-color, var(--mat-sys-primary));border-top-width:var(--mat-slider-active-track-height, 4px)}.mdc-slider--disabled .mdc-slider__track--active_fill{border-color:var(--mat-slider-disabled-active-track-color, var(--mat-sys-on-surface))}[dir=rtl] .mdc-slider__track--active_fill{-webkit-transform-origin:right;transform-origin:right}.mdc-slider__track--inactive{left:0;top:0;opacity:.24;background-color:var(--mat-slider-inactive-track-color, var(--mat-sys-surface-variant));height:var(--mat-slider-inactive-track-height, 4px);border-radius:var(--mat-slider-inactive-track-shape, var(--mat-sys-corner-full))}.mdc-slider--disabled .mdc-slider__track--inactive{background-color:var(--mat-slider-disabled-inactive-track-color, var(--mat-sys-on-surface));opacity:.24}.mdc-slider__track--inactive::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:\\\"\\\";pointer-events:none}@media(forced-colors: active){.mdc-slider__track--inactive::before{border-color:CanvasText}}.mdc-slider__value-indicator-container{bottom:44px;left:50%;pointer-events:none;position:absolute;transform:var(--mat-slider-value-indicator-container-transform, translateX(-50%) rotate(-45deg))}.mdc-slider__thumb--with-indicator .mdc-slider__value-indicator-container{pointer-events:auto}.mdc-slider__value-indicator{display:flex;align-items:center;transform:scale(0);transform-origin:bottom;transition:transform 100ms cubic-bezier(0.4, 0, 1, 1);word-break:normal;background-color:var(--mat-slider-label-container-color, var(--mat-sys-primary));color:var(--mat-slider-label-label-text-color, var(--mat-sys-on-primary));width:var(--mat-slider-value-indicator-width, 28px);height:var(--mat-slider-value-indicator-height, 28px);padding:var(--mat-slider-value-indicator-padding, 0);opacity:var(--mat-slider-value-indicator-opacity, 1);border-radius:var(--mat-slider-value-indicator-border-radius, 50% 50% 50% 0)}.mdc-slider__thumb--with-indicator .mdc-slider__value-indicator{transition:transform 100ms cubic-bezier(0, 0, 0.2, 1);transform:scale(1)}.mdc-slider__value-indicator::before{border-left:6px solid rgba(0,0,0,0);border-right:6px solid rgba(0,0,0,0);border-top:6px solid;bottom:-5px;content:\\\"\\\";height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;display:var(--mat-slider-value-indicator-caret-display, none);border-top-color:var(--mat-slider-label-container-color, var(--mat-sys-primary))}.mdc-slider__value-indicator::after{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:\\\"\\\";pointer-events:none}@media(forced-colors: active){.mdc-slider__value-indicator::after{border-color:CanvasText}}.mdc-slider__value-indicator-text{text-align:center;width:var(--mat-slider-value-indicator-width, 28px);transform:var(--mat-slider-value-indicator-text-transform, rotate(45deg));font-family:var(--mat-slider-label-label-text-font, var(--mat-sys-label-medium-font));font-size:var(--mat-slider-label-label-text-size, var(--mat-sys-label-medium-size));font-weight:var(--mat-slider-label-label-text-weight, var(--mat-sys-label-medium-weight));line-height:var(--mat-slider-label-label-text-line-height, var(--mat-sys-label-medium-line-height));letter-spacing:var(--mat-slider-label-label-text-tracking, var(--mat-sys-label-medium-tracking))}.mdc-slider__thumb{-webkit-user-select:none;user-select:none;display:flex;left:-24px;outline:none;position:absolute;height:48px;width:48px;pointer-events:none}.mdc-slider--discrete .mdc-slider__thumb{transition:transform 80ms ease}.mdc-slider--disabled .mdc-slider__thumb{pointer-events:none}.mdc-slider__thumb--top{z-index:1}.mdc-slider__thumb-knob{position:absolute;box-sizing:border-box;left:50%;top:50%;transform:translate(-50%, -50%);border-style:solid;width:var(--mat-slider-handle-width, 20px);height:var(--mat-slider-handle-height, 20px);border-width:calc(var(--mat-slider-handle-height, 20px)/2) calc(var(--mat-slider-handle-width, 20px)/2);box-shadow:var(--mat-slider-handle-elevation, var(--mat-sys-level1));background-color:var(--mat-slider-handle-color, var(--mat-sys-primary));border-color:var(--mat-slider-handle-color, var(--mat-sys-primary));border-radius:var(--mat-slider-handle-shape, var(--mat-sys-corner-full))}.mdc-slider__thumb:hover .mdc-slider__thumb-knob{background-color:var(--mat-slider-hover-handle-color, var(--mat-sys-primary));border-color:var(--mat-slider-hover-handle-color, var(--mat-sys-primary))}.mdc-slider__thumb--focused .mdc-slider__thumb-knob{background-color:var(--mat-slider-focus-handle-color, var(--mat-sys-primary));border-color:var(--mat-slider-focus-handle-color, var(--mat-sys-primary))}.mdc-slider--disabled .mdc-slider__thumb-knob{background-color:var(--mat-slider-disabled-handle-color, var(--mat-sys-on-surface));border-color:var(--mat-slider-disabled-handle-color, var(--mat-sys-on-surface))}.mdc-slider__thumb--top .mdc-slider__thumb-knob,.mdc-slider__thumb--top.mdc-slider__thumb:hover .mdc-slider__thumb-knob,.mdc-slider__thumb--top.mdc-slider__thumb--focused .mdc-slider__thumb-knob{border:solid 1px #fff;box-sizing:content-box;border-color:var(--mat-slider-with-overlap-handle-outline-color, var(--mat-sys-on-primary));border-width:var(--mat-slider-with-overlap-handle-outline-width, 1px)}.mdc-slider__tick-marks{align-items:center;box-sizing:border-box;display:flex;height:100%;justify-content:space-between;padding:0 1px;position:absolute;width:100%}.mdc-slider__tick-mark--active,.mdc-slider__tick-mark--inactive{width:var(--mat-slider-with-tick-marks-container-size, 2px);height:var(--mat-slider-with-tick-marks-container-size, 2px);border-radius:var(--mat-slider-with-tick-marks-container-shape, var(--mat-sys-corner-full))}.mdc-slider__tick-mark--inactive{opacity:var(--mat-slider-with-tick-marks-inactive-container-opacity, 0.38);background-color:var(--mat-slider-with-tick-marks-inactive-container-color, var(--mat-sys-on-surface-variant))}.mdc-slider--disabled .mdc-slider__tick-mark--inactive{opacity:var(--mat-slider-with-tick-marks-inactive-container-opacity, 0.38);background-color:var(--mat-slider-with-tick-marks-disabled-container-color, var(--mat-sys-on-surface))}.mdc-slider__tick-mark--active{opacity:var(--mat-slider-with-tick-marks-active-container-opacity, 0.38);background-color:var(--mat-slider-with-tick-marks-active-container-color, var(--mat-sys-on-primary))}.mdc-slider__input{cursor:pointer;left:2px;margin:0;height:44px;opacity:0;position:absolute;top:2px;width:44px;box-sizing:content-box}.mdc-slider__input.mat-mdc-slider-input-no-pointer-events{pointer-events:none}.mdc-slider__input.mat-slider__right-input{left:auto;right:0}.mat-mdc-slider{display:inline-block;box-sizing:border-box;outline:none;vertical-align:middle;cursor:pointer;height:48px;margin:0 8px;position:relative;touch-action:pan-y;width:auto;min-width:112px;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-slider.mdc-slider--disabled{cursor:auto;opacity:.38}.mat-mdc-slider.mdc-slider--disabled .mdc-slider__input{cursor:auto}.mat-mdc-slider .mdc-slider__thumb,.mat-mdc-slider .mdc-slider__track--active_fill{transition-duration:0ms}.mat-mdc-slider.mat-mdc-slider-with-animation .mdc-slider__thumb,.mat-mdc-slider.mat-mdc-slider-with-animation .mdc-slider__track--active_fill{transition-duration:80ms}.mat-mdc-slider.mdc-slider--discrete .mdc-slider__thumb,.mat-mdc-slider.mdc-slider--discrete .mdc-slider__track--active_fill{transition-duration:0ms}.mat-mdc-slider.mat-mdc-slider-with-animation .mdc-slider__thumb,.mat-mdc-slider.mat-mdc-slider-with-animation .mdc-slider__track--active_fill{transition-duration:80ms}.mat-mdc-slider .mat-ripple .mat-ripple-element{background-color:var(--mat-slider-ripple-color, var(--mat-sys-primary))}.mat-mdc-slider .mat-ripple .mat-mdc-slider-hover-ripple{background-color:var(--mat-slider-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-primary) 5%, transparent))}.mat-mdc-slider .mat-ripple .mat-mdc-slider-focus-ripple,.mat-mdc-slider .mat-ripple .mat-mdc-slider-active-ripple{background-color:var(--mat-slider-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-primary) 20%, transparent))}.mat-mdc-slider._mat-animation-noopable.mdc-slider--discrete .mdc-slider__thumb,.mat-mdc-slider._mat-animation-noopable.mdc-slider--discrete .mdc-slider__track--active_fill,.mat-mdc-slider._mat-animation-noopable .mdc-slider__value-indicator{transition:none}.mat-mdc-slider .mat-focus-indicator::before{border-radius:50%}.mdc-slider__thumb--focused .mat-focus-indicator::before{content:\\\"\\\"}\\n\"],\n encapsulation: 2,\n changeDetection: 0\n });\n }\n return MatSlider;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n/** Ensures that there is not an invalid configuration for the slider thumb inputs. */\nfunction _validateInputs(isRange, endInputElement, startInputElement) {\n const startValid = !isRange || startInputElement?._hostElement.hasAttribute('matSliderStartThumb');\n const endValid = endInputElement?._hostElement.hasAttribute(isRange ? 'matSliderEndThumb' : 'matSliderThumb');\n if (!startValid || !endValid) {\n _throwInvalidInputConfigurationError();\n }\n}\nfunction _throwInvalidInputConfigurationError() {\n throw Error(`Invalid slider thumb input configuration!\n\n Valid configurations are as follows:\n\n \n \n \n\n or\n\n \n \n \n \n `);\n}\n\n/**\n * Provider that allows the slider thumb to register as a ControlValueAccessor.\n * @docs-private\n */\nconst MAT_SLIDER_THUMB_VALUE_ACCESSOR = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: /*#__PURE__*/forwardRef(() => MatSliderThumb),\n multi: true\n};\n/**\n * Provider that allows the range slider thumb to register as a ControlValueAccessor.\n * @docs-private\n */\nconst MAT_SLIDER_RANGE_THUMB_VALUE_ACCESSOR = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: /*#__PURE__*/forwardRef(() => MatSliderRangeThumb),\n multi: true\n};\n/**\n * Directive that adds slider-specific behaviors to an input element inside ``.\n * Up to two may be placed inside of a ``.\n *\n * If one is used, the selector `matSliderThumb` must be used, and the outcome will be a normal\n * slider. If two are used, the selectors `matSliderStartThumb` and `matSliderEndThumb` must be\n * used, and the outcome will be a range slider with two slider thumbs.\n */\nlet MatSliderThumb = /*#__PURE__*/(() => {\n class MatSliderThumb {\n _ngZone = inject(NgZone);\n _elementRef = inject(ElementRef);\n _cdr = inject(ChangeDetectorRef);\n _slider = inject(MAT_SLIDER);\n _platform = inject(Platform);\n _listenerCleanups;\n get value() {\n return numberAttribute(this._hostElement.value, 0);\n }\n set value(value) {\n if (value === null) {\n value = this._getDefaultValue();\n }\n value = isNaN(value) ? 0 : value;\n const stringValue = value + '';\n if (!this._hasSetInitialValue) {\n this._initialValue = stringValue;\n return;\n }\n if (this._isActive) {\n return;\n }\n this._setValue(stringValue);\n }\n /**\n * Handles programmatic value setting. This has been split out to\n * allow the range thumb to override it and add additional necessary logic.\n */\n _setValue(value) {\n this._hostElement.value = value;\n this._updateThumbUIByValue();\n this._slider._onValueChange(this);\n this._cdr.detectChanges();\n this._slider._cdr.markForCheck();\n }\n /** Event emitted when the `value` is changed. */\n valueChange = new EventEmitter();\n /** Event emitted when the slider thumb starts being dragged. */\n dragStart = new EventEmitter();\n /** Event emitted when the slider thumb stops being dragged. */\n dragEnd = new EventEmitter();\n /**\n * The current translateX in px of the slider visual thumb.\n * @docs-private\n */\n get translateX() {\n if (this._slider.min >= this._slider.max) {\n this._translateX = this._tickMarkOffset;\n return this._translateX;\n }\n if (this._translateX === undefined) {\n this._translateX = this._calcTranslateXByValue();\n }\n return this._translateX;\n }\n set translateX(v) {\n this._translateX = v;\n }\n _translateX;\n /**\n * Indicates whether this thumb is the start or end thumb.\n * @docs-private\n */\n thumbPosition = _MatThumb.END;\n /** @docs-private */\n get min() {\n return numberAttribute(this._hostElement.min, 0);\n }\n set min(v) {\n this._hostElement.min = v + '';\n this._cdr.detectChanges();\n }\n /** @docs-private */\n get max() {\n return numberAttribute(this._hostElement.max, 0);\n }\n set max(v) {\n this._hostElement.max = v + '';\n this._cdr.detectChanges();\n }\n get step() {\n return numberAttribute(this._hostElement.step, 0);\n }\n set step(v) {\n this._hostElement.step = v + '';\n this._cdr.detectChanges();\n }\n /** @docs-private */\n get disabled() {\n return booleanAttribute(this._hostElement.disabled);\n }\n set disabled(v) {\n this._hostElement.disabled = v;\n this._cdr.detectChanges();\n if (this._slider.disabled !== this.disabled) {\n this._slider.disabled = this.disabled;\n }\n }\n /** The percentage of the slider that coincides with the value. */\n get percentage() {\n if (this._slider.min >= this._slider.max) {\n return this._slider._isRtl ? 1 : 0;\n }\n return (this.value - this._slider.min) / (this._slider.max - this._slider.min);\n }\n /** @docs-private */\n get fillPercentage() {\n if (!this._slider._cachedWidth) {\n return this._slider._isRtl ? 1 : 0;\n }\n if (this._translateX === 0) {\n return 0;\n }\n return this.translateX / this._slider._cachedWidth;\n }\n /** The host native HTML input element. */\n _hostElement = this._elementRef.nativeElement;\n /** The aria-valuetext string representation of the input's value. */\n _valuetext = signal('');\n /** The radius of a native html slider's knob. */\n _knobRadius = 8;\n /** The distance in px from the start of the slider track to the first tick mark. */\n _tickMarkOffset = 3;\n /** Whether user's cursor is currently in a mouse down state on the input. */\n _isActive = false;\n /** Whether the input is currently focused (either by tab or after clicking). */\n _isFocused = false;\n /** Used to relay updates to _isFocused to the slider visual thumbs. */\n _setIsFocused(v) {\n this._isFocused = v;\n }\n /**\n * Whether the initial value has been set.\n * This exists because the initial value cannot be immediately set because the min and max\n * must first be relayed from the parent MatSlider component, which can only happen later\n * in the component lifecycle.\n */\n _hasSetInitialValue = false;\n /** The stored initial value. */\n _initialValue;\n /** Defined when a user is using a form control to manage slider value & validation. */\n _formControl;\n /** Emits when the component is destroyed. */\n _destroyed = new Subject();\n /**\n * Indicates whether UI updates should be skipped.\n *\n * This flag is used to avoid flickering\n * when correcting values on pointer up/down.\n */\n _skipUIUpdate = false;\n /** Callback called when the slider input value changes. */\n _onChangeFn;\n /** Callback called when the slider input has been touched. */\n _onTouchedFn = () => {};\n /**\n * Whether the NgModel has been initialized.\n *\n * This flag is used to ignore ghost null calls to\n * writeValue which can break slider initialization.\n *\n * See https://github.com/angular/angular/issues/14988.\n */\n _isControlInitialized = false;\n constructor() {\n const renderer = inject(Renderer2);\n this._ngZone.runOutsideAngular(() => {\n this._listenerCleanups = [renderer.listen(this._hostElement, 'pointerdown', this._onPointerDown.bind(this)), renderer.listen(this._hostElement, 'pointermove', this._onPointerMove.bind(this)), renderer.listen(this._hostElement, 'pointerup', this._onPointerUp.bind(this))];\n });\n }\n ngOnDestroy() {\n this._listenerCleanups.forEach(cleanup => cleanup());\n this._destroyed.next();\n this._destroyed.complete();\n this.dragStart.complete();\n this.dragEnd.complete();\n }\n /** @docs-private */\n initProps() {\n this._updateWidthInactive();\n // If this or the parent slider is disabled, just make everything disabled.\n if (this.disabled !== this._slider.disabled) {\n // The MatSlider setter for disabled will relay this and disable both inputs.\n this._slider.disabled = true;\n }\n this.step = this._slider.step;\n this.min = this._slider.min;\n this.max = this._slider.max;\n this._initValue();\n }\n /** @docs-private */\n initUI() {\n this._updateThumbUIByValue();\n }\n _initValue() {\n this._hasSetInitialValue = true;\n if (this._initialValue === undefined) {\n this.value = this._getDefaultValue();\n } else {\n this._hostElement.value = this._initialValue;\n this._updateThumbUIByValue();\n this._slider._onValueChange(this);\n this._cdr.detectChanges();\n }\n }\n _getDefaultValue() {\n return this.min;\n }\n _onBlur() {\n this._setIsFocused(false);\n this._onTouchedFn();\n }\n _onFocus() {\n this._slider._setTransition(false);\n this._slider._updateTrackUI(this);\n this._setIsFocused(true);\n }\n _onChange() {\n this.valueChange.emit(this.value);\n // only used to handle the edge case where user\n // mousedown on the slider then uses arrow keys.\n if (this._isActive) {\n this._updateThumbUIByValue({\n withAnimation: true\n });\n }\n }\n _onInput() {\n this._onChangeFn?.(this.value);\n // handles arrowing and updating the value when\n // a step is defined.\n if (this._slider.step || !this._isActive) {\n this._updateThumbUIByValue({\n withAnimation: true\n });\n }\n this._slider._onValueChange(this);\n }\n _onNgControlValueChange() {\n // only used to handle when the value change\n // originates outside of the slider.\n if (!this._isActive || !this._isFocused) {\n this._slider._onValueChange(this);\n this._updateThumbUIByValue();\n }\n this._slider.disabled = this._formControl.disabled;\n }\n _onPointerDown(event) {\n if (this.disabled || event.button !== 0) {\n return;\n }\n // On IOS, dragging only works if the pointer down happens on the\n // slider thumb and the slider does not receive focus from pointer events.\n if (this._platform.IOS) {\n const isCursorOnSliderThumb = this._slider._isCursorOnSliderThumb(event, this._slider._getThumb(this.thumbPosition)._hostElement.getBoundingClientRect());\n this._isActive = isCursorOnSliderThumb;\n this._updateWidthActive();\n this._slider._updateDimensions();\n return;\n }\n this._isActive = true;\n this._setIsFocused(true);\n this._updateWidthActive();\n this._slider._updateDimensions();\n // Does nothing if a step is defined because we\n // want the value to snap to the values on input.\n if (!this._slider.step) {\n this._updateThumbUIByPointerEvent(event, {\n withAnimation: true\n });\n }\n if (!this.disabled) {\n this._handleValueCorrection(event);\n this.dragStart.emit({\n source: this,\n parent: this._slider,\n value: this.value\n });\n }\n }\n /**\n * Corrects the value of the slider on pointer up/down.\n *\n * Called on pointer down and up because the value is set based\n * on the inactive width instead of the active width.\n */\n _handleValueCorrection(event) {\n // Don't update the UI with the current value! The value on pointerdown\n // and pointerup is calculated in the split second before the input(s)\n // resize. See _updateWidthInactive() and _updateWidthActive() for more\n // details.\n this._skipUIUpdate = true;\n // Note that this function gets triggered before the actual value of the\n // slider is updated. This means if we were to set the value here, it\n // would immediately be overwritten. Using setTimeout ensures the setting\n // of the value happens after the value has been updated by the\n // pointerdown event.\n setTimeout(() => {\n this._skipUIUpdate = false;\n this._fixValue(event);\n }, 0);\n }\n /** Corrects the value of the slider based on the pointer event's position. */\n _fixValue(event) {\n const xPos = event.clientX - this._slider._cachedLeft;\n const width = this._slider._cachedWidth;\n const step = this._slider.step === 0 ? 1 : this._slider.step;\n const numSteps = Math.floor((this._slider.max - this._slider.min) / step);\n const percentage = this._slider._isRtl ? 1 - xPos / width : xPos / width;\n // To ensure the percentage is rounded to the necessary number of decimals.\n const fixedPercentage = Math.round(percentage * numSteps) / numSteps;\n const impreciseValue = fixedPercentage * (this._slider.max - this._slider.min) + this._slider.min;\n const value = Math.round(impreciseValue / step) * step;\n const prevValue = this.value;\n if (value === prevValue) {\n // Because we prevented UI updates, if it turns out that the race\n // condition didn't happen and the value is already correct, we\n // have to apply the ui updates now.\n this._slider._onValueChange(this);\n this._slider.step > 0 ? this._updateThumbUIByValue() : this._updateThumbUIByPointerEvent(event, {\n withAnimation: this._slider._hasAnimation\n });\n return;\n }\n this.value = value;\n this.valueChange.emit(this.value);\n this._onChangeFn?.(this.value);\n this._slider._onValueChange(this);\n this._slider.step > 0 ? this._updateThumbUIByValue() : this._updateThumbUIByPointerEvent(event, {\n withAnimation: this._slider._hasAnimation\n });\n }\n _onPointerMove(event) {\n // Again, does nothing if a step is defined because\n // we want the value to snap to the values on input.\n if (!this._slider.step && this._isActive) {\n this._updateThumbUIByPointerEvent(event);\n }\n }\n _onPointerUp() {\n if (this._isActive) {\n this._isActive = false;\n if (this._platform.SAFARI) {\n this._setIsFocused(false);\n }\n this.dragEnd.emit({\n source: this,\n parent: this._slider,\n value: this.value\n });\n // This setTimeout is to prevent the pointerup from triggering a value\n // change on the input based on the inactive width. It's not clear why\n // but for some reason on IOS this race condition is even more common so\n // the timeout needs to be increased.\n setTimeout(() => this._updateWidthInactive(), this._platform.IOS ? 10 : 0);\n }\n }\n _clamp(v) {\n const min = this._tickMarkOffset;\n const max = this._slider._cachedWidth - this._tickMarkOffset;\n return Math.max(Math.min(v, max), min);\n }\n _calcTranslateXByValue() {\n if (this._slider._isRtl) {\n return (1 - this.percentage) * (this._slider._cachedWidth - this._tickMarkOffset * 2) + this._tickMarkOffset;\n }\n return this.percentage * (this._slider._cachedWidth - this._tickMarkOffset * 2) + this._tickMarkOffset;\n }\n _calcTranslateXByPointerEvent(event) {\n return event.clientX - this._slider._cachedLeft;\n }\n /**\n * Used to set the slider width to the correct\n * dimensions while the user is dragging.\n */\n _updateWidthActive() {}\n /**\n * Sets the slider input to disproportionate dimensions to allow for touch\n * events to be captured on touch devices.\n */\n _updateWidthInactive() {\n this._hostElement.style.padding = `0 ${this._slider._inputPadding}px`;\n this._hostElement.style.width = `calc(100% + ${this._slider._inputPadding - this._tickMarkOffset * 2}px)`;\n this._hostElement.style.left = `-${this._slider._rippleRadius - this._tickMarkOffset}px`;\n }\n _updateThumbUIByValue(options) {\n this.translateX = this._clamp(this._calcTranslateXByValue());\n this._updateThumbUI(options);\n }\n _updateThumbUIByPointerEvent(event, options) {\n this.translateX = this._clamp(this._calcTranslateXByPointerEvent(event));\n this._updateThumbUI(options);\n }\n _updateThumbUI(options) {\n this._slider._setTransition(!!options?.withAnimation);\n this._slider._onTranslateXChange(this);\n }\n /**\n * Sets the input's value.\n * @param value The new value of the input\n * @docs-private\n */\n writeValue(value) {\n if (this._isControlInitialized || value !== null) {\n this.value = value;\n }\n }\n /**\n * Registers a callback to be invoked when the input's value changes from user input.\n * @param fn The callback to register\n * @docs-private\n */\n registerOnChange(fn) {\n this._onChangeFn = fn;\n this._isControlInitialized = true;\n }\n /**\n * Registers a callback to be invoked when the input is blurred by the user.\n * @param fn The callback to register\n * @docs-private\n */\n registerOnTouched(fn) {\n this._onTouchedFn = fn;\n }\n /**\n * Sets the disabled state of the slider.\n * @param isDisabled The new disabled state\n * @docs-private\n */\n setDisabledState(isDisabled) {\n this.disabled = isDisabled;\n }\n focus() {\n this._hostElement.focus();\n }\n blur() {\n this._hostElement.blur();\n }\n static \u0275fac = function MatSliderThumb_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || MatSliderThumb)();\n };\n static \u0275dir = /* @__PURE__ */i0.\u0275\u0275defineDirective({\n type: MatSliderThumb,\n selectors: [[\"input\", \"matSliderThumb\", \"\"]],\n hostAttrs: [\"type\", \"range\", 1, \"mdc-slider__input\"],\n hostVars: 1,\n hostBindings: function MatSliderThumb_HostBindings(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275listener(\"change\", function MatSliderThumb_change_HostBindingHandler() {\n return ctx._onChange();\n })(\"input\", function MatSliderThumb_input_HostBindingHandler() {\n return ctx._onInput();\n })(\"blur\", function MatSliderThumb_blur_HostBindingHandler() {\n return ctx._onBlur();\n })(\"focus\", function MatSliderThumb_focus_HostBindingHandler() {\n return ctx._onFocus();\n });\n }\n if (rf & 2) {\n i0.\u0275\u0275attribute(\"aria-valuetext\", ctx._valuetext());\n }\n },\n inputs: {\n value: [2, \"value\", \"value\", numberAttribute]\n },\n outputs: {\n valueChange: \"valueChange\",\n dragStart: \"dragStart\",\n dragEnd: \"dragEnd\"\n },\n exportAs: [\"matSliderThumb\"],\n features: [i0.\u0275\u0275ProvidersFeature([MAT_SLIDER_THUMB_VALUE_ACCESSOR, {\n provide: MAT_SLIDER_THUMB,\n useExisting: MatSliderThumb\n }])]\n });\n }\n return MatSliderThumb;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet MatSliderRangeThumb = /*#__PURE__*/(() => {\n class MatSliderRangeThumb extends MatSliderThumb {\n _cdr = inject(ChangeDetectorRef);\n /** @docs-private */\n getSibling() {\n if (!this._sibling) {\n this._sibling = this._slider._getInput(this._isEndThumb ? _MatThumb.START : _MatThumb.END);\n }\n return this._sibling;\n }\n _sibling;\n /**\n * Returns the minimum translateX position allowed for this slider input's visual thumb.\n * @docs-private\n */\n getMinPos() {\n const sibling = this.getSibling();\n if (!this._isLeftThumb && sibling) {\n return sibling.translateX;\n }\n return this._tickMarkOffset;\n }\n /**\n * Returns the maximum translateX position allowed for this slider input's visual thumb.\n * @docs-private\n */\n getMaxPos() {\n const sibling = this.getSibling();\n if (this._isLeftThumb && sibling) {\n return sibling.translateX;\n }\n return this._slider._cachedWidth - this._tickMarkOffset;\n }\n _setIsLeftThumb() {\n this._isLeftThumb = this._isEndThumb && this._slider._isRtl || !this._isEndThumb && !this._slider._isRtl;\n }\n /** Whether this slider corresponds to the input on the left hand side. */\n _isLeftThumb;\n /** Whether this slider corresponds to the input with greater value. */\n _isEndThumb;\n constructor() {\n super();\n this._isEndThumb = this._hostElement.hasAttribute('matSliderEndThumb');\n this._setIsLeftThumb();\n this.thumbPosition = this._isEndThumb ? _MatThumb.END : _MatThumb.START;\n }\n _getDefaultValue() {\n return this._isEndThumb && this._slider._isRange ? this.max : this.min;\n }\n _onInput() {\n super._onInput();\n this._updateSibling();\n if (!this._isActive) {\n this._updateWidthInactive();\n }\n }\n _onNgControlValueChange() {\n super._onNgControlValueChange();\n this.getSibling()?._updateMinMax();\n }\n _onPointerDown(event) {\n if (this.disabled || event.button !== 0) {\n return;\n }\n if (this._sibling) {\n this._sibling._updateWidthActive();\n this._sibling._hostElement.classList.add('mat-mdc-slider-input-no-pointer-events');\n }\n super._onPointerDown(event);\n }\n _onPointerUp() {\n super._onPointerUp();\n if (this._sibling) {\n setTimeout(() => {\n this._sibling._updateWidthInactive();\n this._sibling._hostElement.classList.remove('mat-mdc-slider-input-no-pointer-events');\n });\n }\n }\n _onPointerMove(event) {\n super._onPointerMove(event);\n if (!this._slider.step && this._isActive) {\n this._updateSibling();\n }\n }\n _fixValue(event) {\n super._fixValue(event);\n this._sibling?._updateMinMax();\n }\n _clamp(v) {\n return Math.max(Math.min(v, this.getMaxPos()), this.getMinPos());\n }\n _updateMinMax() {\n const sibling = this.getSibling();\n if (!sibling) {\n return;\n }\n if (this._isEndThumb) {\n this.min = Math.max(this._slider.min, sibling.value);\n this.max = this._slider.max;\n } else {\n this.min = this._slider.min;\n this.max = Math.min(this._slider.max, sibling.value);\n }\n }\n _updateWidthActive() {\n const minWidth = this._slider._rippleRadius * 2 - this._slider._inputPadding * 2;\n const maxWidth = this._slider._cachedWidth + this._slider._inputPadding - minWidth - this._tickMarkOffset * 2;\n const percentage = this._slider.min < this._slider.max ? (this.max - this.min) / (this._slider.max - this._slider.min) : 1;\n const width = maxWidth * percentage + minWidth;\n this._hostElement.style.width = `${width}px`;\n this._hostElement.style.padding = `0 ${this._slider._inputPadding}px`;\n }\n _updateWidthInactive() {\n const sibling = this.getSibling();\n if (!sibling) {\n return;\n }\n const maxWidth = this._slider._cachedWidth - this._tickMarkOffset * 2;\n const midValue = this._isEndThumb ? this.value - (this.value - sibling.value) / 2 : this.value + (sibling.value - this.value) / 2;\n const _percentage = this._isEndThumb ? (this.max - midValue) / (this._slider.max - this._slider.min) : (midValue - this.min) / (this._slider.max - this._slider.min);\n const percentage = this._slider.min < this._slider.max ? _percentage : 1;\n // Extend the native input width by the radius of the ripple\n let ripplePadding = this._slider._rippleRadius;\n // If one of the inputs is maximally sized (the value of both thumbs is\n // equal to the min or max), make that input take up all of the width and\n // make the other unselectable.\n if (percentage === 1) {\n ripplePadding = 48;\n } else if (percentage === 0) {\n ripplePadding = 0;\n }\n const width = maxWidth * percentage + ripplePadding;\n this._hostElement.style.width = `${width}px`;\n this._hostElement.style.padding = '0px';\n if (this._isLeftThumb) {\n this._hostElement.style.left = `-${this._slider._rippleRadius - this._tickMarkOffset}px`;\n this._hostElement.style.right = 'auto';\n } else {\n this._hostElement.style.left = 'auto';\n this._hostElement.style.right = `-${this._slider._rippleRadius - this._tickMarkOffset}px`;\n }\n }\n _updateStaticStyles() {\n this._hostElement.classList.toggle('mat-slider__right-input', !this._isLeftThumb);\n }\n _updateSibling() {\n const sibling = this.getSibling();\n if (!sibling) {\n return;\n }\n sibling._updateMinMax();\n if (this._isActive) {\n sibling._updateWidthActive();\n } else {\n sibling._updateWidthInactive();\n }\n }\n /**\n * Sets the input's value.\n * @param value The new value of the input\n * @docs-private\n */\n writeValue(value) {\n if (this._isControlInitialized || value !== null) {\n this.value = value;\n this._updateWidthInactive();\n this._updateSibling();\n }\n }\n _setValue(value) {\n super._setValue(value);\n this._updateWidthInactive();\n this._updateSibling();\n }\n static \u0275fac = function MatSliderRangeThumb_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || MatSliderRangeThumb)();\n };\n static \u0275dir = /* @__PURE__ */i0.\u0275\u0275defineDirective({\n type: MatSliderRangeThumb,\n selectors: [[\"input\", \"matSliderStartThumb\", \"\"], [\"input\", \"matSliderEndThumb\", \"\"]],\n exportAs: [\"matSliderRangeThumb\"],\n features: [i0.\u0275\u0275ProvidersFeature([MAT_SLIDER_RANGE_THUMB_VALUE_ACCESSOR, {\n provide: MAT_SLIDER_RANGE_THUMB,\n useExisting: MatSliderRangeThumb\n }]), i0.\u0275\u0275InheritDefinitionFeature]\n });\n }\n return MatSliderRangeThumb;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet MatSliderModule = /*#__PURE__*/(() => {\n class MatSliderModule {\n static \u0275fac = function MatSliderModule_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || MatSliderModule)();\n };\n static \u0275mod = /* @__PURE__ */i0.\u0275\u0275defineNgModule({\n type: MatSliderModule\n });\n static \u0275inj = /* @__PURE__ */i0.\u0275\u0275defineInjector({\n imports: [MatCommonModule, MatRippleModule]\n });\n }\n return MatSliderModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nexport { MatSlider, MatSliderChange, MatSliderModule, MatSliderRangeThumb, MatSliderThumb, MatSliderVisualThumb };\n", │ │ "import * as i0 from '@angular/core';\nimport { ChangeDetectionStrategy, Component, NgModule } from '@angular/core';\nimport { FieldType, FormlyMatFormFieldModule } from '@ngx-formly/material/form-field';\nimport * as i1 from '@angular/forms';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport * as i2 from '@angular/material/slider';\nimport { MatSliderModule } from '@angular/material/slider';\nimport * as i3 from '@ngx-formly/core';\nimport { FormlyModule } from '@ngx-formly/core';\nimport { CommonModule } from '@angular/common';\nimport { MatCommonModule, MatRippleModule } from '@angular/material/core';\nlet FormlyFieldSlider = /*#__PURE__*/(() => {\n class FormlyFieldSlider extends FieldType {\n constructor() {\n super(...arguments);\n this.defaultOptions = {\n props: {\n hideFieldUnderline: true,\n floatLabel: 'always',\n displayWith: value => `${value}`\n }\n };\n }\n static {\n this.\u0275fac = /* @__PURE__ */(() => {\n let \u0275FormlyFieldSlider_BaseFactory;\n return function FormlyFieldSlider_Factory(__ngFactoryType__) {\n return (\u0275FormlyFieldSlider_BaseFactory || (\u0275FormlyFieldSlider_BaseFactory = i0.\u0275\u0275getInheritedFactory(FormlyFieldSlider)))(__ngFactoryType__ || FormlyFieldSlider);\n };\n })();\n }\n static {\n this.\u0275cmp = /* @__PURE__ */i0.\u0275\u0275defineComponent({\n type: FormlyFieldSlider,\n selectors: [[\"formly-field-mat-slider\"]],\n standalone: false,\n features: [i0.\u0275\u0275InheritDefinitionFeature],\n decls: 2,\n vars: 15,\n consts: [[3, \"input\", \"change\", \"id\", \"formlyAttributes\", \"tabIndex\", \"color\", \"displayWith\", \"max\", \"min\", \"step\", \"discrete\", \"showTickMarks\"], [\"matSliderThumb\", \"\", 3, \"formControl\", \"formlyAttributes\"]],\n template: function FormlyFieldSlider_Template(rf, ctx) {\n if (rf & 1) {\n i0.\u0275\u0275elementStart(0, \"mat-slider\", 0);\n i0.\u0275\u0275listener(\"input\", function FormlyFieldSlider_Template_mat_slider_input_0_listener($event) {\n return ctx.props.input && ctx.props.input(ctx.field, $event);\n })(\"change\", function FormlyFieldSlider_Template_mat_slider_change_0_listener($event) {\n return ctx.props.change && ctx.props.change(ctx.field, $event);\n });\n i0.\u0275\u0275element(1, \"input\", 1);\n i0.\u0275\u0275elementEnd();\n }\n if (rf & 2) {\n i0.\u0275\u0275styleProp(\"width\", \"100%\");\n i0.\u0275\u0275property(\"id\", ctx.id)(\"formlyAttributes\", ctx.field)(\"tabIndex\", ctx.props.tabindex)(\"color\", ctx.props.color)(\"displayWith\", ctx.props.displayWith)(\"max\", ctx.props.max)(\"min\", ctx.props.min)(\"step\", ctx.props.step)(\"discrete\", ctx.props.discrete)(\"showTickMarks\", ctx.props.showTickMarks)(\"step\", ctx.props.step);\n i0.\u0275\u0275advance();\n i0.\u0275\u0275property(\"formControl\", ctx.formControl)(\"formlyAttributes\", ctx.field);\n }\n },\n dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.FormControlDirective, i2.MatSlider, i2.MatSliderThumb, i3.LegacyFormlyAttributes],\n encapsulation: 2,\n changeDetection: 0\n });\n }\n }\n return FormlyFieldSlider;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nfunction withFormlyFieldSlider() {\n return {\n types: [{\n name: 'slider',\n component: FormlyFieldSlider,\n wrappers: ['form-field']\n }]\n };\n}\nlet FormlyMatSliderModule = /*#__PURE__*/(() => {\n class FormlyMatSliderModule {\n static {\n this.\u0275fac = function FormlyMatSliderModule_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || FormlyMatSliderModule)();\n };\n }\n static {\n this.\u0275mod = /* @__PURE__ */i0.\u0275\u0275defineNgModule({\n type: FormlyMatSliderModule\n });\n }\n static {\n this.\u0275inj = /* @__PURE__ */i0.\u0275\u0275defineInjector({\n imports: [CommonModule, MatCommonModule, MatRippleModule, ReactiveFormsModule, MatSliderModule, FormlyMatFormFieldModule, FormlyModule.forChild(withFormlyFieldSlider())]\n });\n }\n }\n return FormlyMatSliderModule;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { FormlyFieldSlider, FormlyMatSliderModule, withFormlyFieldSlider };\n", │ │ "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { FieldType } from '@ngx-formly/material';\nimport { FormlyFieldConfig, FormlyModule } from '@ngx-formly/core';\nimport { T } from 'src/app/t.const';\nimport { TagEditComponent } from '../../features/tag/tag-edit/tag-edit.component';\n\n@Component({\n selector: 'formly-tag-selection',\n standalone: true,\n imports: [FormsModule, FormlyModule, ReactiveFormsModule, TagEditComponent],\n templateUrl: './formly-tag-selection.component.html',\n styleUrl: './formly-tag-selection.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FormlyTagSelectionComponent extends FieldType {\n T: typeof T = T;\n}\n", │ │ "\n\n\n\n", │ │ "import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { FormlyFieldConfig, FormlyModule } from '@ngx-formly/core';\nimport { FieldType } from '@ngx-formly/material';\nimport { MatButton } from '@angular/material/button';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Log } from '../../core/log';\n\n@Component({\n selector: 'formly-btn',\n templateUrl: './formly-btn.component.html',\n styleUrl: './formly-btn.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FormlyModule, MatButton, TranslatePipe],\n})\nexport class FormlyBtnComponent extends FieldType {\n onClick(): void {\n if (this.to.onClick) {\n const r = this.to.onClick(this.field, this.form, this.model);\n if (r && 'then' in r) {\n r.then((v) => {\n Log.log('update', v, this);\n this.formControl.setValue(v);\n this.form.markAsDirty();\n });\n } else {\n this.formControl.setValue(r);\n }\n }\n }\n}\n", │ │ "@if (value) {\n
    {{ value }}
    \n}\n\n {{ (to.text | translate) || 'Click Me' }}\n\n", │ │ - "// This file is auto-generated by tools/load-env.js\n// Do not modify directly - edit .env file instead\n// Generated at: 2025-08-26T06:06:46.987Z\n\n/**\n * Environment variables loaded from .env file\n * Access these constants instead of process.env in your Angular app\n */\nexport const ENV = {\n\n} as const;\n\n// Type-safe helper to ensure all expected env vars are defined\nexport type EnvVars = typeof ENV;\n", │ │ + "// This file is auto-generated by tools/load-env.js\n// Do not modify directly - edit .env file instead\n// Generated at: 2025-08-29T07:36:08.448Z\n\n/**\n * Environment variables loaded from .env file\n * Access these constants instead of process.env in your Angular app\n */\nexport const ENV = {\n\n} as const;\n\n// Type-safe helper to ensure all expected env vars are defined\nexport type EnvVars = typeof ENV;\n", │ │ "/**\n * Pure functions for accessing environment variables.\n * These can be used anywhere in the codebase, including outside Angular context.\n */\n\n// Import the generated environment constants\n// This file is auto-generated from .env by tools/load-env.js\nimport { ENV } from '../config/env.generated';\n\n/**\n * Get an environment variable value.\n * Returns undefined if the variable is not set.\n */\nexport const getEnv = (key: keyof typeof ENV): string | undefined => {\n return ENV[key] || undefined;\n};\n\n/**\n * Get an optional environment variable that may not be in the required list.\n * Use this for environment variables that are truly optional and may not be defined\n * in the REQUIRED_ENV_KEYS list in load-env.js.\n * Returns undefined if the variable is not set.\n */\nexport const getEnvOptional = (key: string): string | undefined => {\n return (ENV as any)[key] || undefined;\n};\n\n/**\n * Get an environment variable as a number.\n * Returns undefined if the value is not a valid number.\n */\nexport const getEnvNumber = (key: keyof typeof ENV): number | undefined => {\n const value = getEnv(key);\n if (value === undefined) return undefined;\n const num = Number(value);\n return isNaN(num) ? undefined : num;\n};\n\n/**\n * Get all environment variables as an object.\n * Useful for debugging or passing multiple values.\n */\nexport const getAllEnv = (): typeof ENV => ENV;\n", │ │ "import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable, of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { getEnvOptional } from '../../util/env';\n\nexport interface UnsplashPhoto {\n id: string;\n urls: {\n raw: string;\n full: string;\n regular: string;\n small: string;\n thumb: string;\n };\n links?: {\n self?: string;\n html?: string;\n download?: string;\n download_location?: string;\n };\n description: string | null;\n alt_description: string | null;\n user: {\n name: string;\n links?: {\n html?: string;\n };\n };\n}\n\nexport interface UnsplashSearchResponse {\n results: UnsplashPhoto[];\n total: number;\n total_pages: number;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UnsplashService {\n private _http = inject(HttpClient);\n\n private readonly API_URL = 'https://api.unsplash.com';\n // Register your app at https://unsplash.com/developers?utm_source=super-productivity&utm_medium=referral&utm_campaign=api-credit for a free Access Key (50 req/hour)\n // The Access Key is used with \"Client-ID\" prefix in the Authorization header\n private readonly ACCESS_KEY = getEnvOptional('UNSPLASH_KEY');\n\n isAvailable(): boolean {\n return !!this.ACCESS_KEY;\n }\n\n searchPhotos(query: string, page = 1): Observable {\n if (!query || query.trim() === '') {\n return of({ results: [], total: 0, total_pages: 0 });\n }\n\n if (!this.ACCESS_KEY) {\n console.warn(\n 'No Unsplash Access Key configured. Register at https://unsplash.com/developers?utm_source=super-productivity&utm_medium=referral&utm_campaign=api-credit',\n );\n return of({ results: [], total: 0, total_pages: 0 });\n }\n\n const params = {\n query: query.trim(),\n page: page.toString(),\n per_page: '20',\n orientation: 'landscape',\n };\n\n const url = `${this.API_URL}/search/photos`;\n const headers = {\n Authorization: `Client-ID ${this.ACCESS_KEY}`,\n };\n\n return this._http\n .get(url, {\n params,\n headers,\n })\n .pipe(\n catchError((error) => {\n console.error('Unsplash API error:', error);\n return of({ results: [], total: 0, total_pages: 0 });\n }),\n );\n }\n\n getPhotoUrl(\n photo: UnsplashPhoto,\n size: 'thumb' | 'small' | 'regular' = 'regular',\n ): string {\n return photo.urls[size];\n }\n\n /**\n * Get optimized image URL for backgrounds\n * @param photo - The Unsplash photo object\n * @param width - Desired width (default 2560 for high res displays)\n * @param quality - Image quality 1-100 (default 85)\n */\n getBackgroundImageUrl(photo: UnsplashPhoto, width = 2560, quality = 85): string {\n return `${photo.urls.raw}&w=${width}&q=${quality}&auto=format`;\n }\n\n /**\n * Add UTM parameters to Unsplash attribution links as required\n * @param url - The original Unsplash URL\n */\n addUtmParams(url: string): string {\n if (!url) return url;\n\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}utm_source=super-productivity&utm_medium=referral&utm_campaign=api-credit`;\n }\n\n /**\n * Trigger download tracking as required by Unsplash API guidelines\n * This must be called when a user selects a photo for use\n * @param photo - The selected photo\n */\n trackPhotoDownload(photo: UnsplashPhoto): Observable {\n if (!photo.links?.download_location) {\n console.warn('No download_location available for photo', photo.id);\n return of(null);\n }\n\n if (!this.ACCESS_KEY) {\n console.warn('No Unsplash Access Key configured');\n return of(null);\n }\n\n const headers = {\n Authorization: `Client-ID ${this.ACCESS_KEY}`,\n };\n\n // Call the download endpoint to track usage\n return this._http.get(photo.links.download_location, { headers }).pipe(\n catchError((error) => {\n console.error('Failed to track photo download:', error);\n // Don't fail the selection if tracking fails\n return of(null);\n }),\n );\n }\n}\n", │ │ "export const IS_MAC = navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n", │ │ "import * as i0 from '@angular/core';\nimport { InjectionToken, Injectable, EventEmitter, Directive, Optional, Inject, Input, Output } from '@angular/core';\nimport { registerables, Chart, defaults } from 'chart.js';\nimport { merge } from 'lodash-es';\nimport { BehaviorSubject } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs/operators';\nconst NG_CHARTS_CONFIGURATION = new InjectionToken('Configuration for ngCharts');\n/**\n * Provide all the default registerable as defined by Chart.js\n */\nfunction withDefaultRegisterables(...registerables$1) {\n return {\n registerables: [...registerables, ...registerables$1]\n };\n}\n/**\n * Provide configuration for ngCharts. In most cases, you have to pass it some registerables. So either\n * `withDefaultRegisterables()`, or a custom list of registerables tailored to your needs to reduce bundle size.\n */\nfunction provideCharts(...configurations) {\n const config = merge({}, ...configurations);\n return {\n provide: NG_CHARTS_CONFIGURATION,\n useValue: config\n };\n}\nlet ThemeService = /*#__PURE__*/(() => {\n class ThemeService {\n constructor() {\n this.colorschemesOptions = new BehaviorSubject(undefined);\n }\n setColorschemesOptions(options) {\n this.pColorschemesOptions = options;\n this.colorschemesOptions.next(options);\n }\n getColorschemesOptions() {\n return this.pColorschemesOptions;\n }\n static {\n this.\u0275fac = function ThemeService_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || ThemeService)();\n };\n }\n static {\n this.\u0275prov = /* @__PURE__ */i0.\u0275\u0275defineInjectable({\n token: ThemeService,\n factory: ThemeService.\u0275fac,\n providedIn: 'root'\n });\n }\n }\n return ThemeService;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet BaseChartDirective = /*#__PURE__*/(() => {\n class BaseChartDirective {\n constructor(element, zone, themeService, config) {\n this.zone = zone;\n this.themeService = themeService;\n this.type = 'bar';\n this.plugins = [];\n this.chartClick = new EventEmitter();\n this.chartHover = new EventEmitter();\n this.subs = [];\n this.themeOverrides = {};\n if (config?.registerables) {\n Chart.register(...config.registerables);\n }\n if (config?.defaults) {\n defaults.set(config.defaults);\n }\n this.ctx = element.nativeElement.getContext('2d');\n this.subs.push(this.themeService.colorschemesOptions.pipe(distinctUntilChanged()).subscribe(r => this.themeChanged(r)));\n }\n ngOnChanges(changes) {\n const requireRender = ['type'];\n const propertyNames = Object.getOwnPropertyNames(changes);\n if (propertyNames.some(key => requireRender.includes(key)) || propertyNames.every(key => changes[key].isFirstChange())) {\n this.render();\n } else {\n const config = this.getChartConfiguration();\n // Using assign to avoid changing the original object reference\n if (this.chart) {\n Object.assign(this.chart.config.data, config.data);\n if (this.chart.config.plugins) {\n Object.assign(this.chart.config.plugins, config.plugins);\n }\n if (this.chart.config.options) {\n Object.assign(this.chart.config.options, config.options);\n }\n }\n this.update();\n }\n }\n ngOnDestroy() {\n if (this.chart) {\n this.chart.destroy();\n this.chart = void 0;\n }\n this.subs.forEach(s => s.unsubscribe());\n }\n render() {\n if (this.chart) {\n this.chart.destroy();\n }\n return this.zone.runOutsideAngular(() => this.chart = new Chart(this.ctx, this.getChartConfiguration()));\n }\n update(mode) {\n if (this.chart) {\n this.zone.runOutsideAngular(() => this.chart?.update(mode));\n }\n }\n hideDataset(index, hidden) {\n if (this.chart) {\n this.chart.getDatasetMeta(index).hidden = hidden;\n this.update();\n }\n }\n isDatasetHidden(index) {\n return this.chart?.getDatasetMeta(index)?.hidden;\n }\n toBase64Image() {\n return this.chart?.toBase64Image();\n }\n themeChanged(options) {\n this.themeOverrides = options;\n if (this.chart) {\n if (this.chart.config.options) {\n Object.assign(this.chart.config.options, this.getChartOptions());\n }\n this.update();\n }\n }\n getChartOptions() {\n return merge({\n onHover: (event, active) => {\n if (!this.chartHover.observed && !this.chartHover.observers?.length) {\n return;\n }\n this.zone.run(() => this.chartHover.emit({\n event,\n active\n }));\n },\n onClick: (event, active) => {\n if (!this.chartClick.observed && !this.chartClick.observers?.length) {\n return;\n }\n this.zone.run(() => this.chartClick.emit({\n event,\n active\n }));\n }\n }, this.themeOverrides, this.options, {\n plugins: {\n legend: {\n display: this.legend\n }\n }\n });\n }\n getChartConfiguration() {\n return {\n type: this.type,\n data: this.getChartData(),\n options: this.getChartOptions(),\n plugins: this.plugins\n };\n }\n getChartData() {\n return this.data ? this.data : {\n labels: this.labels || [],\n datasets: this.datasets || []\n };\n }\n static {\n this.\u0275fac = function BaseChartDirective_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || BaseChartDirective)(i0.\u0275\u0275directiveInject(i0.ElementRef), i0.\u0275\u0275directiveInject(i0.NgZone), i0.\u0275\u0275directiveInject(ThemeService), i0.\u0275\u0275directiveInject(NG_CHARTS_CONFIGURATION, 8));\n };\n }\n static {\n this.\u0275dir = /* @__PURE__ */i0.\u0275\u0275defineDirective({\n type: BaseChartDirective,\n selectors: [[\"canvas\", \"baseChart\", \"\"]],\n inputs: {\n type: \"type\",\n legend: \"legend\",\n data: \"data\",\n options: \"options\",\n plugins: \"plugins\",\n labels: \"labels\",\n datasets: \"datasets\"\n },\n outputs: {\n chartClick: \"chartClick\",\n chartHover: \"chartHover\"\n },\n exportAs: [\"base-chart\"],\n features: [i0.\u0275\u0275NgOnChangesFeature]\n });\n }\n }\n return BaseChartDirective;\n})();\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/*\n * Public API Surface of ng2-charts\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { BaseChartDirective, NG_CHARTS_CONFIGURATION, ThemeService, provideCharts, withDefaultRegisterables };\n", │ │ "export const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n", │ │ "import { inject, Injectable } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { Log } from '../log';\n\nexport interface CustomTheme {\n id: string;\n name: string;\n url: string;\n requiredMode?: 'dark' | 'light' | 'system';\n}\n\nexport const AVAILABLE_CUSTOM_THEMES: CustomTheme[] = [\n {\n id: 'default',\n name: 'Default',\n url: '',\n requiredMode: 'system',\n },\n {\n id: 'arc',\n name: 'Arc',\n url: 'assets/themes/arc.css',\n requiredMode: 'dark',\n },\n {\n id: 'dark-base',\n name: 'Dark Base',\n url: 'assets/themes/dark-base.css',\n requiredMode: 'dark',\n },\n {\n id: 'dracula',\n name: 'Dracula',\n url: 'assets/themes/dracula.css',\n requiredMode: 'dark',\n },\n {\n id: 'everforest',\n name: 'Everforest',\n url: 'assets/themes/everforest.css',\n requiredMode: 'system',\n },\n {\n id: 'rainbow',\n name: 'Rainbow',\n url: 'assets/themes/rainbow.css',\n requiredMode: 'system',\n },\n {\n id: 'glass',\n name: 'Glass',\n url: 'assets/themes/glass.css',\n requiredMode: 'dark',\n },\n {\n id: 'nord-polar-night',\n name: 'Nord Polar Night',\n url: 'assets/themes/nord-polar-night.css',\n requiredMode: 'dark',\n },\n {\n id: 'nord-snow-storm',\n name: 'Nord Snow Storm',\n url: 'assets/themes/nord-snow-storm.css',\n requiredMode: 'light',\n },\n];\n\n@Injectable({ providedIn: 'root' })\nexport class CustomThemeService {\n private document = inject(DOCUMENT);\n private currentThemeLinkElement: HTMLLinkElement | null = null;\n\n loadTheme(themeId: string): void {\n const theme = AVAILABLE_CUSTOM_THEMES.find((t) => t.id === themeId);\n\n if (!theme) {\n Log.err(`Theme with id ${themeId} not found`);\n return;\n }\n\n // Remove existing theme\n this.unloadCurrentTheme();\n\n // If default theme, no need to load external CSS\n if (theme.id === 'default' || !theme.url) {\n return;\n }\n\n // Create new link element for theme\n const linkElement = this.document.createElement('link');\n linkElement.rel = 'stylesheet';\n linkElement.href = theme.url;\n linkElement.id = 'custom-theme-stylesheet';\n\n // Add to head\n this.document.head.appendChild(linkElement);\n this.currentThemeLinkElement = linkElement;\n }\n\n unloadCurrentTheme(): void {\n if (this.currentThemeLinkElement) {\n this.currentThemeLinkElement.remove();\n this.currentThemeLinkElement = null;\n }\n\n // Also remove any existing custom theme stylesheets\n const existingThemeLink = this.document.getElementById('custom-theme-stylesheet');\n if (existingThemeLink) {\n existingThemeLink.remove();\n }\n }\n\n getAvailableThemes(): CustomTheme[] {\n return AVAILABLE_CUSTOM_THEMES;\n }\n}\n", │ │ "import { effect, inject, Injectable, signal } from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { BodyClass, IS_ELECTRON } from '../../app.constants';\nimport { IS_MAC } from '../../util/is-mac';\nimport { distinctUntilChanged, map, startWith, switchMap, take } from 'rxjs/operators';\nimport { IS_TOUCH_ONLY } from '../../util/is-touch-only';\nimport { MaterialCssVarsService } from 'angular-material-css-vars';\nimport { DOCUMENT } from '@angular/common';\nimport { MatIconRegistry } from '@angular/material/icon';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ChromeExtensionInterfaceService } from '../chrome-extension-interface/chrome-extension-interface.service';\nimport { ThemeService as NgChartThemeService } from 'ng2-charts';\nimport { GlobalConfigService } from '../../features/config/global-config.service';\nimport { WorkContextThemeCfg } from '../../features/work-context/work-context.model';\nimport { WorkContextService } from '../../features/work-context/work-context.service';\nimport { combineLatest, fromEvent, Observable, of } from 'rxjs';\nimport { IS_FIREFOX } from '../../util/is-firefox';\nimport { ImexViewService } from '../../imex/imex-meta/imex-view.service';\nimport { IS_MOUSE_PRIMARY, IS_TOUCH_PRIMARY } from '../../util/is-mouse-primary';\nimport { ChartConfiguration } from 'chart.js';\nimport { IS_ANDROID_WEB_VIEW } from '../../util/is-android-web-view';\nimport { androidInterface } from '../../features/android/android-interface';\nimport { HttpClient } from '@angular/common/http';\nimport { LS } from '../persistence/storage-keys.const';\nimport { CustomThemeService } from './custom-theme.service';\nimport { Log } from '../log';\n\nexport type DarkModeCfg = 'dark' | 'light' | 'system';\n\n@Injectable({ providedIn: 'root' })\nexport class GlobalThemeService {\n private document = inject(DOCUMENT);\n private _materialCssVarsService = inject(MaterialCssVarsService);\n private _workContextService = inject(WorkContextService);\n private _globalConfigService = inject(GlobalConfigService);\n private _matIconRegistry = inject(MatIconRegistry);\n private _domSanitizer = inject(DomSanitizer);\n private _chartThemeService = inject(NgChartThemeService);\n private _chromeExtensionInterfaceService = inject(ChromeExtensionInterfaceService);\n private _imexMetaService = inject(ImexViewService);\n private _http = inject(HttpClient);\n private _customThemeService = inject(CustomThemeService);\n\n darkMode = signal(\n (localStorage.getItem(LS.DARK_MODE) as DarkModeCfg) || 'system',\n );\n\n private _isDarkThemeObs$: Observable = toObservable(this.darkMode).pipe(\n switchMap((darkMode) => {\n switch (darkMode) {\n case 'dark':\n return of(true);\n case 'light':\n return of(false);\n default:\n const darkModePreference = window.matchMedia('(prefers-color-scheme: dark)');\n return fromEvent(darkModePreference, 'change').pipe(\n map((e: any) => e.matches),\n startWith(darkModePreference.matches),\n );\n }\n }),\n distinctUntilChanged(),\n );\n\n isDarkTheme = toSignal(this._isDarkThemeObs$, { initialValue: false });\n\n private _backgroundImgObs$: Observable = combineLatest([\n this._workContextService.currentTheme$,\n this._isDarkThemeObs$,\n ]).pipe(\n map(([theme, isDarkMode]) =>\n isDarkMode ? theme.backgroundImageDark : theme.backgroundImageLight,\n ),\n distinctUntilChanged(),\n );\n\n backgroundImg = toSignal(this._backgroundImgObs$);\n\n init(): void {\n // This is here to make web page reloads on non-work-context pages at least usable\n this._setBackgroundGradient(true);\n this._initIcons();\n this._initHandlersForInitialBodyClasses();\n this._initThemeWatchers();\n\n // Set up dark mode persistence effect\n effect(\n () => {\n const darkMode = this.darkMode();\n localStorage.setItem(LS.DARK_MODE, darkMode);\n },\n { allowSignalWrites: false },\n );\n\n // Set up reactive custom theme updates\n this._setupCustomThemeEffect();\n }\n\n private _setDarkTheme(isDarkTheme: boolean): void {\n this._materialCssVarsService.setDarkTheme(isDarkTheme);\n this._setChartTheme(isDarkTheme);\n // this._materialCssVarsService.setDarkTheme(true);\n // this._materialCssVarsService.setDarkTheme(false);\n }\n\n private _setColorTheme(theme: WorkContextThemeCfg): void {\n this._materialCssVarsService.setAutoContrastEnabled(!!theme.isAutoContrast);\n this._setBackgroundGradient(!!theme.isDisableBackgroundGradient);\n\n // NOTE: setting undefined values does not seem to be a problem so we use !\n if (!theme.isAutoContrast) {\n this._materialCssVarsService.setContrastColorThresholdPrimary(theme.huePrimary!);\n this._materialCssVarsService.setContrastColorThresholdAccent(theme.hueAccent!);\n this._materialCssVarsService.setContrastColorThresholdWarn(theme.hueWarn!);\n }\n\n this._materialCssVarsService.setPrimaryColor(theme.primary!);\n this._materialCssVarsService.setAccentColor(theme.accent!);\n this._materialCssVarsService.setWarnColor(theme.warn!);\n }\n\n private _setBackgroundGradient(isDisableBackgroundGradient: boolean): void {\n if (isDisableBackgroundGradient) {\n this.document.body.classList.add(BodyClass.isDisableBackgroundGradient);\n this.document.body.classList.remove(BodyClass.isEnabledBackgroundGradient);\n } else {\n this.document.body.classList.add(BodyClass.isEnabledBackgroundGradient);\n this.document.body.classList.remove(BodyClass.isDisableBackgroundGradient);\n }\n }\n\n private _initIcons(): void {\n const icons: [string, string][] = [\n ['sp', 'assets/icons/sp.svg'],\n ['play', 'assets/icons/play.svg'],\n ['github', 'assets/icons/github.svg'],\n ['gitlab', 'assets/icons/gitlab.svg'],\n ['jira', 'assets/icons/jira.svg'],\n ['caldav', 'assets/icons/caldav.svg'],\n ['open_project', 'assets/icons/open-project.svg'],\n ['drag_handle', 'assets/icons/drag-handle.svg'],\n ['remove_today', 'assets/icons/remove-today-48px.svg'],\n ['estimate_remaining', 'assets/icons/estimate-remaining.svg'],\n ['working_today', 'assets/icons/working-today.svg'],\n ['repeat', 'assets/icons/repeat.svg'],\n ['gitea', 'assets/icons/gitea.svg'],\n ['redmine', 'assets/icons/redmine.svg'],\n ['calendar', 'assets/icons/calendar.svg'],\n ['early_on', 'assets/icons/early-on.svg'],\n ['tomorrow', 'assets/icons/tomorrow.svg'],\n ['next_week', 'assets/icons/next-week.svg'],\n ['keep', 'assets/icons/keep.svg'],\n ['keep_filled', 'assets/icons/keep-filled.svg'],\n ];\n\n // todo test if can be removed with airplane mode and wifi without internet\n icons.forEach(([name, path]) => {\n this._matIconRegistry.addSvgIcon(\n name,\n this._domSanitizer.bypassSecurityTrustResourceUrl(path),\n );\n });\n\n this.preloadIcons(icons);\n }\n\n preloadIcons(icons: [string, string][]): Promise {\n // Map each icon name to a promise that fetches and registers the icon.\n const iconPromises = icons.map(([iconName, url]) => {\n // Construct the URL for the SVG file.\n // Adjust the path if your SVGs are located elsewhere.\n return this._http\n .get(url, { responseType: 'text' })\n .toPromise()\n .then((svg) => {\n // Register the fetched SVG as an inline icon.\n this._matIconRegistry.addSvgIconLiteral(\n iconName,\n this._domSanitizer.bypassSecurityTrustHtml(svg),\n );\n })\n .catch((error) => {\n Log.err(`Error loading icon: ${iconName} from ${url}`, error);\n });\n });\n\n // Return a promise that resolves when all icons have been processed.\n return Promise.all(iconPromises);\n }\n\n private _initThemeWatchers(): void {\n // init theme watchers\n this._workContextService.currentTheme$.subscribe((theme: WorkContextThemeCfg) =>\n this._setColorTheme(theme),\n );\n this._isDarkThemeObs$.subscribe((isDarkTheme) => this._setDarkTheme(isDarkTheme));\n }\n\n private _initHandlersForInitialBodyClasses(): void {\n this.document.body.classList.add(BodyClass.isNoAdvancedFeatures);\n\n if (!IS_FIREFOX) {\n this.document.body.classList.add(BodyClass.isNoFirefox);\n }\n\n if (IS_MAC) {\n this.document.body.classList.add(BodyClass.isMac);\n } else {\n this.document.body.classList.add(BodyClass.isNoMac);\n }\n\n if (IS_ELECTRON) {\n this.document.body.classList.add(BodyClass.isElectron);\n this.document.body.classList.add(BodyClass.isAdvancedFeatures);\n this.document.body.classList.remove(BodyClass.isNoAdvancedFeatures);\n } else {\n this.document.body.classList.add(BodyClass.isWeb);\n this._chromeExtensionInterfaceService.onReady$.pipe(take(1)).subscribe(() => {\n this.document.body.classList.add(BodyClass.isExtension);\n this.document.body.classList.add(BodyClass.isAdvancedFeatures);\n this.document.body.classList.remove(BodyClass.isNoAdvancedFeatures);\n });\n }\n\n if (IS_ANDROID_WEB_VIEW) {\n androidInterface.isKeyboardShown$.subscribe((isShown) => {\n Log.log('isShown', isShown);\n\n this.document.body.classList.remove(BodyClass.isAndroidKeyboardHidden);\n this.document.body.classList.remove(BodyClass.isAndroidKeyboardShown);\n this.document.body.classList.add(\n isShown ? BodyClass.isAndroidKeyboardShown : BodyClass.isAndroidKeyboardHidden,\n );\n });\n }\n\n // Use effect to reactively update animation class\n effect(() => {\n const misc = this._globalConfigService.misc();\n if (misc?.isDisableAnimations) {\n this.document.body.classList.add(BodyClass.isDisableAnimations);\n } else {\n this.document.body.classList.remove(BodyClass.isDisableAnimations);\n }\n });\n\n this._imexMetaService.isDataImportInProgress$.subscribe((isInProgress) => {\n // timer(1000, 5000)\n // .pipe(map((val) => val % 2 === 0))\n // .subscribe((isInProgress) => {\n if (isInProgress) {\n this.document.body.classList.add(BodyClass.isDataImportInProgress);\n } else {\n this.document.body.classList.remove(BodyClass.isDataImportInProgress);\n }\n });\n\n if (IS_TOUCH_ONLY) {\n this.document.body.classList.add(BodyClass.isTouchOnly);\n } else {\n this.document.body.classList.add(BodyClass.isNoTouchOnly);\n }\n\n if (IS_MOUSE_PRIMARY) {\n this.document.body.classList.add(BodyClass.isMousePrimary);\n } else if (IS_TOUCH_PRIMARY) {\n this.document.body.classList.add(BodyClass.isTouchPrimary);\n }\n }\n\n private _setChartTheme(isDarkTheme: boolean): void {\n const overrides: ChartConfiguration['options'] = isDarkTheme\n ? {\n // legend: {\n // labels: { fontColor: 'white' },\n // },\n scales: {\n x: {\n ticks: {\n color: 'white',\n },\n grid: {\n color: 'rgba(255,255,255,0.1)',\n },\n },\n\n y: {\n ticks: {\n color: 'white',\n },\n grid: {\n color: 'rgba(255,255,255,0.1)',\n },\n },\n },\n }\n : {\n scales: {},\n };\n this._chartThemeService.setColorschemesOptions(overrides);\n }\n\n private _setupCustomThemeEffect(): void {\n // Track previous theme to avoid unnecessary reloads\n let previousThemeId: string | null = null;\n\n // Set up effect to reactively update custom theme when config changes\n effect(() => {\n const misc = this._globalConfigService.misc();\n const themeId = misc?.customTheme || 'default';\n\n // Only load theme if it has changed\n if (themeId !== previousThemeId) {\n this._customThemeService.loadTheme(themeId);\n previousThemeId = themeId;\n }\n });\n }\n}\n", │ --- assets/public/chunk-VHOVANZ5.js ├── +++ assets/public/chunk-XE7IYWZ3.js │┄ Files 6% similar despite different names │ ├── js-beautify {} │ │ @@ -1,12 +1,12 @@ │ │ import { │ │ s as a, │ │ t as b │ │ -} from "./chunk-R4P47OGM.js"; │ │ -import "./chunk-YQVQI5K6.js"; │ │ +} from "./chunk-3R6CM3NH.js"; │ │ +import "./chunk-BJMTRQ2H.js"; │ │ import "./chunk-F6JR3SI6.js"; │ │ import "./chunk-JEX3ETUW.js"; │ │ import "./chunk-MSQU4SW3.js"; │ │ import "./chunk-FREOXMLF.js"; │ │ import "./chunk-RHMYOTJZ.js"; │ │ import "./chunk-66RKCJ2D.js"; │ │ import "./chunk-AX45DQLU.js"; │ │ @@ -31,8 +31,8 @@ │ │ import "./chunk-OXDOKNTF.js"; │ │ import "./chunk-PEJGMLLQ.js"; │ │ import "./chunk-2NYJ54WT.js"; │ │ b(); │ │ export { │ │ a as PluginRunner │ │ }; │ │ -//# sourceMappingURL=chunk-VHOVANZ5.js.map │ │ +//# sourceMappingURL=chunk-XE7IYWZ3.js.map │ --- assets/public/chunk-JLCYLO4B.js.map ├── +++ assets/public/chunk-5KTYML3O.js.map │┄ Files identical despite different names │ --- assets/public/chunk-3XZTXRJN.js ├── +++ assets/public/chunk-PB3ZXSJW.js │┄ Files 1% similar despite different names │ ├── js-beautify {} │ │ @@ -108,15 +108,15 @@ │ │ import { │ │ L as ji, │ │ M as fo, │ │ k as Ai, │ │ l as yo, │ │ m as Bi, │ │ n as go │ │ -} from "./chunk-YQVQI5K6.js"; │ │ +} from "./chunk-BJMTRQ2H.js"; │ │ import "./chunk-JEX3ETUW.js"; │ │ import "./chunk-MSQU4SW3.js"; │ │ import { │ │ q as Di, │ │ r as co │ │ } from "./chunk-FREOXMLF.js"; │ │ import { │ │ @@ -2216,8 +2216,8 @@ │ │ return e │ │ })() │ │ }); │ │ tr(); │ │ export { │ │ Yl as DailySummaryComponent │ │ }; │ │ -//# sourceMappingURL=chunk-3XZTXRJN.js.map │ │ +//# sourceMappingURL=chunk-PB3ZXSJW.js.map │ --- assets/public/chunk-USPS5AYJ.js ├── +++ assets/public/chunk-IOD4LE5B.js │┄ Files 2% similar despite different names │ ├── js-beautify {} │ │ @@ -1,11 +1,11 @@ │ │ import { │ │ f as ie, │ │ g as we │ │ -} from "./chunk-JLCYLO4B.js"; │ │ +} from "./chunk-5KTYML3O.js"; │ │ import { │ │ a as re, │ │ b as oe, │ │ c as ae, │ │ f as le, │ │ g as Oe │ │ } from "./chunk-LOLEDR3S.js"; │ │ @@ -14,15 +14,15 @@ │ │ l as Ie, │ │ m as Z, │ │ n as ee, │ │ o as te, │ │ p as ve, │ │ q as ne, │ │ r as Me │ │ -} from "./chunk-R4P47OGM.js"; │ │ +} from "./chunk-3R6CM3NH.js"; │ │ import { │ │ a as W, │ │ b as xe │ │ } from "./chunk-JDPRH2TW.js"; │ │ import { │ │ c as q, │ │ d as N, │ │ @@ -319,8 +319,8 @@ │ │ } │ │ return t │ │ })() │ │ }); │ │ export { │ │ rt as a, De as b │ │ }; │ │ -//# sourceMappingURL=chunk-USPS5AYJ.js.map │ │ +//# sourceMappingURL=chunk-IOD4LE5B.js.map │ --- assets/public/chunk-R4P47OGM.js.map ├── +++ assets/public/chunk-3R6CM3NH.js.map │┄ Files identical despite different names │ --- assets/public/chunk-USPS5AYJ.js.map ├── +++ assets/public/chunk-IOD4LE5B.js.map │┄ Files identical despite different names │ --- assets/public/chunk-R4P47OGM.js ├── +++ assets/public/chunk-3R6CM3NH.js │┄ Files 0% similar despite different names │ ├── js-beautify {} │ │ @@ -1,11 +1,11 @@ │ │ import { │ │ L as vr, │ │ M as St │ │ -} from "./chunk-YQVQI5K6.js"; │ │ +} from "./chunk-BJMTRQ2H.js"; │ │ import { │ │ c as Ir, │ │ d as Gt │ │ } from "./chunk-F6JR3SI6.js"; │ │ import { │ │ j as gr, │ │ k as fr, │ │ @@ -2870,15 +2870,15 @@ │ │ } │ │ }) │ │ } │ │ sendMessageToPlugin(t, d) { │ │ return S(this, null, function*() { │ │ let { │ │ PluginRunner: l │ │ - } = yield import("./chunk-VHOVANZ5.js"); │ │ + } = yield import("./chunk-XE7IYWZ3.js"); │ │ return this._injector.get(l).sendMessageToPlugin(t, d) │ │ }) │ │ } │ │ _initWindowFocusTracking() { │ │ window.addEventListener("focus", () => { │ │ this._isWindowFocused = !0, this._notifyFocusHandlers(!0) │ │ }), window.addEventListener("blur", () => { │ │ @@ -3474,8 +3474,8 @@ │ │ } │ │ return y │ │ })() │ │ }); │ │ export { │ │ de as a, ne as b, Or as c, Br as d, ee as e, ce as f, Ur as g, xr as h, re as i, ye as j, Wr as k, $r as l, ns as m, is as n, ls as o, Qr as p, qr as q, Jr as r, Ss as s, Mt as t │ │ }; │ │ -//# sourceMappingURL=chunk-R4P47OGM.js.map │ │ +//# sourceMappingURL=chunk-3R6CM3NH.js.map │ --- assets/public/chunk-JLCYLO4B.js ├── +++ assets/public/chunk-5KTYML3O.js │┄ Files 0% similar despite different names │ ├── js-beautify {} │ │ @@ -5,21 +5,21 @@ │ │ f as Qe, │ │ i as Ne, │ │ j as et, │ │ q as Ae, │ │ r as tt, │ │ s as $e, │ │ t as it │ │ -} from "./chunk-R4P47OGM.js"; │ │ +} from "./chunk-3R6CM3NH.js"; │ │ import { │ │ B as Ce, │ │ C as Je, │ │ c as Ie, │ │ d as Xe │ │ -} from "./chunk-YQVQI5K6.js"; │ │ +} from "./chunk-BJMTRQ2H.js"; │ │ import { │ │ a as fe, │ │ b as me, │ │ c as Pe, │ │ e as _e, │ │ f as Se, │ │ g as Ee, │ │ @@ -1114,8 +1114,8 @@ │ │ } │ │ return d │ │ })() │ │ }); │ │ export { │ │ Te as a, Le as b, Z as c, Y as d, Oe as e, oi as f, nt as g │ │ }; │ │ -//# sourceMappingURL=chunk-JLCYLO4B.js.map │ │ +//# sourceMappingURL=chunk-5KTYML3O.js.map │ --- assets/public/chunk-3XZTXRJN.js.map ├── +++ assets/public/chunk-PB3ZXSJW.js.map │┄ Files identical despite different names │ --- assets/public/chunk-Y7X6DNMX.js.map ├── +++ assets/public/chunk-DVXLHQ52.js.map │┄ Files identical despite different names │ --- assets/public/chunk-YQVQI5K6.js ├── +++ assets/public/chunk-BJMTRQ2H.js │┄ Files 0% similar despite different names │ ├── js-beautify {} │ │ @@ -8165,8 +8165,8 @@ │ │ } │ │ return r │ │ })() │ │ }); │ │ export { │ │ de as a, Ia as b, Tt as c, Li as d, ho as e, Fl as f, ct as g, Ea as h, Wr as i, Fa as j, Vd as k, Cs as l, Ud as m, ws as n, Ts as o, Ms as p, Gs as q, Ys as r, Js as s, co as t, el as u, mo as v, Ep as w, $a as x, gl as y, bl as z, yl as A, vl as B, kl as C, xl as D, wl as E, Ml as F, Il as G, Sr as H, uo as I, Bl as J, Ul as K, ql as L, jl as M │ │ }; │ │ -//# sourceMappingURL=chunk-YQVQI5K6.js.map │ │ +//# sourceMappingURL=chunk-BJMTRQ2H.js.map │ --- assets/public/chunk-AWET6OFF.js.map ├── +++ assets/public/chunk-Q5UDDBBV.js.map │┄ Files identical despite different names │ --- assets/public/chunk-Y7X6DNMX.js ├── +++ assets/public/chunk-DVXLHQ52.js │┄ Files 5% similar despite different names │ ├── js-beautify {} │ │ @@ -1,15 +1,15 @@ │ │ import { │ │ f as V, │ │ g as X │ │ -} from "./chunk-JLCYLO4B.js"; │ │ +} from "./chunk-5KTYML3O.js"; │ │ import { │ │ a as L, │ │ b as $ │ │ -} from "./chunk-YQVQI5K6.js"; │ │ +} from "./chunk-BJMTRQ2H.js"; │ │ import { │ │ b as F, │ │ d as W │ │ } from "./chunk-2FU63URL.js"; │ │ import { │ │ Ab as C, │ │ Cb as _, │ │ @@ -158,8 +158,8 @@ │ │ let t = new SpeechSynthesisUtterance; │ │ t.text = e, t.voice = l.getVoices().find(i => n.includes(i.name)) || l.getVoices().find(i => i.default) || null, console.log(o), t.volume = o / 100, l.speak(t) │ │ } │ │ }); │ │ export { │ │ oe as a, J as b, re as c, K as d, Ie as e, ee as f, ve as g, Z as h │ │ }; │ │ -//# sourceMappingURL=chunk-Y7X6DNMX.js.map │ │ +//# sourceMappingURL=chunk-DVXLHQ52.js.map │ --- assets/public/chunk-XUIFSHYO.js ├── +++ assets/public/chunk-2KZHDGJ4.js │┄ Files 12% similar despite different names │ ├── js-beautify {} │ │ @@ -1,15 +1,15 @@ │ │ import { │ │ a, │ │ b │ │ -} from "./chunk-USPS5AYJ.js"; │ │ -import "./chunk-JLCYLO4B.js"; │ │ +} from "./chunk-IOD4LE5B.js"; │ │ +import "./chunk-5KTYML3O.js"; │ │ import "./chunk-LOLEDR3S.js"; │ │ -import "./chunk-R4P47OGM.js"; │ │ -import "./chunk-YQVQI5K6.js"; │ │ +import "./chunk-3R6CM3NH.js"; │ │ +import "./chunk-BJMTRQ2H.js"; │ │ import "./chunk-F6JR3SI6.js"; │ │ import "./chunk-JEX3ETUW.js"; │ │ import "./chunk-MSQU4SW3.js"; │ │ import "./chunk-FREOXMLF.js"; │ │ import "./chunk-RHMYOTJZ.js"; │ │ import "./chunk-66RKCJ2D.js"; │ │ import "./chunk-AX45DQLU.js"; │ │ @@ -34,8 +34,8 @@ │ │ import "./chunk-OXDOKNTF.js"; │ │ import "./chunk-PEJGMLLQ.js"; │ │ import "./chunk-2NYJ54WT.js"; │ │ b(); │ │ export { │ │ a as PluginIndexComponent │ │ }; │ │ -//# sourceMappingURL=chunk-XUIFSHYO.js.map │ │ +//# sourceMappingURL=chunk-2KZHDGJ4.js.map │ --- assets/public/main-UWQROBKP.js ├── +++ assets/public/main-3RR5IWHZ.js │┄ Files 0% similar despite different names │ ├── js-beautify {} │ │ @@ -50,15 +50,15 @@ │ │ import { │ │ b as eS, │ │ c as LM │ │ } from "./chunk-BESLMJLA.js"; │ │ import { │ │ a as tS, │ │ b as BM │ │ -} from "./chunk-USPS5AYJ.js"; │ │ +} from "./chunk-IOD4LE5B.js"; │ │ import { │ │ a as iS, │ │ b as $M, │ │ c as nS, │ │ d as jM │ │ } from "./chunk-5WGRVPAX.js"; │ │ import { │ │ @@ -66,23 +66,23 @@ │ │ b as cw, │ │ c as nC, │ │ d as cM, │ │ e as aC, │ │ f as pM, │ │ g as bs, │ │ h as Lm │ │ -} from "./chunk-Y7X6DNMX.js"; │ │ +} from "./chunk-DVXLHQ52.js"; │ │ import { │ │ a as Ll, │ │ b as z0 │ │ } from "./chunk-3UB54IM4.js"; │ │ import { │ │ f as Rr, │ │ g as Sd │ │ -} from "./chunk-JLCYLO4B.js"; │ │ +} from "./chunk-5KTYML3O.js"; │ │ import { │ │ a as rC, │ │ b as dM │ │ } from "./chunk-XEMS4CV6.js"; │ │ import { │ │ a as yd, │ │ b as $C, │ │ @@ -293,15 +293,15 @@ │ │ h as Ao │ │ } from "./chunk-W3EHXDVY.js"; │ │ import { │ │ a as Tn, │ │ b as gM, │ │ k as Do, │ │ l as Ec │ │ -} from "./chunk-R4P47OGM.js"; │ │ +} from "./chunk-3R6CM3NH.js"; │ │ import { │ │ B as Fm, │ │ C as nM, │ │ D as Zv, │ │ E as oM, │ │ F as eC, │ │ G as rM, │ │ @@ -321,15 +321,15 @@ │ │ r as Dm, │ │ s as Cd, │ │ t as Qv, │ │ u as Xv, │ │ v as Am, │ │ w as Rm, │ │ x as iM │ │ -} from "./chunk-YQVQI5K6.js"; │ │ +} from "./chunk-BJMTRQ2H.js"; │ │ import { │ │ a as So, │ │ b as hc, │ │ c as Ar, │ │ d as cd │ │ } from "./chunk-F6JR3SI6.js"; │ │ import { │ │ @@ -13023,15 +13023,15 @@ │ │ var X1, Z1 = D(() => { │ │ "use strict"; │ │ J1(); │ │ po(); │ │ Q1(); │ │ X1 = [{ │ │ path: "config", │ │ - loadComponent: () => import("./chunk-AWET6OFF.js").then(i => i.ConfigPageComponent), │ │ + loadComponent: () => import("./chunk-Q5UDDBBV.js").then(i => i.ConfigPageComponent), │ │ data: { │ │ page: "config" │ │ }, │ │ canActivate: [Pt] │ │ }, { │ │ path: "search", │ │ loadComponent: () => import("./chunk-VAYAHN5M.js").then(i => i.SearchPageComponent), │ │ @@ -13093,22 +13093,22 @@ │ │ loadComponent: () => import("./chunk-3MDSNHPO.js").then(i => i.QuickHistoryComponent), │ │ data: { │ │ page: "quick-history" │ │ }, │ │ canActivate: [Ur, Pt] │ │ }, { │ │ path: "tag/:id/daily-summary", │ │ - loadComponent: () => import("./chunk-3XZTXRJN.js").then(i => i.DailySummaryComponent), │ │ + loadComponent: () => import("./chunk-PB3ZXSJW.js").then(i => i.DailySummaryComponent), │ │ data: { │ │ page: "daily-summary" │ │ }, │ │ canActivate: [Ur, Pt] │ │ }, { │ │ path: "tag/:id/daily-summary/:dayStr", │ │ - loadComponent: () => import("./chunk-3XZTXRJN.js").then(i => i.DailySummaryComponent), │ │ + loadComponent: () => import("./chunk-PB3ZXSJW.js").then(i => i.DailySummaryComponent), │ │ data: { │ │ page: "daily-summary" │ │ }, │ │ canActivate: [Ur, Pt] │ │ }, { │ │ path: "tag/:id/metrics", │ │ loadComponent: () => import("./chunk-XZGPSUHF.js").then(i => i.MetricPageComponent), │ │ @@ -13149,41 +13149,41 @@ │ │ loadComponent: () => import("./chunk-XZGPSUHF.js").then(i => i.MetricPageComponent), │ │ data: { │ │ page: "metrics" │ │ }, │ │ canActivate: [Wr, Pt] │ │ }, { │ │ path: "project/:id/daily-summary", │ │ - loadComponent: () => import("./chunk-3XZTXRJN.js").then(i => i.DailySummaryComponent), │ │ + loadComponent: () => import("./chunk-PB3ZXSJW.js").then(i => i.DailySummaryComponent), │ │ data: { │ │ page: "daily-summary" │ │ }, │ │ canActivate: [Wr, Pt] │ │ }, { │ │ path: "project/:id/daily-summary/:dayStr", │ │ - loadComponent: () => import("./chunk-3XZTXRJN.js").then(i => i.DailySummaryComponent), │ │ + loadComponent: () => import("./chunk-PB3ZXSJW.js").then(i => i.DailySummaryComponent), │ │ data: { │ │ page: "daily-summary" │ │ }, │ │ canActivate: [Wr, Pt] │ │ }, { │ │ path: "active/:subPageType", │ │ canActivate: [pp, Pt], │ │ - loadComponent: () => import("./chunk-AWET6OFF.js").then(i => i.ConfigPageComponent) │ │ + loadComponent: () => import("./chunk-Q5UDDBBV.js").then(i => i.ConfigPageComponent) │ │ }, { │ │ path: "active/:subPageType/:param", │ │ canActivate: [pp, Pt], │ │ - loadComponent: () => import("./chunk-AWET6OFF.js").then(i => i.ConfigPageComponent) │ │ + loadComponent: () => import("./chunk-Q5UDDBBV.js").then(i => i.ConfigPageComponent) │ │ }, { │ │ path: "active", │ │ canActivate: [pp, Pt], │ │ - loadComponent: () => import("./chunk-AWET6OFF.js").then(i => i.ConfigPageComponent) │ │ + loadComponent: () => import("./chunk-Q5UDDBBV.js").then(i => i.ConfigPageComponent) │ │ }, { │ │ path: "plugins/:pluginId/index", │ │ - loadComponent: () => import("./chunk-XUIFSHYO.js").then(i => i.PluginIndexComponent), │ │ + loadComponent: () => import("./chunk-2KZHDGJ4.js").then(i => i.PluginIndexComponent), │ │ data: { │ │ page: "plugin-index" │ │ }, │ │ canActivate: [Pt] │ │ }, { │ │ path: "**", │ │ redirectTo: `tag/${at.id}/tasks` │ │ @@ -23185,8 +23185,8 @@ │ │ ee.log("Time window for completing sync started"), yield Nh(2e4), ee.log("Time window for completing sync ended. Closing app!"), Vf.finish({ │ │ taskId: e │ │ }) │ │ })) │ │ }))) │ │ }); │ │ export default qN(); │ │ -//# sourceMappingURL=main-UWQROBKP.js.map │ │ +//# sourceMappingURL=main-3RR5IWHZ.js.map │ --- assets/public/main-UWQROBKP.js.map ├── +++ assets/public/main-3RR5IWHZ.js.map │┄ Files identical despite different names