jell-utils 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/.claude/commands/tm/add-dependency.md +58 -0
  2. package/.claude/commands/tm/add-subtask.md +79 -0
  3. package/.claude/commands/tm/add-task.md +81 -0
  4. package/.claude/commands/tm/analyze-complexity.md +124 -0
  5. package/.claude/commands/tm/analyze-project.md +100 -0
  6. package/.claude/commands/tm/auto-implement-tasks.md +100 -0
  7. package/.claude/commands/tm/command-pipeline.md +80 -0
  8. package/.claude/commands/tm/complexity-report.md +120 -0
  9. package/.claude/commands/tm/convert-task-to-subtask.md +74 -0
  10. package/.claude/commands/tm/expand-all-tasks.md +52 -0
  11. package/.claude/commands/tm/expand-task.md +52 -0
  12. package/.claude/commands/tm/fix-dependencies.md +82 -0
  13. package/.claude/commands/tm/help.md +101 -0
  14. package/.claude/commands/tm/init-project-quick.md +49 -0
  15. package/.claude/commands/tm/init-project.md +53 -0
  16. package/.claude/commands/tm/install-taskmaster.md +118 -0
  17. package/.claude/commands/tm/learn.md +106 -0
  18. package/.claude/commands/tm/list-tasks-by-status.md +42 -0
  19. package/.claude/commands/tm/list-tasks-with-subtasks.md +30 -0
  20. package/.claude/commands/tm/list-tasks.md +46 -0
  21. package/.claude/commands/tm/next-task.md +69 -0
  22. package/.claude/commands/tm/parse-prd-with-research.md +51 -0
  23. package/.claude/commands/tm/parse-prd.md +52 -0
  24. package/.claude/commands/tm/project-status.md +67 -0
  25. package/.claude/commands/tm/quick-install-taskmaster.md +23 -0
  26. package/.claude/commands/tm/remove-all-subtasks.md +94 -0
  27. package/.claude/commands/tm/remove-dependency.md +65 -0
  28. package/.claude/commands/tm/remove-subtask.md +87 -0
  29. package/.claude/commands/tm/remove-subtasks.md +89 -0
  30. package/.claude/commands/tm/remove-task.md +110 -0
  31. package/.claude/commands/tm/setup-models.md +52 -0
  32. package/.claude/commands/tm/show-task.md +85 -0
  33. package/.claude/commands/tm/smart-workflow.md +58 -0
  34. package/.claude/commands/tm/sync-readme.md +120 -0
  35. package/.claude/commands/tm/tm-main.md +147 -0
  36. package/.claude/commands/tm/to-cancelled.md +58 -0
  37. package/.claude/commands/tm/to-deferred.md +50 -0
  38. package/.claude/commands/tm/to-done.md +47 -0
  39. package/.claude/commands/tm/to-in-progress.md +39 -0
  40. package/.claude/commands/tm/to-pending.md +35 -0
  41. package/.claude/commands/tm/to-review.md +43 -0
  42. package/.claude/commands/tm/update-single-task.md +122 -0
  43. package/.claude/commands/tm/update-task.md +75 -0
  44. package/.claude/commands/tm/update-tasks-from-id.md +111 -0
  45. package/.claude/commands/tm/validate-dependencies.md +72 -0
  46. package/.claude/commands/tm/view-models.md +52 -0
  47. package/.claude/settings.local.json +17 -3
  48. package/.cursor/commands/tm/add-dependency.md +55 -0
  49. package/.cursor/commands/tm/add-subtask.md +76 -0
  50. package/.cursor/commands/tm/add-task.md +78 -0
  51. package/.cursor/commands/tm/analyze-complexity.md +121 -0
  52. package/.cursor/commands/tm/analyze-project.md +97 -0
  53. package/.cursor/commands/tm/auto-implement-tasks.md +97 -0
  54. package/.cursor/commands/tm/command-pipeline.md +77 -0
  55. package/.cursor/commands/tm/complexity-report.md +117 -0
  56. package/.cursor/commands/tm/convert-task-to-subtask.md +71 -0
  57. package/.cursor/commands/tm/expand-all-tasks.md +51 -0
  58. package/.cursor/commands/tm/expand-task.md +49 -0
  59. package/.cursor/commands/tm/fix-dependencies.md +81 -0
  60. package/.cursor/commands/tm/help.md +98 -0
  61. package/.cursor/commands/tm/init-project-quick.md +46 -0
  62. package/.cursor/commands/tm/init-project.md +50 -0
  63. package/.cursor/commands/tm/install-taskmaster.md +117 -0
  64. package/.cursor/commands/tm/learn.md +103 -0
  65. package/.cursor/commands/tm/list-tasks-by-status.md +39 -0
  66. package/.cursor/commands/tm/list-tasks-with-subtasks.md +29 -0
  67. package/.cursor/commands/tm/list-tasks.md +43 -0
  68. package/.cursor/commands/tm/next-task.md +66 -0
  69. package/.cursor/commands/tm/parse-prd-with-research.md +48 -0
  70. package/.cursor/commands/tm/parse-prd.md +49 -0
  71. package/.cursor/commands/tm/project-status.md +64 -0
  72. package/.cursor/commands/tm/quick-install-taskmaster.md +22 -0
  73. package/.cursor/commands/tm/remove-all-subtasks.md +93 -0
  74. package/.cursor/commands/tm/remove-dependency.md +62 -0
  75. package/.cursor/commands/tm/remove-subtask.md +84 -0
  76. package/.cursor/commands/tm/remove-subtasks.md +86 -0
  77. package/.cursor/commands/tm/remove-task.md +107 -0
  78. package/.cursor/commands/tm/setup-models.md +51 -0
  79. package/.cursor/commands/tm/show-task.md +82 -0
  80. package/.cursor/commands/tm/smart-workflow.md +55 -0
  81. package/.cursor/commands/tm/sync-readme.md +117 -0
  82. package/.cursor/commands/tm/tm-main.md +146 -0
  83. package/.cursor/commands/tm/to-cancelled.md +55 -0
  84. package/.cursor/commands/tm/to-deferred.md +47 -0
  85. package/.cursor/commands/tm/to-done.md +44 -0
  86. package/.cursor/commands/tm/to-in-progress.md +36 -0
  87. package/.cursor/commands/tm/to-pending.md +32 -0
  88. package/.cursor/commands/tm/to-review.md +40 -0
  89. package/.cursor/commands/tm/update-single-task.md +119 -0
  90. package/.cursor/commands/tm/update-task.md +72 -0
  91. package/.cursor/commands/tm/update-tasks-from-id.md +108 -0
  92. package/.cursor/commands/tm/validate-dependencies.md +71 -0
  93. package/.cursor/commands/tm/view-models.md +51 -0
  94. package/.cursor/mcp.json +20 -0
  95. package/.cursor/rules/cursor_rules.mdc +53 -0
  96. package/.cursor/rules/self_improve.mdc +72 -0
  97. package/.cursor/rules/taskmaster/dev_workflow.mdc +424 -0
  98. package/.cursor/rules/taskmaster/taskmaster.mdc +573 -0
  99. package/.env.example +12 -0
  100. package/.gemini/commands/tm/add-dependency.toml +58 -0
  101. package/.gemini/commands/tm/add-subtask.toml +79 -0
  102. package/.gemini/commands/tm/add-task.toml +81 -0
  103. package/.gemini/commands/tm/analyze-complexity.toml +124 -0
  104. package/.gemini/commands/tm/analyze-project.toml +100 -0
  105. package/.gemini/commands/tm/auto-implement-tasks.toml +100 -0
  106. package/.gemini/commands/tm/command-pipeline.toml +80 -0
  107. package/.gemini/commands/tm/complexity-report.toml +120 -0
  108. package/.gemini/commands/tm/convert-task-to-subtask.toml +74 -0
  109. package/.gemini/commands/tm/expand-all-tasks.toml +54 -0
  110. package/.gemini/commands/tm/expand-task.toml +52 -0
  111. package/.gemini/commands/tm/fix-dependencies.toml +84 -0
  112. package/.gemini/commands/tm/help.toml +101 -0
  113. package/.gemini/commands/tm/init-project-quick.toml +49 -0
  114. package/.gemini/commands/tm/init-project.toml +53 -0
  115. package/.gemini/commands/tm/install-taskmaster.toml +120 -0
  116. package/.gemini/commands/tm/learn.toml +106 -0
  117. package/.gemini/commands/tm/list-tasks-by-status.toml +42 -0
  118. package/.gemini/commands/tm/list-tasks-with-subtasks.toml +32 -0
  119. package/.gemini/commands/tm/list-tasks.toml +46 -0
  120. package/.gemini/commands/tm/next-task.toml +69 -0
  121. package/.gemini/commands/tm/parse-prd-with-research.toml +51 -0
  122. package/.gemini/commands/tm/parse-prd.toml +52 -0
  123. package/.gemini/commands/tm/project-status.toml +67 -0
  124. package/.gemini/commands/tm/quick-install-taskmaster.toml +25 -0
  125. package/.gemini/commands/tm/remove-all-subtasks.toml +96 -0
  126. package/.gemini/commands/tm/remove-dependency.toml +65 -0
  127. package/.gemini/commands/tm/remove-subtask.toml +87 -0
  128. package/.gemini/commands/tm/remove-subtasks.toml +89 -0
  129. package/.gemini/commands/tm/remove-task.toml +110 -0
  130. package/.gemini/commands/tm/setup-models.toml +54 -0
  131. package/.gemini/commands/tm/show-task.toml +85 -0
  132. package/.gemini/commands/tm/smart-workflow.toml +58 -0
  133. package/.gemini/commands/tm/sync-readme.toml +120 -0
  134. package/.gemini/commands/tm/tm-main.toml +149 -0
  135. package/.gemini/commands/tm/to-cancelled.toml +58 -0
  136. package/.gemini/commands/tm/to-deferred.toml +50 -0
  137. package/.gemini/commands/tm/to-done.toml +47 -0
  138. package/.gemini/commands/tm/to-in-progress.toml +39 -0
  139. package/.gemini/commands/tm/to-pending.toml +35 -0
  140. package/.gemini/commands/tm/to-review.toml +43 -0
  141. package/.gemini/commands/tm/update-single-task.toml +122 -0
  142. package/.gemini/commands/tm/update-task.toml +75 -0
  143. package/.gemini/commands/tm/update-tasks-from-id.toml +111 -0
  144. package/.gemini/commands/tm/validate-dependencies.toml +74 -0
  145. package/.gemini/commands/tm/view-models.toml +54 -0
  146. package/.gemini/settings.json +20 -0
  147. package/.mcp.json +15 -0
  148. package/.taskmaster/CLAUDE.md +435 -0
  149. package/.taskmaster/config.json +44 -0
  150. package/.taskmaster/docs/prd.txt +584 -0
  151. package/.taskmaster/state.json +6 -0
  152. package/.taskmaster/tasks/tasks.json +304 -0
  153. package/.taskmaster/templates/example_prd.txt +47 -0
  154. package/.taskmaster/templates/example_prd_rpg.txt +511 -0
  155. package/CLAUDE.md +4 -138
  156. package/README.md +551 -0
  157. package/coverage/clover.xml +134 -22
  158. package/coverage/coverage-final.json +1 -1
  159. package/coverage/lcov-report/index.html +21 -21
  160. package/coverage/lcov-report/index.js.html +854 -29
  161. package/coverage/lcov.info +246 -39
  162. package/internal-docs/CLAUDE.md +139 -0
  163. package/internal-docs/NPM_DEPLOYMENT_GUIDE.md +203 -0
  164. package/internal-docs/OBSIDIAN_PROJECT_PROMPT.md +302 -0
  165. package/lib/index.d.ts +88 -0
  166. package/lib/index.js +275 -0
  167. package/package.json +11 -3
  168. /package/{DEPLOYMENT.md → internal-docs/DEPLOYMENT.md} +0 -0
  169. /package/{TEST_RESULTS.md → internal-docs/TEST_RESULTS.md} +0 -0
  170. /package/{TEST_SIMULATION.md → internal-docs/TEST_SIMULATION.md} +0 -0
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">79.67% </span>
26
+ <span class="strong">83.16% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>290/364</span>
28
+ <span class='fraction'>400/481</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">73.38% </span>
33
+ <span class="strong">75.6% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>193/263</span>
35
+ <span class='fraction'>248/328</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">88.88% </span>
40
+ <span class="strong">91.02% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>56/63</span>
42
+ <span class='fraction'>71/78</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">82.81% </span>
47
+ <span class="strong">85.85% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>241/291</span>
49
+ <span class='fraction'>346/403</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line medium'></div>
64
+ <div class='status-line high'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -721,8 +721,283 @@
721
721
  <a name='L656'></a><a href='#L656'>656</a>
722
722
  <a name='L657'></a><a href='#L657'>657</a>
723
723
  <a name='L658'></a><a href='#L658'>658</a>
724
- <a name='L659'></a><a href='#L659'>659</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
725
- <span class="cline-any cline-yes">7x</span>
724
+ <a name='L659'></a><a href='#L659'>659</a>
725
+ <a name='L660'></a><a href='#L660'>660</a>
726
+ <a name='L661'></a><a href='#L661'>661</a>
727
+ <a name='L662'></a><a href='#L662'>662</a>
728
+ <a name='L663'></a><a href='#L663'>663</a>
729
+ <a name='L664'></a><a href='#L664'>664</a>
730
+ <a name='L665'></a><a href='#L665'>665</a>
731
+ <a name='L666'></a><a href='#L666'>666</a>
732
+ <a name='L667'></a><a href='#L667'>667</a>
733
+ <a name='L668'></a><a href='#L668'>668</a>
734
+ <a name='L669'></a><a href='#L669'>669</a>
735
+ <a name='L670'></a><a href='#L670'>670</a>
736
+ <a name='L671'></a><a href='#L671'>671</a>
737
+ <a name='L672'></a><a href='#L672'>672</a>
738
+ <a name='L673'></a><a href='#L673'>673</a>
739
+ <a name='L674'></a><a href='#L674'>674</a>
740
+ <a name='L675'></a><a href='#L675'>675</a>
741
+ <a name='L676'></a><a href='#L676'>676</a>
742
+ <a name='L677'></a><a href='#L677'>677</a>
743
+ <a name='L678'></a><a href='#L678'>678</a>
744
+ <a name='L679'></a><a href='#L679'>679</a>
745
+ <a name='L680'></a><a href='#L680'>680</a>
746
+ <a name='L681'></a><a href='#L681'>681</a>
747
+ <a name='L682'></a><a href='#L682'>682</a>
748
+ <a name='L683'></a><a href='#L683'>683</a>
749
+ <a name='L684'></a><a href='#L684'>684</a>
750
+ <a name='L685'></a><a href='#L685'>685</a>
751
+ <a name='L686'></a><a href='#L686'>686</a>
752
+ <a name='L687'></a><a href='#L687'>687</a>
753
+ <a name='L688'></a><a href='#L688'>688</a>
754
+ <a name='L689'></a><a href='#L689'>689</a>
755
+ <a name='L690'></a><a href='#L690'>690</a>
756
+ <a name='L691'></a><a href='#L691'>691</a>
757
+ <a name='L692'></a><a href='#L692'>692</a>
758
+ <a name='L693'></a><a href='#L693'>693</a>
759
+ <a name='L694'></a><a href='#L694'>694</a>
760
+ <a name='L695'></a><a href='#L695'>695</a>
761
+ <a name='L696'></a><a href='#L696'>696</a>
762
+ <a name='L697'></a><a href='#L697'>697</a>
763
+ <a name='L698'></a><a href='#L698'>698</a>
764
+ <a name='L699'></a><a href='#L699'>699</a>
765
+ <a name='L700'></a><a href='#L700'>700</a>
766
+ <a name='L701'></a><a href='#L701'>701</a>
767
+ <a name='L702'></a><a href='#L702'>702</a>
768
+ <a name='L703'></a><a href='#L703'>703</a>
769
+ <a name='L704'></a><a href='#L704'>704</a>
770
+ <a name='L705'></a><a href='#L705'>705</a>
771
+ <a name='L706'></a><a href='#L706'>706</a>
772
+ <a name='L707'></a><a href='#L707'>707</a>
773
+ <a name='L708'></a><a href='#L708'>708</a>
774
+ <a name='L709'></a><a href='#L709'>709</a>
775
+ <a name='L710'></a><a href='#L710'>710</a>
776
+ <a name='L711'></a><a href='#L711'>711</a>
777
+ <a name='L712'></a><a href='#L712'>712</a>
778
+ <a name='L713'></a><a href='#L713'>713</a>
779
+ <a name='L714'></a><a href='#L714'>714</a>
780
+ <a name='L715'></a><a href='#L715'>715</a>
781
+ <a name='L716'></a><a href='#L716'>716</a>
782
+ <a name='L717'></a><a href='#L717'>717</a>
783
+ <a name='L718'></a><a href='#L718'>718</a>
784
+ <a name='L719'></a><a href='#L719'>719</a>
785
+ <a name='L720'></a><a href='#L720'>720</a>
786
+ <a name='L721'></a><a href='#L721'>721</a>
787
+ <a name='L722'></a><a href='#L722'>722</a>
788
+ <a name='L723'></a><a href='#L723'>723</a>
789
+ <a name='L724'></a><a href='#L724'>724</a>
790
+ <a name='L725'></a><a href='#L725'>725</a>
791
+ <a name='L726'></a><a href='#L726'>726</a>
792
+ <a name='L727'></a><a href='#L727'>727</a>
793
+ <a name='L728'></a><a href='#L728'>728</a>
794
+ <a name='L729'></a><a href='#L729'>729</a>
795
+ <a name='L730'></a><a href='#L730'>730</a>
796
+ <a name='L731'></a><a href='#L731'>731</a>
797
+ <a name='L732'></a><a href='#L732'>732</a>
798
+ <a name='L733'></a><a href='#L733'>733</a>
799
+ <a name='L734'></a><a href='#L734'>734</a>
800
+ <a name='L735'></a><a href='#L735'>735</a>
801
+ <a name='L736'></a><a href='#L736'>736</a>
802
+ <a name='L737'></a><a href='#L737'>737</a>
803
+ <a name='L738'></a><a href='#L738'>738</a>
804
+ <a name='L739'></a><a href='#L739'>739</a>
805
+ <a name='L740'></a><a href='#L740'>740</a>
806
+ <a name='L741'></a><a href='#L741'>741</a>
807
+ <a name='L742'></a><a href='#L742'>742</a>
808
+ <a name='L743'></a><a href='#L743'>743</a>
809
+ <a name='L744'></a><a href='#L744'>744</a>
810
+ <a name='L745'></a><a href='#L745'>745</a>
811
+ <a name='L746'></a><a href='#L746'>746</a>
812
+ <a name='L747'></a><a href='#L747'>747</a>
813
+ <a name='L748'></a><a href='#L748'>748</a>
814
+ <a name='L749'></a><a href='#L749'>749</a>
815
+ <a name='L750'></a><a href='#L750'>750</a>
816
+ <a name='L751'></a><a href='#L751'>751</a>
817
+ <a name='L752'></a><a href='#L752'>752</a>
818
+ <a name='L753'></a><a href='#L753'>753</a>
819
+ <a name='L754'></a><a href='#L754'>754</a>
820
+ <a name='L755'></a><a href='#L755'>755</a>
821
+ <a name='L756'></a><a href='#L756'>756</a>
822
+ <a name='L757'></a><a href='#L757'>757</a>
823
+ <a name='L758'></a><a href='#L758'>758</a>
824
+ <a name='L759'></a><a href='#L759'>759</a>
825
+ <a name='L760'></a><a href='#L760'>760</a>
826
+ <a name='L761'></a><a href='#L761'>761</a>
827
+ <a name='L762'></a><a href='#L762'>762</a>
828
+ <a name='L763'></a><a href='#L763'>763</a>
829
+ <a name='L764'></a><a href='#L764'>764</a>
830
+ <a name='L765'></a><a href='#L765'>765</a>
831
+ <a name='L766'></a><a href='#L766'>766</a>
832
+ <a name='L767'></a><a href='#L767'>767</a>
833
+ <a name='L768'></a><a href='#L768'>768</a>
834
+ <a name='L769'></a><a href='#L769'>769</a>
835
+ <a name='L770'></a><a href='#L770'>770</a>
836
+ <a name='L771'></a><a href='#L771'>771</a>
837
+ <a name='L772'></a><a href='#L772'>772</a>
838
+ <a name='L773'></a><a href='#L773'>773</a>
839
+ <a name='L774'></a><a href='#L774'>774</a>
840
+ <a name='L775'></a><a href='#L775'>775</a>
841
+ <a name='L776'></a><a href='#L776'>776</a>
842
+ <a name='L777'></a><a href='#L777'>777</a>
843
+ <a name='L778'></a><a href='#L778'>778</a>
844
+ <a name='L779'></a><a href='#L779'>779</a>
845
+ <a name='L780'></a><a href='#L780'>780</a>
846
+ <a name='L781'></a><a href='#L781'>781</a>
847
+ <a name='L782'></a><a href='#L782'>782</a>
848
+ <a name='L783'></a><a href='#L783'>783</a>
849
+ <a name='L784'></a><a href='#L784'>784</a>
850
+ <a name='L785'></a><a href='#L785'>785</a>
851
+ <a name='L786'></a><a href='#L786'>786</a>
852
+ <a name='L787'></a><a href='#L787'>787</a>
853
+ <a name='L788'></a><a href='#L788'>788</a>
854
+ <a name='L789'></a><a href='#L789'>789</a>
855
+ <a name='L790'></a><a href='#L790'>790</a>
856
+ <a name='L791'></a><a href='#L791'>791</a>
857
+ <a name='L792'></a><a href='#L792'>792</a>
858
+ <a name='L793'></a><a href='#L793'>793</a>
859
+ <a name='L794'></a><a href='#L794'>794</a>
860
+ <a name='L795'></a><a href='#L795'>795</a>
861
+ <a name='L796'></a><a href='#L796'>796</a>
862
+ <a name='L797'></a><a href='#L797'>797</a>
863
+ <a name='L798'></a><a href='#L798'>798</a>
864
+ <a name='L799'></a><a href='#L799'>799</a>
865
+ <a name='L800'></a><a href='#L800'>800</a>
866
+ <a name='L801'></a><a href='#L801'>801</a>
867
+ <a name='L802'></a><a href='#L802'>802</a>
868
+ <a name='L803'></a><a href='#L803'>803</a>
869
+ <a name='L804'></a><a href='#L804'>804</a>
870
+ <a name='L805'></a><a href='#L805'>805</a>
871
+ <a name='L806'></a><a href='#L806'>806</a>
872
+ <a name='L807'></a><a href='#L807'>807</a>
873
+ <a name='L808'></a><a href='#L808'>808</a>
874
+ <a name='L809'></a><a href='#L809'>809</a>
875
+ <a name='L810'></a><a href='#L810'>810</a>
876
+ <a name='L811'></a><a href='#L811'>811</a>
877
+ <a name='L812'></a><a href='#L812'>812</a>
878
+ <a name='L813'></a><a href='#L813'>813</a>
879
+ <a name='L814'></a><a href='#L814'>814</a>
880
+ <a name='L815'></a><a href='#L815'>815</a>
881
+ <a name='L816'></a><a href='#L816'>816</a>
882
+ <a name='L817'></a><a href='#L817'>817</a>
883
+ <a name='L818'></a><a href='#L818'>818</a>
884
+ <a name='L819'></a><a href='#L819'>819</a>
885
+ <a name='L820'></a><a href='#L820'>820</a>
886
+ <a name='L821'></a><a href='#L821'>821</a>
887
+ <a name='L822'></a><a href='#L822'>822</a>
888
+ <a name='L823'></a><a href='#L823'>823</a>
889
+ <a name='L824'></a><a href='#L824'>824</a>
890
+ <a name='L825'></a><a href='#L825'>825</a>
891
+ <a name='L826'></a><a href='#L826'>826</a>
892
+ <a name='L827'></a><a href='#L827'>827</a>
893
+ <a name='L828'></a><a href='#L828'>828</a>
894
+ <a name='L829'></a><a href='#L829'>829</a>
895
+ <a name='L830'></a><a href='#L830'>830</a>
896
+ <a name='L831'></a><a href='#L831'>831</a>
897
+ <a name='L832'></a><a href='#L832'>832</a>
898
+ <a name='L833'></a><a href='#L833'>833</a>
899
+ <a name='L834'></a><a href='#L834'>834</a>
900
+ <a name='L835'></a><a href='#L835'>835</a>
901
+ <a name='L836'></a><a href='#L836'>836</a>
902
+ <a name='L837'></a><a href='#L837'>837</a>
903
+ <a name='L838'></a><a href='#L838'>838</a>
904
+ <a name='L839'></a><a href='#L839'>839</a>
905
+ <a name='L840'></a><a href='#L840'>840</a>
906
+ <a name='L841'></a><a href='#L841'>841</a>
907
+ <a name='L842'></a><a href='#L842'>842</a>
908
+ <a name='L843'></a><a href='#L843'>843</a>
909
+ <a name='L844'></a><a href='#L844'>844</a>
910
+ <a name='L845'></a><a href='#L845'>845</a>
911
+ <a name='L846'></a><a href='#L846'>846</a>
912
+ <a name='L847'></a><a href='#L847'>847</a>
913
+ <a name='L848'></a><a href='#L848'>848</a>
914
+ <a name='L849'></a><a href='#L849'>849</a>
915
+ <a name='L850'></a><a href='#L850'>850</a>
916
+ <a name='L851'></a><a href='#L851'>851</a>
917
+ <a name='L852'></a><a href='#L852'>852</a>
918
+ <a name='L853'></a><a href='#L853'>853</a>
919
+ <a name='L854'></a><a href='#L854'>854</a>
920
+ <a name='L855'></a><a href='#L855'>855</a>
921
+ <a name='L856'></a><a href='#L856'>856</a>
922
+ <a name='L857'></a><a href='#L857'>857</a>
923
+ <a name='L858'></a><a href='#L858'>858</a>
924
+ <a name='L859'></a><a href='#L859'>859</a>
925
+ <a name='L860'></a><a href='#L860'>860</a>
926
+ <a name='L861'></a><a href='#L861'>861</a>
927
+ <a name='L862'></a><a href='#L862'>862</a>
928
+ <a name='L863'></a><a href='#L863'>863</a>
929
+ <a name='L864'></a><a href='#L864'>864</a>
930
+ <a name='L865'></a><a href='#L865'>865</a>
931
+ <a name='L866'></a><a href='#L866'>866</a>
932
+ <a name='L867'></a><a href='#L867'>867</a>
933
+ <a name='L868'></a><a href='#L868'>868</a>
934
+ <a name='L869'></a><a href='#L869'>869</a>
935
+ <a name='L870'></a><a href='#L870'>870</a>
936
+ <a name='L871'></a><a href='#L871'>871</a>
937
+ <a name='L872'></a><a href='#L872'>872</a>
938
+ <a name='L873'></a><a href='#L873'>873</a>
939
+ <a name='L874'></a><a href='#L874'>874</a>
940
+ <a name='L875'></a><a href='#L875'>875</a>
941
+ <a name='L876'></a><a href='#L876'>876</a>
942
+ <a name='L877'></a><a href='#L877'>877</a>
943
+ <a name='L878'></a><a href='#L878'>878</a>
944
+ <a name='L879'></a><a href='#L879'>879</a>
945
+ <a name='L880'></a><a href='#L880'>880</a>
946
+ <a name='L881'></a><a href='#L881'>881</a>
947
+ <a name='L882'></a><a href='#L882'>882</a>
948
+ <a name='L883'></a><a href='#L883'>883</a>
949
+ <a name='L884'></a><a href='#L884'>884</a>
950
+ <a name='L885'></a><a href='#L885'>885</a>
951
+ <a name='L886'></a><a href='#L886'>886</a>
952
+ <a name='L887'></a><a href='#L887'>887</a>
953
+ <a name='L888'></a><a href='#L888'>888</a>
954
+ <a name='L889'></a><a href='#L889'>889</a>
955
+ <a name='L890'></a><a href='#L890'>890</a>
956
+ <a name='L891'></a><a href='#L891'>891</a>
957
+ <a name='L892'></a><a href='#L892'>892</a>
958
+ <a name='L893'></a><a href='#L893'>893</a>
959
+ <a name='L894'></a><a href='#L894'>894</a>
960
+ <a name='L895'></a><a href='#L895'>895</a>
961
+ <a name='L896'></a><a href='#L896'>896</a>
962
+ <a name='L897'></a><a href='#L897'>897</a>
963
+ <a name='L898'></a><a href='#L898'>898</a>
964
+ <a name='L899'></a><a href='#L899'>899</a>
965
+ <a name='L900'></a><a href='#L900'>900</a>
966
+ <a name='L901'></a><a href='#L901'>901</a>
967
+ <a name='L902'></a><a href='#L902'>902</a>
968
+ <a name='L903'></a><a href='#L903'>903</a>
969
+ <a name='L904'></a><a href='#L904'>904</a>
970
+ <a name='L905'></a><a href='#L905'>905</a>
971
+ <a name='L906'></a><a href='#L906'>906</a>
972
+ <a name='L907'></a><a href='#L907'>907</a>
973
+ <a name='L908'></a><a href='#L908'>908</a>
974
+ <a name='L909'></a><a href='#L909'>909</a>
975
+ <a name='L910'></a><a href='#L910'>910</a>
976
+ <a name='L911'></a><a href='#L911'>911</a>
977
+ <a name='L912'></a><a href='#L912'>912</a>
978
+ <a name='L913'></a><a href='#L913'>913</a>
979
+ <a name='L914'></a><a href='#L914'>914</a>
980
+ <a name='L915'></a><a href='#L915'>915</a>
981
+ <a name='L916'></a><a href='#L916'>916</a>
982
+ <a name='L917'></a><a href='#L917'>917</a>
983
+ <a name='L918'></a><a href='#L918'>918</a>
984
+ <a name='L919'></a><a href='#L919'>919</a>
985
+ <a name='L920'></a><a href='#L920'>920</a>
986
+ <a name='L921'></a><a href='#L921'>921</a>
987
+ <a name='L922'></a><a href='#L922'>922</a>
988
+ <a name='L923'></a><a href='#L923'>923</a>
989
+ <a name='L924'></a><a href='#L924'>924</a>
990
+ <a name='L925'></a><a href='#L925'>925</a>
991
+ <a name='L926'></a><a href='#L926'>926</a>
992
+ <a name='L927'></a><a href='#L927'>927</a>
993
+ <a name='L928'></a><a href='#L928'>928</a>
994
+ <a name='L929'></a><a href='#L929'>929</a>
995
+ <a name='L930'></a><a href='#L930'>930</a>
996
+ <a name='L931'></a><a href='#L931'>931</a>
997
+ <a name='L932'></a><a href='#L932'>932</a>
998
+ <a name='L933'></a><a href='#L933'>933</a>
999
+ <a name='L934'></a><a href='#L934'>934</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
1000
+ <span class="cline-any cline-yes">8x</span>
726
1001
  <span class="cline-any cline-yes">1x</span>
727
1002
  <span class="cline-any cline-no">&nbsp;</span>
728
1003
  <span class="cline-any cline-no">&nbsp;</span>
@@ -733,7 +1008,7 @@
733
1008
  <span class="cline-any cline-neutral">&nbsp;</span>
734
1009
  <span class="cline-any cline-yes">1x</span>
735
1010
  <span class="cline-any cline-neutral">&nbsp;</span>
736
- <span class="cline-any cline-yes">7x</span>
1011
+ <span class="cline-any cline-yes">8x</span>
737
1012
  <span class="cline-any cline-yes">9x</span>
738
1013
  <span class="cline-any cline-yes">3x</span>
739
1014
  <span class="cline-any cline-yes">5x</span>
@@ -742,7 +1017,7 @@
742
1017
  <span class="cline-any cline-yes">3x</span>
743
1018
  <span class="cline-any cline-neutral">&nbsp;</span>
744
1019
  <span class="cline-any cline-neutral">&nbsp;</span>
745
- <span class="cline-any cline-yes">7x</span>
1020
+ <span class="cline-any cline-yes">8x</span>
746
1021
  <span class="cline-any cline-yes">19x</span>
747
1022
  <span class="cline-any cline-yes">9x</span>
748
1023
  <span class="cline-any cline-yes">27x</span>
@@ -769,7 +1044,7 @@
769
1044
  <span class="cline-any cline-yes">9x</span>
770
1045
  <span class="cline-any cline-neutral">&nbsp;</span>
771
1046
  <span class="cline-any cline-neutral">&nbsp;</span>
772
- <span class="cline-any cline-yes">7x</span>
1047
+ <span class="cline-any cline-yes">8x</span>
773
1048
  <span class="cline-any cline-yes">5x</span>
774
1049
  <span class="cline-any cline-yes">10x</span>
775
1050
  <span class="cline-any cline-no">&nbsp;</span>
@@ -778,8 +1053,8 @@
778
1053
  <span class="cline-any cline-neutral">&nbsp;</span>
779
1054
  <span class="cline-any cline-yes">5x</span>
780
1055
  <span class="cline-any cline-neutral">&nbsp;</span>
781
- <span class="cline-any cline-yes">7x</span>
782
- <span class="cline-any cline-yes">7x</span>
1056
+ <span class="cline-any cline-yes">8x</span>
1057
+ <span class="cline-any cline-yes">8x</span>
783
1058
  <span class="cline-any cline-neutral">&nbsp;</span>
784
1059
  <span class="cline-any cline-neutral">&nbsp;</span>
785
1060
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1092,18 +1367,18 @@
1092
1367
  <span class="cline-any cline-neutral">&nbsp;</span>
1093
1368
  <span class="cline-any cline-neutral">&nbsp;</span>
1094
1369
  <span class="cline-any cline-neutral">&nbsp;</span>
1095
- <span class="cline-any cline-yes">6x</span>
1096
- <span class="cline-any cline-yes">6x</span>
1097
- <span class="cline-any cline-yes">3x</span>
1098
- <span class="cline-any cline-yes">3x</span>
1099
- <span class="cline-any cline-yes">3x</span>
1100
- <span class="cline-any cline-yes">3x</span>
1101
- <span class="cline-any cline-yes">3x</span>
1102
- <span class="cline-any cline-yes">27x</span>
1370
+ <span class="cline-any cline-yes">15x</span>
1371
+ <span class="cline-any cline-yes">15x</span>
1372
+ <span class="cline-any cline-yes">5x</span>
1373
+ <span class="cline-any cline-yes">10x</span>
1374
+ <span class="cline-any cline-yes">10x</span>
1375
+ <span class="cline-any cline-yes">10x</span>
1376
+ <span class="cline-any cline-yes">10x</span>
1377
+ <span class="cline-any cline-yes">90x</span>
1103
1378
  <span class="cline-any cline-neutral">&nbsp;</span>
1104
- <span class="cline-any cline-yes">3x</span>
1105
- <span class="cline-any cline-yes">3x</span>
1106
- <span class="cline-any cline-yes">3x</span>
1379
+ <span class="cline-any cline-yes">10x</span>
1380
+ <span class="cline-any cline-yes">10x</span>
1381
+ <span class="cline-any cline-yes">10x</span>
1107
1382
  <span class="cline-any cline-neutral">&nbsp;</span>
1108
1383
  <span class="cline-any cline-neutral">&nbsp;</span>
1109
1384
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1378,7 +1653,282 @@
1378
1653
  <span class="cline-any cline-yes">2x</span>
1379
1654
  <span class="cline-any cline-neutral">&nbsp;</span>
1380
1655
  <span class="cline-any cline-neutral">&nbsp;</span>
1656
+ <span class="cline-any cline-neutral">&nbsp;</span>
1657
+ <span class="cline-any cline-neutral">&nbsp;</span>
1658
+ <span class="cline-any cline-neutral">&nbsp;</span>
1659
+ <span class="cline-any cline-neutral">&nbsp;</span>
1660
+ <span class="cline-any cline-neutral">&nbsp;</span>
1661
+ <span class="cline-any cline-neutral">&nbsp;</span>
1662
+ <span class="cline-any cline-neutral">&nbsp;</span>
1663
+ <span class="cline-any cline-yes">6x</span>
1664
+ <span class="cline-any cline-yes">6x</span>
1665
+ <span class="cline-any cline-neutral">&nbsp;</span>
1666
+ <span class="cline-any cline-neutral">&nbsp;</span>
1667
+ <span class="cline-any cline-neutral">&nbsp;</span>
1668
+ <span class="cline-any cline-neutral">&nbsp;</span>
1669
+ <span class="cline-any cline-neutral">&nbsp;</span>
1670
+ <span class="cline-any cline-neutral">&nbsp;</span>
1671
+ <span class="cline-any cline-neutral">&nbsp;</span>
1672
+ <span class="cline-any cline-neutral">&nbsp;</span>
1673
+ <span class="cline-any cline-yes">6x</span>
1674
+ <span class="cline-any cline-neutral">&nbsp;</span>
1675
+ <span class="cline-any cline-neutral">&nbsp;</span>
1676
+ <span class="cline-any cline-neutral">&nbsp;</span>
1677
+ <span class="cline-any cline-neutral">&nbsp;</span>
1678
+ <span class="cline-any cline-neutral">&nbsp;</span>
1679
+ <span class="cline-any cline-neutral">&nbsp;</span>
1680
+ <span class="cline-any cline-neutral">&nbsp;</span>
1681
+ <span class="cline-any cline-neutral">&nbsp;</span>
1682
+ <span class="cline-any cline-neutral">&nbsp;</span>
1683
+ <span class="cline-any cline-yes">6x</span>
1684
+ <span class="cline-any cline-neutral">&nbsp;</span>
1685
+ <span class="cline-any cline-yes">6x</span>
1686
+ <span class="cline-any cline-yes">6x</span>
1687
+ <span class="cline-any cline-yes">48x</span>
1688
+ <span class="cline-any cline-yes">48x</span>
1689
+ <span class="cline-any cline-neutral">&nbsp;</span>
1690
+ <span class="cline-any cline-yes">6x</span>
1691
+ <span class="cline-any cline-neutral">&nbsp;</span>
1692
+ <span class="cline-any cline-neutral">&nbsp;</span>
1693
+ <span class="cline-any cline-neutral">&nbsp;</span>
1694
+ <span class="cline-any cline-neutral">&nbsp;</span>
1695
+ <span class="cline-any cline-neutral">&nbsp;</span>
1696
+ <span class="cline-any cline-neutral">&nbsp;</span>
1697
+ <span class="cline-any cline-neutral">&nbsp;</span>
1698
+ <span class="cline-any cline-yes">8x</span>
1699
+ <span class="cline-any cline-yes">8x</span>
1700
+ <span class="cline-any cline-yes">8x</span>
1701
+ <span class="cline-any cline-yes">8x</span>
1702
+ <span class="cline-any cline-yes">8x</span>
1703
+ <span class="cline-any cline-yes">8x</span>
1704
+ <span class="cline-any cline-yes">8x</span>
1705
+ <span class="cline-any cline-yes">8x</span>
1706
+ <span class="cline-any cline-yes">8x</span>
1707
+ <span class="cline-any cline-yes">8x</span>
1708
+ <span class="cline-any cline-yes">1x</span>
1709
+ <span class="cline-any cline-yes">7x</span>
1710
+ <span class="cline-any cline-yes">1x</span>
1711
+ <span class="cline-any cline-yes">6x</span>
1712
+ <span class="cline-any cline-yes">1x</span>
1713
+ <span class="cline-any cline-yes">5x</span>
1714
+ <span class="cline-any cline-yes">1x</span>
1715
+ <span class="cline-any cline-yes">4x</span>
1716
+ <span class="cline-any cline-yes">1x</span>
1717
+ <span class="cline-any cline-yes">3x</span>
1718
+ <span class="cline-any cline-yes">1x</span>
1719
+ <span class="cline-any cline-yes">2x</span>
1720
+ <span class="cline-any cline-yes">1x</span>
1721
+ <span class="cline-any cline-yes">1x</span>
1722
+ <span class="cline-any cline-neutral">&nbsp;</span>
1723
+ <span class="cline-any cline-neutral">&nbsp;</span>
1724
+ <span class="cline-any cline-neutral">&nbsp;</span>
1725
+ <span class="cline-any cline-neutral">&nbsp;</span>
1726
+ <span class="cline-any cline-neutral">&nbsp;</span>
1727
+ <span class="cline-any cline-neutral">&nbsp;</span>
1728
+ <span class="cline-any cline-neutral">&nbsp;</span>
1729
+ <span class="cline-any cline-neutral">&nbsp;</span>
1730
+ <span class="cline-any cline-yes">4x</span>
1731
+ <span class="cline-any cline-neutral">&nbsp;</span>
1732
+ <span class="cline-any cline-neutral">&nbsp;</span>
1733
+ <span class="cline-any cline-neutral">&nbsp;</span>
1734
+ <span class="cline-any cline-neutral">&nbsp;</span>
1735
+ <span class="cline-any cline-neutral">&nbsp;</span>
1736
+ <span class="cline-any cline-neutral">&nbsp;</span>
1737
+ <span class="cline-any cline-neutral">&nbsp;</span>
1738
+ <span class="cline-any cline-yes">4x</span>
1739
+ <span class="cline-any cline-neutral">&nbsp;</span>
1740
+ <span class="cline-any cline-neutral">&nbsp;</span>
1741
+ <span class="cline-any cline-neutral">&nbsp;</span>
1742
+ <span class="cline-any cline-neutral">&nbsp;</span>
1743
+ <span class="cline-any cline-neutral">&nbsp;</span>
1744
+ <span class="cline-any cline-neutral">&nbsp;</span>
1745
+ <span class="cline-any cline-neutral">&nbsp;</span>
1746
+ <span class="cline-any cline-neutral">&nbsp;</span>
1747
+ <span class="cline-any cline-yes">10x</span>
1748
+ <span class="cline-any cline-neutral">&nbsp;</span>
1749
+ <span class="cline-any cline-neutral">&nbsp;</span>
1750
+ <span class="cline-any cline-neutral">&nbsp;</span>
1751
+ <span class="cline-any cline-neutral">&nbsp;</span>
1752
+ <span class="cline-any cline-neutral">&nbsp;</span>
1753
+ <span class="cline-any cline-neutral">&nbsp;</span>
1754
+ <span class="cline-any cline-neutral">&nbsp;</span>
1755
+ <span class="cline-any cline-neutral">&nbsp;</span>
1756
+ <span class="cline-any cline-yes">5x</span>
1757
+ <span class="cline-any cline-yes">5x</span>
1758
+ <span class="cline-any cline-yes">5x</span>
1759
+ <span class="cline-any cline-neutral">&nbsp;</span>
1760
+ <span class="cline-any cline-neutral">&nbsp;</span>
1761
+ <span class="cline-any cline-neutral">&nbsp;</span>
1762
+ <span class="cline-any cline-neutral">&nbsp;</span>
1763
+ <span class="cline-any cline-neutral">&nbsp;</span>
1764
+ <span class="cline-any cline-neutral">&nbsp;</span>
1765
+ <span class="cline-any cline-yes">5x</span>
1766
+ <span class="cline-any cline-yes">5x</span>
1767
+ <span class="cline-any cline-neutral">&nbsp;</span>
1768
+ <span class="cline-any cline-neutral">&nbsp;</span>
1769
+ <span class="cline-any cline-neutral">&nbsp;</span>
1770
+ <span class="cline-any cline-neutral">&nbsp;</span>
1771
+ <span class="cline-any cline-neutral">&nbsp;</span>
1772
+ <span class="cline-any cline-neutral">&nbsp;</span>
1773
+ <span class="cline-any cline-neutral">&nbsp;</span>
1774
+ <span class="cline-any cline-neutral">&nbsp;</span>
1775
+ <span class="cline-any cline-yes">5x</span>
1776
+ <span class="cline-any cline-yes">5x</span>
1777
+ <span class="cline-any cline-yes">5x</span>
1778
+ <span class="cline-any cline-yes">5x</span>
1779
+ <span class="cline-any cline-yes">7x</span>
1381
1780
  <span class="cline-any cline-yes">7x</span>
1781
+ <span class="cline-any cline-neutral">&nbsp;</span>
1782
+ <span class="cline-any cline-yes">5x</span>
1783
+ <span class="cline-any cline-yes">5x</span>
1784
+ <span class="cline-any cline-neutral">&nbsp;</span>
1785
+ <span class="cline-any cline-neutral">&nbsp;</span>
1786
+ <span class="cline-any cline-neutral">&nbsp;</span>
1787
+ <span class="cline-any cline-neutral">&nbsp;</span>
1788
+ <span class="cline-any cline-neutral">&nbsp;</span>
1789
+ <span class="cline-any cline-neutral">&nbsp;</span>
1790
+ <span class="cline-any cline-neutral">&nbsp;</span>
1791
+ <span class="cline-any cline-yes">13x</span>
1792
+ <span class="cline-any cline-yes">1x</span>
1793
+ <span class="cline-any cline-yes">12x</span>
1794
+ <span class="cline-any cline-yes">12x</span>
1795
+ <span class="cline-any cline-yes">12x</span>
1796
+ <span class="cline-any cline-yes">12x</span>
1797
+ <span class="cline-any cline-yes">13x</span>
1798
+ <span class="cline-any cline-yes">13x</span>
1799
+ <span class="cline-any cline-yes">13x</span>
1800
+ <span class="cline-any cline-yes">52x</span>
1801
+ <span class="cline-any cline-yes">52x</span>
1802
+ <span class="cline-any cline-yes">52x</span>
1803
+ <span class="cline-any cline-neutral">&nbsp;</span>
1804
+ <span class="cline-any cline-yes">23x</span>
1805
+ <span class="cline-any cline-yes">17x</span>
1806
+ <span class="cline-any cline-neutral">&nbsp;</span>
1807
+ <span class="cline-any cline-yes">23x</span>
1808
+ <span class="cline-any cline-neutral">&nbsp;</span>
1809
+ <span class="cline-any cline-neutral">&nbsp;</span>
1810
+ <span class="cline-any cline-yes">13x</span>
1811
+ <span class="cline-any cline-neutral">&nbsp;</span>
1812
+ <span class="cline-any cline-yes">12x</span>
1813
+ <span class="cline-any cline-yes">12x</span>
1814
+ <span class="cline-any cline-yes">12x</span>
1815
+ <span class="cline-any cline-yes">12x</span>
1816
+ <span class="cline-any cline-yes">16x</span>
1817
+ <span class="cline-any cline-yes">16x</span>
1818
+ <span class="cline-any cline-yes">13x</span>
1819
+ <span class="cline-any cline-neutral">&nbsp;</span>
1820
+ <span class="cline-any cline-yes">13x</span>
1821
+ <span class="cline-any cline-yes">3x</span>
1822
+ <span class="cline-any cline-neutral">&nbsp;</span>
1823
+ <span class="cline-any cline-yes">1x</span>
1824
+ <span class="cline-any cline-neutral">&nbsp;</span>
1825
+ <span class="cline-any cline-neutral">&nbsp;</span>
1826
+ <span class="cline-any cline-neutral">&nbsp;</span>
1827
+ <span class="cline-any cline-yes">2x</span>
1828
+ <span class="cline-any cline-neutral">&nbsp;</span>
1829
+ <span class="cline-any cline-neutral">&nbsp;</span>
1830
+ <span class="cline-any cline-neutral">&nbsp;</span>
1831
+ <span class="cline-any cline-yes">10x</span>
1832
+ <span class="cline-any cline-neutral">&nbsp;</span>
1833
+ <span class="cline-any cline-neutral">&nbsp;</span>
1834
+ <span class="cline-any cline-yes">16x</span>
1835
+ <span class="cline-any cline-yes">16x</span>
1836
+ <span class="cline-any cline-neutral">&nbsp;</span>
1837
+ <span class="cline-any cline-yes">12x</span>
1838
+ <span class="cline-any cline-neutral">&nbsp;</span>
1839
+ <span class="cline-any cline-neutral">&nbsp;</span>
1840
+ <span class="cline-any cline-neutral">&nbsp;</span>
1841
+ <span class="cline-any cline-neutral">&nbsp;</span>
1842
+ <span class="cline-any cline-neutral">&nbsp;</span>
1843
+ <span class="cline-any cline-neutral">&nbsp;</span>
1844
+ <span class="cline-any cline-neutral">&nbsp;</span>
1845
+ <span class="cline-any cline-yes">5x</span>
1846
+ <span class="cline-any cline-yes">5x</span>
1847
+ <span class="cline-any cline-neutral">&nbsp;</span>
1848
+ <span class="cline-any cline-neutral">&nbsp;</span>
1849
+ <span class="cline-any cline-neutral">&nbsp;</span>
1850
+ <span class="cline-any cline-neutral">&nbsp;</span>
1851
+ <span class="cline-any cline-neutral">&nbsp;</span>
1852
+ <span class="cline-any cline-neutral">&nbsp;</span>
1853
+ <span class="cline-any cline-neutral">&nbsp;</span>
1854
+ <span class="cline-any cline-neutral">&nbsp;</span>
1855
+ <span class="cline-any cline-yes">9x</span>
1856
+ <span class="cline-any cline-yes">9x</span>
1857
+ <span class="cline-any cline-neutral">&nbsp;</span>
1858
+ <span class="cline-any cline-neutral">&nbsp;</span>
1859
+ <span class="cline-any cline-neutral">&nbsp;</span>
1860
+ <span class="cline-any cline-neutral">&nbsp;</span>
1861
+ <span class="cline-any cline-neutral">&nbsp;</span>
1862
+ <span class="cline-any cline-neutral">&nbsp;</span>
1863
+ <span class="cline-any cline-neutral">&nbsp;</span>
1864
+ <span class="cline-any cline-yes">8x</span>
1865
+ <span class="cline-any cline-yes">8x</span>
1866
+ <span class="cline-any cline-yes">8x</span>
1867
+ <span class="cline-any cline-neutral">&nbsp;</span>
1868
+ <span class="cline-any cline-neutral">&nbsp;</span>
1869
+ <span class="cline-any cline-neutral">&nbsp;</span>
1870
+ <span class="cline-any cline-neutral">&nbsp;</span>
1871
+ <span class="cline-any cline-neutral">&nbsp;</span>
1872
+ <span class="cline-any cline-neutral">&nbsp;</span>
1873
+ <span class="cline-any cline-neutral">&nbsp;</span>
1874
+ <span class="cline-any cline-yes">8x</span>
1875
+ <span class="cline-any cline-yes">8x</span>
1876
+ <span class="cline-any cline-yes">5x</span>
1877
+ <span class="cline-any cline-neutral">&nbsp;</span>
1878
+ <span class="cline-any cline-neutral">&nbsp;</span>
1879
+ <span class="cline-any cline-yes">3x</span>
1880
+ <span class="cline-any cline-neutral">&nbsp;</span>
1881
+ <span class="cline-any cline-neutral">&nbsp;</span>
1882
+ <span class="cline-any cline-neutral">&nbsp;</span>
1883
+ <span class="cline-any cline-neutral">&nbsp;</span>
1884
+ <span class="cline-any cline-neutral">&nbsp;</span>
1885
+ <span class="cline-any cline-neutral">&nbsp;</span>
1886
+ <span class="cline-any cline-neutral">&nbsp;</span>
1887
+ <span class="cline-any cline-neutral">&nbsp;</span>
1888
+ <span class="cline-any cline-yes">4x</span>
1889
+ <span class="cline-any cline-yes">4x</span>
1890
+ <span class="cline-any cline-neutral">&nbsp;</span>
1891
+ <span class="cline-any cline-yes">1x</span>
1892
+ <span class="cline-any cline-yes">1x</span>
1893
+ <span class="cline-any cline-neutral">&nbsp;</span>
1894
+ <span class="cline-any cline-no">&nbsp;</span>
1895
+ <span class="cline-any cline-no">&nbsp;</span>
1896
+ <span class="cline-any cline-neutral">&nbsp;</span>
1897
+ <span class="cline-any cline-neutral">&nbsp;</span>
1898
+ <span class="cline-any cline-yes">3x</span>
1899
+ <span class="cline-any cline-neutral">&nbsp;</span>
1900
+ <span class="cline-any cline-yes">2x</span>
1901
+ <span class="cline-any cline-yes">2x</span>
1902
+ <span class="cline-any cline-neutral">&nbsp;</span>
1903
+ <span class="cline-any cline-no">&nbsp;</span>
1904
+ <span class="cline-any cline-no">&nbsp;</span>
1905
+ <span class="cline-any cline-neutral">&nbsp;</span>
1906
+ <span class="cline-any cline-neutral">&nbsp;</span>
1907
+ <span class="cline-any cline-yes">1x</span>
1908
+ <span class="cline-any cline-neutral">&nbsp;</span>
1909
+ <span class="cline-any cline-yes">1x</span>
1910
+ <span class="cline-any cline-yes">1x</span>
1911
+ <span class="cline-any cline-neutral">&nbsp;</span>
1912
+ <span class="cline-any cline-no">&nbsp;</span>
1913
+ <span class="cline-any cline-no">&nbsp;</span>
1914
+ <span class="cline-any cline-neutral">&nbsp;</span>
1915
+ <span class="cline-any cline-neutral">&nbsp;</span>
1916
+ <span class="cline-any cline-no">&nbsp;</span>
1917
+ <span class="cline-any cline-neutral">&nbsp;</span>
1918
+ <span class="cline-any cline-neutral">&nbsp;</span>
1919
+ <span class="cline-any cline-neutral">&nbsp;</span>
1920
+ <span class="cline-any cline-neutral">&nbsp;</span>
1921
+ <span class="cline-any cline-neutral">&nbsp;</span>
1922
+ <span class="cline-any cline-neutral">&nbsp;</span>
1923
+ <span class="cline-any cline-neutral">&nbsp;</span>
1924
+ <span class="cline-any cline-yes">3x</span>
1925
+ <span class="cline-any cline-yes">3x</span>
1926
+ <span class="cline-any cline-yes">1x</span>
1927
+ <span class="cline-any cline-neutral">&nbsp;</span>
1928
+ <span class="cline-any cline-yes">2x</span>
1929
+ <span class="cline-any cline-neutral">&nbsp;</span>
1930
+ <span class="cline-any cline-neutral">&nbsp;</span>
1931
+ <span class="cline-any cline-yes">8x</span>
1382
1932
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">"use strict";
1383
1933
  var __assign = (this &amp;&amp; this.__assign) || function () {
1384
1934
  __assign = Object.assign || <span class="fstat-no" title="function not covered" ><span class="branch-1 cbranch-no" title="branch not covered" >fu</span>nction(t) {</span>
@@ -2007,7 +2557,7 @@ var util = {
2007
2557
  objectToQueryString: function (obj) {
2008
2558
  return Object.entries(obj)
2009
2559
  .filter(function (_a) {
2010
- var _ = _a[0], value = _a[1];
2560
+ var value = _a[1];
2011
2561
  return value !== undefined &amp;&amp; value !== null;
2012
2562
  })
2013
2563
  .map(function (_a) {
@@ -2034,6 +2584,281 @@ var util = {
2034
2584
  var end = str.substring(str.length - visibleEnd);
2035
2585
  var masked = maskChar.repeat(str.length - visibleStart - visibleEnd);
2036
2586
  return start + masked + end;
2587
+ },
2588
+ // ==================== Date Utilities (v0.2.0) ====================
2589
+ /**
2590
+ * @description Format date with custom format tokens
2591
+ * @param date Date object or date string
2592
+ * @param format Format string with tokens (YYYY, MM, DD, HH, mm, ss, ddd, dddd)
2593
+ * @returns Formatted date string
2594
+ */
2595
+ formatDateAdvanced: function (date, format) {
2596
+ var d = new Date(date);
2597
+ var weekdays = [
2598
+ '일요일',
2599
+ '월요일',
2600
+ '화요일',
2601
+ '수요일',
2602
+ '목요일',
2603
+ '금요일',
2604
+ '토요일'
2605
+ ];
2606
+ var replacements = {
2607
+ YYYY: d.getFullYear().toString(),
2608
+ MM: (d.getMonth() + 1).toString().padStart(2, '0'),
2609
+ DD: d.getDate().toString().padStart(2, '0'),
2610
+ HH: d.getHours().toString().padStart(2, '0'),
2611
+ mm: d.getMinutes().toString().padStart(2, '0'),
2612
+ ss: d.getSeconds().toString().padStart(2, '0'),
2613
+ dddd: weekdays[d.getDay()],
2614
+ ddd: weekdays[d.getDay()].charAt(0)
2615
+ };
2616
+ var result = format;
2617
+ // Replace longer tokens first to avoid partial matches
2618
+ var tokens = ['YYYY', 'dddd', 'ddd', 'MM', 'DD', 'HH', 'mm', 'ss'];
2619
+ for (var _i = 0, tokens_1 = tokens; _i &lt; tokens_1.length; _i++) {
2620
+ var token = tokens_1[_i];
2621
+ result = result.replace(new RegExp(token, 'g'), replacements[token]);
2622
+ }
2623
+ return result;
2624
+ },
2625
+ /**
2626
+ * @description Get relative time string in Korean
2627
+ * @param date Date object or date string
2628
+ * @returns Korean relative time string (e.g., '방금 전', '5분 전', '어제')
2629
+ */
2630
+ timeAgo: function (date) {
2631
+ var now = Date.now();
2632
+ var past = new Date(date).getTime();
2633
+ var diff = now - past;
2634
+ var minute = 60 * 1000;
2635
+ var hour = 60 * minute;
2636
+ var day = 24 * hour;
2637
+ var week = 7 * day;
2638
+ var month = 30 * day;
2639
+ var year = 365 * day;
2640
+ if (diff &lt; minute)
2641
+ return '방금 전';
2642
+ if (diff &lt; hour)
2643
+ return "".concat(Math.floor(diff / minute), "\uBD84 \uC804");
2644
+ if (diff &lt; day)
2645
+ return "".concat(Math.floor(diff / hour), "\uC2DC\uAC04 \uC804");
2646
+ if (diff &lt; 2 * day)
2647
+ return '어제';
2648
+ if (diff &lt; week)
2649
+ return "".concat(Math.floor(diff / day), "\uC77C \uC804");
2650
+ if (diff &lt; month)
2651
+ return "".concat(Math.floor(diff / week), "\uC8FC \uC804");
2652
+ if (diff &lt; year)
2653
+ return "".concat(Math.floor(diff / month), "\uAC1C\uC6D4 \uC804");
2654
+ return "".concat(Math.floor(diff / year), "\uB144 \uC804");
2655
+ },
2656
+ /**
2657
+ * @description Get the number of days in a month
2658
+ * @param year Year (e.g., 2025)
2659
+ * @param month Month (1-12)
2660
+ * @returns Number of days in the month
2661
+ */
2662
+ getDaysInMonth: function (year, month) {
2663
+ return new Date(year, month, 0).getDate();
2664
+ },
2665
+ /**
2666
+ * @description Check if a year is a leap year
2667
+ * @param year Year to check
2668
+ * @returns true if leap year, false otherwise
2669
+ */
2670
+ isLeapYear: function (year) {
2671
+ return (year % 4 === 0 &amp;&amp; year % 100 !== 0) || year % 400 === 0;
2672
+ },
2673
+ // ==================== Number Utilities (v0.2.0) ====================
2674
+ /**
2675
+ * @description Format number with thousand separators
2676
+ * @param num Number to format
2677
+ * @returns Formatted string with commas
2678
+ */
2679
+ formatNumber: function (num) {
2680
+ return num.toLocaleString('en-US');
2681
+ },
2682
+ /**
2683
+ * @description Format number as currency
2684
+ * @param amount Amount to format
2685
+ * @param currency Currency code (KRW, USD, EUR, JPY, CNY)
2686
+ * @returns Formatted currency string
2687
+ */
2688
+ formatCurrency: function (amount, currency) {
2689
+ if (currency === void 0) { currency = 'KRW'; }
2690
+ var formatted = util.formatNumber(amount);
2691
+ var symbols = {
2692
+ KRW: { symbol: '원', prefix: false },
2693
+ USD: { symbol: '$', prefix: true },
2694
+ EUR: { symbol: '€', prefix: true },
2695
+ JPY: { symbol: '¥', prefix: true },
2696
+ CNY: { symbol: '¥', prefix: true }
2697
+ };
2698
+ var _a = symbols[currency], symbol = _a.symbol, prefix = _a.prefix;
2699
+ return prefix ? "".concat(symbol).concat(formatted) : "".concat(formatted).concat(symbol);
2700
+ },
2701
+ /**
2702
+ * @description Format bytes to human-readable file size
2703
+ * @param bytes Number of bytes
2704
+ * @param precision Decimal precision (default: 0 for B/KB, 2 for larger)
2705
+ * @returns Formatted file size string
2706
+ */
2707
+ formatFileSize: function (bytes, precision) {
2708
+ var units = ['B', 'KB', 'MB', 'GB', 'TB'];
2709
+ var size = bytes;
2710
+ var unitIndex = 0;
2711
+ while (size &gt;= 1024 &amp;&amp; unitIndex &lt; units.length - 1) {
2712
+ size /= 1024;
2713
+ unitIndex++;
2714
+ }
2715
+ var decimals = precision !== undefined ? precision : unitIndex === 0 ? 0 : 0;
2716
+ return "".concat(size.toFixed(decimals), " ").concat(units[unitIndex]);
2717
+ },
2718
+ /**
2719
+ * @description Convert number to Korean words
2720
+ * @param num Number to convert
2721
+ * @returns Korean number string (e.g., '천이백삼십사')
2722
+ */
2723
+ numberToKorean: function (num) {
2724
+ if (num === 0)
2725
+ return '영';
2726
+ var digits = ['', '일', '이', '삼', '사', '오', '육', '칠', '팔', '구'];
2727
+ var units = ['', '십', '백', '천'];
2728
+ var bigUnits = ['', '만', '억', '조'];
2729
+ var processGroup = function (n) {
2730
+ var result = '';
2731
+ var temp = n;
2732
+ for (var i = 3; i &gt;= 0; i--) {
2733
+ var digit = Math.floor(temp / Math.pow(10, i));
2734
+ temp %= Math.pow(10, i);
2735
+ if (digit &gt; 0) {
2736
+ // Omit '일' before 십, 백, 천 (but not for units[0])
2737
+ if (digit &gt; 1 || i === 0) {
2738
+ result += digits[digit];
2739
+ }
2740
+ result += units[i];
2741
+ }
2742
+ }
2743
+ return result;
2744
+ };
2745
+ var result = '';
2746
+ var groupIndex = 0;
2747
+ var remaining = num;
2748
+ while (remaining &gt; 0) {
2749
+ var group = remaining % 10000;
2750
+ if (group &gt; 0) {
2751
+ var groupStr = processGroup(group);
2752
+ // '만' 단위에서 1은 생략, '억' 이상에서는 '일' 포함
2753
+ if (group === 1 &amp;&amp; groupIndex &gt;= 1) {
2754
+ if (groupIndex &gt;= 2) {
2755
+ // 억 이상: '일억', '일조'
2756
+ result = '일' + bigUnits[groupIndex] + result;
2757
+ }
2758
+ else {
2759
+ // 만: '만' (일 생략)
2760
+ result = bigUnits[groupIndex] + result;
2761
+ }
2762
+ }
2763
+ else {
2764
+ result = groupStr + bigUnits[groupIndex] + result;
2765
+ }
2766
+ }
2767
+ remaining = Math.floor(remaining / 10000);
2768
+ groupIndex++;
2769
+ }
2770
+ return result;
2771
+ },
2772
+ /**
2773
+ * @description Parse number from formatted string
2774
+ * @param str String containing number (with commas, currency symbols, etc.)
2775
+ * @returns Parsed number
2776
+ */
2777
+ parseNumberFromString: function (str) {
2778
+ var cleaned = str.replace(/[^0-9.-]/g, '');
2779
+ return parseFloat(cleaned);
2780
+ },
2781
+ // ==================== Validation Utilities (v0.2.0) ====================
2782
+ /**
2783
+ * @description Validate email address
2784
+ * @param email Email address to validate
2785
+ * @returns true if valid email, false otherwise
2786
+ */
2787
+ isEmail: function (email) {
2788
+ var emailRegex = /^[a-zA-Z0-9.!#$%&amp;'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
2789
+ return emailRegex.test(email);
2790
+ },
2791
+ /**
2792
+ * @description Validate Korean phone number
2793
+ * @param phone Phone number to validate
2794
+ * @returns true if valid Korean phone number, false otherwise
2795
+ */
2796
+ isPhoneNumber: function (phone) {
2797
+ var mobileRegex = /^01[016789]-?\d{3,4}-?\d{4}$/;
2798
+ var landlineRegex = /^0[2-6][1-5]?-?\d{3,4}-?\d{4}$/;
2799
+ return mobileRegex.test(phone) || landlineRegex.test(phone);
2800
+ },
2801
+ /**
2802
+ * @description Validate URL
2803
+ * @param url URL to validate
2804
+ * @returns true if valid URL, false otherwise
2805
+ */
2806
+ isUrl: function (url) {
2807
+ try {
2808
+ var parsed = new URL(url);
2809
+ return ['http:', 'https:', 'ftp:'].includes(parsed.protocol);
2810
+ }
2811
+ catch (_a) {
2812
+ return false;
2813
+ }
2814
+ },
2815
+ /**
2816
+ * @description Format Korean phone number with hyphens
2817
+ * @param phone Phone number to format
2818
+ * @returns Formatted phone number
2819
+ */
2820
+ formatPhoneNumber: function (phone) {
2821
+ var digits = phone.replace(/[^0-9]/g, '');
2822
+ if (digits.startsWith('02')) {
2823
+ // Seoul: 02-XXXX-XXXX
2824
+ if (digits.length === 10) {
2825
+ return "".concat(digits.slice(0, 2), "-").concat(digits.slice(2, 6), "-").concat(digits.slice(6));
2826
+ }
2827
+ else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>if (digits.length === 9) {</span>
2828
+ <span class="cstat-no" title="statement not covered" > return "".concat(digits.slice(0, 2), "-").concat(digits.slice(2, 5), "-").concat(digits.slice(5));</span>
2829
+ }
2830
+ }
2831
+ else if (digits.startsWith('01')) {
2832
+ // Mobile: 01X-XXXX-XXXX or 01X-XXX-XXXX
2833
+ if (digits.length === 11) {
2834
+ return "".concat(digits.slice(0, 3), "-").concat(digits.slice(3, 7), "-").concat(digits.slice(7));
2835
+ }
2836
+ else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>if (digits.length === 10) {</span>
2837
+ <span class="cstat-no" title="statement not covered" > return "".concat(digits.slice(0, 3), "-").concat(digits.slice(3, 6), "-").concat(digits.slice(6));</span>
2838
+ }
2839
+ }
2840
+ else <span class="missing-if-branch" title="else path not taken" >E</span>if (/^0[3-6]/.test(digits)) {
2841
+ // Area code: 0XX-XXXX-XXXX
2842
+ if (digits.length === 11) {
2843
+ return "".concat(digits.slice(0, 3), "-").concat(digits.slice(3, 7), "-").concat(digits.slice(7));
2844
+ }
2845
+ else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>if (digits.length === 10) {</span>
2846
+ <span class="cstat-no" title="statement not covered" > return "".concat(digits.slice(0, 3), "-").concat(digits.slice(3, 6), "-").concat(digits.slice(6));</span>
2847
+ }
2848
+ }
2849
+ <span class="cstat-no" title="statement not covered" > return phone;</span>
2850
+ },
2851
+ /**
2852
+ * @description Format Korean business registration number
2853
+ * @param brn Business registration number
2854
+ * @returns Formatted business number (XXX-XX-XXXXX)
2855
+ */
2856
+ formatBusinessNumber: function (brn) {
2857
+ var digits = brn.replace(/[^0-9]/g, '');
2858
+ if (digits.length !== 10) {
2859
+ return brn;
2860
+ }
2861
+ return "".concat(digits.slice(0, 3), "-").concat(digits.slice(3, 5), "-").concat(digits.slice(5));
2037
2862
  }
2038
2863
  };
2039
2864
  exports.default = util;
@@ -2044,7 +2869,7 @@ exports.default = util;
2044
2869
  <div class='footer quiet pad2 space-top1 center small'>
2045
2870
  Code coverage generated by
2046
2871
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2047
- at 2025-10-10T11:56:16.371Z
2872
+ at 2025-12-26T02:22:49.618Z
2048
2873
  </div>
2049
2874
  <script src="prettify.js"></script>
2050
2875
  <script>