@blazedpath/commons 0.0.4

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 (224) hide show
  1. package/README.md +3 -0
  2. package/blz-base/health/index.js +215 -0
  3. package/blz-base/index.js +1466 -0
  4. package/blz-cache/LruCache.js +44 -0
  5. package/blz-cache/index.js +29 -0
  6. package/blz-config/index.js +434 -0
  7. package/blz-core/index.js +364 -0
  8. package/blz-cryptography/index.js +54 -0
  9. package/blz-datetimes/index.js +356 -0
  10. package/blz-file/example.dat +2545 -0
  11. package/blz-file/fileService.js +205 -0
  12. package/blz-file/index.js +94 -0
  13. package/blz-file/index.test.js +31 -0
  14. package/blz-file/lab.js +33 -0
  15. package/blz-hazelcast/index.js +189 -0
  16. package/blz-hazelcast/lib/credentials.js +25 -0
  17. package/blz-hazelcast/lib/credentialsFactory.js +12 -0
  18. package/blz-hazelcast/lib/hazelcastCache.js +234 -0
  19. package/blz-iterable/index.js +446 -0
  20. package/blz-json-schema/index.js +11 -0
  21. package/blz-jwt/index.js +121 -0
  22. package/blz-kafka/index.js +522 -0
  23. package/blz-math/index.js +131 -0
  24. package/blz-mongodb/index.js +326 -0
  25. package/blz-rds/__test__/scape.test.js +58 -0
  26. package/blz-rds/blz-rds-executor.js +578 -0
  27. package/blz-rds/blz-rds-helper.js +310 -0
  28. package/blz-rds/commands/core/add.js +13 -0
  29. package/blz-rds/commands/core/and.js +18 -0
  30. package/blz-rds/commands/core/asc.js +10 -0
  31. package/blz-rds/commands/core/avg.js +10 -0
  32. package/blz-rds/commands/core/column-ref.js +8 -0
  33. package/blz-rds/commands/core/count-distinct.js +10 -0
  34. package/blz-rds/commands/core/count.js +10 -0
  35. package/blz-rds/commands/core/decimal.js +8 -0
  36. package/blz-rds/commands/core/desc.js +10 -0
  37. package/blz-rds/commands/core/distinct.js +10 -0
  38. package/blz-rds/commands/core/divide.js +11 -0
  39. package/blz-rds/commands/core/embedded-exists.js +17 -0
  40. package/blz-rds/commands/core/embedded-select.js +17 -0
  41. package/blz-rds/commands/core/equals.js +9 -0
  42. package/blz-rds/commands/core/false.js +8 -0
  43. package/blz-rds/commands/core/greater-or-equal.js +9 -0
  44. package/blz-rds/commands/core/greater.js +9 -0
  45. package/blz-rds/commands/core/in.js +9 -0
  46. package/blz-rds/commands/core/integer.js +8 -0
  47. package/blz-rds/commands/core/is-not-null.js +11 -0
  48. package/blz-rds/commands/core/is-null-or-value.js +10 -0
  49. package/blz-rds/commands/core/is-null.js +11 -0
  50. package/blz-rds/commands/core/less-or-equal.js +9 -0
  51. package/blz-rds/commands/core/less-unary.js +12 -0
  52. package/blz-rds/commands/core/less.js +9 -0
  53. package/blz-rds/commands/core/like.js +12 -0
  54. package/blz-rds/commands/core/max.js +10 -0
  55. package/blz-rds/commands/core/min.js +10 -0
  56. package/blz-rds/commands/core/multiply.js +13 -0
  57. package/blz-rds/commands/core/not-equals.js +9 -0
  58. package/blz-rds/commands/core/not-in.js +9 -0
  59. package/blz-rds/commands/core/not.js +13 -0
  60. package/blz-rds/commands/core/null.js +8 -0
  61. package/blz-rds/commands/core/nvl.js +11 -0
  62. package/blz-rds/commands/core/or.js +13 -0
  63. package/blz-rds/commands/core/parameter.js +34 -0
  64. package/blz-rds/commands/core/remainder.js +16 -0
  65. package/blz-rds/commands/core/string.js +8 -0
  66. package/blz-rds/commands/core/subtract.js +13 -0
  67. package/blz-rds/commands/core/sum.js +10 -0
  68. package/blz-rds/commands/core/true.js +8 -0
  69. package/blz-rds/commands/core/tuple.js +13 -0
  70. package/blz-rds/commands/datetimes/add-days.js +11 -0
  71. package/blz-rds/commands/datetimes/add-hours.js +11 -0
  72. package/blz-rds/commands/datetimes/add-milliseconds.js +11 -0
  73. package/blz-rds/commands/datetimes/add-minutes.js +11 -0
  74. package/blz-rds/commands/datetimes/add-months.js +11 -0
  75. package/blz-rds/commands/datetimes/add-seconds.js +11 -0
  76. package/blz-rds/commands/datetimes/add-years.js +11 -0
  77. package/blz-rds/commands/datetimes/date-diff.js +11 -0
  78. package/blz-rds/commands/datetimes/date.js +12 -0
  79. package/blz-rds/commands/datetimes/datetime-diff.js +11 -0
  80. package/blz-rds/commands/datetimes/datetime.js +15 -0
  81. package/blz-rds/commands/datetimes/day.js +10 -0
  82. package/blz-rds/commands/datetimes/hour.js +10 -0
  83. package/blz-rds/commands/datetimes/millisecond.js +10 -0
  84. package/blz-rds/commands/datetimes/minute.js +10 -0
  85. package/blz-rds/commands/datetimes/month-text.js +10 -0
  86. package/blz-rds/commands/datetimes/month.js +10 -0
  87. package/blz-rds/commands/datetimes/now.js +9 -0
  88. package/blz-rds/commands/datetimes/second.js +10 -0
  89. package/blz-rds/commands/datetimes/subtract-days.js +11 -0
  90. package/blz-rds/commands/datetimes/subtract-hours.js +11 -0
  91. package/blz-rds/commands/datetimes/subtract-milliseconds.js +11 -0
  92. package/blz-rds/commands/datetimes/subtract-minutes.js +11 -0
  93. package/blz-rds/commands/datetimes/subtract-seconds.js +11 -0
  94. package/blz-rds/commands/datetimes/time-diff.js +11 -0
  95. package/blz-rds/commands/datetimes/time.js +13 -0
  96. package/blz-rds/commands/datetimes/today.js +9 -0
  97. package/blz-rds/commands/datetimes/week-day-text.js +10 -0
  98. package/blz-rds/commands/datetimes/week-day.js +10 -0
  99. package/blz-rds/commands/datetimes/week.js +10 -0
  100. package/blz-rds/commands/datetimes/year.js +10 -0
  101. package/blz-rds/commands/math/abs.js +10 -0
  102. package/blz-rds/commands/math/acos.js +10 -0
  103. package/blz-rds/commands/math/asin.js +10 -0
  104. package/blz-rds/commands/math/atan.js +10 -0
  105. package/blz-rds/commands/math/atan2.js +11 -0
  106. package/blz-rds/commands/math/ceil.js +10 -0
  107. package/blz-rds/commands/math/cos.js +10 -0
  108. package/blz-rds/commands/math/cosh.js +10 -0
  109. package/blz-rds/commands/math/exp.js +10 -0
  110. package/blz-rds/commands/math/floor.js +10 -0
  111. package/blz-rds/commands/math/log.js +18 -0
  112. package/blz-rds/commands/math/log10.js +10 -0
  113. package/blz-rds/commands/math/pow.js +11 -0
  114. package/blz-rds/commands/math/random.js +9 -0
  115. package/blz-rds/commands/math/round.js +18 -0
  116. package/blz-rds/commands/math/sign.js +10 -0
  117. package/blz-rds/commands/math/sin.js +10 -0
  118. package/blz-rds/commands/math/sinh.js +10 -0
  119. package/blz-rds/commands/math/sqrt.js +10 -0
  120. package/blz-rds/commands/math/tan.js +10 -0
  121. package/blz-rds/commands/math/tanh.js +10 -0
  122. package/blz-rds/commands/math/trunc.js +18 -0
  123. package/blz-rds/commands/strings/concat.js +20 -0
  124. package/blz-rds/commands/strings/contains.js +12 -0
  125. package/blz-rds/commands/strings/ends-with.js +12 -0
  126. package/blz-rds/commands/strings/index-of.js +11 -0
  127. package/blz-rds/commands/strings/is-null-or-empty.js +11 -0
  128. package/blz-rds/commands/strings/is-null-or-white-space.js +11 -0
  129. package/blz-rds/commands/strings/join.js +22 -0
  130. package/blz-rds/commands/strings/last-index-of.js +11 -0
  131. package/blz-rds/commands/strings/length.js +10 -0
  132. package/blz-rds/commands/strings/pad-left.js +20 -0
  133. package/blz-rds/commands/strings/pad-right.js +20 -0
  134. package/blz-rds/commands/strings/replace.js +12 -0
  135. package/blz-rds/commands/strings/starts-with.js +12 -0
  136. package/blz-rds/commands/strings/substring.js +12 -0
  137. package/blz-rds/commands/strings/to-lower.js +10 -0
  138. package/blz-rds/commands/strings/to-upper.js +10 -0
  139. package/blz-rds/commands/strings/trim-end.js +10 -0
  140. package/blz-rds/commands/strings/trim-start.js +10 -0
  141. package/blz-rds/commands/strings/trim.js +10 -0
  142. package/blz-rds/index.js +744 -0
  143. package/blz-rds-mysql/base.js +857 -0
  144. package/blz-rds-mysql/connection-manager.js +129 -0
  145. package/blz-rds-mysql/execute-bulk-insert.js +35 -0
  146. package/blz-rds-mysql/execute-bulk-merge.js +45 -0
  147. package/blz-rds-mysql/execute-non-query.js +34 -0
  148. package/blz-rds-mysql/execute-query.js +50 -0
  149. package/blz-rds-mysql/index.js +41 -0
  150. package/blz-rds-mysql/stored-procedure.js +207 -0
  151. package/blz-rds-mysql/syntaxis.json +114 -0
  152. package/blz-rds-mysqlx/base.js +846 -0
  153. package/blz-rds-mysqlx/connection-manager.js +141 -0
  154. package/blz-rds-mysqlx/execute-bulk-insert.js +35 -0
  155. package/blz-rds-mysqlx/execute-bulk-merge.js +45 -0
  156. package/blz-rds-mysqlx/execute-non-query.js +29 -0
  157. package/blz-rds-mysqlx/execute-query.js +39 -0
  158. package/blz-rds-mysqlx/index.js +41 -0
  159. package/blz-rds-mysqlx/stored-procedure.js +179 -0
  160. package/blz-rds-mysqlx/syntaxis.json +105 -0
  161. package/blz-rds-oracle/index.js +540 -0
  162. package/blz-rds-oracle/syntaxis.json +112 -0
  163. package/blz-rds-postgres/base.js +861 -0
  164. package/blz-rds-postgres/connection-manager.js +225 -0
  165. package/blz-rds-postgres/execute-bulk-insert.js +81 -0
  166. package/blz-rds-postgres/execute-bulk-merge.js +93 -0
  167. package/blz-rds-postgres/execute-non-query.js +23 -0
  168. package/blz-rds-postgres/execute-query.js +37 -0
  169. package/blz-rds-postgres/index.js +41 -0
  170. package/blz-rds-postgres/result-set.js +51 -0
  171. package/blz-rds-postgres/stored-procedure.js +116 -0
  172. package/blz-rds-postgres/syntaxis.json +114 -0
  173. package/blz-redis/index.js +217 -0
  174. package/blz-redis/lib/redisCache.js +265 -0
  175. package/blz-regex/index.js +25 -0
  176. package/blz-security/.eslintrc.js +15 -0
  177. package/blz-security/__test__/AuthorizationKpn.yaml +1043 -0
  178. package/blz-security/__test__/FinancingSetting.yaml +177 -0
  179. package/blz-security/__test__/KpnConfigPortal.yaml +330 -0
  180. package/blz-security/__test__/OrderManagement.yaml +5190 -0
  181. package/blz-security/__test__/Security.yaml +128 -0
  182. package/blz-security/__test__/autorization.test.js +105 -0
  183. package/blz-security/__test__/orderManagement.test.js +26 -0
  184. package/blz-security/__test__/secureUrl.test.js +79 -0
  185. package/blz-security/__test__/solveMergeRule.test.js +109 -0
  186. package/blz-security/__test__/sqlInjectionGuard.test.js +203 -0
  187. package/blz-security/__test__/xssGuard.test.js +204 -0
  188. package/blz-security/authorizationService.js +536 -0
  189. package/blz-security/config/global.js +8 -0
  190. package/blz-security/config/welcome +8 -0
  191. package/blz-security/doc/README.md +75 -0
  192. package/blz-security/filescanner/index.js +46 -0
  193. package/blz-security/helpers/consts.js +229 -0
  194. package/blz-security/helpers/utils.js +267 -0
  195. package/blz-security/implementations/cache.js +90 -0
  196. package/blz-security/implementations/oidc.js +404 -0
  197. package/blz-security/implementations/pkceCacheStore.js +23 -0
  198. package/blz-security/implementations/saml.js +10 -0
  199. package/blz-security/implementations/uma.js +63 -0
  200. package/blz-security/implementations/webAuthn.js +9 -0
  201. package/blz-security/implementations/wstg.js +72 -0
  202. package/blz-security/index.js +77 -0
  203. package/blz-security/lab/index.js +27 -0
  204. package/blz-security/middleware/HapiServerAzureAd.js +641 -0
  205. package/blz-security/middleware/HapiServerKeycloak.js +840 -0
  206. package/blz-security/middleware/HapiServerSimToken.js +247 -0
  207. package/blz-security/middleware/hapi.js +515 -0
  208. package/blz-security/middleware/hapiServer.js +974 -0
  209. package/blz-security/navigationMemoryRepository.js +15 -0
  210. package/blz-security/navigationMongoDbRepository.js +73 -0
  211. package/blz-security/secureUrlService.js +47 -0
  212. package/blz-security/securityService.js +409 -0
  213. package/blz-security/sqlInjectionGuard.js +162 -0
  214. package/blz-security/templates/forbidden.html +0 -0
  215. package/blz-security/templates/session-iframe-azure-ad.html +7 -0
  216. package/blz-security/templates/session-iframe.html +73 -0
  217. package/blz-security/templates/unauthorized.html +1 -0
  218. package/blz-security/xssGuard.js +87 -0
  219. package/blz-strings/index.js +167 -0
  220. package/blz-uuid/index.js +7 -0
  221. package/blz-yaml/index.js +19 -0
  222. package/index.js +84 -0
  223. package/package.json +97 -0
  224. package/process-managers/index.js +422 -0
@@ -0,0 +1,204 @@
1
+ const XssGuard = require('../xssGuard');
2
+ const logger = require('pino');
3
+
4
+ describe('XssGuard', () => {
5
+ let guard;
6
+
7
+ beforeEach(() => {
8
+ guard = new XssGuard(logger({ level: 'silent' }));
9
+ });
10
+
11
+
12
+ test('sanitizes buffer as String', () => {
13
+ const input = {"zipBinaryString":"PK\u0003\u0004\u0014\u0000\b\u0000\b\u0000݄îZ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000:\u0000\u0000\u0000criteria-set-11-exported-2025-07-14T16:38:58.967Z1073.jsoníÝmS\u001ai¢\u0006à¿bñéLU3E7/B¾ù‚ÆZ\u0010J\u00187™ÍVÊ\u0018vŽg3š£fÏLmí?\u0005´³‰Aeiºy€ë›±Û\u0006ZáÊs?Ý÷óÏÒåíÕýèöêb0º/½úç×ÿ<ùXz\u0015ÇQéîþâþË]éU©}º·ßi\u001f–¢Òõů£Ò«R÷âöê®Ë;\u001f.îF\u001fwn®w\u0006¿Þü}´3\u001cÝÝï4wÊ;ÿuõëç›ÛûÑÇ\u001f¾ùG)*}\u001cÝ]Þ^}¾¿º¹.½*=þ±ÑoÓ=LJL*I­\\i–+É0Ž_ÅÍWIëÇÝVóçhçáx÷J^Õv_%\u001f\u001bÕúÏ?Ì>\\«\u001c7†IåU%~U¯ÿب$3\u000f÷Ç^»¯âƏI¥ñó\u000f¥Eœ¢Ò«¿üq¾n®'g«Ö¬D³NáÕÝÞçϟ®./>|\u001aŸ·áÙOíRTú|q;º¾?øú\b×_>}\u001aïÞþíòӗ»éÙI÷þp;ºøûǛÿ›~kït°w0<靖¢ÒßnGÿûet}ùûð÷ÏãÃ\u001fîtޖ¢Òè\u001fãÃß|\u001cïM¹R)¿)ÿ¹wtôþðaÛá7¿…?ŸHùæoÛ\u0019ïpùåöv|̓»›ñ¯þ§³RTº¹ý%=\\y¼ÇíèãÕýñ§½Ë˛/×÷éw?Ž>|ÿÍ«»£«Ëû«û«›/w\u00077×\u001f¯¦\u000f9}µ\u0017Ó]ÇOþ»m÷·\u0017×w\u0017—ão=Ú^úË»ÒôÕ¼+ýµ\u0014•în¾Ü^Žf\u001eä×˿f\u001fÿãèÃýÍí`ò\u0017~t{óë³;\fožÞüËèù\u001fÿeôäOŸ]Ýý}üäž9ÀÃ.O?ƒÑ/¿Ž®ïŸ{\u000eÓ=ž<Âá—ëë«ë_ž9BºÇŒ#܎ÿš¾Ì>ù£ß>®ïfoKóϜþoö˜ñÈÿÞþÄ/àë\u001džþùg\u0005öyæY<óKøv—§ñܯáÛ]f\u001cã«wË3çô»½f=›OŸn./^8Ðãf\u001cçòËÝýͯãÓ\u0016?³-yf[õ™mµg¶Õ¿Ûvu·ÿÇ\u0007Áàó§«ñ‡ÓÑ^gО|@\u001düû™>·1yncõ¹µç6Ö\u001fo¼\u001d}\u001a>ùÙ7~=ÿоÃg·U\b>û?\u001dü©=œÛV‹;~þð¨3œþ4øÃ\u001fþl†?Í5\u0018ü\u001c¼„ÐÁ:!t`ð\u0003\u001føÀ\u0007>»a\u000f~¸cðÃ\u001fþðgCýi\u0004ëÏÑéÁûãÙü\u001c]]_\\_^]ÿ²s<º\u001eÝ^]î\u001cL€Y\u0013‹&¯\fE(BÑ:R4~\u000fþ©Û›¾\u0005‰´l‘ê\u0001‹t8¿H‡cPÖ\u0006¤C \u0001\tH@\u0002Òw Õž\u001f2N2U„#\u001cáh;8ª†Î‘A\u0012hD#\u001amFIØ\u001auú{o{GG³=z=øÓNÿâ÷ñe\fÿu?\u001aßHuqûû\u000fkÂQúʀ\u0004$ ¹’Dñò%zx>\u000bO\u001cí'ŽNËGy0\u0014WwëñLŠ’¤ÒªT*³@J’jeºé\t–Æ´ŒOÒԕÅy:9=|ð®\u0014½+íu:½éWý÷‡íý“áäëL~™uâ\u0018ÇÂulüþ\u001ctž¼Ñ_·÷:Ãד/\u0007o\u0007ÃvwçätØ>>Û\u001bö֟\u0004\u0007íÇ£3î=ó©:9i\u000fŸ¯-Ͳ0ð>‡þÛîðýÉa{¯3[Ä«ñ¦Ï\u0017¿ßfïB\b\bÇ'ÿ¤Ó99M#Àçõû÷\u000b4>ã\u001a׌϶~|Ö\b·æ!ܐp2ï4>éY‡cF[T¢\u0012•¨ôH¥f€©áYž©a³Y­\u0005›\u001ab\nS˜ÚàPð +ê[\u001c«ÝÐ/¶è\u001d½?\u0019\ffƒÕ¹¹¸NÅZ›K,¦¯G†‡!\f¹èC©C€£<\u0004\u0019\u0011¡\bE(Ú\nŠÂm‹p‘\u0003èD'ÓJ[ÈR­˜i¥…£ºÉÇv\u000e˜v®®?Ü|¹þø\"OoÞ¼yóļÒÃäÑwNŕøùy¥—´:8k\u001fžL®#}™«éK–å!\nQˆBTÆ\u001e‰¸V¯åpåCR+ÿ¹|”Þ(4Û§þø9|¼ºÜ9¹þÇÍÕåh§¼3ý]í|¸øtq}9ÚùòùãÅýè.ÃÅ\u0010ñ\u0004¦Õ^\fñÇÝR‹\u000e®ŽÎ÷\f®\u0002—kÒMv2\u001c¶OßÿqåËӐ½°;×^vmòÖº¹»\u001f}üîOœð¯÷Î?,Üï?\u001b\u0016ºŠ\"+|\tøÀ\u0007>ð/(øþtÜ\u0001_žðÅà\u0003\u001føÀ\u0007¾ à\u001böúàË\u0013¾\nøÀ\u0007>ð/(øúƒ!ør„¯Þ\u0002\u001føÀ\u0007>ð\u0005\u0005_§}\f¾<ák‚\u000f|à\u0003\u001føÂšãëwÁ—'|»à\u0003\u001føÀ\u0007¾°àk»¸%Wø\u001aà\u0003\u001føÀ\u0007¾ à{}¾\u000f¾<᫃\u000f|à\u0003\u001føÂ\u001añuÝǗ+|su¬<<BqÝýä#\u001fùÈ·åòEéÐ/J³Ï(ü‹Ò«_¢ôòÏ(½ÿ!Jo\u0000ŒÖï\u000eøtpµ6pfn~I\u001a9¬”]¬›O.ž\u001dWë\rnr“›Ü\f¯ù¥ˆEµÇÓ¬Tâ¤Ò¨5«²#Í\u0004˜À\u0004&0\tÌÙ`Æqe·^KâF\u0002ÌZ=\u0006&0\tL`\u0002s6˜ÆøC0Nš\u0015`Öê\u0015`\u0002\u0013˜À\u0004æºu’ŠdW\u0000f­\u0005L`\u0002\u0013˜À\u0004¦Höe0›À\u0004&0\tL`Šd_\u0006s\u0017˜À\u0004&0¹n«eˆdW\u0001f\u0003˜À\u0004&0\tL‘ìË`ց\tL`\u0002\u0013˜À\u0014ɾ\ff\r˜À\u0004&0¹në8ŠdW\u0001¦¦\u001f`\u0002\u0013˜À\u0004¦Hv\u000e05ý\u0000\u0013˜À\u0004&0E²s€©é\u0007˜À\u0004&0Ã\u0002sÒ±.’\r\u000fLM?À\u0004&0\tL‘ìË`V5ý\u0000\u0013˜À\u0004&0E²s€©é\u0007˜À\u0004&0\u0003kúéwE²!‚©é\u0007˜À\u0004&0)’\u0003LM?À\u0004&0\tL‘ì\u001c`jú\u0001&0\tÌÀÀl[Þ+H05ý\u0000\u0013˜À\u0004&0E²s€©é\u0007˜À\u0004&0)’\u0003LM?À\u0004&0\u0019\u0016˜¯Ï÷E²!‚©é\u0007˜À\u0004&0)’\u0003LM?À\u0004&0\tL‘ìË`&š~€\tL`\u00023°9ÌnO$\u001b\"˜š~€\tL`\u0002\u0013˜\"Ù9ÀÔô\u0003L`\u0002\u0013˜À\u0014ÉÎ\u0001æ\\M?\u000f0ĊóDLb\u0012“˜Ä\\¦˜Q:™\u0019¥÷™Di\u0005P”¶³Gé™ѻҰןn?žî·ß\u000fRÜèÛ\u0011k”sâ›\u000eõ–ÌñŒ£.GãÌ5Bñò‡¯gå$)\u0012ãf³Z›q\\©¬=ƃ\tÆÑ»Ò1•©Lå5Sy\u000eU\u000fº‹ZùxÛ6ŽGk\u0004$ \u0001\tHÀ@Ç¥Ç\u001d\u0002æ)`•€\u0004$ \u0001\t\u0018¦€“¤•€ù\t˜\u0010€\u0004$ \u0001Ã\u0014p2çHÀü\u0004Œ\tH@\u0002\u0012€a\n8¹ú†€ù\tX! \u0001\tH@\u0002®íR”\u0004Ì `Ü\" \u0001\tH@\u0002®íÊ\u001f\u0004Ì\"`“€\u0004$ \u0001\t¸¶E«\u0004Ì\"à.\u0001\tH@\u0002\u0012pm{m\b˜EÀ ûi\u0010ˆ@\u0004\"\u0010Å\u0014Õ\u0004Eh>•2ù\tš½S&É£à­\u001aFÁÛ&\u0000Úá&7¹¹y7Ò[tc\u0015`ր\tL`\u0002\u0013˜À´èÆË`V\tL`\u0002\u0013˜À´èÆË`&.ºALb\u0012“˜ÄÜêE3rò4¯U3âŒm9y]\"Tu‰\u0010MiJSšº86\u0017ø²–äT›Õ\u001c†‘±aäòÖnl·\u0007à\u0003\u001fø6l•(—ö¬\u0000ÌJ\u000b˜À\u0004&0\tL—ö¼\ff\u0013˜À\u0004&0\tL—ö¼\fæ.0\tL`\u0002ӕ=\"ٗÁl\u0000\u0013˜À\u0004&0)’}\u0019Ì:0\tL`\u0002\u0013˜\"ٗÁ¬\u0001\u0013˜À\u0004&0ƒ\u0002sR\u0004+’\r\u000fÌ*0\tL`\u0002\u0013˜\"ٗÁL€\tL`\u0002\u0013˜À\u0014ɾ\ff\fL`\u0002\u0013˜À\f\nÌÉ\u001a]\"ÙðÀÔô\u0003L`\u0002\u0013˜À\u0014ɾ\bfµ¥é\u0007˜À\u0004&0)’\u0003LM?À\u0004&0\u0019\u0016˜ö±H6D05ý\u0000\u0013˜À\u0004&0E²s€©é\u0007˜À\u0004&0)’\u0003LM?À\u0004&0\u0019XÓO¿+’\r\u0011LM?À\u0004&0\tL‘ì\u001c`jú\u0001&0\tL`Šdç\u0000SÓ\u000f0\tL`\u0006\u0006fÛò^A‚©é\u0007˜À\u0004&0)’\u0003LM?À\u0004&0\tL‘ìË`65ý\u0000\u0013˜À\u0004fX`¾>ß\u0017Ɇ\b¦¦\u001f`\u0002\u0013˜À\u0004¦Hv\u000e05ý\u0000\u0013˜À\u0004&0E²s€©é\u0007˜À\u0004&0\u0003›ÃìöD²!‚©é\u0007˜À\u0004&0)’\u0003LM?À\u0004&0\tL‘ì\u001c`ÎÕôóð\b3Ä|8OÄ$&1‰IÌeŠ\u0019¥“™QzŸI”V\u0000Ei;{”.œ\u0019½+\r{ýéöãé~ûý ō¾\u001d±F9'¾éPoÉ\u001cÏ8êr4ÎX#”\u000bÆgåj\\ ÆI<UuC1\u000e¦ï©~ïhú\u0006Þ{ÛÅ3žñ¼a\u0003ڃî¢h>Þ¶\u0003ÓÌ\u0005AõZ\u000eãÒ$1.]\u0016…ƒó½é]\u001f¾8Úßë \u0010…(\\'\n\u0003\u001aiºzèkB+\bE(B\u0011ŠP„ºžh\u0001Bw[\bE(B\u0011ŠP„ºÂh\u0011B›\bE(B\u0011ŠÐÐç4-–\u0012$¡»\bE(B\u0011ŠP„\nr\u0017!´P„\"\u0014¡\bE¨ w\u0011Bë\bE(B\u0011ŠÐÀ\tÜ\u000b*È\rÐ\u001aB\u0011ŠP„\"\u0014¡‚ÜE\b­\"\u0014¡\bE(B\u0011*È]„Ð\u0004¡\bE(B\u0011\u001a8¡“r?Anx„j'B(B\u0011ŠP„\nr\u0017\"T;\u0011B\u0011ŠP„\"T»\b¡\ríD\bE(B\u0011\u001a:¡“ÕZ\u0004¹á\u0011ª\b¡\bE(B\u0011*È]ˆPíD\bE(B\u0011ŠPAîB„j'B(B\u0011ŠÐàۉú]Anˆ„j'B(B\u0011ŠP„\nr\u0017\"T;\u0011B\u0011ŠP„\"T»\u0010¡Ú‰\u0010ŠP„\"4xBÛ\u0016;\u000b’PíD\bE(B\u0011ŠPAîB„j'B(B\u0011ŠP„\nr\u0017\"T;\u0011B\u0011ŠP„†Nèëó}An€„Öµ\u0013!\u0014¡\bE(B\u0005¹\u000b\u0011ª\b¡\bE(B\u0011*È]ˆPíD\bE(B\u0011\u001aü\\h·'È\r‘PíD\bE(B\u0011ŠPAîB„j'B(B\u0011ŠP„\nr\u0017\"t®v¢‡G˜aèÃyb(C\u0019ÊP†ækh”NŠFé].QZ[\u0014¥=ôQº°hô®4ìõ§Û§ûí÷ƒ48úvT\u001båœ\u0013§ÃÁ%\u0003=ã¨Ëñ9sõQmùCܳr\\-’çf³ZÛ\\žÚí\u0001Œa\fãuÂx\u000eL\u000fº‹\u0012ùxÛ6\u000eL\u0013ð\u000f|à\u0003_X£Ðã\u000eøò„/\u0006\u001føÀ\u0007>ð\u0005\u0005ß$N\u0005_~ðUÀ\u0007>ð\u000f|AÁ7™O\u0004_nðÕZà\u0003\u001føÀ\u0007¾ à›\\P\u0003¾üàk‚\u000f|à\u0003\u001føÖm!Lðeo\u0017|à\u0003\u001føÀ·n\u000b‡€/\u000b|\rð\u000f|à\u0003ߺ\u0015­‚/\u000b|uð\u000f|à\u0003ߺ\u0015Ӏ/\u000b|A\u0016̐|ä#Ÿ:™\\ëd‚’3Ÿâ—üàÌØü’S1[5\u000e¢˜­Vãúº»Ù99\u001dLßjýÞÑô½¶÷¶KR’’T¹©Ñæ\u0002hfn‰ë9 \u0019×´™.\u000bͳÁùÁ´Í´×;Ôf\nMhnjšu©VAhŒP„\"\u0014¡\bE¨u©\u0016!´‚P„\"\u0014¡\bE¨u©\u0016 ´ÚB(B\u0011ŠP„®!¸ w\u0015„6\u0011ŠP„\"\u0014¡\b\u0015ä.Bè.B\u0011ŠP„\"\u0014¡‚ÜE\bm \u0014¡\bE(Bׁ+Aî*\b­#\u0014¡\bE(B\u0011*È]„Ð\u001aB\u0011ŠP„\"\u0014¡‚ÜE\b­\"\u0014¡\bE(B×ÁfAî*\bÕN„P„\"\u0014¡\b\u0015ä.D¨v\"„\"\u0014¡\bE¨ w!Bµ\u0013!\u0014¡\bEhè„N–`\u0011ä\u0006Gh¢\b¡\bE(B\u0011*È]ˆPíD\bE(B\u0011ŠPAîB„j'B(B\u0011ŠÐàۉú]Anˆ„j'B(B\u0011ŠP„\nr\u0017\"T;\u0011B\u0011ŠP„\"T»\u0010¡Ú‰\u0010ŠP„\"4xBÛ\u0016;\u000b’PíD\bE(B\u0011ŠPAîB„j'B(B\u0011ŠP„\nr\u0017\"T;\u0011B\u0011ŠP„†Nèëó}Anˆ„j'B(B\u0011ŠP„\nr\u0017!4ÖN„P„\"\u0014¡\b\u0015ä.D¨v\"„\"\u0014¡\b\r~.´Û\u0013ä†H¨v\"„\"\u0014¡\bE¨ w!Bµ\u0013!\u0014¡\bE(B\u0005¹\u000b\u0011:W;ÑÃ#Ì0ôá<1”¡\fe(Có54J'E£ô.—(­-ŠÒ\u001eú(]X4zW\u001aöúÓíÇÓýöûA\u001a\u001c};ªrΉÓáà’žqÔ帜¹ú¨²ü!îYÁ<7›Õ\u001ažñŒg<‡Ëó\u001c¼\u001et\u0017Eóñ¶m\u001cªVQˆB\u0014¢\u0010…¡T;(̓Â\u0004…(D!\nQ\u00188…“\u0010\u0016…ùQ\u0018£\u0010…(D!\n\u0003§p2/‰Âü(¬ \u0010…(D!\n\u0003§pr©\u000e\ns£°ÒB!\nQˆB\u0014®ÿ¢›(ÌBa\u0013…(D!\nQ¸þ˖ 0\u000b…»(D!\nQˆÂõ/~Ea\u0016\n\u001b(D!\nQˆÂõ¯ÎAa\u0016\nƒ¬Àa!\u000bYÈB\u0016\u0016\\\u0013”¥ù”ÕäGiƶšœÊäªqùT™Ür$휜\u000e¦oµ~ïhú^Û{Û%iø’î\u001d\fOÎÛé¯l0|øÓô\u001fƒŸ\u0006ýöéa{úÿ¢ÃöÃ~/c›íˆ<V뺤J9£Øj%{;N%\u0007z“*z—FïùÞ\u0010´ \u0005­F\u001d«x\u0005Ân‚]ìb\u0017»ØÅ®•¿Šb7Æ.v±‹]ìb×jaE±[\tsµ0îr—»ÜåîFº[ð\na9©œÓ\u0012aI«\u0015àEWg\u0005›¼Ù—/3™ÉLf²Ûrà³\u0019$Ÿ…^³œÄS\u0007]³\fT \u0002Õý´@]\u001cÔ¬-KÉn.s³‰ŒxY \u000e&ãÑñí´\u0006¦\u001cå¨õ®]’\u001cŽ¿\rþò—¿üå/]›\\¸¿uþò—¿üå/]¤\\¸¿5þò—¿ü寋•åυû[å/ùË_þòWþ\\¸¿\tùË_þò—¿òçÂýùË_þò—¿›ìïdm!ùsxþVøË_þò—¿ü•?\u0017ío³Å_þò—¿üå¯ü¹p›üå/ùËßMöw²Æ½ü9<õ_ñ—¿üå/åÏÅû«ÿŠ¿üå/ù+.Þ_ýWüå/ù»ÑþvÚÇòç\u0010ýÕÅ_þò—¿ü•?\u0017ï¯þ+þò—¿üå¯ü¹xõ_ñ—¿üåïf÷_õ»òç\u0010ýÕÅ_þò—¿ü•?\u0017ï¯þ+þò—¿üå¯ü¹pwõ_ñ—¿üåïfûÛ¶þ`þê¿â/ùË_þʟ‹÷Wÿ\u0015ùË_þòWþ\\¼¿ú¯øË_þòw£ý}}¾/\u000eÑ_ýWüå/ùË_ùsñþê¿â/ùË_þʟ‹÷Wÿ\u0015ùË_þnöüo·'\u000eÑ_ýWüå/ùË_ùsñþê¿â/ùË_þʟ‹÷w®þ«‡G˜\u0001ðÃy\u00020€\u0001\f`\u0000\u0007\fp”N\u0004Gé\rIQZŒ\u0015¥\u000b4DéBÁѻҰןn?žî·ß\u000f\u0012ðèÛñt”s¼\u000eD—¬ûŒ£.\u0005÷Fær­Z’‡í5¶/Ëö#¤#\u001dé[Iz@$›SþšÝ&v±‹]ìb\u0017»¦’‹bw\u0017»ØÅ.v±‹]3ÈE±ÛÀ.v±‹]ìnâ¼ñ±…\u001b‚d·Ž]ìb\u0017»ØÅ®¹(vkØÅ.v±‹]ì\n™‹b·Š]ìb\u0017»ØÝ@v'7\u001b\t™Ãc7Á.v±‹]ìbWÈ\\\u0014»1v±‹]ìb\u0017»Bæ¢Ø­`\u0017»ØÅ.v7ÝI³•98vëZª°‹]ìb\u0017»BæÂØÕR…]ìb\u0017»Ø\u00152\u0017Æ®–*ìb\u0017»ØÝDv'Ë(\b™ÃcWK\u0015v±‹]ìbWÈ\\\u0018»Zª°‹]ìb\u0017»BæÂØÕR…]ìb\u0017»\u001bÙR5^³WÈ\u001c\u001e»Zª°‹]ìb\u0017»BæÂØÕR…]ìb\u0017»Ø\u00152\u0017Æ®–*ìb\u0017»ØÝHvÛ\u0016þ\u000b’]-UØÅ.v±‹]!sQìÖ´Ta\u0017»ØÅ.v…Ì…±«¥\n»ØÅ.v7‘Ý×çûBæ\u0010ÙÕR…]ìb\u0017»Ø\u00152\u0017Æ®–*ìb\u0017»ØÅ®¹0vµTa\u0017»ØÅîFÎív{Bæ\u0010ÙÕR…]ìb\u0017»Ø\u00152\u0017Æ®–*ìb\u0017»ØÅ®¹0vçj©zx„\u0019î>œ'îr—»ÜånxîFé$o”ÞQ\u0014¥õUQºVB”.Ì\u001b½+\r{ýéöãé~ûý ݎ¾\u001d=G9gØé°sɨÏ8êrLÏ\\U]þPú¬`қÍj\réHG:Ò7‹ô9H>è.\níãmÛ8$®à\u0013ŸøÄ'>7qD|ÜÁgŽ|V[øÄ'>ñ‰Ï\räs\u0012\u0010ã3?>›øÄ'>ñ‰Ï\räs2ϊÏüøÜÅ'>ñ‰O|n Ÿ“Ë•ð™\u001fŸ\r|â\u0013ŸøÄçv.Z‹Ï,|Öñ‰O|â\u0013ŸÛ¹\u001c\u000f>³ðYÃ'>ñ‰O|ngÑ0>³ðYÅ'>ñ‰O|ng…\u0012>³ð\u0019d\u0015\u0012?ùÉO~òs\rª‚ò7ŸÒ¢üøÍÜZ”ä2zMè»,}\u0007\u0013}£w¥c\fc\u0018Ãê‹\fc—ïh…£\u001cå(G9ªÇˆ£‹:š´8ÊQŽr”£\n8º°£MŽr”£\u001cå¨f#Ž.ìè.G9ÊQŽrTÅ\u0011G\u0017v´ÁQŽr”£\u001cÕuÄх\u001d­s”£\u001cå(G•\u001eqtaGk\u001cå(G9ÊQíG\u001c]ØÑ*G9ÊQŽrT\r\u0012G\u0017v4Ô\u001a$‚\u0014¤ \u0005©>¤-èCJ²ö!Å­ÚÒ\u0019Þ/ÇÕ\"\u0019®îÖã\rn#l·\u0007ô¥/}Õ ÍÐsÐýy\nt{¯3|=ýûx;\u0018¶»;'§ÃöñÙÞ°w6•ú ½¨³ãÇiV*qRiԚÕÇGÙÆáo\u0005»ØÅ.v±‹Ý<ٍãÊn½–č\u0004»IÜÂ.v±‹]ìb7Ov\u001bFe<àmV°›ÄMìb\u0017»ØÅîvv\u0004\u000b™WÁî.v±‹]ìb\u0017»Bæ¢Øm`\u0017»ØÅ.v±+d.ŠÝ:v±‹]ìbw;\u0017Ð\u00112¯‚Ý\u001av±‹]ìb\u0017»Bæ¢Ø­b\u0017»ØÅ.v±+d.ŠÝ\u0004»ØÅ.v±»«Ë\n™WÁ®–*ìb\u0017»ØÅ®¹0vµTa\u0017»ØÅ.v…ÌE±[ÑR…]ìb\u0017»›ÈîdÅ\u0003!sxìj©Â.v±‹]ì\n™\u000bcWK\u0015v±‹]ìbWÈ\\\u0018»Zª°‹]ìbw#[ªú]!sˆìj©Â.v±‹]ì\n™\u000bcWK\u0015v±‹]ìbWÈ\\\u0018»Zª°‹]ìbw#Ùm[ø/HvµTa\u0017»ØÅ.v…Ì…±«¥\n»ØÅ.v±+d.Œ]-UØÅ.v±»‰ì¾>ß\u00172‡ÇnÜÒR…]ìb\u0017»Ø\u00152\u0017Æ®–*ìb\u0017»ØÅ®¹0vµTa\u0017»ØÅîFÎív{Bæ\u0010ÙÕR…]ìb\u0017»Ø\u00152\u0017Æ®–*ìb\u0017»ØÅ®¹0vçj©zx„\u0019î>œ'îr—»ÜånxîFé$o”ÞQ\u0014¥õUQºVB”.Ì\u001b½+\r{ýéöãé~ûý ݎ¾\u001d=G9gØé°sɨÏ8êrLÏ\\Õ\\þPú¬`қÍj\réHG:Ò7‹ô9H>è.\níãmÛ8$Nð‰O|â\u0013Ÿ›8\">îà3O>c|â\u0013ŸøÄç\u0006ò9\tˆñ™\u001fŸ\u0015|â\u0013ŸøÄç\u0006ò9™gÅgn|6[øÄ'>ñ‰Ï\räsr¹\u0012>ó㳉O|â\u0013ŸøÜÎEkñ™…Ï]|â\u0013ŸøÄçv.ǃÏ,|6ð‰O|â\u0013ŸÛY4ŒÏ,|Öñ‰O|â\u0013ŸÛY¡„Ï,|\u0006Y…ÄO~ò“Ÿü\\ƒ*¤ üͧ´(?~3·\u0016Õ\u001by\u0014\u0011Ö\u0014\u0011.Kß³ÁùÁä­tÜëM?oö÷:<æ1õ\u0018Y\u0000'\u0010ˆ\u0013\u0010ƒ\u0018Ä \u00061ˆ-‰³:ˆc\u0010ƒ\u0018Ä \u00061ˆ-’³:ˆ+ \u00061ˆA\fb\u001dÁ¢é•A¼Û\u00021ˆA\fb\u0010ƒX4½:ˆ› \u00061ˆA\fb\u0010‹¦W\u0007ñ.ˆA\fb\u0010ƒØú;¢éÕAÜ\u00001ˆA\fb\u0010ƒX4½:ˆë \u00061ˆA\fb\u0010‹¦W\u0007q\rÄ \u00061ˆAlm[Ñôê Ö¬\u0005b\u0010ƒ\u0018Ä \u0016M¯\u0010bÍZ \u00061ˆA\fbÑô\n!Ö¬\u0005b\u0010ƒ\u0018ÄÛ\u0001ñdm\u0007Ñtx\u0010kÖ\u00021ˆA\fb\u0010‹¦W\u0007qC³\u0016ˆA\fb\u0010ƒX4½Bˆ5k\u0018Ä \u0006ñ–4kõ»¢é\u0010!Ö¬\u0005b\u0010ƒ\u0018Ä \u0016M¯\u0010bÍZ \u00061ˆA\fbÑô\n!Ö¬\u0005b\u0010ƒ\u0018Ä[\u0002qÛ2ˆAB¬Y\u000bÄ \u00061ˆA,š^!̵@\fb\u0010ƒ\u0018Ä¢é\u0015B¬Y\u000bÄ \u00061ˆ·\u0003â×çû¢é\u0010!Ö¬\u0005b\u0010ƒ\u0018Ä \u0016M¯\u0010bÍZ \u00061ˆA\fbÑôê ®kÖ\u00021ˆA\fâ-™#îöDÓ!B¬Y\u000bÄ \u00061ˆA,š^!̵@\fb\u0010ƒ\u0018Ä¢é\u0015B<W³ÖÃ#̐øá<‘˜Ä$&1‰×Aâ(,ŽÒû™¢´r+JW…ˆÒ…‹£w¥a¯?Ý~<Ýo¿\u001f¤äÑ·#ì(çä;\u001dš.™ù\u0019G]Žò™k»jË\u001fnŸ\u0015Œ|³Y­A\u001eò‡ü¦#?\u0007Ò\u0007ÝEé}¼m\u001b‡Í5 \u0002\u0015¨@\u0005êvŒš;@Í\u0013Ô*P\nT \u0002u+@ÄÊ@Í\u000fÔ\u0004¨@\u0005*Pº\u0015 Nækš\u001f¨1P\nT \u0002u+@\\\b\u0005Ôü@­\u0000\u0015¨@\u0005*P-ê\u000bÔÌ ÖZ@\u0005*P\nTK\u0011\u00015;¨M \u0002\u0015¨@\u0005ª\u0002e f\u0007u\u0017¨@\u0005*Pªö\t¨ÙA\r²¾‰¨D%*Q‰º–õMA‰œOÑR~ glZš×ãáÙÞé`ü.ïÎ‰ò›r¥R~S\u001e\u001c\u001e\u001eÌ\u0006ypx¸óáâþò¿w.o®ÿvuûëäOôE}ûí·ßfâûoa¿Ã7®ÄÙñü©žµ\u000fO&mbÞ«3?¯ÿS}¿'”±!\u0019;cgäáß<þ=±×¬g“«u·%Ïl3`œß§Úò}J÷^x¸ø¦\\‰ËoþÓábtýñêú—Ááá‹F•g\u0002UžESyF„ƒó½á·CÃã‡ïtNN\u0007Ó/ú½£é\u0017\u000f›ŽÚí馣?¾3\u0019PN\u0006\u0015o»F–ÔÛÊQßô\u0003eîaß×»³p\u001d-¬†ha«U~Sî¿í\u000eßOe{b¤öùâ÷ñû¥ ú¾y›­‚¼Ã£Î\u0010L`2\u001c3\u001cÛ$‚’B\bZ8-Ü8‡Ò׳\u0018Dò@\u0000\u0001\b@›\u0004P\u001c8@ÿI&¸\rƒ!\u00061ˆA\fÚ$ƒ*Å\\3ñ\u001f^ÃXË§Köçé…&“¤\u001a?u±Ä\u001f\u00171>3/5y½+Ÿ˜ú~ÒɄ\u0012²µ:²\u0002Z{™tqµ\u0015 tûyH—¤š‘Žt¤#]0Ò¹Ý,‹_™\u000bQ’V\u000e~U\u0012#µ<.!|é‚AØÁ\u000ev«ÂnŽ;¹\fëŠaq\u0017‹XÄ\"\u0016±¸ú1àË+õb±\u0018\u0016\u001bXÄ\"\u0016±ˆÅ•³8Çz»X,†Å:\u0016±ˆE,bqå,αj.\u0016‹a±†E,b\u0011‹X\\9‹s¬}‹ÅbX¬b\u0011‹XÄ\"\u0016W?·øò\n¶X,†Å\u0004‹XÄ\"\u0016±¸z\u0016Û.¹\t„Å\u0018‹XÄ\"\u0016±¸r\u0016çXM\u0016‹Å°XÁ\"\u0016±ˆE,ª£ÁâW¨…·z,\u0017¹ÈE.n¥‹ù®ìº¦®®Ù\u001a°I斜¸•CŸi\u001eª>¹ò:U©JUª®CKŽJ¸,ØíÂ\u000ev°ƒ\u001dìÖ¡û\u0006vY°kÀ\u000ev°ƒ\u001dìÖ¡Ñ\u0006vY°«Ã\u000ev°ƒ\u001dìÖ¡§\u0006vY°«Á\u000ev°ƒ\u001dìÖ¡}\u0006vY°«Â\u000ev°ƒ\u001dìÖ¡S\u0006vY°K`\u0007;ØÁ\u000evëÐ\u0014\u0003»,ØÅ°ƒ\u001dì`\u0007»uè]\u0016ì*°ƒ\u001dì`\u0007»uhu]\u0006ìâ »ZhG;ÚÑNWËÒ»Z‚ÒrÍ\u001aXâŒ\r,³¬L÷^˜Ê7åV«ü¦Ü99\u001d¼?\u0019\ff[Ù¹¹¸Þ9¹¾»¿øôiüVÛ9¹»ûrq=\u0007šå™`–gQY~\u001aÉoÞª\u000bØøðê\u0016Çñð¨3¤\u001bÝè\u0016ìXîñ\u001bÅÍ\u000fÓn!0\rÏöN\u0007{\u0007ÓÞéÜ:U*tzV§ïÑ¡\u0012•¨D¥µW©\u0011îp©·wú¾÷\fG½Û«_®®'Së¢Ðä%\u0019!±ˆEëhÑãm\u0010Z\u000eBõÀ‡F$2\u001a\"\u0010\b´\u0011\u0002ýuòÞº¹½\u001f}ì?\u000f“JR/WvËqm\u00187^U›¯êÍ\u001f[õÊÏ¥ý?PK\u0007\b­ù\u0017þ’ \u0000\u0000`]\n\u0000PK\u0001\u0002-\u0003\u0014\u0000\b\u0000\b\u0000݄îZ­ù\u0017þ’ \u0000\u0000`]\n\u0000:\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000¤\u0000\u0000\u0000\u0000criteria-set-11-exported-2025-07-14T16:38:58.967Z1073.jsonPK\u0005\u0006\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000h\u0000\u0000\u0000ú \u0000\u0000\u0000\u0000","criteriaSetId":null};
14
+ const result = guard.sanitizeObject(input);
15
+ expect(result.zipBinaryString).toBe(input.zipBinaryString);
16
+ });
17
+
18
+ test('allows clean string without altering it', () => {
19
+ const input = { comment: 'This is a safe comment.' };
20
+ const result = guard.sanitizeObject(input);
21
+ expect(result.comment).toBe('This is a safe comment.');
22
+ });
23
+
24
+ test('sanitizes basic XSS attempt', () => {
25
+ const input = { comment: '<script>alert("xss")</script>' };
26
+ const result = guard.sanitizeObject(input);
27
+ expect(result.comment).toBe('');
28
+ });
29
+
30
+ test('sanitizes inline XSS', () => {
31
+ const input = { title: '<img src=x onerror=alert(1)>' };
32
+ const result = guard.sanitizeObject(input);
33
+ expect(result.title).toBe(''); // dompurify removes the dangerous attribute
34
+ });
35
+
36
+ test('sanitizes encoded XSS attempt', () => {
37
+ const input = { encoded: '%3Cscript%3Ealert(1)%3C%2Fscript%3E' };
38
+ const result = guard.sanitizeObject(input);
39
+ expect(result.encoded).toBe(''); // <script> is decoded and then cleaned
40
+ });
41
+
42
+ test('sanitizes nested objects', () => {
43
+ const input = {
44
+ level1: {
45
+ level2: {
46
+ content: '<script>evil()</script>'
47
+ }
48
+ }
49
+ };
50
+ const result = guard.sanitizeObject(input);
51
+ expect(result.level1.level2.content).toBe('');
52
+ });
53
+
54
+ test('sanitizes arrays inside objects', () => {
55
+ const input = {
56
+ tags: ['safe', '<img src=x onerror=alert(1)>']
57
+ };
58
+ const result = guard.sanitizeObject(input);
59
+ expect(result.tags[0]).toBe('safe');
60
+ expect(result.tags[1]).toBe('');
61
+ });
62
+
63
+ test('preserves clean strings in array', () => {
64
+ const input = {
65
+ tags: ['tag1', 'tag2', 'tag3']
66
+ };
67
+ const result = guard.sanitizeObject(input);
68
+ expect(result.tags).toEqual(['tag1', 'tag2', 'tag3']);
69
+ });
70
+
71
+ test('sanitizes SVG-based XSS', () => {
72
+ const input = { x: '<svg/onload=alert(1)>' };
73
+ const result = guard.sanitizeObject(input);
74
+ expect(result.x).toBe(''); // removes onload attribute
75
+ });
76
+
77
+ test('sanitizes strings and ignores non-string values', () => {
78
+ const input = {
79
+ num: 123,
80
+ bool: true,
81
+ nullValue: null,
82
+ undef: undefined,
83
+ notReplace: 'a < b'
84
+ };
85
+
86
+ const result = guard.sanitizeObject(input);
87
+
88
+ expect(result.num).toBe(123);
89
+ expect(result.bool).toBe(true);
90
+ expect(result.nullValue).toBeNull();
91
+ expect(result.undef).toBeUndefined();
92
+ expect(result.notReplace).toBe('a &lt; b');
93
+ });
94
+
95
+ test('sanitizes XSS in deep mixed structures', () => {
96
+ const input = {
97
+ items: [
98
+ { safe: 'ok' },
99
+ { unsafe: '<iframe src="javascript:alert(1)">' }
100
+ ]
101
+ };
102
+ const result = guard.sanitizeObject(input);
103
+ expect(result.items[1].unsafe).toBe('');
104
+ });
105
+
106
+ test('sanitizes <a> with javascript href', () => {
107
+ const input = { link: '<a href="javascript:alert(1)">click</a>' };
108
+ const result = guard.sanitizeObject(input);
109
+ expect(result.link).toBe('click');
110
+ });
111
+
112
+ test('removes unexpected <object> tag', () => {
113
+ const input = { embed: '<object data="evil.swf"></object>' };
114
+ const result = guard.sanitizeObject(input);
115
+ expect(result.embed).toBe('');
116
+ });
117
+
118
+ test('removes unexpected <iframe> tag', () => {
119
+ const input = { iframe: '<iframe src="http://malicious.com"></iframe>' };
120
+ const result = guard.sanitizeObject(input);
121
+ expect(result.iframe).toBe('');
122
+ });
123
+
124
+ test('removes style attribute with expression()', () => {
125
+ const input = { style: '<div style="width:expression(alert(1))">' };
126
+ const result = guard.sanitizeObject(input);
127
+ expect(result.style).toBe('');
128
+ });
129
+
130
+ test('encodes < in string', () => {
131
+ const input = { text: 'a < b' };
132
+ const result = guard.sanitizeObject(input);
133
+ expect(result.text).toBe('a &lt; b');
134
+ });
135
+
136
+ test('allows > in string without encoding', () => {
137
+ const input = { text: 'a > b' };
138
+ const result = guard.sanitizeObject(input);
139
+ expect(result.text).toBe('a > b'); // dompurify leaves this unchanged
140
+ });
141
+
142
+ test('allows & in string without encoding', () => {
143
+ const input = { text: 'Tom & Jerry' };
144
+ const result = guard.sanitizeObject(input);
145
+ expect(result.text).toBe('Tom & Jerry'); // & is preserved if not HTML
146
+ });
147
+
148
+ test('allows " in string without encoding', () => {
149
+ const input = { text: 'She said "hello"' };
150
+ const result = guard.sanitizeObject(input);
151
+ expect(result.text).toBe('She said "hello"'); // not encoded
152
+ });
153
+
154
+ test('allows \' in string without encoding', () => {
155
+ const input = { text: "It's fine" };
156
+ const result = guard.sanitizeObject(input);
157
+ expect(result.text).toBe("It's fine"); // not encoded
158
+ });
159
+
160
+ test('encodes only special HTML characters like < when needed', () => {
161
+ const input = { text: 'if (a < b && b > c) { console.log("yes"); }' };
162
+ const result = guard.sanitizeObject(input);
163
+ expect(result.text).toBe('if (a &lt; b &amp;&amp; b &gt; c) { console.log("yes"); }');
164
+ });
165
+
166
+ test('sanitizes special chars inside deeply nested object', () => {
167
+ const input = {
168
+ user: {
169
+ profile: {
170
+ bio: `I'm <strong>bold</strong> & smart`
171
+ }
172
+ }
173
+ };
174
+ const result = guard.sanitizeObject(input);
175
+ expect(result.user.profile.bio).toBe("I'm bold &amp; smart"); // <strong> removed
176
+ });
177
+
178
+ test('sanitizes array of special char strings', () => {
179
+ const input = {
180
+ messages: ['Hello & welcome', 'a < b', 'Use "quotes"', "It's fine"]
181
+ };
182
+ const result = guard.sanitizeObject(input);
183
+ expect(result.messages).toEqual([
184
+ 'Hello & welcome',
185
+ 'a &lt; b',
186
+ 'Use "quotes"',
187
+ "It's fine"
188
+ ]);
189
+ });
190
+
191
+
192
+ // test('sanitizes XML Tags', () => {
193
+ // const input = {
194
+ // messages: [
195
+ // '<xml xmlns="https://developers.google.com/blockly/xml"><block type="main_return" id="main-return-block" deletable="false" x="30" y="30"><value name="script"><block type="context_variable" id="[p{VL@_oCmCmgd,dZUh)"><field name="VARIABLENAME">Identifier</field></block></value></block></xml>',
196
+ // '&lt;xml xmlns=&quot;https://developers.google.com/blockly/xml&quot;&gt;&lt;block type=&quot;main_return&quot; id=&quot;main-return-block&quot; deletable=&quot;false&quot; x=&quot;30&quot; y=&quot;30&quot;&gt;&lt;value name=&quot;script&quot;&gt;&lt;block type=&quot;context_variable&quot; id=&quot;[p{VL@_oCmCmgd,dZUh)&quot;&gt;&lt;field name=&quot;VARIABLENAME&quot;&gt;Identifier&lt;/field&gt;&lt;/block&gt;&lt;/value&gt;&lt;/block&gt;&lt;/xml&gt;']
197
+ // };
198
+ // const result = guard.sanitizeObject(input);
199
+ // expect(result.messages).toEqual([
200
+ // 'Identifier',
201
+ // '&lt;xml xmlns=&quot;https://developers.google.com/blockly/xml&quot;&gt;&lt;block type=&quot;main_return&quot; id=&quot;main-return-block&quot; deletable=&quot;false&quot; x=&quot;30&quot; y=&quot;30&quot;&gt;&lt;value name=&quot;script&quot;&gt;&lt;block type=&quot;context_variable&quot; id=&quot;[p{VL@_oCmCmgd,dZUh)&quot;&gt;&lt;field name=&quot;VARIABLENAME&quot;&gt;Identifier&lt;/field&gt;&lt;/block&gt;&lt;/value&gt;&lt;/block&gt;&lt;/xml&gt;'
202
+ // ]);
203
+ // });
204
+ });