WooCommerce Gutenberg Products Block - Version 4.0.1

Version Description

Download this release

Release Info

Developer aljullu
Plugin Icon 128x128 WooCommerce Gutenberg Products Block
Version 4.0.1
Comparing to
See all releases

Code changes from version 5.5.0 to 4.0.1

Files changed (295) hide show
  1. .prettierrc.js +0 -3
  2. LICENSE +0 -674
  3. assets/css/abstracts/_colors.scss +1 -2
  4. assets/css/abstracts/_mixins.scss +0 -25
  5. assets/css/editor.scss +10 -9
  6. assets/css/style.scss +0 -12
  7. assets/img/avatar.jpg +0 -0
  8. {images/previews → assets/img}/beanie.jpg +0 -0
  9. assets/img/block-error.svg +2727 -0
  10. {images/previews → assets/img}/cap.jpg +0 -0
  11. {images/previews → assets/img}/collection.jpg +0 -0
  12. assets/img/grid.svg +50 -0
  13. assets/img/no-matching-products.svg +1 -0
  14. assets/img/no-products.svg +1 -0
  15. {images → assets/img}/payment-methods/alipay.svg +0 -0
  16. {images → assets/img}/payment-methods/amex.svg +0 -0
  17. {images → assets/img}/payment-methods/bancontact.svg +0 -0
  18. {images → assets/img}/payment-methods/diners.svg +0 -0
  19. {images → assets/img}/payment-methods/discover.svg +0 -0
  20. {images → assets/img}/payment-methods/eps.svg +0 -0
  21. {images → assets/img}/payment-methods/giropay.svg +0 -0
  22. {images → assets/img}/payment-methods/ideal.svg +0 -0
  23. {images → assets/img}/payment-methods/jcb.svg +0 -0
  24. {images → assets/img}/payment-methods/laser.svg +0 -0
  25. {images → assets/img}/payment-methods/maestro.svg +0 -0
  26. {images → assets/img}/payment-methods/mastercard.svg +0 -0
  27. {images → assets/img}/payment-methods/multibanco.svg +0 -0
  28. {images → assets/img}/payment-methods/p24.svg +0 -0
  29. {images → assets/img}/payment-methods/sepa.svg +0 -0
  30. {images → assets/img}/payment-methods/sofort.svg +0 -0
  31. {images → assets/img}/payment-methods/unionpay.svg +0 -0
  32. {images → assets/img}/payment-methods/visa.svg +0 -0
  33. {images → assets/img}/payment-methods/wechat.svg +0 -0
  34. {images/previews → assets/img}/pennant.jpg +0 -0
  35. assets/img/single-product-preview.svg +5 -0
  36. assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/attribute-select-control.js +2 -4
  37. assets/js/atomic/blocks/product-elements/add-to-cart/shared/add-to-cart-button.js +5 -29
  38. assets/js/atomic/blocks/product-elements/button/block.js +16 -14
  39. assets/js/atomic/blocks/product-elements/image/block.js +51 -48
  40. assets/js/atomic/blocks/product-elements/image/test/block.test.js +0 -139
  41. assets/js/atomic/blocks/product-elements/price/block.js +1 -1
  42. assets/js/atomic/blocks/product-elements/rating/block.js +2 -1
  43. assets/js/atomic/blocks/product-elements/shared/with-product-selector.js +4 -4
  44. assets/js/atomic/blocks/product-elements/summary/block.js +4 -2
  45. assets/js/atomic/blocks/product-elements/title/block.js +30 -21
  46. assets/js/atomic/utils/index.js +5 -4
  47. assets/js/atomic/utils/render-inner-blocks.js +69 -0
  48. assets/js/atomic/utils/render-parent-block.js +41 -0
  49. assets/js/atomic/utils/render-parent-block.tsx +0 -126
  50. assets/js/base/components/block-error-boundary/block-error.js +2 -12
  51. assets/js/base/components/block-error-boundary/index.js +3 -5
  52. assets/js/base/components/block-error-boundary/style.scss +18 -16
  53. assets/js/base/components/button/index.js +55 -0
  54. assets/js/base/components/button/index.tsx +0 -48
  55. assets/js/base/components/button/style.scss +39 -1
  56. assets/js/base/components/cart-checkout/address-form/country-address-fields.js +546 -0
  57. assets/js/{settings/shared/default-address-fields.ts → base/components/cart-checkout/address-form/default-address-fields.js} +23 -73
  58. assets/js/base/components/cart-checkout/address-form/{address-form.tsx → index.js} +28 -52
  59. assets/js/base/components/cart-checkout/address-form/index.ts +0 -1
  60. assets/js/base/components/cart-checkout/address-form/prepare-address-fields.ts +0 -131
  61. assets/js/base/components/cart-checkout/address-form/test/index.js +0 -178
  62. assets/js/base/components/cart-checkout/form-step/style.scss +4 -0
  63. assets/js/base/components/cart-checkout/index.js +4 -4
  64. assets/js/base/components/cart-checkout/order-summary/index.js +1 -2
  65. assets/js/base/components/cart-checkout/order-summary/order-summary-item.js +27 -104
  66. assets/js/base/components/cart-checkout/order-summary/style.scss +12 -29
  67. assets/js/base/components/cart-checkout/order-summary/test/index.js +0 -43
  68. assets/js/base/components/cart-checkout/payment-method-icons/common-icons.js +20 -20
  69. assets/js/base/components/cart-checkout/place-order-button/index.js +2 -6
  70. assets/js/base/components/cart-checkout/policies/{index.tsx → index.js} +1 -1
  71. assets/js/base/components/cart-checkout/product-backorder-badge/{index.tsx → index.js} +1 -1
  72. assets/js/base/components/cart-checkout/product-badge/{index.tsx → index.js} +6 -9
  73. assets/js/base/components/cart-checkout/product-details/index.tsx +0 -60
  74. assets/js/base/components/cart-checkout/product-details/style.scss +0 -25
  75. assets/js/base/components/cart-checkout/product-details/test/__snapshots__/index.js.snap +0 -76
  76. assets/js/base/components/cart-checkout/product-details/test/index.js +0 -57
  77. assets/js/base/components/cart-checkout/product-image/{index.tsx → index.js} +10 -5
  78. assets/js/base/components/cart-checkout/product-low-stock-badge/{index.tsx → index.js} +7 -7
  79. assets/js/base/components/cart-checkout/product-metadata/index.js +39 -0
  80. assets/js/base/components/cart-checkout/product-metadata/index.tsx +0 -45
  81. assets/js/base/components/cart-checkout/product-metadata/style.scss +1 -1
  82. assets/js/base/components/cart-checkout/product-name/index.js +30 -0
  83. assets/js/base/components/{product-name → cart-checkout/product-name}/stories/index.js +0 -0
  84. assets/js/base/components/{product-name → cart-checkout/product-name}/style.scss +2 -0
  85. assets/js/base/components/cart-checkout/product-name/test/__snapshots__/index.js.snap +25 -0
  86. assets/js/base/components/{product-name → cart-checkout/product-name}/test/index.js +3 -16
  87. assets/js/base/components/cart-checkout/product-sale-badge/index.js +50 -0
  88. assets/js/base/components/cart-checkout/product-sale-badge/index.tsx +0 -62
  89. assets/js/base/components/cart-checkout/product-summary/{index.tsx → index.js} +10 -8
  90. assets/js/base/components/cart-checkout/product-variation-data/index.js +53 -0
  91. assets/js/base/components/cart-checkout/shipping-calculator/{address.tsx → address.js} +9 -8
  92. assets/js/base/components/cart-checkout/shipping-calculator/{index.tsx → index.js} +8 -10
  93. assets/js/base/components/cart-checkout/shipping-location/index.js +67 -0
  94. assets/js/base/components/cart-checkout/shipping-location/index.tsx +0 -70
  95. assets/js/base/components/cart-checkout/shipping-rates-control-package/index.tsx +0 -152
  96. assets/js/base/components/cart-checkout/shipping-rates-control-package/package-rates.tsx +0 -69
  97. assets/js/base/components/cart-checkout/shipping-rates-control-package/render-package-rate-option.tsx +0 -46
  98. assets/js/base/components/cart-checkout/shipping-rates-control-package/style.scss +0 -43
  99. assets/js/base/components/cart-checkout/shipping-rates-control/index.js +113 -0
  100. assets/js/base/components/cart-checkout/shipping-rates-control/index.tsx +0 -187
  101. assets/js/base/components/cart-checkout/shipping-rates-control/package-options.js +58 -0
  102. assets/js/base/components/cart-checkout/shipping-rates-control/package.js +126 -0
  103. assets/js/base/components/cart-checkout/shipping-rates-control/packages.js +76 -0
  104. assets/js/base/components/cart-checkout/shipping-rates-control/style.scss +35 -0
  105. assets/js/base/components/cart-checkout/totals/discount/stories/index.js +0 -37
  106. assets/js/base/components/cart-checkout/totals/discount/style.scss +0 -9
  107. assets/js/base/components/cart-checkout/totals/footer-item/stories/index.js +0 -32
  108. assets/js/base/components/cart-checkout/totals/footer-item/test/__snapshots__/index.js.snap +0 -79
  109. assets/js/base/components/cart-checkout/totals/footer-item/test/index.js +0 -81
  110. assets/js/base/components/cart-checkout/totals/index.js +8 -4
  111. assets/js/base/components/cart-checkout/totals/shipping/shipping-rate-selector.js +0 -48
  112. assets/js/base/components/cart-checkout/totals/shipping/shipping-via.tsx +0 -17
  113. assets/js/base/components/cart-checkout/totals/shipping/stories/index.js +0 -35
  114. assets/js/base/components/cart-checkout/totals/subtotals-item/index.js +39 -0
  115. assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/index.js +11 -11
  116. assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/stories/index.js +4 -5
  117. assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/style.scss +8 -18
  118. assets/js/base/components/cart-checkout/totals/{discount → totals-discount-item}/index.js +35 -51
  119. assets/js/base/components/cart-checkout/totals/totals-discount-item/style.scss +5 -0
  120. assets/js/base/components/cart-checkout/totals/totals-fees-item/index.js +50 -0
  121. assets/js/base/components/cart-checkout/totals/{footer-item → totals-footer-item}/index.js +11 -27
  122. assets/js/base/components/cart-checkout/totals/{footer-item → totals-footer-item}/style.scss +1 -1
  123. assets/js/base/components/cart-checkout/totals/totals-item/index.js +52 -0
  124. {packages/checkout/totals/item → assets/js/base/components/cart-checkout/totals/totals-item}/style.scss +2 -6
  125. assets/js/base/components/cart-checkout/totals/{shipping → totals-shipping-item}/has-shipping-rate.js +0 -0
  126. assets/js/base/components/cart-checkout/totals/{shipping/index.tsx → totals-shipping-item/index.js} +104 -142
  127. assets/js/base/components/cart-checkout/totals/totals-shipping-item/shipping-rate-selector.js +77 -0
  128. assets/js/base/components/cart-checkout/totals/{shipping → totals-shipping-item}/style.scss +13 -9
  129. assets/js/base/components/cart-checkout/totals/totals-taxes-item/index.js +57 -0
  130. assets/js/base/components/cart-checkout/totals/totals-taxes-item/style.scss +3 -0
  131. assets/js/base/components/checkbox-control/stories/index.js +0 -27
  132. assets/js/base/components/checkbox-control/style.scss +15 -26
  133. assets/js/base/components/checkbox-list/index.js +4 -4
  134. assets/js/base/components/chip/removable-chip.js +1 -1
  135. assets/js/base/components/chip/stories/index.js +0 -42
  136. assets/js/base/components/country-input/CountryInputProps.ts +0 -15
  137. assets/js/base/components/country-input/billing-country-input.js +23 -0
  138. assets/js/base/components/country-input/billing-country-input.tsx +0 -16
  139. assets/js/base/components/country-input/{country-input.tsx → country-input.js} +14 -2
  140. assets/js/base/components/country-input/{index.ts → index.js} +0 -0
  141. assets/js/base/components/country-input/shipping-country-input.js +23 -0
  142. assets/js/base/components/country-input/shipping-country-input.tsx +0 -16
  143. assets/js/base/components/dropdown-selector/index.js +1 -1
  144. assets/js/base/components/dropdown-selector/menu.js +1 -1
  145. assets/js/base/components/dropdown-selector/selected-chip.js +1 -1
  146. assets/js/base/components/filter-submit-button/index.js +1 -1
  147. assets/js/base/components/formatted-monetary-amount/{index.tsx → index.js} +20 -33
  148. assets/js/base/components/label/{index.tsx → index.js} +15 -10
  149. assets/js/base/components/loading-mask/index.js +17 -16
  150. assets/js/base/components/loading-mask/style.scss +3 -4
  151. packages/checkout/panel/index.tsx → assets/js/base/components/panel/index.js +15 -16
  152. assets/js/base/components/panel/style.scss +50 -0
  153. assets/js/base/components/payment-methods/express-payment-methods.js +86 -0
  154. assets/js/base/components/payment-methods/express-payment/cart-express-payment.js +47 -0
  155. assets/js/base/components/payment-methods/express-payment/checkout-express-payment.js +78 -0
  156. assets/js/{blocks/cart-checkout → base/components}/payment-methods/express-payment/index.js +0 -0
  157. assets/js/{blocks/cart-checkout → base/components}/payment-methods/express-payment/style.scss +0 -0
  158. assets/js/{blocks/cart-checkout → base/components}/payment-methods/index.js +0 -0
  159. assets/js/{blocks/cart-checkout → base/components}/payment-methods/no-payment-methods/index.js +1 -1
  160. assets/js/{blocks/cart-checkout → base/components}/payment-methods/no-payment-methods/style.scss +0 -0
  161. assets/js/{blocks/cart-checkout → base/components}/payment-methods/payment-method-error-boundary.js +2 -2
  162. assets/js/base/components/payment-methods/payment-method-options.js +93 -0
  163. assets/js/{blocks/cart-checkout/payment-methods/payment-method-card.js → base/components/payment-methods/payment-method-tab.js} +10 -10
  164. assets/js/base/components/payment-methods/payment-methods.js +43 -0
  165. assets/js/{blocks/cart-checkout → base/components}/payment-methods/saved-payment-method-options.js +45 -51
  166. assets/js/{blocks/cart-checkout → base/components}/payment-methods/style.scss +15 -76
  167. assets/js/{blocks/cart-checkout → base/components}/payment-methods/test/payment-methods.js +34 -56
  168. assets/js/base/components/price-slider/index.js +7 -8
  169. assets/js/base/components/price-slider/style.scss +6 -6
  170. assets/js/base/components/{product-list/product-list-item → product-list-item}/index.js +0 -0
  171. assets/js/base/components/{product-list/product-list-item → product-list-item}/utils.js +0 -0
  172. assets/js/base/components/product-list/container.js +2 -7
  173. assets/js/base/components/product-list/index.js +242 -2
  174. assets/js/base/components/product-list/product-list.js +0 -262
  175. assets/js/base/components/product-list/style.scss +0 -5
  176. assets/js/base/components/product-name/index.tsx +0 -48
  177. assets/js/base/components/product-name/test/__snapshots__/index.js.snap +0 -49
  178. assets/js/base/components/product-price/index.js +53 -71
  179. assets/js/base/components/product-price/stories/index.js +32 -7
  180. assets/js/base/components/product-price/test/__snapshots__/index.js.snap +0 -57
  181. assets/js/base/components/product-price/test/index.js +0 -63
  182. assets/js/base/components/{product-list/product-sort-select → product-sort-select}/index.js +0 -0
  183. assets/js/base/components/{product-list/product-sort-select → product-sort-select}/style.scss +0 -0
  184. assets/js/base/components/quantity-selector/{index.tsx → index.js} +17 -19
  185. assets/js/base/components/quantity-selector/style.scss +3 -17
  186. assets/js/base/components/radio-control-accordion/index.js +0 -73
  187. assets/js/base/components/radio-control/index.js +1 -1
  188. assets/js/base/components/radio-control/{option-layout.tsx → option-layout.js} +5 -11
  189. assets/js/base/components/radio-control/option.js +1 -6
  190. assets/js/base/components/radio-control/style.scss +36 -28
  191. assets/js/base/components/read-more/test/index.js +3 -3
  192. assets/js/base/components/reviews/review-list-item/index.js +10 -7
  193. assets/js/base/components/reviews/review-list/index.js +6 -5
  194. assets/js/base/components/select/index.js +60 -1
  195. assets/js/base/components/select/select.js +0 -60
  196. assets/js/base/components/select/style.scss +3 -45
  197. assets/js/base/components/select/validated.js +3 -5
  198. assets/js/base/components/sidebar-layout/style.scss +7 -12
  199. assets/js/base/components/spinner/index.tsx +0 -10
  200. assets/js/base/components/spinner/style.scss +0 -37
  201. assets/js/base/components/state-input/StateInputProps.ts +0 -15
  202. assets/js/base/components/state-input/billing-state-input.js +23 -0
  203. assets/js/base/components/state-input/billing-state-input.tsx +0 -16
  204. assets/js/base/components/state-input/{index.ts → index.js} +0 -0
  205. assets/js/base/components/state-input/shipping-state-input.js +23 -0
  206. assets/js/base/components/state-input/shipping-state-input.tsx +0 -16
  207. assets/js/base/components/state-input/{state-input.tsx → state-input.js} +20 -4
  208. assets/js/base/components/store-notices-container/index.js +2 -0
  209. assets/js/base/components/store-notices-container/snackbar-notices.js +29 -0
  210. assets/js/base/{context/providers/store-notices/components → components/store-notices-container}/store-notices-container.js +3 -1
  211. assets/js/base/{context/providers/store-notices/components → components/store-notices-container}/style.scss +21 -0
  212. assets/js/base/components/summary/{index.tsx → index.js} +1 -8
  213. assets/js/base/components/text-input/debounced-validated.js +35 -0
  214. assets/js/base/components/text-input/{text-input.tsx → index.js} +23 -26
  215. assets/js/base/components/text-input/index.ts +0 -2
  216. assets/js/base/components/text-input/style.scss +0 -20
  217. assets/js/base/components/text-input/validated-text-input.tsx +0 -166
  218. assets/js/base/components/text-input/validated.js +130 -0
  219. assets/js/base/components/title/index.js +1 -1
  220. assets/js/base/components/title/style.scss +0 -2
  221. assets/js/base/{context/providers/validation/components → components/validation}/index.js +0 -0
  222. assets/js/base/{context/providers/validation/components/validation-input-error → components/validation}/style.scss +0 -0
  223. assets/js/base/{context/providers/validation/components/validation-input-error/index.js → components/validation/validation-input-error.js} +2 -5
  224. assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/actions.js +0 -0
  225. assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/constants.js +0 -0
  226. assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/event-emit.js +9 -3
  227. assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/index.js +34 -37
  228. assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/reducer.js +0 -0
  229. assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form/index.js +5 -1
  230. assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form/submit/index.js +7 -8
  231. assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/index.js +0 -0
  232. assets/js/base/context/{providers/cart-checkout → cart-checkout}/cart/index.js +0 -0
  233. assets/js/base/context/cart-checkout/checkout-state/actions.js +82 -0
  234. assets/js/base/context/cart-checkout/checkout-state/constants.js +51 -0
  235. assets/js/base/context/cart-checkout/checkout-state/event-emit.js +53 -0
  236. assets/js/base/context/{providers/cart-checkout/checkout-state/index.tsx → cart-checkout/checkout-state/index.js} +132 -140
  237. assets/js/base/context/cart-checkout/checkout-state/reducer.js +235 -0
  238. assets/js/base/context/{providers/cart-checkout → cart-checkout}/checkout/index.js +11 -14
  239. assets/js/base/context/{providers/cart-checkout → cart-checkout}/checkout/processor/index.js +38 -46
  240. assets/js/base/context/{providers/cart-checkout → cart-checkout}/checkout/processor/utils.js +0 -0
  241. assets/js/base/context/{providers/cart-checkout → cart-checkout}/customer/index.js +1 -5
  242. assets/js/base/context/{providers/cart-checkout → cart-checkout}/index.js +0 -0
  243. assets/js/base/context/cart-checkout/payment-methods/actions.js +111 -0
  244. assets/js/base/context/cart-checkout/payment-methods/constants.js +80 -0
  245. assets/js/base/context/cart-checkout/payment-methods/event-emit.js +41 -0
  246. assets/js/base/context/{providers/cart-checkout/payment-methods/index.ts → cart-checkout/payment-methods/index.js} +0 -0
  247. assets/js/base/context/cart-checkout/payment-methods/payment-method-data-context.js +464 -0
  248. assets/js/base/context/cart-checkout/payment-methods/reducer.js +131 -0
  249. assets/js/base/context/{providers/cart-checkout → cart-checkout}/payment-methods/test/payment-method-data-context.js +7 -21
  250. assets/js/base/context/{providers/cart-checkout/payment-methods/use-payment-method-registration.ts → cart-checkout/payment-methods/use-payment-method-registration.js} +47 -77
  251. assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/constants.js +1 -0
  252. assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/event-emit.js +3 -3
  253. assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/index.js +80 -49
  254. assets/js/base/context/{providers/container-width-context.js → container-width-context.js} +0 -0
  255. assets/js/base/context/{providers/editor-context.js → editor/index.js} +1 -13
  256. assets/js/base/context/event-emit/emitter-callback.ts +0 -16
  257. assets/js/base/context/event-emit/reducer.ts +0 -65
  258. assets/js/base/context/event-emit/types.ts +0 -18
  259. assets/js/base/context/event-emit/utils.ts +0 -15
  260. assets/js/base/context/hooks/cart/use-store-cart-item-quantity.ts +0 -146
  261. assets/js/base/context/hooks/collections/index.js +0 -3
  262. assets/js/base/context/hooks/index.js +0 -14
  263. assets/js/base/context/hooks/payment-methods/use-payment-methods.js +0 -35
  264. assets/js/base/context/hooks/payment-methods/utils.ts +0 -85
  265. assets/js/base/context/hooks/shipping/index.js +0 -2
  266. assets/js/base/context/hooks/shipping/use-select-shipping-rate.ts +0 -81
  267. assets/js/base/context/hooks/shipping/use-select-shipping-rates.ts +0 -55
  268. assets/js/base/context/hooks/test/use-store-snackbar-notices.js +0 -51
  269. assets/js/base/context/hooks/use-checkout-submit.js +0 -47
  270. assets/js/base/context/hooks/use-customer-data.ts +0 -181
  271. assets/js/base/context/hooks/use-emit-response.ts +0 -66
  272. assets/js/base/context/hooks/use-store-events.ts +0 -66
  273. assets/js/base/context/hooks/use-store-snackbar-notices.js +0 -52
  274. assets/js/base/context/index.js +7 -0
  275. assets/js/base/context/index.ts +0 -3
  276. assets/js/base/context/providers/cart-checkout/checkout-state/actions.ts +0 -110
  277. assets/js/base/context/providers/cart-checkout/checkout-state/constants.ts +0 -84
  278. assets/js/base/context/providers/cart-checkout/checkout-state/event-emit.ts +0 -62
  279. assets/js/base/context/providers/cart-checkout/checkout-state/reducer.ts +0 -197
  280. assets/js/base/context/providers/cart-checkout/checkout-state/types.ts +0 -103
  281. assets/js/base/context/providers/cart-checkout/checkout-state/utils.ts +0 -63
  282. assets/js/base/context/providers/cart-checkout/payment-methods/actions.ts +0 -78
  283. assets/js/base/context/providers/cart-checkout/payment-methods/constants.ts +0 -77
  284. assets/js/base/context/providers/cart-checkout/payment-methods/event-emit.ts +0 -49
  285. assets/js/base/context/providers/cart-checkout/payment-methods/payment-method-data-context.tsx +0 -355
  286. assets/js/base/context/providers/cart-checkout/payment-methods/reducer.ts +0 -120
  287. assets/js/base/context/providers/cart-checkout/payment-methods/types.ts +0 -161
  288. assets/js/base/context/providers/cart-checkout/payment-methods/use-active-payment-method.ts +0 -38
  289. assets/js/base/context/providers/cart-checkout/payment-methods/use-payment-method-dispatchers.ts +0 -105
  290. assets/js/base/context/providers/cart-checkout/payment-methods/utils.ts +0 -43
  291. assets/js/base/context/providers/cart-checkout/shipping/reducers.js +0 -18
  292. assets/js/base/context/providers/cart-checkout/shipping/utils.js +0 -16
  293. assets/js/base/context/providers/index.js +0 -9
  294. assets/js/base/context/providers/store-notices/index.js +0 -2
  295. assets/js/base/context/providers/store-snackbar-notices/components/snackbar-notices-container.js +0 -36
.prettierrc.js DELETED
@@ -1,3 +0,0 @@
1
- // Import the default config file and expose it in the project root.
2
- // Useful for editor integrations.
3
- module.exports = require( '@wordpress/prettier-config' );
 
 
 
LICENSE DELETED
@@ -1,674 +0,0 @@
1
- GNU GENERAL PUBLIC LICENSE
2
- Version 3, 29 June 2007
3
-
4
- Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
5
- Everyone is permitted to copy and distribute verbatim copies
6
- of this license document, but changing it is not allowed.
7
-
8
- Preamble
9
-
10
- The GNU General Public License is a free, copyleft license for
11
- software and other kinds of works.
12
-
13
- The licenses for most software and other practical works are designed
14
- to take away your freedom to share and change the works. By contrast,
15
- the GNU General Public License is intended to guarantee your freedom to
16
- share and change all versions of a program--to make sure it remains free
17
- software for all its users. We, the Free Software Foundation, use the
18
- GNU General Public License for most of our software; it applies also to
19
- any other work released this way by its authors. You can apply it to
20
- your programs, too.
21
-
22
- When we speak of free software, we are referring to freedom, not
23
- price. Our General Public Licenses are designed to make sure that you
24
- have the freedom to distribute copies of free software (and charge for
25
- them if you wish), that you receive source code or can get it if you
26
- want it, that you can change the software or use pieces of it in new
27
- free programs, and that you know you can do these things.
28
-
29
- To protect your rights, we need to prevent others from denying you
30
- these rights or asking you to surrender the rights. Therefore, you have
31
- certain responsibilities if you distribute copies of the software, or if
32
- you modify it: responsibilities to respect the freedom of others.
33
-
34
- For example, if you distribute copies of such a program, whether
35
- gratis or for a fee, you must pass on to the recipients the same
36
- freedoms that you received. You must make sure that they, too, receive
37
- or can get the source code. And you must show them these terms so they
38
- know their rights.
39
-
40
- Developers that use the GNU GPL protect your rights with two steps:
41
- (1) assert copyright on the software, and (2) offer you this License
42
- giving you legal permission to copy, distribute and/or modify it.
43
-
44
- For the developers' and authors' protection, the GPL clearly explains
45
- that there is no warranty for this free software. For both users' and
46
- authors' sake, the GPL requires that modified versions be marked as
47
- changed, so that their problems will not be attributed erroneously to
48
- authors of previous versions.
49
-
50
- Some devices are designed to deny users access to install or run
51
- modified versions of the software inside them, although the manufacturer
52
- can do so. This is fundamentally incompatible with the aim of
53
- protecting users' freedom to change the software. The systematic
54
- pattern of such abuse occurs in the area of products for individuals to
55
- use, which is precisely where it is most unacceptable. Therefore, we
56
- have designed this version of the GPL to prohibit the practice for those
57
- products. If such problems arise substantially in other domains, we
58
- stand ready to extend this provision to those domains in future versions
59
- of the GPL, as needed to protect the freedom of users.
60
-
61
- Finally, every program is threatened constantly by software patents.
62
- States should not allow patents to restrict development and use of
63
- software on general-purpose computers, but in those that do, we wish to
64
- avoid the special danger that patents applied to a free program could
65
- make it effectively proprietary. To prevent this, the GPL assures that
66
- patents cannot be used to render the program non-free.
67
-
68
- The precise terms and conditions for copying, distribution and
69
- modification follow.
70
-
71
- TERMS AND CONDITIONS
72
-
73
- 0. Definitions.
74
-
75
- "This License" refers to version 3 of the GNU General Public License.
76
-
77
- "Copyright" also means copyright-like laws that apply to other kinds of
78
- works, such as semiconductor masks.
79
-
80
- "The Program" refers to any copyrightable work licensed under this
81
- License. Each licensee is addressed as "you". "Licensees" and
82
- "recipients" may be individuals or organizations.
83
-
84
- To "modify" a work means to copy from or adapt all or part of the work
85
- in a fashion requiring copyright permission, other than the making of an
86
- exact copy. The resulting work is called a "modified version" of the
87
- earlier work or a work "based on" the earlier work.
88
-
89
- A "covered work" means either the unmodified Program or a work based
90
- on the Program.
91
-
92
- To "propagate" a work means to do anything with it that, without
93
- permission, would make you directly or secondarily liable for
94
- infringement under applicable copyright law, except executing it on a
95
- computer or modifying a private copy. Propagation includes copying,
96
- distribution (with or without modification), making available to the
97
- public, and in some countries other activities as well.
98
-
99
- To "convey" a work means any kind of propagation that enables other
100
- parties to make or receive copies. Mere interaction with a user through
101
- a computer network, with no transfer of a copy, is not conveying.
102
-
103
- An interactive user interface displays "Appropriate Legal Notices"
104
- to the extent that it includes a convenient and prominently visible
105
- feature that (1) displays an appropriate copyright notice, and (2)
106
- tells the user that there is no warranty for the work (except to the
107
- extent that warranties are provided), that licensees may convey the
108
- work under this License, and how to view a copy of this License. If
109
- the interface presents a list of user commands or options, such as a
110
- menu, a prominent item in the list meets this criterion.
111
-
112
- 1. Source Code.
113
-
114
- The "source code" for a work means the preferred form of the work
115
- for making modifications to it. "Object code" means any non-source
116
- form of a work.
117
-
118
- A "Standard Interface" means an interface that either is an official
119
- standard defined by a recognized standards body, or, in the case of
120
- interfaces specified for a particular programming language, one that
121
- is widely used among developers working in that language.
122
-
123
- The "System Libraries" of an executable work include anything, other
124
- than the work as a whole, that (a) is included in the normal form of
125
- packaging a Major Component, but which is not part of that Major
126
- Component, and (b) serves only to enable use of the work with that
127
- Major Component, or to implement a Standard Interface for which an
128
- implementation is available to the public in source code form. A
129
- "Major Component", in this context, means a major essential component
130
- (kernel, window system, and so on) of the specific operating system
131
- (if any) on which the executable work runs, or a compiler used to
132
- produce the work, or an object code interpreter used to run it.
133
-
134
- The "Corresponding Source" for a work in object code form means all
135
- the source code needed to generate, install, and (for an executable
136
- work) run the object code and to modify the work, including scripts to
137
- control those activities. However, it does not include the work's
138
- System Libraries, or general-purpose tools or generally available free
139
- programs which are used unmodified in performing those activities but
140
- which are not part of the work. For example, Corresponding Source
141
- includes interface definition files associated with source files for
142
- the work, and the source code for shared libraries and dynamically
143
- linked subprograms that the work is specifically designed to require,
144
- such as by intimate data communication or control flow between those
145
- subprograms and other parts of the work.
146
-
147
- The Corresponding Source need not include anything that users
148
- can regenerate automatically from other parts of the Corresponding
149
- Source.
150
-
151
- The Corresponding Source for a work in source code form is that
152
- same work.
153
-
154
- 2. Basic Permissions.
155
-
156
- All rights granted under this License are granted for the term of
157
- copyright on the Program, and are irrevocable provided the stated
158
- conditions are met. This License explicitly affirms your unlimited
159
- permission to run the unmodified Program. The output from running a
160
- covered work is covered by this License only if the output, given its
161
- content, constitutes a covered work. This License acknowledges your
162
- rights of fair use or other equivalent, as provided by copyright law.
163
-
164
- You may make, run and propagate covered works that you do not
165
- convey, without conditions so long as your license otherwise remains
166
- in force. You may convey covered works to others for the sole purpose
167
- of having them make modifications exclusively for you, or provide you
168
- with facilities for running those works, provided that you comply with
169
- the terms of this License in conveying all material for which you do
170
- not control copyright. Those thus making or running the covered works
171
- for you must do so exclusively on your behalf, under your direction
172
- and control, on terms that prohibit them from making any copies of
173
- your copyrighted material outside their relationship with you.
174
-
175
- Conveying under any other circumstances is permitted solely under
176
- the conditions stated below. Sublicensing is not allowed; section 10
177
- makes it unnecessary.
178
-
179
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180
-
181
- No covered work shall be deemed part of an effective technological
182
- measure under any applicable law fulfilling obligations under article
183
- 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184
- similar laws prohibiting or restricting circumvention of such
185
- measures.
186
-
187
- When you convey a covered work, you waive any legal power to forbid
188
- circumvention of technological measures to the extent such circumvention
189
- is effected by exercising rights under this License with respect to
190
- the covered work, and you disclaim any intention to limit operation or
191
- modification of the work as a means of enforcing, against the work's
192
- users, your or third parties' legal rights to forbid circumvention of
193
- technological measures.
194
-
195
- 4. Conveying Verbatim Copies.
196
-
197
- You may convey verbatim copies of the Program's source code as you
198
- receive it, in any medium, provided that you conspicuously and
199
- appropriately publish on each copy an appropriate copyright notice;
200
- keep intact all notices stating that this License and any
201
- non-permissive terms added in accord with section 7 apply to the code;
202
- keep intact all notices of the absence of any warranty; and give all
203
- recipients a copy of this License along with the Program.
204
-
205
- You may charge any price or no price for each copy that you convey,
206
- and you may offer support or warranty protection for a fee.
207
-
208
- 5. Conveying Modified Source Versions.
209
-
210
- You may convey a work based on the Program, or the modifications to
211
- produce it from the Program, in the form of source code under the
212
- terms of section 4, provided that you also meet all of these conditions:
213
-
214
- a) The work must carry prominent notices stating that you modified
215
- it, and giving a relevant date.
216
-
217
- b) The work must carry prominent notices stating that it is
218
- released under this License and any conditions added under section
219
- 7. This requirement modifies the requirement in section 4 to
220
- "keep intact all notices".
221
-
222
- c) You must license the entire work, as a whole, under this
223
- License to anyone who comes into possession of a copy. This
224
- License will therefore apply, along with any applicable section 7
225
- additional terms, to the whole of the work, and all its parts,
226
- regardless of how they are packaged. This License gives no
227
- permission to license the work in any other way, but it does not
228
- invalidate such permission if you have separately received it.
229
-
230
- d) If the work has interactive user interfaces, each must display
231
- Appropriate Legal Notices; however, if the Program has interactive
232
- interfaces that do not display Appropriate Legal Notices, your
233
- work need not make them do so.
234
-
235
- A compilation of a covered work with other separate and independent
236
- works, which are not by their nature extensions of the covered work,
237
- and which are not combined with it such as to form a larger program,
238
- in or on a volume of a storage or distribution medium, is called an
239
- "aggregate" if the compilation and its resulting copyright are not
240
- used to limit the access or legal rights of the compilation's users
241
- beyond what the individual works permit. Inclusion of a covered work
242
- in an aggregate does not cause this License to apply to the other
243
- parts of the aggregate.
244
-
245
- 6. Conveying Non-Source Forms.
246
-
247
- You may convey a covered work in object code form under the terms
248
- of sections 4 and 5, provided that you also convey the
249
- machine-readable Corresponding Source under the terms of this License,
250
- in one of these ways:
251
-
252
- a) Convey the object code in, or embodied in, a physical product
253
- (including a physical distribution medium), accompanied by the
254
- Corresponding Source fixed on a durable physical medium
255
- customarily used for software interchange.
256
-
257
- b) Convey the object code in, or embodied in, a physical product
258
- (including a physical distribution medium), accompanied by a
259
- written offer, valid for at least three years and valid for as
260
- long as you offer spare parts or customer support for that product
261
- model, to give anyone who possesses the object code either (1) a
262
- copy of the Corresponding Source for all the software in the
263
- product that is covered by this License, on a durable physical
264
- medium customarily used for software interchange, for a price no
265
- more than your reasonable cost of physically performing this
266
- conveying of source, or (2) access to copy the
267
- Corresponding Source from a network server at no charge.
268
-
269
- c) Convey individual copies of the object code with a copy of the
270
- written offer to provide the Corresponding Source. This
271
- alternative is allowed only occasionally and noncommercially, and
272
- only if you received the object code with such an offer, in accord
273
- with subsection 6b.
274
-
275
- d) Convey the object code by offering access from a designated
276
- place (gratis or for a charge), and offer equivalent access to the
277
- Corresponding Source in the same way through the same place at no
278
- further charge. You need not require recipients to copy the
279
- Corresponding Source along with the object code. If the place to
280
- copy the object code is a network server, the Corresponding Source
281
- may be on a different server (operated by you or a third party)
282
- that supports equivalent copying facilities, provided you maintain
283
- clear directions next to the object code saying where to find the
284
- Corresponding Source. Regardless of what server hosts the
285
- Corresponding Source, you remain obligated to ensure that it is
286
- available for as long as needed to satisfy these requirements.
287
-
288
- e) Convey the object code using peer-to-peer transmission, provided
289
- you inform other peers where the object code and Corresponding
290
- Source of the work are being offered to the general public at no
291
- charge under subsection 6d.
292
-
293
- A separable portion of the object code, whose source code is excluded
294
- from the Corresponding Source as a System Library, need not be
295
- included in conveying the object code work.
296
-
297
- A "User Product" is either (1) a "consumer product", which means any
298
- tangible personal property which is normally used for personal, family,
299
- or household purposes, or (2) anything designed or sold for incorporation
300
- into a dwelling. In determining whether a product is a consumer product,
301
- doubtful cases shall be resolved in favor of coverage. For a particular
302
- product received by a particular user, "normally used" refers to a
303
- typical or common use of that class of product, regardless of the status
304
- of the particular user or of the way in which the particular user
305
- actually uses, or expects or is expected to use, the product. A product
306
- is a consumer product regardless of whether the product has substantial
307
- commercial, industrial or non-consumer uses, unless such uses represent
308
- the only significant mode of use of the product.
309
-
310
- "Installation Information" for a User Product means any methods,
311
- procedures, authorization keys, or other information required to install
312
- and execute modified versions of a covered work in that User Product from
313
- a modified version of its Corresponding Source. The information must
314
- suffice to ensure that the continued functioning of the modified object
315
- code is in no case prevented or interfered with solely because
316
- modification has been made.
317
-
318
- If you convey an object code work under this section in, or with, or
319
- specifically for use in, a User Product, and the conveying occurs as
320
- part of a transaction in which the right of possession and use of the
321
- User Product is transferred to the recipient in perpetuity or for a
322
- fixed term (regardless of how the transaction is characterized), the
323
- Corresponding Source conveyed under this section must be accompanied
324
- by the Installation Information. But this requirement does not apply
325
- if neither you nor any third party retains the ability to install
326
- modified object code on the User Product (for example, the work has
327
- been installed in ROM).
328
-
329
- The requirement to provide Installation Information does not include a
330
- requirement to continue to provide support service, warranty, or updates
331
- for a work that has been modified or installed by the recipient, or for
332
- the User Product in which it has been modified or installed. Access to a
333
- network may be denied when the modification itself materially and
334
- adversely affects the operation of the network or violates the rules and
335
- protocols for communication across the network.
336
-
337
- Corresponding Source conveyed, and Installation Information provided,
338
- in accord with this section must be in a format that is publicly
339
- documented (and with an implementation available to the public in
340
- source code form), and must require no special password or key for
341
- unpacking, reading or copying.
342
-
343
- 7. Additional Terms.
344
-
345
- "Additional permissions" are terms that supplement the terms of this
346
- License by making exceptions from one or more of its conditions.
347
- Additional permissions that are applicable to the entire Program shall
348
- be treated as though they were included in this License, to the extent
349
- that they are valid under applicable law. If additional permissions
350
- apply only to part of the Program, that part may be used separately
351
- under those permissions, but the entire Program remains governed by
352
- this License without regard to the additional permissions.
353
-
354
- When you convey a copy of a covered work, you may at your option
355
- remove any additional permissions from that copy, or from any part of
356
- it. (Additional permissions may be written to require their own
357
- removal in certain cases when you modify the work.) You may place
358
- additional permissions on material, added by you to a covered work,
359
- for which you have or can give appropriate copyright permission.
360
-
361
- Notwithstanding any other provision of this License, for material you
362
- add to a covered work, you may (if authorized by the copyright holders of
363
- that material) supplement the terms of this License with terms:
364
-
365
- a) Disclaiming warranty or limiting liability differently from the
366
- terms of sections 15 and 16 of this License; or
367
-
368
- b) Requiring preservation of specified reasonable legal notices or
369
- author attributions in that material or in the Appropriate Legal
370
- Notices displayed by works containing it; or
371
-
372
- c) Prohibiting misrepresentation of the origin of that material, or
373
- requiring that modified versions of such material be marked in
374
- reasonable ways as different from the original version; or
375
-
376
- d) Limiting the use for publicity purposes of names of licensors or
377
- authors of the material; or
378
-
379
- e) Declining to grant rights under trademark law for use of some
380
- trade names, trademarks, or service marks; or
381
-
382
- f) Requiring indemnification of licensors and authors of that
383
- material by anyone who conveys the material (or modified versions of
384
- it) with contractual assumptions of liability to the recipient, for
385
- any liability that these contractual assumptions directly impose on
386
- those licensors and authors.
387
-
388
- All other non-permissive additional terms are considered "further
389
- restrictions" within the meaning of section 10. If the Program as you
390
- received it, or any part of it, contains a notice stating that it is
391
- governed by this License along with a term that is a further
392
- restriction, you may remove that term. If a license document contains
393
- a further restriction but permits relicensing or conveying under this
394
- License, you may add to a covered work material governed by the terms
395
- of that license document, provided that the further restriction does
396
- not survive such relicensing or conveying.
397
-
398
- If you add terms to a covered work in accord with this section, you
399
- must place, in the relevant source files, a statement of the
400
- additional terms that apply to those files, or a notice indicating
401
- where to find the applicable terms.
402
-
403
- Additional terms, permissive or non-permissive, may be stated in the
404
- form of a separately written license, or stated as exceptions;
405
- the above requirements apply either way.
406
-
407
- 8. Termination.
408
-
409
- You may not propagate or modify a covered work except as expressly
410
- provided under this License. Any attempt otherwise to propagate or
411
- modify it is void, and will automatically terminate your rights under
412
- this License (including any patent licenses granted under the third
413
- paragraph of section 11).
414
-
415
- However, if you cease all violation of this License, then your
416
- license from a particular copyright holder is reinstated (a)
417
- provisionally, unless and until the copyright holder explicitly and
418
- finally terminates your license, and (b) permanently, if the copyright
419
- holder fails to notify you of the violation by some reasonable means
420
- prior to 60 days after the cessation.
421
-
422
- Moreover, your license from a particular copyright holder is
423
- reinstated permanently if the copyright holder notifies you of the
424
- violation by some reasonable means, this is the first time you have
425
- received notice of violation of this License (for any work) from that
426
- copyright holder, and you cure the violation prior to 30 days after
427
- your receipt of the notice.
428
-
429
- Termination of your rights under this section does not terminate the
430
- licenses of parties who have received copies or rights from you under
431
- this License. If your rights have been terminated and not permanently
432
- reinstated, you do not qualify to receive new licenses for the same
433
- material under section 10.
434
-
435
- 9. Acceptance Not Required for Having Copies.
436
-
437
- You are not required to accept this License in order to receive or
438
- run a copy of the Program. Ancillary propagation of a covered work
439
- occurring solely as a consequence of using peer-to-peer transmission
440
- to receive a copy likewise does not require acceptance. However,
441
- nothing other than this License grants you permission to propagate or
442
- modify any covered work. These actions infringe copyright if you do
443
- not accept this License. Therefore, by modifying or propagating a
444
- covered work, you indicate your acceptance of this License to do so.
445
-
446
- 10. Automatic Licensing of Downstream Recipients.
447
-
448
- Each time you convey a covered work, the recipient automatically
449
- receives a license from the original licensors, to run, modify and
450
- propagate that work, subject to this License. You are not responsible
451
- for enforcing compliance by third parties with this License.
452
-
453
- An "entity transaction" is a transaction transferring control of an
454
- organization, or substantially all assets of one, or subdividing an
455
- organization, or merging organizations. If propagation of a covered
456
- work results from an entity transaction, each party to that
457
- transaction who receives a copy of the work also receives whatever
458
- licenses to the work the party's predecessor in interest had or could
459
- give under the previous paragraph, plus a right to possession of the
460
- Corresponding Source of the work from the predecessor in interest, if
461
- the predecessor has it or can get it with reasonable efforts.
462
-
463
- You may not impose any further restrictions on the exercise of the
464
- rights granted or affirmed under this License. For example, you may
465
- not impose a license fee, royalty, or other charge for exercise of
466
- rights granted under this License, and you may not initiate litigation
467
- (including a cross-claim or counterclaim in a lawsuit) alleging that
468
- any patent claim is infringed by making, using, selling, offering for
469
- sale, or importing the Program or any portion of it.
470
-
471
- 11. Patents.
472
-
473
- A "contributor" is a copyright holder who authorizes use under this
474
- License of the Program or a work on which the Program is based. The
475
- work thus licensed is called the contributor's "contributor version".
476
-
477
- A contributor's "essential patent claims" are all patent claims
478
- owned or controlled by the contributor, whether already acquired or
479
- hereafter acquired, that would be infringed by some manner, permitted
480
- by this License, of making, using, or selling its contributor version,
481
- but do not include claims that would be infringed only as a
482
- consequence of further modification of the contributor version. For
483
- purposes of this definition, "control" includes the right to grant
484
- patent sublicenses in a manner consistent with the requirements of
485
- this License.
486
-
487
- Each contributor grants you a non-exclusive, worldwide, royalty-free
488
- patent license under the contributor's essential patent claims, to
489
- make, use, sell, offer for sale, import and otherwise run, modify and
490
- propagate the contents of its contributor version.
491
-
492
- In the following three paragraphs, a "patent license" is any express
493
- agreement or commitment, however denominated, not to enforce a patent
494
- (such as an express permission to practice a patent or covenant not to
495
- sue for patent infringement). To "grant" such a patent license to a
496
- party means to make such an agreement or commitment not to enforce a
497
- patent against the party.
498
-
499
- If you convey a covered work, knowingly relying on a patent license,
500
- and the Corresponding Source of the work is not available for anyone
501
- to copy, free of charge and under the terms of this License, through a
502
- publicly available network server or other readily accessible means,
503
- then you must either (1) cause the Corresponding Source to be so
504
- available, or (2) arrange to deprive yourself of the benefit of the
505
- patent license for this particular work, or (3) arrange, in a manner
506
- consistent with the requirements of this License, to extend the patent
507
- license to downstream recipients. "Knowingly relying" means you have
508
- actual knowledge that, but for the patent license, your conveying the
509
- covered work in a country, or your recipient's use of the covered work
510
- in a country, would infringe one or more identifiable patents in that
511
- country that you have reason to believe are valid.
512
-
513
- If, pursuant to or in connection with a single transaction or
514
- arrangement, you convey, or propagate by procuring conveyance of, a
515
- covered work, and grant a patent license to some of the parties
516
- receiving the covered work authorizing them to use, propagate, modify
517
- or convey a specific copy of the covered work, then the patent license
518
- you grant is automatically extended to all recipients of the covered
519
- work and works based on it.
520
-
521
- A patent license is "discriminatory" if it does not include within
522
- the scope of its coverage, prohibits the exercise of, or is
523
- conditioned on the non-exercise of one or more of the rights that are
524
- specifically granted under this License. You may not convey a covered
525
- work if you are a party to an arrangement with a third party that is
526
- in the business of distributing software, under which you make payment
527
- to the third party based on the extent of your activity of conveying
528
- the work, and under which the third party grants, to any of the
529
- parties who would receive the covered work from you, a discriminatory
530
- patent license (a) in connection with copies of the covered work
531
- conveyed by you (or copies made from those copies), or (b) primarily
532
- for and in connection with specific products or compilations that
533
- contain the covered work, unless you entered into that arrangement,
534
- or that patent license was granted, prior to 28 March 2007.
535
-
536
- Nothing in this License shall be construed as excluding or limiting
537
- any implied license or other defenses to infringement that may
538
- otherwise be available to you under applicable patent law.
539
-
540
- 12. No Surrender of Others' Freedom.
541
-
542
- If conditions are imposed on you (whether by court order, agreement or
543
- otherwise) that contradict the conditions of this License, they do not
544
- excuse you from the conditions of this License. If you cannot convey a
545
- covered work so as to satisfy simultaneously your obligations under this
546
- License and any other pertinent obligations, then as a consequence you may
547
- not convey it at all. For example, if you agree to terms that obligate you
548
- to collect a royalty for further conveying from those to whom you convey
549
- the Program, the only way you could satisfy both those terms and this
550
- License would be to refrain entirely from conveying the Program.
551
-
552
- 13. Use with the GNU Affero General Public License.
553
-
554
- Notwithstanding any other provision of this License, you have
555
- permission to link or combine any covered work with a work licensed
556
- under version 3 of the GNU Affero General Public License into a single
557
- combined work, and to convey the resulting work. The terms of this
558
- License will continue to apply to the part which is the covered work,
559
- but the special requirements of the GNU Affero General Public License,
560
- section 13, concerning interaction through a network will apply to the
561
- combination as such.
562
-
563
- 14. Revised Versions of this License.
564
-
565
- The Free Software Foundation may publish revised and/or new versions of
566
- the GNU General Public License from time to time. Such new versions will
567
- be similar in spirit to the present version, but may differ in detail to
568
- address new problems or concerns.
569
-
570
- Each version is given a distinguishing version number. If the
571
- Program specifies that a certain numbered version of the GNU General
572
- Public License "or any later version" applies to it, you have the
573
- option of following the terms and conditions either of that numbered
574
- version or of any later version published by the Free Software
575
- Foundation. If the Program does not specify a version number of the
576
- GNU General Public License, you may choose any version ever published
577
- by the Free Software Foundation.
578
-
579
- If the Program specifies that a proxy can decide which future
580
- versions of the GNU General Public License can be used, that proxy's
581
- public statement of acceptance of a version permanently authorizes you
582
- to choose that version for the Program.
583
-
584
- Later license versions may give you additional or different
585
- permissions. However, no additional obligations are imposed on any
586
- author or copyright holder as a result of your choosing to follow a
587
- later version.
588
-
589
- 15. Disclaimer of Warranty.
590
-
591
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592
- APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593
- HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594
- OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595
- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596
- PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597
- IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598
- ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599
-
600
- 16. Limitation of Liability.
601
-
602
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603
- WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604
- THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605
- GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606
- USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607
- DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608
- PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609
- EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610
- SUCH DAMAGES.
611
-
612
- 17. Interpretation of Sections 15 and 16.
613
-
614
- If the disclaimer of warranty and limitation of liability provided
615
- above cannot be given local legal effect according to their terms,
616
- reviewing courts shall apply local law that most closely approximates
617
- an absolute waiver of all civil liability in connection with the
618
- Program, unless a warranty or assumption of liability accompanies a
619
- copy of the Program in return for a fee.
620
-
621
- END OF TERMS AND CONDITIONS
622
-
623
- How to Apply These Terms to Your New Programs
624
-
625
- If you develop a new program, and you want it to be of the greatest
626
- possible use to the public, the best way to achieve this is to make it
627
- free software which everyone can redistribute and change under these terms.
628
-
629
- To do so, attach the following notices to the program. It is safest
630
- to attach them to the start of each source file to most effectively
631
- state the exclusion of warranty; and each file should have at least
632
- the "copyright" line and a pointer to where the full notice is found.
633
-
634
- <one line to give the program's name and a brief idea of what it does.>
635
- Copyright (C) <year> <name of author>
636
-
637
- This program is free software: you can redistribute it and/or modify
638
- it under the terms of the GNU General Public License as published by
639
- the Free Software Foundation, either version 3 of the License, or
640
- (at your option) any later version.
641
-
642
- This program is distributed in the hope that it will be useful,
643
- but WITHOUT ANY WARRANTY; without even the implied warranty of
644
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645
- GNU General Public License for more details.
646
-
647
- You should have received a copy of the GNU General Public License
648
- along with this program. If not, see <https://www.gnu.org/licenses/>.
649
-
650
- Also add information on how to contact you by electronic and paper mail.
651
-
652
- If the program does terminal interaction, make it output a short
653
- notice like this when it starts in an interactive mode:
654
-
655
- <program> Copyright (C) <year> <name of author>
656
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657
- This is free software, and you are welcome to redistribute it
658
- under certain conditions; type `show c' for details.
659
-
660
- The hypothetical commands `show w' and `show c' should show the appropriate
661
- parts of the General Public License. Of course, your program's commands
662
- might be different; for a GUI interface, you would use an "about box".
663
-
664
- You should also get your employer (if you work as a programmer) or school,
665
- if any, to sign a "copyright disclaimer" for the program, if necessary.
666
- For more information on this, and how to apply and follow the GNU GPL, see
667
- <https://www.gnu.org/licenses/>.
668
-
669
- The GNU General Public License does not permit incorporating your program
670
- into proprietary programs. If your program is a subroutine library, you
671
- may consider it more useful to permit linking proprietary applications with
672
- the library. If this is what you want to do, use the GNU Lesser General
673
- Public License instead of this License. But first, please read
674
- <https://www.gnu.org/licenses/why-not-lgpl.html>.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/css/abstracts/_colors.scss CHANGED
@@ -5,10 +5,9 @@
5
  $no-stock-color: $alert-red;
6
  $low-stock-color: $alert-yellow;
7
  $in-stock-color: $alert-green;
8
- $discount-color: $alert-green;
9
 
10
  $placeholder-color: var(--global--color-primary, $gray-200);
11
- $input-border-gray: #50575e;
12
  $input-border-dark: rgba(255, 255, 255, 0.4);
13
  $input-disabled-dark: rgba(255, 255, 255, 0.3);
14
  $controls-border-dark: rgba(255, 255, 255, 0.6);
5
  $no-stock-color: $alert-red;
6
  $low-stock-color: $alert-yellow;
7
  $in-stock-color: $alert-green;
 
8
 
9
  $placeholder-color: var(--global--color-primary, $gray-200);
10
+ $input-border-gray: #8d96a0;
11
  $input-border-dark: rgba(255, 255, 255, 0.4);
12
  $input-disabled-dark: rgba(255, 255, 255, 0.3);
13
  $controls-border-dark: rgba(255, 255, 255, 0.6);
assets/css/abstracts/_mixins.scss CHANGED
@@ -52,7 +52,6 @@ $fontSizes: (
52
 
53
  // Hide an element from sighted users, but available to screen reader users.
54
  @mixin visually-hidden() {
55
- border: 0;
56
  clip: rect(1px, 1px, 1px, 1px);
57
  clip-path: inset(50%);
58
  height: 1px;
@@ -62,29 +61,6 @@ $fontSizes: (
62
  /* Many screen reader and browser combinations announce broken words as they would appear visually. */
63
  overflow-wrap: normal !important;
64
  word-wrap: normal !important;
65
- padding: 0;
66
- position: absolute !important;
67
- width: 1px;
68
- }
69
-
70
- @mixin visually-hidden-focus-reveal() {
71
- background-color: #fff;
72
- border-radius: 3px;
73
- box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6);
74
- clip: auto !important;
75
- clip-path: none;
76
- color: $input-text-active;
77
- display: block;
78
- font-size: 0.875rem;
79
- font-weight: 700;
80
- height: auto;
81
- left: 5px;
82
- line-height: normal;
83
- padding: 15px 23px 14px;
84
- text-decoration: none;
85
- top: 5px;
86
- width: auto;
87
- z-index: 100000;
88
  }
89
 
90
  @mixin reset-box() {
@@ -124,7 +100,6 @@ $fontSizes: (
124
  background: transparent;
125
  box-shadow: none;
126
  display: inline;
127
- text-shadow: none;
128
 
129
  &:hover,
130
  &:focus,
52
 
53
  // Hide an element from sighted users, but available to screen reader users.
54
  @mixin visually-hidden() {
 
55
  clip: rect(1px, 1px, 1px, 1px);
56
  clip-path: inset(50%);
57
  height: 1px;
61
  /* Many screen reader and browser combinations announce broken words as they would appear visually. */
62
  overflow-wrap: normal !important;
63
  word-wrap: normal !important;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  }
65
 
66
  @mixin reset-box() {
100
  background: transparent;
101
  box-shadow: none;
102
  display: inline;
 
103
 
104
  &:hover,
105
  &:focus,
assets/css/editor.scss CHANGED
@@ -48,15 +48,16 @@
48
  }
49
  }
50
 
51
- // Selectors with extra specificity to override some editor styles.
52
- .woocommerce-search-list__list.woocommerce-search-list__list {
53
- box-sizing: border-box;
54
- margin: 0;
55
- padding: 0;
56
  }
57
 
58
- .woocommerce-search-list__selected.woocommerce-search-list__selected > ul {
59
- list-style: none;
60
- margin: 0;
61
- padding: 0;
 
 
 
62
  }
48
  }
49
  }
50
 
51
+ // Adds border to placeholder lists, so they can be distinguished from the white background.
52
+ .components-placeholder .woocommerce-search-list__list {
53
+ border: 1px solid $gray-200;
 
 
54
  }
55
 
56
+ // Work-around to make the SearchList component work fine with the last versions of @wordpress/components.
57
+ // Ideally it should be possible to remove this once this issue is fixed in WC Admin:
58
+ // https://github.com/woocommerce/woocommerce-admin/issues/4349
59
+ .components-placeholder .woocommerce-search-list__list .woocommerce-search-list__item {
60
+ border-radius: 0;
61
+ height: auto;
62
+ text-align: left;
63
  }
assets/css/style.scss CHANGED
@@ -21,7 +21,6 @@
21
  }
22
 
23
  img {
24
- height: auto;
25
  width: 100%;
26
 
27
  &[hidden] {
@@ -201,9 +200,6 @@
201
  .wc-block-components-product-sale-badge {
202
  line-height: 1;
203
  }
204
- .editor-styles-wrapper .wp-block-button .wp-block-button__link:not(.has-text-color) {
205
- color: #fff;
206
- }
207
  }
208
 
209
  .theme-twentytwenty {
@@ -307,11 +303,3 @@
307
  }
308
  }
309
  }
310
-
311
- // Default screen-reader styles. Included as a fallback for themes that don't have support.
312
- .screen-reader-text {
313
- @include visually-hidden();
314
- }
315
- .screen-reader-text:focus {
316
- @include visually-hidden-focus-reveal();
317
- }
21
  }
22
 
23
  img {
 
24
  width: 100%;
25
 
26
  &[hidden] {
200
  .wc-block-components-product-sale-badge {
201
  line-height: 1;
202
  }
 
 
 
203
  }
204
 
205
  .theme-twentytwenty {
303
  }
304
  }
305
  }
 
 
 
 
 
 
 
 
assets/img/avatar.jpg ADDED
Binary file
{images/previews → assets/img}/beanie.jpg RENAMED
File without changes
assets/img/block-error.svg ADDED
@@ -0,0 +1,2727 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <svg
2
+ width="208.5"
3
+ height="92"
4
+ viewBox="0 0 834 368"
5
+ xmlns="http://www.w3.org/2000/svg"
6
+ >
7
+ <g>
8
+ <g>
9
+ <path
10
+ fill="#DCDDDE"
11
+ d="M77.3,290.2h0.3l0.3,0.1l0.2,0.1l0.4,0.1h0.1l0.4,0.2h0.1l0.2,0.2l0.3,0.2l0,0l0.3,0.3l0.2,0.3l0,0h0.4l2,0.1
12
+ l2,0.1l2.1,0.2l1.1,0.1l1.1,0.1l1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1,0.1l1.1,0.2l1,0.2l1,0.2l1,0.2l0.9,0.2
13
+ l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.8,0.2l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.2l0.4,0.2
14
+ l0.4,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.3l0.2,0.2h0.2h1.4h0.6l0,0
15
+ l-0.2-0.3v-0.1l-0.2-0.3v-0.1l-0.1-0.3v-0.1l-0.1-0.3v-0.1l-0.1-0.4v-0.1l0.1-0.3v-0.1l0.1-0.3v-0.1l0.1-0.3l0.1-0.1l0.1-0.2
16
+ l0.1-0.2l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1
17
+ l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.1l0.5-0.1h0.4h0.5h0.4h0.4h0.4h0.4h0.4h0.4h0.4l0.7,0.1l0.7,0.1l0.7,0.1
18
+ h0.3h0.3h0.3h0.2h0.2h0.2h0.3h0.4h0.8h0.8l0.9-0.1l0.9-0.1l1-0.1l2.2-0.2l2.3-0.2l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.3-0.1
19
+ l1.2-0.1l1.3-0.1h1.2h0.7h0.7h0.7h0.6h0.7h0.6h0.7h0.6h0.7h0.6h0.6l0.6,0.1l0.6,0.1l0.5,0.1l0.6,0.1l0.5,0.1l0.6,0.1l0.5,0.1
20
+ l0.5,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.1l0.2,0.2l0.2,0.2
21
+ l0.1,0.1l0.2,0.2v0.1l0.2,0.3l0,0l0.2,0.5l0,0l0.1,0.5l0,0l0.1,0.6l0,0l-0.1,0.6l0,0l-0.2,0.5h-0.1l-0.2,0.4h-0.1l-0.1,0.1
22
+ l1.9,0.3l2.3,0.4l2.2,0.4h1.1l2.5,0.1l2.2,0.1l0.7-0.1l0.6-0.1l0.5-0.1h0.5h0.5h0.6h0.6h0.6h0.6h0.6h0.6h1.1h1.1h1.1h1.1h1.1h5.2
23
+ h0.4l4-0.2l2-0.1l2-0.1l1.2-0.1l0.1-0.2l0.4-0.4l0.5-0.3l0,0l0.3-0.1l0.4-0.1l0,0l0.4-0.1h0.2h0.4h0.4h2.4h2.4h2.4h2.4h4.8
24
+ l4.8,0.1l9.5,0.1l4.8,0.1l4.7,0.1h4.8h2.4h2.4h2.4h2.4h2.4h2.4h2.4h2.4h2.4h2.4l2.4-0.1l2.4-0.1l2.4-0.1l2.4-0.1h1.2h1.2h1.2h1.2
25
+ h1.2h1.2h1.2h1.2h2.5h2.4h2.4h1.2h1.2h0.2h0.2h0.5h0.5l0.5-0.1l0.7-0.1l0.7-0.1l1.4-0.2l1.4-0.2l0.8-0.1l0.7-0.1l0.8-0.1l0.7-0.1
26
+ l0.8-0.1h0.7h0.7h0.4h0.4h0.4h0.4h0.4h0.4h0.3h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.2l0.4,0.2l0.2,0.2l0.2,0.1
27
+ l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.2v0.2
28
+ v0.2v0.2l-0.1,0.3l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2
29
+ l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.2,0.1l-0.1,0.1h0.1l0.5,0.1l0.2,0.1l0.3,0.1l0.2,0.1h0.1h0.2l0.7-0.1
30
+ l0.7-0.1l0.7-0.1l1.5-0.2l1.6-0.2l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1h0.1h0.1l0,0l0.2-0.4l0.4-0.4l0,0l0.3-0.2l0.3-0.2l0,0l0.4-0.2
31
+ h0.1l0.4-0.1h0.1l0.3-0.1h0.2h0.4h0.4h0.4h0.4h0.4h0.4h0.7l0.8,0.1l0.8,0.1l1.6,0.1l0.8,0.1h0.7h0.6h0.2h0.2h1.4h1.5h2.9h1.4h1.4
32
+ h0.7h0.7h0.7h0.7l1.9-0.1l1.9-0.1l1.8-0.1l1.9-0.1l1.9-0.1l1.9-0.1l3.8-0.3l3.7-0.3l2-0.1l1.9-0.1l1.9-0.1l1.9-0.1l2-0.1l1.9-0.1
33
+ h0.7h0.7h1.4h1.4h1.4h2.7h1.3h1.3h0.5h0.5h0.6h0.7l1.5-0.1l1.4-0.1h0.7h0.7h0.5h0.2h0.3h0.2h0.3h0.1l0.5,0.1h0.1l0.3,0.1l0.3,0.2
34
+ l0,0l0.5,0.4l0.4,0.5l0,0l0.2,0.5l0.2,0.5v0.5v0.5l0,0l-0.2,0.5L404,306l-0.2,0.4h-0.1l-0.2,0.3l-0.3,0.2l0,0l-0.5,0.3h-0.1
35
+ l-0.3,0.1l-0.2,0.1l-0.3,0.1l-1.3,0.4l-1.2,0.3l-1.3,0.3l-1.4,0.3l-1.3,0.3l-1.4,0.3l-1.3,0.3l-1.4,0.3l-1.3,0.3l-1.4,0.3
36
+ l-2.6,0.5l-5,1l-3.5,0.7h-0.2l2-0.1l2.1-0.1l2.1-0.1l2-0.1h1.8h1.6h0.8h0.6h0.2h0.6l0.9-0.1l1.1-0.1h0.7h0.7h0.7h0.7h0.8h0.8h0.8
37
+ h0.8h0.8l0.8,0.1l0.8,0.1h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1
38
+ l0.4,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.4,0.3l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3l0.1,0.3
39
+ l0.1,0.3v0.3l0.1,0.3v0.3l-0.1,0.3v0.3l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3
40
+ l-0.2,0.3l-0.3,0.2l-0.3,0.2l-0.3,0.2L407,323l-0.4,0.2l-0.3,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
41
+ l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.5,0.1l-0.8,0.1l-0.9,0.1
42
+ l-0.9,0.1l-0.9,0.1l-1,0.1h-0.9h-0.9h-1h-1h-1h-1h-1.1h-1h-1.1h-1h-1.1h-1l-1.1-0.1l-1-0.1l-1-0.1l-1.1-0.1l-1.2-0.1v0.1v0.3v0.1
43
+ l-0.1,0.3v0.1l-0.1,0.3l-0.1,0.2l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.2l-0.2,0.2l-0.3,0.2
44
+ l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1l-0.7,0.2
45
+ l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.6,0.1l-0.7,0.1l-0.5,0.1l-1.1,0.1
46
+ l-0.9,0.1l-0.8,0.1l-0.7,0.1h-0.5h-0.6h-0.7h-0.7h-0.8h-0.7h-0.8h-0.8h-0.8h-0.8h-0.9h-0.9H349h-0.9h-0.9h-0.9h-1l-0.9-0.1l-1-0.1
47
+ l-1.1-0.1l-1-0.1l-1-0.1l-1.1-0.1l-1.1-0.1l-1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2
48
+ l-1.1-0.2l-1.1-0.2l-1-0.2l-1.1-0.3l-1-0.3l-1.1-0.3l-1-0.3l-1-0.3l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
49
+ l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
50
+ l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.4-0.3
51
+ l-0.3-0.3l-0.3-0.3l-0.1-0.1l-0.6,0.1l-0.9,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1.1,0.1l-1,0.1
52
+ h-0.9h-1h-1.2l-0.1,0.3l0,0l-0.3,0.4l-0.3,0.4l-0.4,0.3l0,0l-0.4,0.2l-0.3,0.2h-0.1l-0.5,0.1h-0.1h-0.4h-0.2h-0.3h-1.5h-1.5h-2.9
53
+ h-3l-2.9-0.1l-2.9-0.1l-2.9-0.1l-5.8-0.2l-5.7-0.2l-2.9-0.1l-2.9-0.1l-2.9-0.1h-2.8h-2.9h-1.4h-1.4h-2.1h-2.1h-2.1h-2.1h-2.1h-1.1
54
+ h-1.1h-1.1H225h-1.1h-1.1h-0.3h-0.3h-0.8h-1.8h-1h-1h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.2-0.1l-0.2-0.1
55
+ l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.3l-0.1-0.1l-0.2-0.4
56
+ l-0.1-0.1l-0.2-0.4v-0.1l-0.2-0.5v-0.1l-0.1-0.5v-0.1l0.1-0.5v-0.1l0.1-0.4l0.1-0.1l0.1-0.4l0.1-0.1l0.1-0.3l0.1-0.1l0.2-0.2
57
+ l0.1-0.2l0.2-0.3l0.2-0.2l0.4-0.4l0.4-0.3l0.3-0.3h-0.2h-0.1l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.8,0.3l-0.8,0.3l-0.7,0.3l-0.8,0.3
58
+ l-0.8,0.3l-0.8,0.3l-0.8,0.3l-0.8,0.3l-0.8,0.3l-1.6,0.5l-1.7,0.5l-1.6,0.5l-1.7,0.5l-1.7,0.5l-1.7,0.5l-1.7,0.5l-1.7,0.4
59
+ l-1.6,0.4l-1.6,0.4l-1.6,0.4l-2.2,0.6l0.2,0.6l0.1,0.1l0.1,0.4l0.1,0.4v0.1v0.4v0.1l0.1,0.1l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3
60
+ l0.1,0.3v0.3l0.1,0.3l-0.1,0.3v0.2v0.2l-0.1,0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
61
+ l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.1,0.2l-0.1,0.2l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.4,0.3l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
62
+ l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1H175h-0.4h-0.4h-0.4h-0.4H173h-0.8h-0.8h-0.8
63
+ h-0.8H169h-0.8l-1.5-0.1l-1.5-0.1h-0.7h-0.7h-0.6h-0.6H162h-0.2h-0.2l-6.1,0.5l-3.1,0.2l-3.1,0.2l-3.1,0.2l-3.1,0.2l-3.1,0.2
64
+ l-3.1,0.2l-3.1,0.2l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1h-1.6h-1.5h-1.5h-1.5h-1.5h-1.5h-1.5h-0.4
65
+ h-0.4h-0.2l-0.4-0.1h-0.1l-0.5-0.2l0,0l-0.5-0.3l-0.4-0.4l-0.3-0.4l0,0l-0.3-0.6l-0.2-0.6v-0.6l0.1-0.6l0.2-0.6l0,0l0.2-0.4
66
+ l0.3-0.3l0.4-0.3l0,0l0.5-0.3l0,0l0.3-0.1l0.2-0.1l0.4-0.1l0.3-0.1l0.4-0.1l0.7-0.1l0.9-0.1l1-0.1l2.1-0.3l2.2-0.3l2-0.3l0.9-0.1
67
+ l0.7-0.1l1-0.1l0.9-0.1l0.9-0.1l1-0.1l1.9-0.2l1.9-0.2l1.9-0.2l1.9-0.2l1.9-0.2l0.9-0.1l0.9-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1
68
+ l0.6-0.2l1.2-0.3l1.2-0.3l1.2-0.3l1.2-0.3l1.1-0.3l-1.2-0.1l-2.2-0.2l-1.1-0.1l-1.1-0.1l-1.1-0.1l-0.9-0.1l-1-0.1l-0.9-0.1
69
+ l-0.9-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.7-0.1l-0.7-0.1l-0.5-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1
70
+ l-0.3-0.2l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.4-0.4l-0.1-0.1l-0.3-0.4l0,0l-0.2-0.3l0,0l-0.2-0.5l0,0l-0.1-0.5l0,0v-0.5l0,0l0.1-0.5
71
+ l0,0l0.2-0.4l0,0l0.2-0.4l0,0l0.3-0.4l0.1-0.1l0.3-0.3h-0.4h-0.7h-0.7h-0.7h-0.3h-0.3h-0.2h-0.3l-0.5-0.1l-0.5-0.1l-0.5-0.1
72
+ l-0.6-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.2l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.4-0.4
73
+ l-0.1-0.1l-0.3-0.5h-0.1l-0.2-0.5l0,0l-0.1-0.4v-0.4l0,0V314l0.1-0.4l0,0l0,0h-0.4l-0.8,0.1l-0.7,0.1h-0.7h-0.7h-0.7h-0.7h-0.8
74
+ h-0.7h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4l-2.7-0.1l-2.5-0.1h-1.2h-1.2h-1.1h-1.1H76.9h-0.2h-0.4h-0.8h-0.9h-0.9h-0.4h-0.4h-0.4h-0.4
75
+ h-0.3h-0.2l-0.4-0.1l-0.4-0.1l0,0l-0.5-0.3l-0.4-0.4l-0.4-0.5l0,0l-0.2-0.5l-0.2-0.6v-0.6l0.1-0.6l0,0l0.2-0.6l0.4-0.5l0.4-0.4
76
+ l0,0l0.4-0.2L71,308h0.1l0.3-0.1h0.1l0.2-0.1l0.7-0.2l0.7-0.2l0.7-0.1l0.2-0.1l-0.1-0.1l-0.3-0.5l0,0l-0.2-0.5l-0.1-0.5l-0.1-0.6
77
+ l0.1-0.6l0.2-0.5h0.1l0.3-0.5l0.5-0.5l0,0l0.5-0.3H75l0.4-0.2l0.2-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l-0.3-0.1
78
+ l-0.5-0.4l-0.5-0.4h-0.1h-0.9h-0.9h-0.9H73h-0.9l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.7-0.1l-0.5,0.1l-0.6,0.1h-0.5h-0.6h-0.5
79
+ h-0.6H64h-0.5h-0.6h-0.5h-0.6h-0.5h-1.1h-1.1h-1l-1.1-0.1l-1.9-0.1l-1.8-0.1h-0.8h-0.7h-0.7h-0.5h-0.4h-0.9l-2.8,0.1l-3.9,0.2
80
+ l-4.3,0.2l-2.2,0.1l-2.1,0.1l-2,0.1l-1.8,0.1h-0.8h-0.7H28h-0.6h-0.5h-0.5h-0.3h-0.2l-0.4-0.1l0,0l-0.4-0.1l-0.4-0.2l0,0l-0.4-0.3
81
+ L24,300l-0.3-0.4l0,0l-0.2-0.5l-0.1-0.5v-0.1v-0.3l-0.1-0.1v-0.3l0.1-0.1v-0.3l0.1-0.1l0.1-0.3v-0.1l0.1-0.3l0.1-0.1l0.1-0.3
82
+ l0.1-0.1l0.1-0.2l0.1-0.2l0.2-0.3l0.3-0.3l0.2-0.3l0.3-0.2l0.2-0.2l0.3-0.2L26,294l0.3-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0,0h-0.5h-0.6
83
+ h-0.3h-0.3h-0.3h-0.3l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.4-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
84
+ l-0.3-0.3l-0.2-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4v-0.4l-0.1-0.4l0.1-0.4v-0.4l0.1-0.4l0.1-0.3
85
+ l0.1-0.3l0.1-0.2l0.1-0.3l0.1-0.2l0.1-0.3l0.1-0.1l0.2-0.3l0.1-0.1l0.2-0.2l0.1-0.1l0.2-0.2l0.1-0.1l0.3-0.2l0.1-0.1l0.2-0.2
86
+ l0.2-0.1l0.4-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.4h0.4h0.3h0.4h0.3h0.4h0.3h0.4l0.3,0.1l0.4,0.1l0.7,0.1l0.7,0.2l0.7,0.2
87
+ l0.7,0.2l0.7,0.2l0.7,0.2l1.2,0.4l1.2,0.4l0.6,0.2l0.6,0.2l0.5,0.2l0.5,0.1l0.5,0.1l0.4,0.1h0.2h0.2h0.2h0.2l1.7,0.2l1.7,0.2
88
+ l1.8,0.2l1.8,0.2l3.8,0.5l4,0.5l3.9,0.5l2,0.2l1.8,0.2l1.8,0.2l1.8,0.2l1.7,0.2l1.5,0.1h0.4h0.7h0.5l0.5-0.1l1-0.2l1-0.2l1-0.2
89
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1h0.5h0.4h0.4h0.4L77.3,290.2z M330.2,321.8l-0.7,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1
90
+ l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1h-0.8h-0.8h-0.8h-0.8h-0.8H316h-0.7h-0.7h-0.7h-0.1
91
+ l0.2,0.1l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2
92
+ l0.5,0.1l0.4,0.1l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.2l0.9,0.2l0.9,0.2l1,0.2l0.9,0.2l1,0.2l1,0.2l1,0.2l1,0.2l1,0.2l1,0.1l1,0.1
93
+ l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l0.9,0.1l0.9,0.1l1,0.1l0.9,0.1h0.9h0.9h0.9h0.9h0.9h0.8h0.8h0.8h0.8h0.8h0.8h0.7h0.7h0.6h0.7h0.5
94
+ h0.4l0.5-0.1l0.8-0.1l0.9-0.1l1-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.5-0.2
95
+ l0.5-0.2l0.5-0.2l0.2-0.1h-0.1l-0.3-0.1l-0.7-0.2l-0.7-0.2l-0.6-0.2l-0.7-0.2l-0.5-0.1h-0.1H363l-0.4-0.1l-0.5-0.1l-0.7-0.1
96
+ l-0.8-0.1l-0.9-0.1l-1-0.1h-0.2l-0.7-0.1h-0.2h-0.1h-0.8h-0.8h-0.8h0.2h-1.6H352h-1.7h-0.8h-0.9h-0.8h-0.9H346h-0.8h-0.3h-0.3
97
+ h-0.4h-0.4h-0.4H343l-0.9,0.1l-0.9,0.1l-1,0.1h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.3h-0.2h-0.3h-0.2l-0.3-0.1l-0.3-0.1
98
+ l-0.2-0.1l-0.3-0.1l-0.3-0.1L334,326l-0.2-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.2-0.3l-0.2-0.3l-0.2-0.2l-0.1-0.2l-0.2-0.2
99
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.2-0.4l-0.1-0.4l-0.1-0.4V322L330.2,321.8z M172.4,323.5l-0.9,0.1l-1,0.1l-1,0.1h-0.9h-1h-0.9h-0.9
100
+ h-0.9H164h-1.7h-1.6h-1.4h-0.7h-0.5h-0.5h-0.4l-3.4,0.2h-0.1l2.2,0.2l4.7,0.4l3.6,0.3h0.2l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1
101
+ l0.7-0.1l0.7-0.1l0.7-0.1l0.6-0.1l0.8-0.2l1.2-0.3L172.4,323.5L172.4,323.5z M394.4,320.2h-0.7H393h-0.7h-0.6l-1.1,0.1h-0.8h-0.6
102
+ h-0.4h-0.5h-0.7h-1.5h-1.8l-2,0.1l-2,0.1l-2.2,0.1l-4.5,0.2l-3,0.1l0.6,0.1l1.9,0.2l1.9,0.2l2,0.1l1,0.1l1,0.1l1,0.1l1,0.1h1h1
103
+ h0.9h1h1h1h0.9h0.9h0.9h0.9h0.9h0.9l0.9-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.3-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.3-0.1l0.4-0.1
104
+ l0.3-0.1l0.3-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.1h-0.2h-0.3h-0.4h-0.3l-0.7-0.1h-0.7h-0.7h-0.7h-0.7H395h-0.6V320.2z
105
+ M185.1,311.1v0.5l-0.1,0.5l0,0l-0.2,0.5l-0.3,0.5l0,0l-0.2,0.3l-0.3,0.2l0,0l-0.2,0.2l0,0l0.4,0.4l0.1,0.1l0.2,0.3h0.1l0.2,0.3
106
+ l0,0l0.1,0.3h0.1l0.1,0.4l0,0l0.1,0.3l0,0l0.1,0.3l0,0l-0.1,0.4v0.1l-0.1,0.5v0.1l-0.2,0.4l-0.1,0.1l-0.2,0.3l-0.1,0.2l-0.2,0.3
107
+ l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.2l-0.4,0.2l1.4-0.4l1.5-0.4l1.6-0.4l1.6-0.4l1.7-0.4l1.6-0.4
108
+ l1.6-0.5l1.7-0.5l1.6-0.5l1.6-0.5l1.6-0.5l0,0h-0.2l-1.1-0.2l-1.1-0.3l-1-0.3l-1.1-0.3l-1-0.3l-1.1-0.3l-1-0.3l-0.5-0.2l-0.5-0.2
109
+ l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.2-0.1l-0.2-0.2h-0.1l-0.3-0.2l0,0l-0.4-0.3l0,0l-0.2-0.3l-0.2-0.3h-0.1
110
+ l-0.1-0.3l-0.5-0.1l-0.8-0.2L185.1,311.1z M222.2,319.9h0.4h1.1h1h1.1h1h1.1l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
111
+ l-0.4-0.2l0,0h-0.6h-0.2H224h-0.1l-0.4-0.1l-0.2-0.1h-0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
112
+ l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.3,0.2h-0.1h1.6h0.8L222.2,319.9z M297.2,316.3l-2.4,0.3l-2.4,0.3l-2.4,0.3l-4.8,0.6l-4.8,0.6
113
+ l-2.4,0.3l-2.4,0.3h1h2.9h1.6h1.7h1.7h1.8l1.8-0.1l2-0.1h0.9h0.9l1-0.1l0.9-0.1l1-0.1l0.9-0.1l0.9-0.1l1-0.1l0.9-0.1l0.9-0.1
114
+ l1-0.1l0.9-0.1l0,0v-0.1l-0.1-0.3v-0.1l-0.1-0.3v-0.1v-0.3v-0.1v-0.3l0,0h-0.8h-1.2L297.2,316.3z M345.5,317.8L343,318l-0.9,0.1
115
+ l1.2,0.1l1.4,0.1l1.4,0.1h0.1l-0.1-0.2l0,0v-0.4L345.5,317.8z M159.4,308.6l-1.8,0.1l-1.8,0.1l-1.8,0.1h-0.5h-0.9h-1.3h-0.8h-0.8
116
+ h-0.9h-1h-1h-1.1h-1.1l-1.1,0.1l-1.1,0.1h-0.2l-0.1,0.2l-0.4,0.5l-0.4,0.3h0.1h0.7h0.6h0.6h0.6h0.6h1.1h1.1l1.2-0.1l1.1-0.1
117
+ l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l2.4-0.2l2.4-0.2l2-0.2l-0.8-0.2L159.4,308.6z M219.2,306.9l-2,0.1l-1.6,0.1l0.2,0.1
118
+ l0.3,0.2l0.3,0.2l0.4,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2h0.1h0.8l3,0.1l3,0.1l6,0.2l6,0.2l3.5,0.1l3.5,0.1l3.5,0.1h0.1h-0.2
119
+ l-0.3-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.1-0.1h-0.6l-2-0.1l-2-0.1l-2-0.1l-2-0.1l-2-0.1l-2-0.2l-2-0.2l-0.9-0.1l-0.9-0.1
120
+ l-0.9-0.1l-0.9-0.1l-1.8-0.2l-1.8-0.2l-1.8-0.2l-1.4-0.2H219.2z M288.8,304.3h-1.2h-0.8l1.2,0.1h0.2l2.5-0.1l2.4-0.1l0,0h-0.8
121
+ h-1.2h-1.2L288.8,304.3z"
122
+ />
123
+ <path
124
+ fill="#DCDDDE"
125
+ d="M582.2,247.8h2.8h1.4h1.4h1.4h1.4h1.4h0.7h0.7h0.7h0.7h0.7h0.7l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1
126
+ l0.7-0.1l0.7-0.1l0.7-0.1l0.5-0.1l0.6-0.1l1.1-0.2l1.2-0.1l1.1-0.1l2-0.2l0.8-0.1h0.6l0.5,0.1l0.5,0.2l0.5,0.3l0.4,0.4l0.3,0.5
127
+ l0.2,0.5l0.1,0.6v0.6l-0.1,0.6l-0.2,0.5l-0.3,0.5l-0.4,0.4l-0.5,0.3l-0.5,0.2l-0.4,0.1h1.2h1.9l0.7-0.1l1.7-0.2l0.9-0.1l0.9-0.1
128
+ l0.8-0.1l0.9-0.1h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.4l0.4,0.1l0.9,0.1l0.9,0.2l0.9,0.2l0.5,0.1l0.4,0.1l0.4,0.1
129
+ l0.4,0.1l0.2,0.1l0.2,0.1h0.1l0.3,0.2l0.3,0.2h0.1l0,0h0.2h0.5h0.5h0.5l0.5,0.1l0.5,0.1l0.5,0.1l1.1,0.1l1.1,0.2l1,0.2l1,0.1
130
+ l0.9,0.1h0.4h0.4h0.3h0.4l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l1.8,0.3h0.1l1-0.1
131
+ l1.4-0.1l1.4-0.1l0.9-0.1l-0.4-0.2l-0.8-0.4l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.2h-0.1l-0.2-0.3h-0.1l-0.3-0.5l0,0
132
+ l-0.1-0.3l-0.1-0.3l0,0l-0.1-0.4l-0.1-0.4l0,0l0.1-0.4l0.1-0.4l0,0l0.2-0.3l0.2-0.3l0,0l0.4-0.5l0,0l0.4-0.3h0.1l0.2-0.2l0.2-0.1
133
+ l0.2-0.1l0.3-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.8h0.8h0.8h0.8h0.7h0.7l0.6,0.1l0.7,0.1l0.7,0.1
134
+ l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.8,0.2h1.1h0.8h0.7h0.7h0.6l1.6,0.1l1.6,0.1l1.6,0.1l1.5,0.1l1.6,0.1l1.5,0.1l1.6,0.1l1.5,0.1
135
+ l3,0.3l2.6,0.2h0.3h1.8h2.2h1.1h1.1h1.1h1.1h1.1h1.1h1.1h1.1l1.1,0.1l1.1,0.1l1.1,0.1l1.2,0.1l0.4,0.1l0.5,0.1l0.5,0.1h0.1
136
+ l0.1-0.1l0.2-0.2h0.1l0.4-0.2h0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.3-0.1h0.2h0.2h0.3h0.2h0.3h0.6h0.6l0.6,0.1l0.5,0.2l0.5,0.3l0.5,0.4
137
+ l0.4,0.4l0.2,0.5l0.2,0.6l0,0h0.2l0.6,0.2l0.6,0.1l1.2,0.1l1.8,0.1l3.6,0.2l1.8,0.1l1.7,0.1l1.8,0.1h0.9h0.8h0.1h0.1h0.1h0.1h0.3
138
+ h0.3l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.9-0.2l0.9-0.2l1-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.3h0.2h0.3h0.3
139
+ h0.2h0.3h0.3l0.4,0.1l0.3,0.1l0.3,0.1l0.4,0.1l0.4,0.2l0.2,0.1l0.2,0.1l0.1,0.1l0.2,0.2l0.1,0.1l0.2,0.2l0.1,0.1l0.2,0.2l0.1,0.1
140
+ l0.2,0.3l0.1,0.1l0.1,0.3l0.1,0.1l0.1,0.2l0.1,0.1l0.1,0.3l0.1,0.3l0.1,0.4l0.1,0.4v0.3v0.3v0.1l-0.1,0.4v0.1l-0.1,0.4v0.1
141
+ l-0.1,0.1h0.2h0.9h0.8h0.9h0.9h0.9h0.5h0.6h0.6l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.4,0.1l0.3,0.1l0.4,0.1
142
+ l0.4,0.1l0.4,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.2l0.2,0.2l0.1,0.1l0.2,0.2l0,0l0.2,0.3h0.1l0.2,0.3l0.5-0.2l0.9-0.3l0.9-0.3
143
+ l0.9-0.3l1.6-0.5l2-0.6l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l0.9-0.3l0.9-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.3h0.1h0.4h0.1
144
+ l0.3,0.1l0.3,0.1h0.1l0.4,0.2l0.4,0.2l0.3,0.3h0.1l0.4,0.4l0.2,0.5l0.2,0.5l0.1,0.5l0,0l-0.1,0.6l-0.1,0.5l-0.2,0.5h-0.1l-0.2,0.3
145
+ l-0.2,0.2h-0.1l-0.3,0.3l-0.1,0.1l-0.2,0.2l-0.4,0.2l-0.4,0.2l-0.6,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.2l-0.6,0.2l-0.5,0.2l-0.6,0.2
146
+ l-0.5,0.2l-0.6,0.2l-0.6,0.2l-0.5,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-1.2,0.4l-1.2,0.4l-1.2,0.4l-1.2,0.3l-1.2,0.3l0.8,0.1h0.4h7.9
147
+ h4h3.9h1.9h1.2h1.5h1.5h0.8h0.8h0.8h0.9l0.9,0.1l0.9,0.1l0.8,0.1l0.9,0.1l0.9,0.1l0.8,0.1l0.9,0.1l0.8,0.1l0.8,0.1l0.4,0.1
148
+ l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.4,0.1l0.4,0.1l0.3,0.2l0.4,0.2l0.3,0.2l0.4,0.2
149
+ l0.3,0.2l0.3,0.3l0.2,0.2l0.2,0.2l0.2,0.3l0.1,0.2l0.2,0.3v0.1l0.1,0.3l0.1,0.1l0.1,0.5v0.1v0.6v0.1v0.3l-0.1,0.3v0.1l-0.1,0.3
150
+ l-0.2,0.3l0,0l-0.2,0.3l-0.2,0.3l0,0l-0.4,0.3l0,0l-0.4,0.3h-0.1l-0.3,0.1H804l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.3h-0.4h-0.4
151
+ h-0.4h-0.4h-0.4h-0.4H800l-0.8-0.1l-0.9-0.1l-1.7-0.3l-0.8-0.1h-0.4H795h-0.3h-0.3h-0.2H794h-2.6h-2.5h-1.2h-1.2h-1.2h-1.2h-1.2
152
+ l-1.2-0.1H781h-0.6h-0.7h-0.6l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1
153
+ l-1.4-0.2l-1.4-0.3l-1.5-0.3l-3.3-0.6h-0.2h-3h-4h-3.9h-4h-4h-2h-2h-0.8l-0.4,0.1l-0.7,0.2l-1.4,0.5l-1.4,0.5l-0.8,0.2l-0.7,0.3
154
+ l-0.8,0.2l-0.7,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.4,0.1l-0.4,0.1l-0.3,0.1l-0.3,0.1l-0.7,0.1l-0.7,0.1
155
+ l-0.7,0.1h-0.8H725h-0.4h-0.4h-0.4h-0.1l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1
156
+ l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-1.3,0.2l-1.4,0.1l-1.4,0.1
157
+ l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1h-1.4h-1.4h-1.3h-1.4h-1.4h-1.4H691h-1.3h-1.4H687h-1.4h-1.3l-1.2-0.1l-1.1-0.1l-1.2-0.1
158
+ h-0.6l-0.5-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-1.4-0.2l-0.7-0.1
159
+ l-0.8-0.1l-0.8-0.2l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.2-0.2l-0.2-0.1
160
+ l-0.2-0.2l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.3l-0.1-0.1l-0.1-0.4l-0.1-0.1l-0.1-0.5v-0.1l-0.1-0.5v-0.1
161
+ l0.1-0.5v-0.1l0.1-0.5v-0.1l0.2-0.4l0.1-0.1l0.2-0.3l0.1-0.1l0.2-0.3l0.1-0.1l0.2-0.2l0.2-0.1l0.2-0.2l0.2-0.2l0.3-0.2l0.3-0.2
162
+ l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1l0.4-0.1l0.7-0.3l0.7-0.3l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2
163
+ l0.7-0.2l0.7-0.2l0.8-0.2l0.7-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1h0.1v-0.1v-0.1l0.1-0.4V266l0.1-0.3v-0.1
164
+ l0.2-0.3v-0.1l0.1-0.1l-0.5-0.1l-0.8-0.1l-0.9-0.1l-0.8-0.2l-0.9-0.2l-0.8-0.2l-0.8-0.2l-0.8-0.2l-0.8-0.2l-0.6-0.2h-0.2h-0.5
165
+ h-0.5h-0.5l-0.9-0.1l-0.9-0.1l-0.8-0.1L670,263h-0.7l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1h-0.1l-1.2,0.2
166
+ l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.3,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-0.6,0.1l-0.7,0.1l-0.6,0.1l-0.7,0.1l-0.6,0.1l-0.6,0.1h-0.7
167
+ H649h-0.6h-0.7h-0.6h-0.6h-0.6h-0.6h-0.6h-0.6h-0.6h-0.6h-0.6l-0.6-0.1l-0.5-0.1l-0.6-0.1l-0.6-0.1l-0.5-0.1l-0.6-0.1l-0.5-0.1
168
+ l-0.6-0.1l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.6-0.2l-0.4-0.2l-3.7,0.5l-2.8,0.3l-2.7,0.3l-0.9,0.1l-0.9,0.1l-0.9,0.1
169
+ l-0.9,0.1l-0.8,0.1l-0.9,0.1l-0.9,0.1l-0.8,0.1h-0.8h-0.9h-0.8h-0.8l-1.6,0.1H612h-1.6h-1.6h-1.7h-1l-0.5,0.2l-0.7,0.3l-0.7,0.3
170
+ l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.8,0.2l-0.7,0.2l-0.7,0.2l-0.8,0.2l-0.7,0.2l-0.8,0.2l-0.7,0.2
171
+ l-0.8,0.2l-0.8,0.2l-0.7,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-1.5,0.3l-1.5,0.3l-1.5,0.3l-0.7,0.1l-1.1,0.4
172
+ l-1.3,0.5l-1.3,0.5l-1.3,0.5l-1.3,0.5l-1.3,0.5l-1.3,0.5l-1.4,0.5l-1.4,0.5l-1.3,0.5l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2
173
+ l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2L564,278l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.1l-0.4,0.1l-0.4,0.1l-0.9,0.2l-2.3,0.6
174
+ l-1.4,0.3l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1h-0.4h-0.4h-0.4
175
+ H545h-0.4h-0.4h-0.4h-0.4H543h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2
176
+ l-0.4-0.2l-0.4-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.1l-0.2-0.3l-0.1-0.1l-0.2-0.3l-0.1-0.1l-0.2-0.4v-0.1l-0.1-0.5
177
+ l-0.1-0.1V277v-0.1v-0.5l0.1-0.1l0.1-0.5v-0.1l0.2-0.4l0.1-0.1l0.2-0.3l0.1-0.1l0.2-0.2l0.1-0.1l0.2-0.2l0.1-0.1l0.2-0.2l0.2-0.2
178
+ l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.2l0.4-0.2l0.4-0.1l0.5-0.1l0.4-0.1l0.5-0.1l0.4-0.1l0.5-0.1l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2
179
+ l0.8-0.2l0.7-0.2l0.2-0.1l0.3-0.1l1.3-0.4l0.7-0.2l0.6-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1l0.4-0.1l0.8-0.1l0.8-0.1
180
+ l0.7-0.1l1.4-0.2l0.7-0.1l0.7-0.1l0.8-0.1l0.9-0.2l1.1-0.2l1.2-0.2l1.3-0.2l1.3-0.2l1.4-0.2l1.4-0.2l1.4-0.2l1.4-0.2l2.9-0.4
181
+ l3-0.5l1.5-0.2l1.5-0.2l1.5-0.2h0.2l0.8-0.4l2.5-1.1l2.5-1.1l-0.1-0.1h-9.7h-0.2h-0.2h-0.4h-0.5h-0.6l-1.2,0.1l-0.7,0.1l-0.6,0.1
182
+ h-0.7h-0.5h-0.3h-0.3h-0.3h-0.3h-0.2l-0.5-0.1h-0.1l-0.3-0.1l-0.3-0.2l0,0l-0.3-0.2l-0.2-0.2h-0.1l-0.1-0.1l-0.5,0.1l-0.7,0.1
183
+ l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1h-0.7h-0.7h-0.7H561h-0.7h-0.7h-0.7h-0.7h-0.7h-0.7l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1
184
+ l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-1-0.2l-2.4,0.6l-1.7,0.4l-1.8,0.4
185
+ l-2,0.4l-2,0.4L534,264l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2L523,266l-1.1,0.2
186
+ l-1.1,0.2l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1.1,0.1H512h-1.1h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5
187
+ h-0.5h-0.5l-0.5-0.1l-0.5-0.1l-0.4-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.4-0.1l-0.5-0.1l-0.4-0.1l-0.4-0.1l-0.5-0.1
188
+ l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3
189
+ l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.2-0.4l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.1-0.3l-0.1-0.3l-0.1-0.2v-0.3v-0.2
190
+ l-0.1-0.3l0.1-0.2v-0.3v-0.2l0.1-0.3v-0.2l0.1-0.3l0.1-0.1l0.1-0.3l0.1-0.1l0.2-0.3l0.1-0.1l0.2-0.2l0.2-0.2l0.3-0.3l0.3-0.3
191
+ l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.6-0.1
192
+ l0.6-0.1l0.7-0.1l0.6-0.1h0.6h0.6h0.5h0.3v-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.3l-0.1-0.3v-0.3v-0.3v-0.3l0.1-0.3l0.1-0.3l0.1-0.3
193
+ l0.1-0.3l0.1-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.4-0.3l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.1
194
+ l0.4-0.1l0.4-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.7-0.1l0.7-0.1l0.7-0.1h0.7h0.6h0.6h0.6h0.6
195
+ h0.6h0.6h1.1h2.2h1.1h1.1h8.9h0.3h0.2h0.2h0.2h0.2h0.2h0.3h0.3l0.5-0.1l0.6-0.1l0.7-0.1l0.6-0.1l0.7-0.1l0.7-0.2l1.4-0.3l0.7-0.2
196
+ l0.7-0.2l0.7-0.1l0.7-0.1l0.7-0.1l0.4-0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1
197
+ l0.4,0.1l0.4,0.1l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.3,0.2l0.4,0.3l0.3,0.3l0.4,0.3l0.3,0.3l0.2,0.3l0.3,0.3l0.1,0.2l0.1,0.2
198
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2l0.5,0.1l1.5,0.2l1.4,0.2l0.7,0.1l0.6,0.1l0.6,0.1l0.5,0.1
199
+ l1,0.1l0.9,0.1l1,0.1l1,0.1l0.9,0.1h0.5l0,0l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.5-0.2l0.5-0.2l0.5-0.2
200
+ l0.5-0.2l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.5-0.1h0.5h0.5h0.5
201
+ h0.4h1.5L582.2,247.8z M689.3,272.3h-0.8h-0.8h-0.8h-0.8h-0.8l-0.8,0.1l-0.7,0.1l-0.8,0.1l-0.8,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1
202
+ l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.5,0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
203
+ l0.5,0.1h0.5l1.1,0.1l1.1,0.1l1.1,0.1h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3l1.3-0.1l1.3-0.1l1.3-0.1l1.2-0.1l1.3-0.1
204
+ l1.3-0.1l1.3-0.1l0.6-0.1l0.7-0.1l0.7-0.1l0.6-0.1h0.2h-1.4h-1.5H706h-1.5H703h-1.5H700l-1.2-0.1l-1.2-0.1l-1.3-0.1h-0.7H695
205
+ l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.6-0.1l-0.5-0.1L689.3,272.3z M504.5,259h-0.4h-0.5h-0.5h-0.5
206
+ h-0.5h-0.5l-0.4,0.1l-0.5,0.1l-0.4,0.1h-0.2H500l0.2,0.1l0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
207
+ l0.2,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1h0.4h0.4h0.4h0.4h0.4
208
+ h0.4h0.5h0.4h0.5h0.4h0.5h0.5h0.9h1l1-0.1l1-0.1l1-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1-0.1l-1-0.1l-1.1-0.1l-1.1-0.1
209
+ l-2.1-0.2l-2.1-0.3l-2.1-0.2l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-0.9-0.1h-0.2h-0.5h-0.7h-0.8L504.5,259L504.5,259z M624.9,258.1
210
+ l-0.1,0.2l1.5-0.2h0.1l0,0H624.9L624.9,258.1L624.9,258.1z M707.9,257.6l0.5,0.1l0.5,0.1l0.6,0.1l0.7,0.1l1.2,0.2l1.4,0.2h0.2
211
+ l0.3-0.1l0,0l-0.4-0.2l-0.4-0.2l0,0l-0.9-0.1l-2.3-0.1l-2-0.1h-0.2H707.9z"
212
+ />
213
+ </g>
214
+ <g transform="matrix(0.998358,0.0572833,-0.0572833,0.998358,15.545,-79.3702)">
215
+ <g>
216
+ <g>
217
+ <g transform="matrix(1,0,0,1,398.965,43.2222)">
218
+ <path
219
+ fill="#0096FF"
220
+ d="M73.8,141.4c0.7,0.2-1.1-1-1.5-1.6c-0.9-1.5,2.2-4.9,2.2-4.9c3.4-5.2,7.1-9.9,11-14.8
221
+ c1.8-2.2,2.9-7.9,5.5-6.6c2.4,1.2-12.2,20.2-13.7,21.9c-1.4,1.6-4.4,6.5-4.4,4.4c0-8.8,14.7-31.8,23-34.6
222
+ c1.9-0.6-1.5,3.8-2.7,5.5c-0.4,0.5-9.3,12.1-11.5,9.9c-1.4-1.4,1.7-7,2.2-7.7c4.6-7.2,10.6-13.6,17-19.2
223
+ c2.6-2.3,5.1-4.9,7.7-7.1c1.3-1.1,3.8-5,3.8-3.3c0,5-10.9,14.5-14.3,18.1c-1.6,1.7-3.8,6-5.5,4.4c-2.2-2.2,3.5-5.2,5.5-7.7
224
+ c5.4-6.7,11-13,17.6-18.7c2-1.7,5.3-4.6,7.7-6c2-1.2,6.5-6.5,5.5-4.4c-4.5,9-22.9,15.6-11,5.5c17.2-14.6,33.4-19.6,53.8-26.3
225
+ c11.7-3.9,17.5-13.2,31.3-10.4c6.4,1.3,14.9,1.8,20.9,3.8c7.3,2.4,14.8,8.8,22.5,8.8c1.3,0-2.6,0.2-3.8,0
226
+ c-2.5-0.4-4.9-1.3-7.1-2.2c-8.1-3.2-16.5-5-24.7-7.7c-0.7-0.2-1.5-7.1-1.1-7.1c1.3,0,3.6,3.6,5.5,3.8
227
+ c12.3,1.8,20.7,8.4,32.4,13.7c22.6,10.3,41.6,23.5,58.7,40.6c13.3,13.3,10.8,40,15.9,55.4c2.8,8.5,3.1,19,5.5,28.5
228
+ c1.2,4.7,4.1,11.7,2.2,17.6c-0.7,2-0.2,4.6-1.6,6c-1,1-11-1.2-12.6-1.6c-12.4-3.1-27.3-1.1-40.1-1.1
229
+ c-13.3,0-31.3,5.8-42.8,11.5c-5.8,2.9-15.5,0.6-21.9,2.7c-6.1,2-17.2-0.7-23-2.2s-12.2-0.5-18.1-1.6c-9.3-1.9-18.1-5.5-28-7.1
230
+ c-17.9-3-41,1-58.2,4.4c-4.6,0.9-10.8,3.8-15.4,3.8c-5.9,0-11.9-0.5-17.6-0.5c-0.9,0-8.8,1.5-8.8,0.5c0-6.2,10.5-16.6,12.6-23
231
+ c6.8-20.3,4-39.2,24.7-51.6c5.3-3.2,16.3-10.1,23-7.1c10.2,4.5-3.5,26.8-5.5,30.7c-1.7,3.4-3.8,6.5-5.5,9.9
232
+ c-0.3,0.7-5.8,12.5-6.6,14.3c-0.7,1.6-2.4,6-1.1,4.9c24.9-21.4,45.1-47,72.4-65.8c7-4.9,19.9-13.4,28-18.1
233
+ c2.2-1.3,8.3-5,7.1-2.7c-2.1,4.3-14.3,15-15.4,15.9c-16.6,15-33.5,29.5-51,43.3c-2.1,1.7-10.6,10.4-14.3,8.8
234
+ c-2.9-1.3,1.7-6.1,3.3-8.8c4-6.8,4-6.4,7.7-13.2c8.7-16.1,18.3-32.5,30.7-46.1c5.2-5.8,9.5-10.4,15.4-15.4
235
+ c1.4-1.2,5.4-4.6,4.9-2.7c-1.1,4.3-7.7,8.4-11,11.5c-13.9,13.2-21.5,20.4-36.2,32.9c-3.8,3.2-7.6,6.3-11.5,9.3
236
+ c-0.2,0.2-5.1,4.2-5.1,2c0-2.4,15-17.5,17.4-20c19.7-20.9,43.7-41.6,70.3-53.3c3.7-1.6,36.7-14.9,30.5,1.6
237
+ c-0.9,2.5-2.2,4.8-3.6,7.1c-1.4,2.5-3,4.9-4.7,7.2c-4.6,6.6-11.3,15.3-16.5,21.4c-0.3,0.3-14.5,16.8-19.2,21.9
238
+ c-12.9,14.2-25.4,29.2-39,42.8c-2.3,2.3,4.9-4.3,7.1-6.6c4.2-4.4,8.3-8.9,12.6-13.2c17-16.7,34.9-32.5,53.2-47.7
239
+ c2.5-2.1,10.2-9.4,15.4-10.4c2.3-0.5-1.7,4.5-3.1,6.3c-1.5,2-3,3.9-4.5,5.7c-4.9,5.7-14,15.5-19.2,20.9
240
+ c-15,15.4-30,30.7-45,46.1c-6.9,7.1-6.8,6.8-13.2,14.3c-0.4,0.5-1.7,1.8-1.1,1.6c8.5-1.7,13-11.5,19.2-17.6
241
+ c20.5-20.2,41.2-40.1,63.6-58.2c4.9-3.9,14.5-11.4,21.2-15.7c1.4-0.9,14.5-8.4,9.5,0.8c-1.4,2.6-3.1,4.9-4.8,7.3
242
+ c-2,2.7-4.1,5.4-6.1,8c-5.8,7.5-11.3,14.2-17.6,21.4c-10.5,11.9-24.6,23.5-31.8,37.9c-1,2,3.9-2.3,5.5-3.8
243
+ c3.3-3.1,6.2-6.6,9.3-9.9c14-14.7,28.3-28.8,44.4-41.2c3.5-2.7,7.2-5.3,11-7.7c2.6-1.7,9.6-6.3,8.8-3.3
244
+ c-2.5,9.5-15.1,18.9-21.4,25.2c-21.4,21.7-43.1,45.9-67.5,64.2c-2.2,1.6,3.5-4.2,5.5-6c4-3.7,7.9-7.5,12.1-11
245
+ c16-13.6,32.5-27.1,49.9-39c4.5-3,10.5-7.2,16-9.6c2-0.9,6.8-3,6.5-0.8c-1.6,12-23.9,29.7-30.7,36.8c-5.2,5.4-15.4,9-15.4,16.5
246
+ c0,1.3,2.5-0.6,3.7-1.1c4.1-1.7,4.3-2,8.3-5.2c9.8-7.6,19-16.1,29.2-23.3c2.8-2,5.8-3.7,8.8-5.5c1-0.6,3-2.8,3.3-1.6
247
+ c1.5,5.8-14,19.7-16.5,22.5c-2.3,2.7-4.5,5.4-6.6,8.2c-0.8,1.1-2.8,4.6-1.6,3.8c5.1-3.1,8.5-6.5,13.2-10.4c2.4-2,4.7-4.1,7.1-6
248
+ c1.8-1.5,3.5-3.1,5.5-4.4c14.7-9.8-6,15.4-6,18.7c0,2.5,4.7-1.8,6.6-3.3c2.9-2.3,7.3-7.4,11.9-5.9c3.6,1.2-2.4,11.3-0.9,13.6
249
+ c2.1,3.1,8.1-3.9,9.3-2.7c0.6,0.6,0.8,5.3,0,6c-2.1,2.1-5.8-4.9-7.1-4.9"
250
+ />
251
+ <path
252
+ fill="#0096FF"
253
+ d="M210.4,9.7h1l1,0.1l1.2,0.2l1.2,0.2h0.1l1.3,0.3l1.3,0.4h0.1l1,0.4l1,0.4l0.9,0.4l1.5,0.8l1.2,0.8l1,0.7
254
+ l0.5,0.4l0.3,0.1l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.3l0.8,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3
255
+ l0.7,0.3l1.3,0.5l1.3,0.6l1.3,0.6l1.2,0.6l1.2,0.6L243,22l1.1,0.6l1.1,0.6l1,0.6l2,1.1l1.9,1l0.9,0.5l0.9,0.5l0.9,0.5l0.9,0.4
256
+ l0.7,0.3l1.3,0.5l1.4,0.7l1.4,0.7l0.1,0.1l0.9,0.4l1.2,0.5l1.2,0.5l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6
257
+ l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7
258
+ l1.1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8
259
+ l1,0.8l1,0.8l1,0.8l0.9,0.8L311,64l0.9,0.8l0.9,0.8l0.9,0.8l0.9,0.8l0.9,0.8l0.9,0.9l0.9,0.9l0.9,0.9l0.9,0.9l0.9,0.9l0.9,0.9
260
+ l0.9,0.9l0.9,0.9l0.5,0.6l0.6,0.6l0.6,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.7l0.5,0.6l0.5,0.6l0.4,0.7l0.4,0.7
261
+ l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.6l0.4,0.7l0.4,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.6l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.6
262
+ l0.3,0.7l0.3,0.6l0.2,0.6l0.3,0.7l0.4,1.2l0.4,1.3l0.4,1.3l0.4,1.3l0.4,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.2,1.2
263
+ l0.2,1.2l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.3,2.1l0.3,2l0.5,3.8l0.2,1.8l0.2,1.7l0.1,0.8
264
+ l0.1,0.8l0.1,0.8l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.4l0.1,0.4l0.1,0.3l0.2,0.5
265
+ l0.3,1l0.4,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.2,1.2l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1l0.2,1l0.2,1l0.3,1.9l0.5,3.7
266
+ l0.3,1.7l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.6l0.1,0.6l0.1,0.6v0.1v0.2l0.2,0.7l0.6,2l0.4,1.2
267
+ l0.2,0.7l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.9l0.2,0.9l0.2,1l0.2,1l0.2,1.1l0.2,1.1l0.1,1.2l0.1,1.2l0.1,1.2v0.7v0.7v0.7v0.7v0.7
268
+ v0.7v0.7l-0.1,0.7l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.2,0.8l-0.2,0.8l-0.2,0.8l-0.1,0.6l0,0l-0.1,0.9l-0.1,1l-0.1,0.8
269
+ l-0.2,0.8l-0.2,0.8l-0.2,0.9l-0.3,1l-0.4,1.1l-0.4,1.1l-0.5,1.2l-0.6,1.3l-0.7,1.3l-0.8,1.3l-0.9,1.3l-1.1,1.3l-0.7,0.7l-1,1
270
+ l-1,0.9h-0.1l-0.9,0.7l-0.9,0.7l-1,0.6h-0.1l-1.3,0.7l-1.3,0.7l-1,0.5l-1.9,0.7l-1.6,0.4l-1.4,0.3l-1.2,0.2l-1.2,0.1l-1.5,0.1
271
+ H326h-1.2l-1-0.1l-0.9-0.1l-0.9-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-1.4-0.2l-1.4-0.2l-1.3-0.2l-1.2-0.2l-1.1-0.2l-1-0.2
272
+ l-0.9-0.2l-0.8-0.2l-0.5-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.4-0.1l-0.4-0.1h-0.4h-0.4H305
273
+ h-0.4h-0.4h-0.4h-0.4H303h-0.4h-0.5h-0.4h-1h-1h-1h-1.1h-1.1h-1.1h-1.1h-1.2h-1.2h-1.2l-2.5,0.1l-2.5,0.1l-2.6,0.1h-1.3h-1.4
274
+ H279h-1.4h-1.4h-1.3h0.1h-0.3h-0.3H274h-0.4h-0.4h-0.4h-0.4H272h-0.4l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1
275
+ l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.2
276
+ l-0.6,0.2l-0.6,0.2l-0.5,0.2l-1.2,0.3l-1.2,0.4l-1.2,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1,0.4l-1,0.4
277
+ l-1,0.4l-0.9,0.4l-0.9,0.4l-0.8,0.4l-1,0.5l-0.7,0.3l-0.9,0.4l-0.9,0.4l-0.9,0.3l-0.8,0.3l-0.9,0.3l-0.8,0.2l-0.8,0.2l-0.8,0.2
278
+ l-0.8,0.2l-0.7,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-1.2,0.1l-1.2,0.1l-1.1,0.1l-1.1,0.1h-1h-1H223h-0.8h-1.5
279
+ h-1.3h-0.5h-0.5H218h-0.3h-0.3l0,0h-0.1l-0.9,0.3l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.8,0.2l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1
280
+ l-0.7,0.1l-0.7,0.1h-0.7h-0.7h-0.7h-0.7h-0.7h-0.7h-1.2l-1.3-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.1-0.1l-1.1-0.2l-1.1-0.2
281
+ l-1.1-0.2l-1-0.2l-1-0.2l-1-0.2l-1-0.2l-0.9-0.2l-0.9-0.2l-1.7-0.4l-1.6-0.4l-1.4-0.3l-1.1-0.3h-0.1l0,0h-0.1h-0.1h-0.1h-0.2
282
+ h-0.2H181h-0.3h-0.3h-0.3h-0.3h-0.9h-1h-1.2h-1.3l-1.4-0.1h-0.8h-0.8l-0.8-0.1l-0.9-0.1l-0.9-0.1l-1-0.1l-1-0.1l-1-0.1
283
+ l-1.1-0.2l-1-0.2l-1.2-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.3l-1.1-0.3l-1-0.3l-1-0.3l-1-0.3l-1.9-0.5l-1.9-0.5l-3.5-1l-1.6-0.5
284
+ l-1.6-0.5l-0.7-0.2l-0.8-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.1l-0.7-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1
285
+ l-0.5-0.1l-0.5-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1h-0.6h-0.7h-0.7h-0.7H130h-0.7h-0.7h-0.7h-0.7h-0.7h-0.8h-0.8
286
+ h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-1.7,0.2
287
+ l-1.7,0.2l-1.7,0.2l-1.7,0.2l-1.7,0.3l-1.7,0.3l-1.7,0.3l-1.7,0.3l-1.7,0.3l-1.7,0.3l-1.6,0.3l-1.6,0.3l-1.6,0.3l-1.6,0.3
288
+ l-1.5,0.3h-0.1l0,0h-0.1h-0.2l-0.2,0.1l-0.2,0.1l-0.7,0.2l-0.8,0.2l-0.9,0.3l-1,0.3l-1.2,0.4l-1.2,0.4l-0.7,0.2l-0.7,0.2
289
+ l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.9,0.2l-0.9,0.2l-1,0.2l-1,0.2l-1.1,0.2l-1.1,0.1l-1.2,0.1l-1.2,0.1H68h-1.5h-1.3h-1.3h-1.3
290
+ h-1.2l-1.2-0.1l-2.3-0.1l-2.2-0.1h-1h-1h-0.9h-0.9h-0.3l-1.3,0.2l-0.9,0.1l-1,0.1l-1.1,0.1l-1.2,0.1l-0.7,0.1h-0.7h-0.8H43
291
+ h-1.1l-1.3-0.1l-1.7-0.2l-2-0.4l-1.8-0.5l-0.8-0.3l-1-0.4l-1-0.4h-0.1l-1.3-0.6l-1.2-0.7h-0.1l-1.1-0.7l-1.1-0.8l-1-0.8l0,0
292
+ l-1.2-1.1l-1.1-1.2l-1-1.2l0,0l-0.9-1.2l-0.8-1.3l-0.7-1.3l-0.6-1.4l0,0l-0.6-1.5l-0.5-1.6l-0.4-1.6l-0.3-1.6l0,0l-0.1-1.2
293
+ l-0.1-1.2v-1.2l0-0.9l0.1-1.4l0.2-1.3l0.2-1.3l0.2-1.2l0.3-1.1l0.3-1.1l0.3-1l0.3-0.9l0.3-0.9l0.3-0.9l0.3-0.8l0.3-0.8l0.3-0.7
294
+ l0.4-0.7l0.3-0.7l0.3-0.7l0.3-0.6l0.3-0.6l0.4-0.6l0.7-1.1l0.7-1.1l0.7-1l0.7-1l0.6-0.9l0.6-0.9l1.1-1.6l1.1-1.5l0.5-0.7
295
+ l0.4-0.6l0.4-0.6l0.3-0.5l0.3-0.4l0.2-0.4l0,0l0.2-0.5l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.8l0.2-0.8l0.2-0.8
296
+ l0.2-0.8l0.2-0.8l0.4-1.7l0.4-1.7l0.8-3.6l0.4-1.9l0.2-1l0.2-1l0.2-1l0.2-1l0.3-1l0.3-1.1l0.3-1.1L38,152l0.3-1.1l0.3-1.1
297
+ l0.4-1.1l0.4-1.1l0.4-1.2l0.4-1.2l0.5-1.2l0.5-1.2l0.5-1.2l0.5-1.2l0.3-0.7l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6
298
+ l0.3-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.5-0.6l0.5-0.6l0.5-0.6l0.5-0.6
299
+ l0.5-0.6l0.5-0.6l0.5-0.6v-0.1v-0.1l0.4-1l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.5-0.9l0.5-0.9l0.5-0.9l0.5-0.9
300
+ l0.5-0.9l0.5-0.9l0.5-0.9l0,0l0.2-0.7l0.3-0.9l0.3-0.8l0.3-0.8l0.3-0.7l0.3-0.7l0.3-0.7l0.5-1.1l0.5-1l0.5-0.9l0.4-0.8l0.4-0.8
301
+ l0.4-0.8l0.5-0.8l0.7-1.1l0.6-0.9l0.6-0.9l0.6-0.9l0.6-0.9l0.6-0.9l0.6-0.8l0.6-0.8l0.6-0.8l0.6-0.8l0.7-0.8l0.7-0.8l0.7-0.8
302
+ l0.7-0.8l0.7-0.8l0.7-0.8l0.7-0.8l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7
303
+ l0.7-0.6l0.7-0.6l0.7-0.6l0.6-0.6l0.4-0.3l0.3-0.3l0.3-0.3l0.4-0.3l0.9-0.8l0.9-0.9l1-1l0.2-0.1l0.2-0.3l0.6-0.7l0.6-0.7
304
+ l0.7-0.7l0.7-0.7l0.1-0.1l0.3-0.6l0.5-1l0.6-1l0.8-1.3l0.9-1.3l0.8-1.1L97,62l0.8-0.9l0.8-0.8l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7
305
+ l0.8-0.7l1-0.8l1-0.8l1-0.8l1-0.8l1-0.8l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.6l1-0.6l1-0.6l1-0.6l1-0.6l1-0.6
306
+ l1-0.6l1-0.6l1-0.5l1-0.5l1-0.5l1-0.5l1-0.5l1-0.5l1-0.5l1-0.5l1-0.5l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4
307
+ l1-0.4l1.9-0.7l1.9-0.7l1.9-0.7l1.9-0.7l1.9-0.7l1.9-0.7l1.9-0.6l1.9-0.6l3.7-1.2l3.7-1.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1
308
+ l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.3-0.2l0.3-0.1l0.7-0.4l0.7-0.4l0.8-0.4l1.7-1l1-0.6
309
+ l1.1-0.6l1.1-0.6l0.7-0.4l0.6-0.3l0.7-0.3l0.7-0.3l0.7-0.4l0.7-0.3l0.8-0.4l0.8-0.3l0.8-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3
310
+ l0.9-0.3l1-0.3l1-0.3l1-0.2l1-0.2l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.1l1.1-0.1l1.2-0.1h0.6h0.1l1.4-0.8l1.4-0.7l1.5-0.6l1.5-0.5
311
+ l1.5-0.4l0,0l1.6-0.3l1.6-0.2l1.6-0.1L210.4,9.7z M55.5,120.7l-0.1,0.1L55.5,120.7L55.5,120.7z"
312
+ />
313
+ </g>
314
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
315
+ <path
316
+ fill="#E2F0FD"
317
+ d="M184.1,73.1l1.4,0.1l1.3,0.2l1,0.2l0.9,0.2l0.9,0.3l0.9,0.3l0.9,0.4l1,0.5l1,0.5l1,0.6l1,0.7l0.9,0.8
318
+ l0.9,0.9l0.9,0.9l0.8,1l0.7,1.1l0.7,1.1l0.6,1.1l0.5,1.1l0.4,1l0.3,0.9l0.2,0.7l0.2,0.7l0.2,0.7l0.1,0.7l0.1,0.7l0.1,0.7
319
+ l0.1,0.7l0.1,0.7l0.1,0.7V94v0.7v0.7v0.7v0.7v0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.6l-0.1,0.6l-0.2,0.6
320
+ l-0.2,0.6L202,104l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.5l-0.2,0.6l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.6l-0.5,0.9
321
+ l-0.5,1l-0.5,0.9l-0.5,0.9l-0.6,0.9l-0.6,0.9l-0.6,0.8l-0.6,0.8l-0.6,0.8l-0.6,0.8l-0.6,0.7l-0.6,0.7l-0.6,0.7l-0.6,0.7
322
+ l-0.6,0.7l-0.6,0.7l-0.6,0.6l-0.6,0.6l-0.6,0.6l-0.6,0.6l-0.6,0.6l-0.6,0.6l-0.6,0.6l-0.6,0.6l-1.1,1l-1.1,1l-1.1,1l-1.9,1.7
323
+ l-1.7,1.5l-0.7,0.6l-0.6,0.6l-0.5,0.5l-0.2,0.2l-0.2,0.2l-0.4,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.3l-0.5,0.3
324
+ l-0.5,0.3l-0.5,0.3l-0.6,0.3l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1h-0.6
325
+ h-0.6l0,0l-0.5,0.3l-0.9,0.4l-0.8,0.4l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-1,0.2l-1,0.2l-1,0.2l-1,0.1l-1,0.1h-1h-1.1h-1.1
326
+ l-1.1-0.1l-1-0.1l-1-0.2l-1-0.2l-1-0.3l-1-0.3l-1-0.4l-0.9-0.4l-0.9-0.4l-0.9-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.7-0.5
327
+ l-0.7-0.6l-0.7-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.3-0.4l-1-0.2l-1.1-0.3l-1.1-0.4l-1.1-0.4l-1-0.5l-0.9-0.5l-0.9-0.5l-0.9-0.6
328
+ l-0.8-0.6l-0.7-0.6l-0.7-0.6l-0.6-0.6l-0.6-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.5-0.9
329
+ l-0.5-1l-0.4-1l-0.4-0.9l-0.3-0.9l-0.3-0.9l-0.3-0.9l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.1-0.8l-0.1-0.7l-0.1-0.7
330
+ l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7v-0.7v-0.7v-0.7l-0.1-1.2v-1.2l0-1.2V101v-1.1l0.1-1.1v-0.6l0.1-0.6
331
+ l0.1-0.6l0.1-0.6l0.1-0.7l0.1-0.8l0.2-1l0.4-1.4l0.3-0.8l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.3-0.5v-0.1l0.3-0.5l0.3-0.5
332
+ l0.3-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.4l0.4-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3
333
+ l0.5-0.3l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.1l0.6-0.1l0.6-0.1h0.4l0.3-0.2l0.5-0.4l0.5-0.4l0.5-0.3
334
+ l0.5-0.3l0.5-0.3l0,0l0.5-0.3l0.5-0.3l0.5-0.3l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1
335
+ l0.6-0.1h0.6h0.6h0.6h0.6h0.6l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.3,0.2
336
+ l0.3-0.3l0.5-0.5l0.5-0.5l0.6-0.5l0.6-0.5l0.7-0.5l0.7-0.5l0.8-0.6l0.9-0.6l1-0.6l1.1-0.6l1.2-0.6l1.3-0.5l1.2-0.4l1.1-0.3
337
+ l1.2-0.2l1.2-0.2l1.3-0.1h1.3h1.4l1.4,0.1l1.4,0.2l1.4,0.3l1.5,0.5l1.4,0.6l1.3,0.7l1.3,0.8l0.1,0.1l0.6-0.1l1-0.1l1.1-0.1h1.2
338
+ L184.1,73.1z"
339
+ />
340
+ </g>
341
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
342
+ <path
343
+ fill="#E2F0FD"
344
+ d="M104.3,122.6h0.2h0.2h0.2h0.2h0.1h0.2h0.2h0.2h0.2h0.2h0.1h0.2h0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0,0
345
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
346
+ l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2
347
+ l0.1,0.2v0.2l0,0v0.2v0.2v0.2v0.2v0.2v0.2l0,0.3v0.5v0.4l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.2,0.6
348
+ l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.5l-0.3,0.5l-0.3,0.5
349
+ l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.4,0.5l-0.4,0.4l-0.2,0.3l-0.2,0.2l-0.3,0.3
350
+ l-0.3,0.3l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.5,0.2l-0.5,0.2l-0.3,0.1l-0.2,0.1H100h-0.2h-0.1h-0.2h-0.2h-0.2H99h-0.2
351
+ h-0.1h-0.1h-0.2h-0.1h-0.2H98l-0.2,0.1l-0.4,0.2l-0.5,0.2l-0.5,0.2l-0.6,0.2l-0.6,0.2l-0.4,0.1h-0.2h-0.2h-0.2H94h-0.2h-0.2
352
+ h-0.2h-0.2H93h-0.2h-0.2h-0.2l-0.4-0.1l-0.5-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
353
+ l-0.3-0.3l-0.5-0.4l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.3-0.5l-0.3-0.6l-0.3-0.6l-0.2-0.6l-0.2-0.6l-0.1-0.6l-0.1-0.6v-0.6v-0.6
354
+ v-0.6l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3
355
+ l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.8-0.6l0.6-0.5
356
+ l0.5-0.4l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.3-0.2l0.8-0.6l0.5-0.4l0.6-0.4l0.6-0.4l0.7-0.4l0.7-0.4l0.4-0.2
357
+ l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.2l0.6-0.2l0.4-0.1l0.4-0.1l0.5-0.1L104.3,122.6z"
358
+ />
359
+ </g>
360
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
361
+ <path
362
+ fill="#E2F0FD"
363
+ d="M77.7,183.2h0.2h0.2h0.2h0.1h0.2h0.2H79l0.3,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.6,0.2l0.6,0.3l0.7,0.3
364
+ l0.7,0.3l0.7,0.4l0.7,0.4l0.8,0.4l0.8,0.4l0.8,0.4l0.8,0.4l0.8,0.5l1.7,0.9l1.6,0.9l1.6,0.9l1.4,0.9l1.3,0.8l1.1,0.7l0.5,0.3
365
+ l0.4,0.3l0.4,0.3l0.4,0.3l0.3,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0,0l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.2
366
+ l0.1,0.2l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.2l-0.1,0.3
367
+ l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.3l-0.2,0.3l-0.1,0.2l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
368
+ l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1H100l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.2l-0.5,0.3l-0.3,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1
369
+ l-0.3,0.1l-0.5,0.1l-0.5,0.1h-0.3h-0.2h-0.2h-0.2h-0.1h-0.2H95h-0.2h-0.4l-0.6-0.1l-0.5-0.1l-0.5-0.1l-0.4-0.1l-0.4-0.1
370
+ l-0.4-0.1l-0.6-0.2l-0.5-0.2l-0.4-0.2H90l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.9,0.1l-0.9,0.1h-0.9h-1h-1h-1h-1h-0.5h-0.5h-0.5h-0.5
371
+ h-0.5h-0.5l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1
372
+ l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.4
373
+ l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.4-0.4l-0.2-0.3l-0.2-0.2l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3
374
+ l-0.2-0.3l-0.2-0.4l-0.2-0.4l-0.1-0.5l-0.1-0.5l-0.1-0.5v-0.5v-0.5v-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.1-0.3l0.1-0.2l0.1-0.2
375
+ l0.1-0.2l0.1-0.1l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.3-0.3l0.5-0.4
376
+ l0.4-0.3l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.2L66,185l0.4-0.1l0.4-0.1l0.4-0.1l0.3-0.1l0.4-0.1l0.7-0.2l0.7-0.1l0.7-0.1l0.7-0.1
377
+ l0.7-0.1l0.7-0.1l0.6-0.1h0.6h0.6h0.6h0.4l0.1-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.1l0.2-0.1h0.2H77
378
+ l0.3-0.1l0.6-0.1L77.7,183.2z M82.6,187.1L82.6,187.1h-0.1H82.6z M72.7,185.7L72.7,185.7L72.7,185.7L72.7,185.7z"
379
+ />
380
+ </g>
381
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
382
+ <path
383
+ fill="#0065FF"
384
+ d="M154.3,188.6l1.6-0.1l1.5-0.1l1.5-0.1h0.7h0.7h0.6l0.6-0.1h0.6l0.6-0.1l0.5-0.1l0.6-0.1l3.9-0.6l2-0.3
385
+ l2-0.3l2.1-0.3l2.1-0.3l2.1-0.3l2.1-0.3l2.1-0.4l2.1-0.4l2.1-0.4l2.1-0.4l2.1-0.4l1-0.2l1.1-0.2l1.1-0.2l1-0.2l1-0.2l1-0.2
386
+ l1-0.2l1-0.2l1-0.2l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3
387
+ l0.9-0.3l0.9-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.7-0.3l0.7-0.3l0.7-0.4l0.7-0.3l0.7-0.4l0.7-0.4l0.8-0.5
388
+ l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.7l0.8-0.7
389
+ l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8
390
+ l0.8-0.8l0.8-0.8l0.8-0.8l1.7-1.7l1.6-1.7l1.6-1.7l1.6-1.7l1.6-1.8l3.3-3.5l3.3-3.5l1.7-1.8l1.7-1.8l1.7-1.8l1.7-1.8l1.7-1.7
391
+ l0.9-0.9l0,0v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.7l0.1-0.8l0.1-0.8l0.1-0.9l0.1-0.9
392
+ l0.3-1.9l0.3-2l0.1-1.1l0.2-1.1l0.2-1.1l0.2-1.2l0.2-1.2l0.1-0.7l0.1-0.6l0.1-0.6l0.1-0.7l0.2-0.6l0.2-0.7l0.2-0.7l0.2-0.7
393
+ l0.2-0.7l0.2-0.7l0.2-0.6l0.2-0.6l0.2-0.6l0.2-0.6l0.2-0.5l0.2-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5
394
+ l0.3-0.5l0.3-0.5l0.4-0.5l0.4-0.5l0.4-0.4l0.4-0.5l0.4-0.4l0.4-0.4l0.5-0.5l0.8-0.7l0.9-0.8l0.9-0.7l0.9-0.7l0.9-0.6l0.9-0.6
395
+ l0.9-0.5l0.9-0.5l0.9-0.5l0.9-0.4l0.9-0.4l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.1l0.8-0.1l0.8-0.1
396
+ l0.8-0.1l0.8-0.1l0.8-0.1h0.8h0.8h0.8h0.7h0.8h0.7h0.7l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.6,0.1
397
+ l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.4L328,85l0.8,0.3l0.7,0.3l0.7,0.3l0.7,0.4
398
+ l0.6,0.4l0.6,0.4l0.6,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.8,0.7l0.8,0.8l0.8,0.8l0.7,0.8l0.6,0.8l0.6,0.8l0.6,0.8l0.5,0.7
399
+ l0.5,0.7l0.5,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7
400
+ l0.3,0.7l0.5,1.3l0.5,1.3l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.3,1.1l0.6,2l0.6,1.8l0.2,0.8l0.2,0.7l0.2,0.6l0.2,0.5l0.1,0.3
401
+ l0.1,0.2l0.4,1.1l0.5,1.2l0.5,1.2l0.5,1.2l0.5,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2
402
+ l0.4,1.2l0.4,1.3l0.4,1.2l0.4,1.3l0.4,1.2l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3
403
+ l0.3,1.3l0.3,1.3l0.2,1.1l0.1,0.2l0.1,0.3l0.1,0.5l0.2,0.7l0.2,0.8l0.2,0.9l0.2,1l0.2,1.1l0.1,0.6l0.1,0.6l0.1,0.7l0.1,0.7
404
+ l0.1,0.7l0.1,0.8l0.1,0.8l0.1,0.8v0.9v0.9v1l-0.1,1.1l-0.1,1.1l-0.1,0.8l-0.1,0.7l-0.1,0.7l-0.2,0.7l-0.2,0.8l-0.2,0.5
405
+ l-0.1,0.3v0.1v0.1v0.1l-0.1,0.5l-0.1,0.6l-0.2,0.7l-0.2,0.8l-0.2,0.9l-0.2,1l-0.3,1.1l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.7
406
+ l-0.2,0.7L361,192l-0.3,0.7l-0.3,0.7l-0.3,0.8l-0.3,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.7l-0.5,0.7
407
+ l-0.4,0.6l-0.4,0.6l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.7,0.8l-0.7,0.8l-0.6,0.7l-0.5,0.6l-0.4,0.5l-0.2,0.2l-0.1,0.1l-0.2,0.4
408
+ l-0.3,0.6l-0.3,0.5l-0.3,0.6l-0.5,0.9l-0.5,0.9l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.6,0.8l-0.6,0.7l-0.6,0.7l-0.6,0.7l-0.6,0.7
409
+ l-0.6,0.7l-0.6,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.8,0.7l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.5,0.4
410
+ l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.7,0.3l-0.7,0.3l-0.8,0.3l-0.8,0.3l-0.8,0.2
411
+ l-1.1,0.3l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1
412
+ h-0.9H310h-0.9h-0.9h-0.9h-0.9h-1.7H303h-1.7h-1.7H298h-3.2h-1.5h-1.5h-1.5h-1.4h-1.4h-0.7h-0.7h-0.7h-0.7h-0.6h-0.6h-0.6h-0.6
413
+ l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.5,0.1l-0.5,0.1l-0.6,0.1L273,233l-3.6,0.7l-3.6,0.7
414
+ l-3.6,0.7l-7.2,1.5l-7.2,1.5l-7.3,1.5l-7.3,1.5l-3.7,0.8l-3.7,0.8l-3.7,0.8l-3.8,0.8l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1
415
+ l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.7l-0.7-0.1l-0.7-0.1l-0.7-0.1
416
+ l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-1.4-0.2l-1.4-0.2l-1.4-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.2-0.3
417
+ l-1.2-0.3l-1.2-0.3l-1.2-0.3l-1.1-0.3l-2.2-0.5l-2-0.5l-2.1-0.5l-0.7-0.2l-0.8-0.2l-0.8-0.3l-0.7-0.3l-0.7-0.3l-0.7-0.3
418
+ l-0.6-0.3l-0.6-0.3l-0.5-0.3l-0.6-0.3l-0.9-0.5h-0.1h-0.3h-0.6l-0.6-0.1l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.2
419
+ l-0.7-0.2l-0.7-0.2l-0.8-0.3l-0.7-0.3l-0.3,0.3l-0.9,0.8l-1,0.7l-1,0.6l-1.1,0.6l-1.1,0.5l-1.1,0.4l-1.2,0.3l-1.2,0.2l-0.6,0.1
420
+ l-0.8,0.1l-0.9,0.1l-0.9,0.1l-1,0.1h-1.1h-1.1l-1.2-0.1l-1.2-0.2l-1.3-0.2l-1.2-0.3l-0.8-0.2l-0.7-0.2l-0.7-0.3l-0.7-0.3
421
+ l-0.7-0.3l-0.7-0.3l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.5-0.5l-0.6-0.5l-0.5-0.6l-0.5-0.5l-0.5-0.6
422
+ l-0.4-0.6l-0.4-0.6l-0.5-0.7l-0.6-1l-0.6-1.1l-0.5-1.1l-0.4-1l-0.4-1l-0.3-0.9l-0.3-0.9l-0.2-0.9l-0.2-0.9l-0.2-0.8l-0.2-0.6
423
+ l-0.2-0.7l-0.2-0.8l-0.2-0.9l-0.2-0.9l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.7l-0.1-0.8l-0.1-0.8l-0.1-1v-1.1V208
424
+ l0.1-1.4l0.2-1.2l0.3-1.2l0.4-1.3l0.3-0.7l0.3-0.8l0.4-0.8v-0.1l0.4-0.8l0.4-0.7v-0.1l0.7-1l0.7-0.9l0,0l0.5-0.6l0.6-0.6
425
+ l0.6-0.6l0,0l0.7-0.6l0.8-0.6l0.8-0.5h0.1l0.9-0.5l0.9-0.5l0.9-0.4l0.8-0.3l1.2-0.4l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2
426
+ l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.1l1-0.1l1-0.1l1-0.1l1-0.1l1-0.1l0.9-0.1h0.9L154.3,188.6z
427
+ M353.1,204.9L353.1,204.9L353.1,204.9L353.1,204.9z"
428
+ />
429
+ </g>
430
+ <g transform="matrix(1,0,0,1,381.866,45.2348)">
431
+ <path
432
+ fill="#0096FF"
433
+ d="M100,290.7h0.6h0.6h0.6h0.6h0.6h0.5h0.5h0.5h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l1,0.2
434
+ l1,0.2l1,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.8,0.2l1.6,0.4l1.5,0.4l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.6,0.1
435
+ l0.6,0.1h0.1h0.1h0.3h0.3h0.3h0.4h0.4h0.4h0.4h0.5h0.5h0.5h0.5h1.1l1.2-0.1l1.2-0.1h0.7h0.7h0.7h0.7h0.7h0.7h0.8l0.8,0.1
436
+ l0.8,0.1l0.8,0.1l0.8,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0,0l20.9,0h0.2h0.4h0.4l0.4,0.1l0,0
437
+ l0.5,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.3l0.5,0.3l0.4,0.3l0.4,0.3l0.4,0.4l0.4,0.4l0.4,0.4l0.3,0.4l0.3,0.4l0.3,0.5
438
+ l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.1,0.5l0.1,0.5l0.1,0.5v0.5v0.5l0,0v0.6l-0.1,0.6l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.5
439
+ l-0.2,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.2l0,0l-0.5,0.2
440
+ l-0.5,0.2l-0.5,0.1l-0.4,0.1l-0.7,0.1l-0.5,0.1l-0.5,0.1l-0.4,0.1h-0.2l-0.4,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.5,0.1h-0.5
441
+ h-0.5h-0.5h-0.9h-0.9h-0.8h-0.7h-2h-1h-1h-1h-1.1h-1.1l-1.1-0.1h-0.6h-0.6l-0.6,0l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1
442
+ l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.4-0.1H101h-0.6h-0.6l-0.5-0.1l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.3l-0.5-0.3l-0.5-0.3
443
+ l-0.4-0.3l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.2-0.2l-0.1,0.1l-0.6,0.3l-1.3,0.6l-1.3,0.7l-1.4,0.7l-0.7,0.4l-0.8,0.4l-0.8,0.3
444
+ l-0.8,0.3l-0.8,0.3l-0.8,0.3l-0.8,0.3l-0.5,0.2l-0.4,0.1l-0.4,0.1L82,315l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1
445
+ l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1L77,316h-0.5H76h-0.5h-0.6h-0.6h-0.4l-0.5-0.1l-0.5-0.1l-0.5-0.1l0,0l-0.5-0.2l-0.5-0.2
446
+ l-0.5-0.2l-0.5-0.2l-0.4-0.3l-0.4-0.3l0,0l-0.4-0.3l-0.4-0.3l-0.4-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.2-0.5
447
+ l-0.2-0.5l0,0l-0.2-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5v-0.5v-0.5v-0.5l0.1-0.6l0,0l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.2-0.5
448
+ l0.2-0.4l0.2-0.4l0.3-0.4l0,0l0.3-0.4l0.3-0.4l0.3-0.4l0.4-0.4l0.4-0.3l0,0l0.4-0.3L70,300h0.1l0.4-0.2l0.4-0.2l0.4-0.2
449
+ l0.2-0.1l0.1-0.4l0.2-0.4L72,298l0.3-0.5l0.4-0.6l0.5-0.7l0.3-0.4l0.3-0.3l0.3-0.3l0.4-0.4l0.6-0.5l0.5-0.4l0.5-0.4l0.6-0.3
450
+ l0.7-0.3l0.7-0.3l0.7-0.2l0.7-0.2l0.8-0.1h0.8h0.8l0.7,0.1l0.6,0.1l0.4,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.3l0.5,0.3
451
+ l0.2,0.2l0.5-0.2l0.7-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.5-0.2l0.4-0.1l0.4-0.1l0.5-0.1l0.6-0.2l0.6-0.1l0.6-0.1
452
+ l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1h0.6L100,290.7z M79.4,310.3h0.2l-0.4-0.1L79.4,310.3z"
453
+ />
454
+ </g>
455
+ <g transform="matrix(1,0,0,1,396.607,49.2944)">
456
+ <path
457
+ d="M110.6,285.7h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.4,0.1l0.7,0.2
458
+ l0.7,0.2l0.7,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l1.1,0.5l1.1,0.5l1.1,0.4l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2
459
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1h0.2h0.2h0.2h0.3h0.3h0.3h0.3h0.3h0.3h0.6h0.6h0.6h0.6l0.6,0h0.6h0.7l1.3-0.1l1.4-0.1
460
+ l1.4-0.1h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.4h0.4h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.3,0.1h0.2h0.2h0.2h0.3h0.3h0.3h0.3h0.3h0.7
461
+ h0.8h0.8h0.4h0.4h0.4h0.4h0.4h0.4h0.4l0.5,0.1l0.5,0.1l0.5,0.1l0.4,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
462
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.3,0.3l0.3,0.3l0.2,0.3l0.2,0.4l0.2,0.4l0.1,0.4l0.1,0.4
463
+ l0.1,0.4l0.1,0.4v0.4v0.4v0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3
464
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.3,0.5l-0.3,0.6l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.4
465
+ l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.3,0.4l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.6,0.3l-0.6,0.3
466
+ l-0.6,0.3l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1
467
+ l-0.6,0.1l-0.6,0.1l-0.6,0.1H142h-0.6h-0.6h-0.6h-0.6H139h-0.6h-0.6h-0.6h-0.6l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1
468
+ l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-1.1-0.2l-1.1-0.2l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-2.1-0.6
469
+ l-2.1-0.6l-1-0.3l-1-0.3h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.4h-0.4h-0.4H113h-0.5l-0.5,0.1l-0.5,0.1
470
+ l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1L108,309l-0.5,0.1l-0.5,0.1l-0.5,0.1l-1,0.3l-1,0.3l-1,0.3l-1.8,0.6
471
+ l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.9
472
+ h-0.9h-0.9h-0.9h-0.9h-0.9l-0.9-0.1l-0.9-0.1l-1.8-0.1l-1.8-0.1l-0.9-0.1h-0.9h-0.8h-0.8h-0.8h-0.8h-0.8h-0.4h-0.4h-0.4h-0.4
473
+ h-0.3h-0.3h-0.3h-0.3h-0.3l-0.3,0.1l-0.4,0.1l-0.5,0.1l-0.6,0.1l-0.7,0.1l-0.7,0.1l-0.8,0.1l-0.8,0.1l-0.9,0.1l-0.9,0.1h-0.9
474
+ h-1h-1h-1h-1h-1h-1h-1h-1h-1h-1l-1-0.1l-0.9-0.1h-0.5h-0.5l-0.5-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1
475
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2
476
+ l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3v-0.2v-0.2v-0.3v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.3
477
+ l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.3-0.5l0.3-0.5l0.3-0.5l0.4-0.8l0.1-0.3l0.1-0.2l0.2-0.4l0.2-0.4
478
+ l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3
479
+ l0.3-0.3L55,293l0.3-0.2l0.4-0.2l0.4-0.2l0.3-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.7-0.4l0.7-0.3l0.7-0.3l0.7-0.3l0.7-0.3l1.3-0.6
480
+ l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.3-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1
481
+ l0.2-0.2l0.2-0.1l0.2-0.2l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1h0.4h0.4H71l0.3,0.1l0.3,0.1l0.2,0.1h0.1l0.4-0.1
482
+ l0.4-0.1l0.4-0.1l0.4-0.2l0.9-0.3l0.9-0.4l0.9-0.3l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.3h0.3
483
+ h0.3h0.3h0.3H82h0.3h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.5,0.1l0.5,0.1l0.9,0.3l0.9,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.7,0.3l0.7,0.3
484
+ l1.2,0.5l1.1,0.4l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.1l0.5,0.1l0.2,0.1l0.2,0.1l0.2,0.1H96h0.2h0.2h0.2h0.2H97h0.3h0.3h0.3h0.3h0.3
485
+ h0.3h0.3h0.3h0.3h0.3h0.3h0.4l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1l0.4-0.1
486
+ l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.4h0.4h0.4L110.6,285.7z M115.3,302.4h0.6h0.3h0.3h0.3h0.3h0.3h0.3l0.3,0.1
487
+ l0.3,0.1l0.3,0.1l0.3,0.1l1.1,0.3l1.1,0.3l2.1,0.6l2.1,0.6l1.1,0.3l1,0.3l1,0.3l1,0.3l1,0.2l1,0.2l1,0.2l0.5,0.1l0.5,0.1
488
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5l0.5-0.1l0.5-0.1
489
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.4-0.2
490
+ l0,0l0.1-0.1l0.2-0.1l0.2-0.2l0.2-0.2l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.2-0.4
491
+ l0.2-0.4l0.2-0.4l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2v-0.1V298v-0.1v-0.1v-0.1v-0.1v-0.1
492
+ l0,0H156h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.2-0.1H155h-0.2h-0.3h-0.3h-0.3h-0.3h-0.3H153h-0.4h-0.4h-0.8h-0.8h-0.8h-0.4H149
493
+ h-0.4h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.3-0.1h-0.2h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.6h-0.6h-0.6h-0.6h-0.6h-0.6H140h-0.7
494
+ l-1.4,0.1l-1.4,0.1l-1.4,0.1h-0.7h-0.7H133l-0.7,0h-0.7h-0.7h-0.7h-0.4h-0.4H129h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1
495
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-1.1-0.5l-1.1-0.5l-1.1-0.4l-0.5-0.2
496
+ l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.1l-0.5-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1h-0.3h-0.3h-0.3h-0.3
497
+ H112h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3H109h-0.3h-0.3h-0.3h-0.3l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.5,0.1
498
+ l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.4,0.1h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4H99h-0.4
499
+ h-0.4h-0.4h-0.4H97h-0.4h-0.4l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2
500
+ l-0.6-0.2l-1.2-0.5l-1.2-0.5l-0.6-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.8-0.2l-0.8-0.2l-0.4-0.1l-0.4-0.1h-0.1l0,0l0,0
501
+ H83h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.2
502
+ l-0.9,0.3l-0.9,0.3l-0.9,0.4l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1h-0.3h-0.3
503
+ h-0.1l-0.2,0.1l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3
504
+ l-1.3,0.6l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2
505
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
506
+ l-0.2,0.2l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.4,0.8l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.1,0.2
507
+ l-0.1,0.2l-0.1,0.2l0,0l0,0l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1h0.3H56h0.4h0.4h0.4l0.9,0.1l0.9,0.1h0.9h0.9h1h1h1h1h1h1
508
+ h0.9h0.9h0.9h0.9l0.8-0.1l0.8-0.1l0.7-0.1l0.7-0.1l0.6-0.1l0.5-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.4h0.4h0.4
509
+ h0.4h0.4h0.4h0.9h0.9H82h0.9h0.9h0.9l0.9,0.1l1.8,0.1l1.8,0.1l0.9,0.1l0.9,0.1h0.9h0.8h0.8h0.8h0.8h0.8h0.4h0.4h0.4h0.4h0.3
510
+ h0.3h0.3h0.3H99l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l1.8-0.6l1-0.3l1-0.3l1.1-0.3l0.6-0.2l0.6-0.2
511
+ l0.6-0.2l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1h0.6h0.6L115.3,302.4z"
512
+ />
513
+ </g>
514
+ <g transform="matrix(1,0,0,1,381.866,45.2348)">
515
+ <path
516
+ fill="#0096FF"
517
+ d="M258.4,272.4h0.5h0.5h0.6h0.4h0.3h0.3h0.2h0.2h0.2l0,0l0.2,0.1l0.2,0.1l0.2,0.1l0,0l0.2,0.1l0.2,0.1
518
+ l0.2,0.1l0.2,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2v0.2v0.2v0.2v0.2v0.2l0,0v0.2v0.2
519
+ l-0.1,0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l0,0l-0.1,0.2l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1h-0.1
520
+ l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.8,0.3l-0.9,0.2
521
+ l-0.8,0.2v0.1l0.1,0.2v0.2v0.2v0.2v0.2v0.2l0,0v0.2v0.2v0.2v0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
522
+ l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.2,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
523
+ l-0.5,0.1l-0.5,0.1l-0.6,0.1l-0.6,0.1l-0.7,0.1l-0.7,0.1l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1
524
+ L249,286l-0.2,0.2l-0.2,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1H248l-0.1,0.1l-0.2,0.1h-0.1h-0.1h-0.1h-0.1h-0.2
525
+ h-0.2h-0.1h-0.1h-0.2h-0.1h-0.1h-0.1h-0.1H246h-0.1h-0.1h-0.1h-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.2-0.2
526
+ l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2h-0.1l-0.8,0.1l-0.8,0.1h-0.8H240h-0.7h-0.7H238h-0.6h-0.5h-0.5h-0.3h-0.3l-0.3-0.1
527
+ l-0.2-0.1h-0.2l-0.2-0.1h-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.2-0.1l0,0l-0.8,0.3l-0.9,0.3l-0.9,0.2l-0.5,0.1l-0.4,0.1
528
+ l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1h-0.4H227h-0.4h-0.4h-0.4h-0.4H225h-0.4h-0.4l-0.4-0.1
529
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.3-0.1l-0.2-0.1l-0.2-0.1l0,0l-0.2-0.1l-0.2-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.2
530
+ l-0.1-0.2l0,0l-0.1-0.1l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2v-0.2v-0.1v-0.2v-0.2v-0.1v-0.2v-0.2v-0.2v-0.3v-0.3l0.1-0.3
531
+ l0.1-0.4l0.1-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.5
532
+ l0.4-0.5l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.3-0.1
533
+ l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.4-0.1l0.1-0.1l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.2
534
+ l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
535
+ l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.6h0.6h0.6h0.6h0.6h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
536
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l4.8,1.4l0.9-0.1l1.1-0.1h1L258.4,272.4z"
537
+ />
538
+ </g>
539
+ <g transform="matrix(1,0,0,1,381.866,45.2348)">
540
+ <path
541
+ d="M240.3,267.1h0.9h0.9h0.9h0.9h0.9h0.9h0.9h0.9h0.9h0.9h0.9h0.9l0.9,0h0.8l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1
542
+ l0.8,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.5,0.2l0.5,0.2l0.3,0.1l0.3,0.1l0.3,0.1
543
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.2
544
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2v0.3v0.2v0.3v0.3v0.1v0.1v0.3l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.3l-0.2,0.3l-0.2,0.3
545
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.2l-0.3,0.3
546
+ l-0.6,0.5l-0.6,0.5l-0.6,0.5l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3
547
+ l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.3,0.1l-0.2,0.1l-1.2,0.2l-1.1,0.2l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-2.2,0.6
548
+ l-2.2,0.6l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.2l-1.1,0.2l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1L234,291l-0.6,0.1
549
+ l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1h-0.6h-0.6h-0.6h-0.6H228h-0.6h-0.6h-0.6h-0.6H225l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1
550
+ L222,291l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.6-0.2h-0.1l0,0h-0.1h-0.1H216h-0.2h-0.2h-0.2
551
+ h-0.2h-0.3h-0.3H214h-0.6h-0.7h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1
552
+ l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3
553
+ l-0.2-0.3l-0.2-0.3l-0.1-0.2v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1V285v-0.1v-0.1v-0.1v-0.1v-0.2l0.1-0.3l0.1-0.3
554
+ l0.1-0.3l0.1-0.3l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2
555
+ l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1l0.5-0.2l0.4-0.2l0.4-0.1l0.3-0.1l0.2-0.1l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.8-0.2l0.8-0.2
556
+ l1.5-0.4l1.4-0.4l1.3-0.3l0.4-0.1l-0.2-0.1l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2V275v-0.3v-0.3v-0.3v-0.3
557
+ l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1
558
+ l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.6-0.2l0.6-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.8-0.1
559
+ l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1L240.3,267.1z M238.9,273.1
560
+ l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.6,0.1
561
+ l-0.6,0.1l-0.6,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.1,0.1l-0.1,0.1
562
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1l0,0l-0.1,0.1l-0.2,0.1l0.1,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.1,0.2
563
+ l0.1,0.2l0.1,0.2l0.1,0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
564
+ l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.4,0.1l-0.5,0.1l-0.5,0.1l-0.6,0.2l-1.3,0.3l-1.4,0.4l-1.5,0.4l-0.7,0.2l-0.7,0.2
565
+ l-0.3,0.1h0.1h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.2,0.1l0.2,0.1l0.6,0.2l0.5,0.2l0.5,0.2l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
566
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1
567
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.3l1.1-0.3l2.2-0.6l2.2-0.6l1.1-0.3l1.1-0.3
568
+ l1.1-0.3l1.1-0.3l1.2-0.3l1-0.2l0,0l0.2-0.1l0.3-0.1l0.3-0.2l0.4-0.2l0.4-0.2l0.4-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.4
569
+ l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.1-0.2v-0.1l-0.4-0.1
570
+ l-0.4-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1L253,273l-0.8-0.1h-0.8
571
+ l-0.8,0h-0.8H249h-0.8h-0.8h-0.8h-0.9h-0.9h-0.9H243h-0.9h-0.9h-0.9h-0.9h-0.9L238.9,273.1z"
572
+ />
573
+ </g>
574
+ <path
575
+ d="M708.1,249.1h0.2h0.1h0.1h0.1h0.2h0.1h0.1h0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
576
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1v0.1l0.1,0.1
577
+ v0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
578
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
579
+ l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
580
+ l-0.4,0.1h-0.4h-0.4H701h-0.4h-0.4h-0.4H699h-0.8h-0.9h-1h-0.2h-0.3h-0.2h-0.2l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.7-0.2
581
+ l-0.2-0.1l-0.2-0.1h-0.1h-0.1h-0.1h-0.1h-0.2H692h-0.1h-0.2h-0.1h-0.1h-0.2h-0.1h-0.1H691l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
582
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
583
+ l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1v-0.1v-0.1v-0.1V253v-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
584
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1
585
+ l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.1h0.1h0.1h0.1h0.2h0.4h0.2h0.3h0.2h0.2l0.4,0.1l0.4,0.1l0.4,0.1l0.7,0.2l0.3,0.1
586
+ l0.3,0.1l0.2,0.1h0.2h0.7h0.9h0.7h0.8h0.3h0.3h0.4h0.3h0.3h0.2h0.3h0.3h0.2l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.2-0.1
587
+ l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.4-0.1l0.3-0.1l0.4-0.2l0.4-0.2l0.4-0.2l0.1-0.1l0.1-0.1h0.1h0.1h0.2h0.1h0.1h0.2h0.1h-0.1
588
+ V249.1z M693.9,255.9L693.9,255.9L693.9,255.9L693.9,255.9L693.9,255.9L693.9,255.9z"
589
+ />
590
+ <path
591
+ d="M698.7,232.2L698.7,232.2h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1
592
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1
593
+ l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.1,0.1v0.1v0.1l0.1,0.1v0.1v0.1l0.1,0.1v0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1v0.1l-0.1,0.1v0.1
594
+ l-0.1,0.1v0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
595
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1H700h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.1,0.1
596
+ l-0.2,0.1l-0.2,0.1l-0.3,0.2l-0.5,0.4l-0.7,0.4l-0.7,0.5l-0.8,0.5l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
597
+ l-0.5,0.2l-0.4,0.2l-0.2,0.1l-0.2,0.1l-0.3,0.1h-0.2h-0.3H691h-0.3h-0.2h-0.1h-0.1h-0.1h-0.1H690h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1
598
+ h-0.1h-0.1h-0.1H689h-0.1h-0.1l-0.1-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
599
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1V241l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.1
600
+ l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1l-0.1-0.1v-0.1v-0.1v-0.1v-0.1V239v-0.1v-0.1l0.1-0.1v-0.1v-0.1v-0.1l0.1-0.1
601
+ v-0.1l0.1-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
602
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1
603
+ h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.2-0.1l0.3-0.1l0.2-0.2l0.3-0.2l0.4-0.2l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.3-0.2
604
+ l0.4-0.2l0.3-0.2l0.3-0.2l0.4-0.2l0.4-0.2l0.3-0.1l0.3-0.1h0.2h0.1h0.1h0.1h0.1L698.7,232.2L698.7,232.2z M699.1,238.1
605
+ L699.1,238.1L699.1,238.1L699.1,238.1L699.1,238.1z M692.9,237.4L692.9,237.4L692.9,237.4L692.9,237.4L692.9,237.4z"
606
+ />
607
+ <path
608
+ d="M688.9,250.5h0.5h0.5h0.5h0.2h0.2h0.2h0.1l0.2,0.1l0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1
609
+ l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2v0.2l0.1,0.2l-0.1,0.2v0.2v0.2
610
+ l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1
611
+ l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2h-0.2h-0.2h-0.5h-0.4H689h-0.4h-0.4h-0.5h-0.4h-0.4l-0.4,0.1l-0.5,0.1
612
+ l-0.4,0.1l-0.4,0.1l-0.5,0.1l-0.4,0.1l-0.4,0.1l-0.5,0.1l-0.9,0.2l-0.8,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.3l-0.9,0.3
613
+ l-0.9,0.3l-0.9,0.3l-0.9,0.3l-1.8,0.6l-1.8,0.6l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-1,0.2
614
+ l-0.9,0.2l-0.9,0.2h-0.2h-0.2h-0.2H661h-0.2h-0.2h-0.2h-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1
615
+ l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.2l-0.1-0.2v-0.2v-0.2l0.1-0.2
616
+ v-0.2l0.1-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.2-0.1l0.2-0.1
617
+ l0.2-0.1l0.2-0.1l0.2-0.1h0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l1.9-0.6
618
+ l1.8-0.6l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.2l1-0.2l0.9-0.2l0.9-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1
619
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.5h0.5h0.5L688.9,250.5z"
620
+ />
621
+ <path
622
+ fill="#25B3FF"
623
+ d="M616.5,62.9h0.5h0.5h0.5h0.5L619,63l0.5,0.1l0.5,0.1l0.5,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.2,0.1
624
+ l0.2,0.1l0.4,0.2l0.4,0.2l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.2l0.1,0.1h0.1h0.2h0.5h0.5h0.5h0.4h0.5l0.5,0.1l0.5,0.1l0.4,0.1
625
+ l0.5,0.1l0.4,0.1l0.4,0.1l0.5,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.1,0.1l0.3,0.2h0.1l0.1,0.1l0.1,0.1h0.1l0.2,0.2l0.2,0.2l0,0
626
+ l0.2,0.2l0.1,0.3l0,0l0.1,0.3l0.1,0.3l0,0v0.4v0.4l0,0l-0.1,0.3l-0.1,0.3l0,0l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2h-0.1
627
+ l-0.2,0.3h-0.1l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.2l-0.2,0.1l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
628
+ l-0.6,0.2l-0.7,0.2l-0.6,0.2l-0.6,0.1l-1.1,0.2l-0.9,0.2l-0.5,0.1l-0.4,0.1l-0.5,0.1l-0.5,0.1l-1,0.1h-0.1l-0.4,0.3l-0.5,0.4
629
+ l-0.5,0.4l-0.2,0.1l0.3-0.1h0.2l0.3-0.1h0.3h0.3l0,0h0.4l0.4,0.1l0.3,0.1l0.4,0.2l0.3,0.2l0.3,0.2l0.2,0.3l0.2,0.3l0.2,0.3
630
+ l0.1,0.3l0.1,0.1h0.4l1.1-0.1l2.3-0.3l1.1-0.1l1.2-0.1l1.2-0.1l1.2-0.1l0.5-0.1h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.1h0.4h0.1
631
+ l0.3,0.1l0.3,0.1h0.1l0.3,0.1l0.2,0.2l0.3,0.2l0,0l0.2,0.2l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0,0l0.1,0.3v0.3v0.4l-0.1,0.4l0,0
632
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3h-0.1l-0.1,0.2l-0.2,0.2l0,0l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.2l-0.1,0.1l-0.2,0.1l-0.2,0.1
633
+ l-0.3,0.2l-0.4,0.2l-0.3,0.1l-0.2,0.1l-1.3,0.6l-0.9,0.5l-0.8,0.4l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.5,0.2l-0.5,0.2
634
+ l-0.5,0.2l-0.6,0.2l-1.4,0.4l-0.4,0.1l-0.4,0.1l-0.9,0.2l-0.9,0.2l-1.1,0.2l-1.1,0.3l-1.1,0.3L622,87l0.1,0.1h0.1l0.1,0.3
635
+ l0.1,0.1l0.1,0.3v0.1l0.1,0.2l0.1,0.3l0.1,0.3l0,0V89l-0.1,0.3l-0.1,0.3l-0.1,0.3h-0.1l-0.1,0.3l-0.1,0.3l-0.2,0.2l-0.2,0.2
636
+ l-0.2,0.2l0,0l-0.2,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l0,0h-0.1l0,0l-0.3,0.4l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.9,1.2
637
+ l-0.9,1.3l-0.9,1.3l-0.5,0.7l-0.5,0.6l-0.5,0.6l-0.5,0.6l-0.5,0.6l-0.5,0.6l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2
638
+ l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.4,0.2l-0.2,0.1l-0.3,0.1h-0.1l-0.2,0.1H609h-0.3h-0.2h-0.2H608h-0.1
639
+ h-0.3h-0.2l-0.3-0.1H607l-0.4-0.1h-0.1l-0.4-0.1l-0.1-0.1l-0.3-0.2l-0.1-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.2
640
+ l-0.2-0.2l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.2l-0.7,0.8l-0.7,0.8
641
+ l-0.4,0.4l-0.3,0.3l-0.3,0.3l-0.4,0.3l-0.3,0.3l-0.3,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.3,0.2H599l-0.2,0.1l-0.2,0.1h-0.1h-0.2
642
+ h-0.2H598h-0.2h-0.2h0.4h-0.3h-0.2h-0.1l-0.3-0.1l-0.3-0.1h-0.1l-0.3-0.1l-0.2-0.2h-0.1l-0.2-0.2l-0.2-0.2l-0.1-0.1l-0.2-0.2
643
+ l-0.1-0.2l-0.1-0.1l-0.1-0.2l-0.1-0.2v-0.1l-0.1-0.3l-0.1-0.1l-0.1-0.3v-0.2l-0.1-0.3v-0.3V100v-0.1l-0.4,0.4l-0.6,0.9l-0.3,0.4
644
+ L593,102l-0.3,0.4l-0.3,0.4l-0.4,0.4l-0.3,0.4l-0.4,0.4l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1
645
+ l-0.3,0.2h-0.1l-0.2,0.1l-0.3,0.1h-0.1l-0.4,0.1h-0.4H588h-0.3h-0.4l0,0l-0.3-0.1l-0.3-0.1l-0.3-0.1l0,0l-0.2-0.2l-0.2-0.2
646
+ l-0.2-0.2l0,0l-0.2-0.2l-0.2-0.2l-0.1-0.2l0,0l-0.2-0.3l-0.1-0.3l0,0l-0.1-0.3l-0.1-0.3V103v-0.2l-0.1,0.2l-0.2,0.4l-0.3,0.4
647
+ l-0.2,0.4l-0.2,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.4,0.2l-0.2,0.1l-0.2,0.1
648
+ l-0.1,0.1l-0.3,0.1h-0.1l-0.3,0.1h-0.2h-0.3h-0.3h-0.3h-0.2h-0.2h-0.2l-0.3-0.1h-0.1l-0.3-0.1h-0.1l-0.2-0.1l-0.2-0.1l0,0
649
+ l-0.2-0.1l-0.2-0.2h-0.1l-0.2-0.2l-0.1-0.2h-0.1l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.3h-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.1l-0.1-0.2V104
650
+ l-0.1-0.1v-0.3v-0.3V103v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.6l0.1-0.6l0.2-0.7l0.2-0.7l0.4-1.4l0.5-1.5l0.2-0.7
651
+ l0.2-0.6l-0.6,0.3l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.2,0.1l-0.6,0.7l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.5,0.5l-0.4,0.5
652
+ l-0.5,0.5l-0.5,0.5l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2
653
+ l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1H564h-0.2h-0.3h-0.2H563h-0.2l-0.3-0.1h-0.2l-0.3-0.1h-0.1
654
+ l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.2l-0.2-0.2l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.1l-0.1-0.2
655
+ l-0.1-0.2l-0.1-0.1l-0.1-0.2l-0.1-0.2v-0.1l-0.1-0.3l-0.1-0.1V101v-0.2v-0.3l0,0h-0.2h-0.4l-0.4-0.1l-0.5-0.1l-0.2-0.1l-0.2-0.1
656
+ l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.1,0.1l-0.4,0.1l-0.3,0.1l-0.4,0.1H555h-0.3h-0.2h-0.2h-0.2H554h-0.3h-0.1
657
+ l-0.3-0.1l0,0l-0.4-0.1l0,0l-0.2-0.1l-0.2-0.1h-0.1l-0.2-0.1l-0.2-0.1h-0.1l-0.2-0.2l-0.2-0.2l0,0l-0.2-0.2l-0.2-0.2l0,0
658
+ l-0.2-0.3l-0.1-0.3l0,0l-0.1-0.2l-0.1-0.1l-0.3,0.2l-0.4,0.2l-0.5,0.2l-0.4,0.2l-0.3,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1
659
+ l-0.3,0.1H547h-0.4h-0.4h-0.3h-0.2h-0.2l-0.3-0.1h-0.1l-0.4-0.1h-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2
660
+ l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.3h-0.1l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2V96l0,0v-0.2l0,0l-0.4,0.3
661
+ l-0.8,0.6l-0.8,0.6l-1.7,1.2l-1.7,1.2l-0.8,0.6l-0.9,0.6l-0.8,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.4,0.3l-0.5,0.3
662
+ l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.4,0.3l-0.5,0.3l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2
663
+ l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.2,0.1h-0.2h-0.2H521h-0.1h-0.3h-0.4l0,0H520l-0.2-0.1l-0.2-0.1h-0.1l-0.3-0.1l-0.2-0.2l-0.3-0.2
664
+ l-0.2-0.2l0,0l-0.2-0.2l-0.2-0.3l-0.1-0.2l-0.3-0.2l-0.2-0.3l0,0l-0.2-0.3l-0.1-0.3l-0.1-0.1l-0.1-0.3l-0.1-0.3l-0.1-0.1v-0.2
665
+ l-0.1-0.2v-0.2v-0.4l0.1-0.3v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.1-0.2
666
+ l0.2-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.4-0.3l0.3-0.3l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.2l0.3-0.2l0.4-0.2l0.4-0.2l0.7-0.3l1.2-0.6
667
+ l0.6-0.3l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l1.1-0.6l1.1-0.6
668
+ l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l2.2-1.1l2.2-1.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.1l0.9-0.5
669
+ l0.9-0.5l0.9-0.5l0.9-0.5l0.9-0.5l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.2-0.1l0.2-0.1l0.2-0.1l0,0
670
+ l0.4-0.1h0.4h0.4l0.4,0.1l0.4,0.1l0.3,0.2l0.4,0.2l0.2,0.2l0.2,0.3l0.1,0.1l2.1-0.4l4.8-1l2.3-0.5l2.3-0.5l0.4-0.2l0.4-0.2
671
+ l0.4-0.2l0.4-0.2l0.4-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.1h0.2h0.4h0.1h0.3h0.2h0.1h0.2l0.3,0.1l0,0l0.2,0.1l0.1-0.1
672
+ l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2l0.2-0.2l0.3-0.2
673
+ l0.2-0.2l0.5-0.3l0.6-0.3l0.4-0.2l0.1-0.3l0.1-0.3l0,0l0.2-0.2l0.1-0.2l0.2-0.2l0,0l0.2-0.2l0.2-0.2l0,0l0.3-0.2l0.1-0.1
674
+ l0.2-0.1l0.4-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.2-0.1l0.5-0.1l0.5-0.1l0.4-0.1l0.6-0.1l0.7-0.1l1.2-0.2l1.2-0.2l0.5-0.1l0.6-0.1
675
+ l0.5-0.1l0.2-0.2l0.6-0.4l0.6-0.4l0.5-0.4l0.6-0.3l0.5-0.3l0.9-0.6l0.8-0.5l0.3-0.2l0.3-0.2l0.3-0.2l0.4-0.3l0.5-0.3l0.5-0.4
676
+ l0.5-0.4l0.5-0.4l0.6-0.4l0.5-0.4l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.4-0.1l0.4-0.1l0.3-0.1l0.2-0.1h0.2h0.4h0.2h0.4
677
+ h0.1h0.2h0.2h0.1l0.2,0.1l0.2,0.1h0.1l0.2,0.1l0.2,0.1l0,0l0.2,0.2l0.2,0.2h0.1l0.2,0.2l0.2,0.2l0,0l0.1,0.2l0.1,0.2l0,0
678
+ l0.1,0.2l0.4-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.6h0.5h0.5
679
+ L616.5,62.9z M609.5,90.5L609.5,90.5l0.1,0.4l0.1,0.2l0.1,0.3v0.2l0.1,0.2v0.4l0,0.4V93v0.4l-0.1,0.4l-0.1,0.8l-0.1,0.9
680
+ l-0.1,0.9l-0.1,0.1l0.3-0.4l0.5-0.6l0.4-0.6l0.5-0.6L612,93l0.9-1.3l0.4-0.6l0,0l-0.3,0.1l-0.2,0.1l-0.3,0.1h-0.2H612h-0.1h-0.2
681
+ h-0.2h-0.1l-0.3-0.1l-0.3-0.1h-0.1l-0.3-0.1l-0.3-0.1l0,0l-0.2-0.2l-0.2-0.2L609.5,90.5L609.5,90.5z M586.1,91.5L586.1,91.5
682
+ l-0.5,0.3l0,0l-0.1,0.4v0.2l0.2-0.3L586.1,91.5l0.1-0.1L586.1,91.5z M599.9,89l-0.8,0.1l-0.1,0.1l-0.5,0.3l-0.4,0.3l-0.5,0.3
683
+ l-0.3,0.2h0.3h0.2h0.4h0.1h0.2h0.2h0.1l0.2,0.1l0.2,0.1h0.1l0.2,0.1l0.2,0.1v-0.2l0.1-0.3l0.2-0.3l0.1-0.3l0,0l0.2-0.2l0.1-0.2
684
+ l0,0L599.9,89z"
685
+ />
686
+ <path
687
+ fill="#25B3FF"
688
+ d="M474.6,336.5h0.3h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2l0.5,0.3
689
+ l0.5,0.3l0.4,0.3l0.4,0.3l0.4,0.2l0.3,0.2l0.1,0.1l0.1,0.1l0.3,0.1l0.2,0.1l0.2,0.1h0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1
690
+ l0.5,0.1l0.9,0.2l0.9,0.2l0.9,0.2l1.8,0.4l0.8,0.2l0.8,0.2l0,0l0.2-0.1l0.2-0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.3h0.2l0.5,0.1
691
+ l0.5,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.2,0.1l0,0l0.2,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.2
692
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0,0l0.1,0.2v0.2l0.1,0.2v0.2v0.2v0.2v0.2v0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
693
+ l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1h-0.1l-0.1,0.1l-0.2,0.1
694
+ l-0.2,0.1h-0.1h-0.2h-0.2h-0.2h-0.3h-0.2h-0.3h-0.2H493l-0.5-0.1l-0.5-0.1v0.1l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
695
+ l-0.1,0.2l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2l0,0h-0.2h-0.1h-0.2h-0.6
696
+ h-0.6h-0.5h-0.6l-1.2,0.1h-1.2h-0.6h-0.7h-0.6h-0.7h-0.7h-0.7l-0.7-0.1h-0.1H479h-0.8h-0.8h-0.8h-0.8h-1.5h-1.5h-1.5h0.7
697
+ l-0.9,0.4l-1.1,0.5l-0.7,0.3l-0.2,0.2l-0.3,0.3l-0.4,0.3l-0.5,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1
698
+ l-0.2,0.1l-0.3,0.1l-0.2,0.1h-0.1h-0.2h-0.1h-0.1h-0.2h-0.1h-0.1h-0.2h-0.2h-0.1h-0.1h-0.2h-0.2l-0.2-0.1l-0.2-0.1h-0.1
699
+ l-0.4,0.1l-0.6,0.2l-0.6,0.1l-0.4,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.4H460h-0.3h-0.3H459h-0.3h-0.4h-0.2h-0.2h-0.2h-0.1h-0.1h-0.2
700
+ l-0.2-0.1l-0.1-0.1l-0.2-0.1l0,0l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2
701
+ l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.2L455,351v-0.2v-0.2l0,0v-0.2l0.1-0.2l0.1-0.2v-0.2l0.1-0.2l0.1-0.2l0,0
702
+ l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0,0l0.1-0.2l0.2-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.2
703
+ l0.4-0.2l0.5-0.2l0.8-0.3l0,0l0.1-0.2l0,0l0.1-0.1l0.1-0.1l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0,0l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1
704
+ l0.1-0.1l0.2-0.2l0.3-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.3-0.1l0.5-0.3l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.8-0.4l0.7-0.3l0.2-0.1
705
+ l0,0l1.2-0.6l0.8-0.4l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.1l0.2-0.1h0.1l0,0v-0.1v-0.1v-0.2v-0.1l0.1-0.2v-0.2v-0.1l0.1-0.1
706
+ v-0.1l0.1-0.2l0.1-0.3l0.1-0.3l0.2-0.3l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.1l0.3-0.1l0.3-0.1
707
+ l0.3-0.1h0.2h0.3L474.6,336.5z"
708
+ />
709
+ <path
710
+ fill="#25B3FF"
711
+ d="M632.9,316.7h0.5h0.5h0.4h0.2h0.2l0.2,0h0.2h0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.2,0.1
712
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2l0.1,0.2v0.2v0.2l-0.1,0.2v0.2
713
+ l-0.1,0.2l-0.1,0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1
714
+ l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2h-0.2h-0.2h-0.2l-0.4,0h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4l-0.4,0.1
715
+ l-0.4,0.1l-0.4,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.3,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
716
+ l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.5,0.2l-0.7,0.2l-0.8,0.2l-0.8,0.2l-0.4,0.1l-0.5,0.1
717
+ l-0.4,0.1l-0.5,0.1l-0.4,0.1l-0.4,0.1l-7,0.8h-0.5h-0.6h-0.5h-0.6h-0.8h-0.2h-0.2h-0.2h-0.2h-0.2l-0.1-0.1l-0.2-0.1l-0.2-0.1
718
+ l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
719
+ l-0.1-0.2l-0.1-0.2v-0.2l-0.1-0.2v-0.2v-0.2l0.1-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1
720
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.2-0.1l0.2-0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.4h0.4h0.4h0.4
721
+ l0,0l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.5-0.1
722
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.6-0.1h0.6h0.6h0.6h0.6l1.2-0.1h1.1h0.4l1.3-0.3l1.7-0.4l0.9-0.2l0.8-0.2l0.9-0.2l0.9-0.2l0.9-0.2
723
+ l0.9-0.2l0.9-0.2l0.9-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1l0.5-0.1h0.5h0.5h0.5L632.9,316.7z"
724
+ />
725
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
726
+ <path
727
+ d="M208.6,8l0.8,0h0.8l0.8,0h0.8l0.8,0h0.8l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1
728
+ l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2
729
+ l0.8,0.2l0.8,0.2l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3L239,14l0.8,0.3l1.5,0.6l1.5,0.6l1.5,0.6l1.4,0.6l1.4,0.6
730
+ l1.4,0.6l1.3,0.6l1.3,0.6l1.3,0.6l1.2,0.6l1.2,0.6l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.9,0.4
731
+ l0.9,0.3l0.9,0.3l0.9,0.3l1,0.3l1,0.3l1,0.3l1,0.3l2,0.6l2.1,0.6l2.1,0.6l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.4l1.1,0.4l1.1,0.4
732
+ l1.1,0.4l1.1,0.4l0.6,0.2l0.6,0.2l0.5,0.2l0.6,0.2l0.6,0.2L284,31l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.5,0.3l0.5,0.3l0.9,0.5
733
+ l0.9,0.5l0.9,0.5l0.9,0.5l0.9,0.5l0.9,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.6
734
+ l0.8,0.6l0.8,0.6l0.8,0.6l0.8,0.6l0.8,0.6l0.8,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6
735
+ l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.6,0.6l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7
736
+ l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7
737
+ l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.8l0.5,0.8l0.5,0.8l0.5,0.8l0.5,0.8l0.5,0.8l0.5,0.8l0.5,0.8
738
+ l0.5,0.8l0.5,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8
739
+ l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.9l0.4,0.9l0.7,1.7l0.7,1.7l0.7,1.7l0.7,1.8
740
+ l0.6,1.8l0.6,1.8l0.6,1.8l0.6,1.8l0.6,1.8l0.6,1.8l0.6,1.8l0.5,1.9l0.5,1.8l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4
741
+ l0.1,0.4l0.1,0.4l0.1,0.4l0.2,0.4l0.3,0.8l0.3,0.7l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.8,1.6l0.4,0.8l0.4,0.8l0.4,0.9
742
+ l0.4,0.9l0.4,0.9l0.4,0.9l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.1,0.5l0.1,0.5
743
+ l0.1,0.5l0.1,0.5l0.1,0.6l0.1,0.5l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6v0.6v0.6v0.6v0.5l-0.1,0.9l-0.2,0.9l-0.3,0.8l-0.4,0.8
744
+ l-0.5,0.7l-0.6,0.6l-0.7,0.5l-0.8,0.4l-0.8,0.3l-0.9,0.1H360l-0.9-0.1l-0.9-0.3l-0.8-0.4l-0.7-0.5l-0.7-0.6l-0.6-0.7l-0.4-0.8
745
+ l-0.3-0.8l-0.2-0.9l-0.1-0.9v-0.4v-0.3v-0.3v-0.3V153v-0.3v-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
746
+ l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.3-0.7l-0.3-0.7
747
+ l-0.4-0.7l-0.4-0.7l-0.4-0.8l-0.4-0.8l-0.8-1.6l-0.4-0.8l-0.4-0.8l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.2-0.5
748
+ l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.1-0.5l-0.5-1.8l-0.5-1.8l-0.5-1.8l-0.5-1.7
749
+ l-0.6-1.7l-0.6-1.7l-0.6-1.7l-0.6-1.7l-0.6-1.7l-0.6-1.7l-0.6-1.6l-0.6-1.6l-0.7-1.6l-0.3-0.8l-0.3-0.8l-0.3-0.8l-0.3-0.8
750
+ l-0.3-0.8l-0.3-0.8l-0.3-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.7l-0.4-0.7
751
+ L331,94l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7L327,87l-0.4-0.7l-0.4-0.7l-0.4-0.7
752
+ l-0.4-0.7l-0.4-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7
753
+ l-0.5-0.6l-0.5-0.6L318,74l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.6-0.6
754
+ l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6
755
+ l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5
756
+ l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5
757
+ l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
758
+ l-0.4-0.2l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.9-0.4l-0.9-0.4l-0.9-0.3l-1-0.3l-1-0.3l-1-0.3l-1-0.3l-1-0.3l-2-0.6
759
+ l-2.1-0.6l-2.1-0.6l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-0.6-0.2l-0.5-0.2l-0.5-0.2
760
+ l-0.5-0.2l-0.5-0.2l-0.5-0.3l-0.5-0.3l-0.5-0.3l-1.1-0.6l-1.2-0.6l-1.2-0.6l-1.2-0.6l-1.2-0.6l-1.3-0.6l-1.3-0.6l-1.3-0.6
761
+ l-1.3-0.5l-1.4-0.5l-1.4-0.5l-0.7-0.3l-0.7-0.2l-0.7-0.3l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2L230,24l-0.7-0.2
762
+ l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2L223,22l-0.7-0.2l-0.7-0.1l-0.7-0.1l-0.7-0.1
763
+ l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.6-0.1h-0.6h-0.6h-0.6h-0.6l-0.6,0h-0.6h-0.6h-0.6h-0.6
764
+ h-0.6h-0.5l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2
765
+ l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3
766
+ l-0.9,0.3l-0.9,0.3l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4
767
+ l-0.9,0.4l-0.9,0.4l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-3.4,1.9l-3.4,1.9l-0.5,0.3
768
+ l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.2l-0.6,0.2l-1.2,0.5l-1.2,0.5l-1.2,0.5l-1.2,0.4
769
+ l-1.2,0.4l-2.3,0.9l-2.3,0.8l-1.1,0.4l-1.1,0.4L132,51l-1.1,0.4l-1.1,0.4l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2
770
+ l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.4,0.3l-0.4,0.2l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3
771
+ l-0.4,0.3l-0.4,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-1.1,1.1l-1.2,1.2l-2.3,2.3l-2.4,2.3l-2.4,2.3
772
+ l-4.7,4.6l-2.3,2.3l-2.3,2.3L99,77.9L97.8,79l-1.2,1.1l-1.1,1.2l-1.1,1.1l-1.1,1.2l-1.1,1.2L91.1,86L90,87.2l-1.1,1.2l-1.1,1.2
773
+ l-1.1,1.2L85.6,92l-1.1,1.2l-1.1,1.2l-1,1.2l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.2
774
+ l-0.9,1.2l-0.9,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.3l-0.8,1.3l-0.8,1.3
775
+ l-0.8,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.6,1.3l-0.6,1.3
776
+ l-0.6,1.4l-0.6,1.4l-0.6,1.4l-0.6,1.4l-0.6,1.4l-0.5,1.4l-0.5,1.4l-0.5,1.4l-0.5,1.4l-0.5,1.4l-0.5,1.4l-0.5,1.4l-0.4,1.4
777
+ l-0.4,1.4l-0.4,1.4l-0.4,1.4l-0.4,1.4l-0.4,1.4l-0.3,1.4l-0.3,1.4l-0.3,1.4l-0.3,1.4l-0.3,1.4l-0.3,1.4l-0.2,1.4l-0.1,0.7
778
+ l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7
779
+ l-0.1,0.7l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.2,0.7L42,187l-0.2,0.7l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6
780
+ l-0.2,0.6l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.1l-0.5,1.1l-1,2.2l-0.1,0.3l-0.2,0.3l-0.3,0.7l-0.2,0.4l-0.2,0.4l-0.2,0.4
781
+ l-0.2,0.4l-0.2,0.4l0,0v0.1v0.9l-0.2,0.9l-0.3,0.8l-0.4,0.8l-0.5,0.7l-0.6,0.6l-0.7,0.5l-0.8,0.4l-0.8,0.3l-0.9,0.2h-0.9
782
+ l-0.9-0.1l-0.9-0.2l-0.8-0.4l-0.7-0.5l-0.7-0.6l0,0l-0.6-0.6l0,0l-0.4-0.7l0,0l-0.3-0.7v-0.1l-0.2-0.6l-0.1-0.3l-0.1-0.5
783
+ l-0.1-0.5v-0.5v-0.7l0.1-0.6l0.1-0.5l0.1-0.5l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.3l0.1-0.4l0.3-0.6l0.3-0.6l0.3-0.6
784
+ l0.3-0.5l0.2-0.5l0.4-0.7l0.1-0.1l0.9-2l0.5-1.1l0.5-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5
785
+ l0.2-0.5l0.2-0.5l0.2-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.4l0.1-0.4l0.1-0.5l0.1-0.7l0.1-0.8
786
+ l0.1-0.8l0.1-0.8l0.1-0.8l0.1-0.8l0.1-0.8l0.1-0.8l0.1-0.8l0.1-0.8l0.3-1.5l0.3-1.5l0.3-1.5l0.3-1.5l0.3-1.5l0.4-1.5l0.4-1.5
787
+ l0.4-1.5l0.4-1.5l0.4-1.5l0.4-1.5l0.5-1.5l0.5-1.5l0.5-1.5l0.5-1.5l0.5-1.5l0.5-1.5l0.6-1.5l0.6-1.5l0.6-1.5l0.6-1.5l0.6-1.5
788
+ l0.6-1.5l0.6-1.5l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.8-1.4l0.8-1.4l0.8-1.4l0.8-1.4l0.8-1.4
789
+ l0.8-1.4l0.8-1.4l0.8-1.3l0.8-1.3l0.8-1.3l0.9-1.3l0.9-1.3l0.9-1.3l0.9-1.3l0.9-1.3l0.9-1.3l0.9-1.3l0.9-1.2l0.9-1.2l0.9-1.2
790
+ l0.9-1.2l0.9-1.2l0.9-1.2l1-1.2l1-1.2l1-1.2l1-1.1l1.1-1.3l1.1-1.3l1.1-1.3l1.1-1.2l1.1-1.2l1.1-1.2l1.1-1.2l1.2-1.2l1.2-1.2
791
+ l1.2-1.2l1.2-1.2l1.2-1.2l1.2-1.2l1.2-1.2l1.2-1.2l1.2-1.2l2.4-2.3l2.4-2.3l4.7-4.6l2.3-2.3l2.3-2.3l2.3-2.3l1.1-1.1l1.2-1.2
792
+ l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.6-0.4l0.6-0.4l0.6-0.4l0.6-0.4l0.6-0.3l0.6-0.3l0.6-0.3
793
+ l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l1.2-0.5l1.2-0.5l1.2-0.5l1.2-0.5
794
+ l1.2-0.4l2.3-0.9l2.3-0.8l1.1-0.4l1.1-0.4l1.1-0.4l1.1-0.4l1-0.4l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.4-0.2
795
+ l0.4-0.2l0.4-0.2l0.4-0.2l3.4-1.8l3.4-1.9l1.7-0.9l1.7-0.9l1.7-0.9l1.8-0.9l1.8-0.9l1.8-0.9l1.8-0.9L167,22l0.9-0.4l0.9-0.4
796
+ l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4L176,18l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l1-0.4l1-0.4l1-0.4l1-0.4
797
+ l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.1
798
+ l1-0.1l1.1-0.1l0.8-0.1l0.8-0.1L208.6,8z M35.3,198.2l-0.1-0.2l-0.1-0.1L35.3,198.2z M34.9,197.7l-0.2-0.3l-0.3-0.3L34.9,197.7
799
+ z"
800
+ />
801
+ </g>
802
+ <g transform="matrix(1,0,0,1,381.866,45.2348)">
803
+ <path
804
+ d="M223.3,0.9l1.4-0.1l1.4-0.1l1.4-0.1l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0.1
805
+ l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.2l1.4,0.2l1.4,0.2l1.4,0.2l1.4,0.2l1.4,0.2
806
+ l1.4,0.2l1.4,0.2l1.4,0.2l1.4,0.3l1.4,0.3l1.4,0.3l1.4,0.3l1.4,0.3l1.3,0.3l1.3,0.3l1.3,0.3l1.3,0.4l1.3,0.4l1.3,0.4l1.3,0.4
807
+ l1.3,0.4l1.3,0.4l1.3,0.4l1.3,0.4l1.3,0.5L292,10l1.3,0.5l1.3,0.5l1.3,0.5l1.3,0.5l1.3,0.6l1.3,0.6l1.2,0.6l1.2,0.6l1.2,0.6
808
+ l1.2,0.6l1.2,0.6l1.2,0.7l1.2,0.7l1.2,0.7l1.2,0.7l1.2,0.7l1.2,0.7l1.2,0.8l1.1,0.8l1.1,0.8l1.1,0.8l0.6,0.4l0.6,0.4l0.6,0.4
809
+ l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.5l0.5,0.4l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5
810
+ l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.6
811
+ l0.5,0.5l0.5,0.6l0.5,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6
812
+ l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.1,0.2l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.1l0.1,0.2
813
+ l0.1,0.1l0.3,0.4l0.3,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.5,0.4l0.5,0.4l1,0.9l1.1,1l0.6,0.5l0.6,0.5l0.6,0.6l0.6,0.6l0.6,0.6
814
+ l0.6,0.6l0.6,0.7l0.6,0.7l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.5
815
+ l0.3,0.5l0.3,0.5l0.3,0.5l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.5,0.8
816
+ l0.5,0.8l0.5,0.8l0.5,0.8l0.6,0.8l0.6,0.8l0.6,0.8l0.6,0.8l0.6,0.8l1.3,1.7l1.3,1.7l0.7,0.9l0.7,0.9l0.7,0.9l0.7,0.9l0.7,0.9
817
+ l0.7,0.9l0.7,1l0.7,1l0.6,1l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.7
818
+ l0.3,0.7l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.4,1.2l0.4,1.2l0.4,1.2
819
+ l0.4,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.6,2.3l0.6,2.3l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.4,1.1l0.2,0.5l0.2,0.5
820
+ l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.3,0.6l0.2,0.4l0.2,0.5l0.2,0.4
821
+ l0.2,0.5l0.3,0.9l0.3,1l0.4,1.1l0.4,1.1l0.4,1.2l0.4,1.3l0.8,2.7l0.9,2.8l0.9,2.9l0.9,2.9l0.4,1.4l0.4,1.4l0.4,1.3l0.4,1.3
822
+ l0.4,1.2l0.4,1.1l0.4,1l0.3,0.9l0.2,0.4l0.1,0.3l0.1,0.1l0.7,0.9l0.6,0.9l0.5,1l0.4,1.1l0.2,1.1l0.1,1.1l-0.1,1.1l-0.2,1.1
823
+ l-0.3,1.1l-0.5,1l-0.6,0.9l-0.7,0.9l-0.8,0.8l0,0l-0.8,0.6l-0.8,0.5l0,0l-0.9,0.4l-1,0.3l0,0l-1,0.2l-1,0.1l0,0h-1l-1-0.1h-0.1
824
+ l-0.7-0.2l-0.7-0.2h-0.1l-0.6-0.3l-0.6-0.3h-0.1l-0.9-0.6l-0.3-0.3l-0.6-0.5l-0.5-0.5l-0.4-0.4l-0.3-0.4l-0.4-0.6l-0.4-0.6
825
+ l-0.3-0.6l-0.3-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.6l-0.4-1.1l-0.4-1.2l-0.4-1.3l-0.4-1.3l-0.5-1.4
826
+ l-0.5-1.4l-0.5-1.4l-0.5-1.5l-0.9-3l-0.9-2.9l-0.9-2.8l-0.8-2.6l-0.4-1.2l-0.4-1.1l-0.3-1l-0.3-0.9l-0.3-0.7l-0.2-0.6l-0.1-0.2
827
+ l-0.1-0.1l0,0l0,0l-0.3-0.6l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.2-0.7l-0.2-0.7
828
+ l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.4-1.3l-0.4-1.3l-0.4-1.3l-0.4-1.2l-0.3-1.2l-0.3-1.2l-0.3-1.2l-0.6-2.3l-0.6-2.3L366,118
829
+ l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1l-0.3-1l-0.3-1l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5
830
+ l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.4l-0.2-0.5l-0.2-0.4L361,104l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4L360,102
831
+ l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.6-0.8l-0.6-0.8l-0.6-0.8l-0.6-0.8l-0.6-0.8l-1.3-1.7
832
+ l-1.3-1.7l-0.7-0.9l-0.7-0.9l-0.7-0.9l-0.7-0.9l-0.7-0.9l-0.7-0.9l-0.7-1l-0.7-1l-0.6-1l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5
833
+ l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.6l-0.2-0.5l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
834
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4
835
+ l-0.5-0.4l-0.5-0.4l-0.5-0.5l-0.5-0.5l-1.1-1l-1.1-1l-0.6-0.5l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.7l-0.6-0.7l-0.3-0.4
836
+ l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.2-0.4l-0.4-0.6l-0.3-0.5l-0.3-0.5l-0.3-0.5
837
+ l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5
838
+ l-0.4-0.5l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4
839
+ l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4
840
+ l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.3l-0.4-0.4l-0.4-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.4-0.3l-0.9-0.7l-0.9-0.6
841
+ l-0.9-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.5l-1-0.5l-1-0.5l-1-0.5l-1-0.5l-1.1-0.5l-1.1-0.5l-1.1-0.5l-1.1-0.5
842
+ l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4L278,23l-1.2-0.3l-1.2-0.3l-1.2-0.3
843
+ l-1.2-0.3l-1.2-0.3l-1.2-0.3l-1.2-0.3l-1.2-0.3l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2
844
+ l-1.2-0.2l-1.2-0.2l-1.2-0.1l-1.2-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1H241
845
+ l-1.3,0h-1.3h-1.3h-1.3h-1.3l-1.3,0h-1.3h-1.3h-1.3H228l-1.3,0l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1
846
+ l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.2l-1.3,0.2l-1.3,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2
847
+ l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.3l-1.2,0.3
848
+ l-1.3,0.3l-1.3,0.3l-1.3,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.4l-1.2,0.4l-1.2,0.4l-1.2,0.4l-1.1,0.4l-1.1,0.4
849
+ l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1,0.5l-1,0.5l-1,0.5l-1,0.5l-1,0.5l-1,0.5l-1,0.5l-1,0.5
850
+ l-1,0.5l-1,0.5l-1,0.5l-0.9,0.5l-0.9,0.5l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6
851
+ l-0.9,0.6l-0.9,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7
852
+ l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7L127,55l-0.8,0.8l-0.8,0.8l-0.8,0.8l-0.8,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8
853
+ l-0.7,0.8l-0.1,0.1l-0.1,0.2l-0.2,0.5l-0.2,0.5l-0.3,0.5l-0.5,0.9l-0.5,0.9l-0.6,0.9l-0.6,0.9l-0.6,0.9l-0.6,0.9l-0.6,0.9
854
+ l-0.6,0.9l-0.6,0.9l-0.7,0.9l-0.7,0.9l-0.7,0.9l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8
855
+ l-0.7,0.8l-0.7,0.8l-0.7,0.8l-1.5,1.6l-1.5,1.6l-1.5,1.6l-1.1,1.2l-0.2,0.3l-1.4,2l-1.4,2l-1.4,2l-1.4,2l-2.8,4.1l-2.9,4.1
856
+ l-2.9,4.2l-1.5,2.1l-1.5,2.1l-1.5,2.1l-1.5,2.1l-1.2,1.7l-0.4,0.9l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.2
857
+ l-0.9,2.5l-0.9,2.5l-0.9,2.5l-0.9,2.6l-0.9,2.6l-1.8,5.2l-0.9,2.6l-0.9,2.6l-0.9,2.6l-1,2.6l-1,2.6l-0.5,1.3l-0.5,1.3l-0.5,1.3
858
+ l-0.5,1.3l-0.5,1.3l-0.5,1.4l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9
859
+ l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.5,0.8l-0.9,1.6l-0.9,1.6l-0.9,1.5l-0.9,1.5l-1.8,3l-0.9,1.5l-0.8,1.5
860
+ l-0.2,0.3l-0.2,0.4l-0.2,0.5l-0.3,0.5l-0.3,0.6l-0.3,0.6l-0.6,1.4l-1.4,3l-0.7,1.5l-0.7,1.5l-0.4,0.7l-0.3,0.7l-0.3,0.7
861
+ l-0.4,0.7l-0.4,0.6l-0.4,0.6l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.3,0.4l-0.4,0.5l-0.5,0.5l-0.3,0.3l-0.7,0.6l-0.1,0.1l-0.5,0.4
862
+ l-0.6,0.4h-0.1l-0.7,0.3l-0.7,0.3l0,0l-0.6,0.2l-0.6,0.2l0,0l-0.7,0.1l-0.7,0.1l0,0h-0.9l-0.9-0.1l0,0l-0.9-0.2l-0.9-0.3l0,0
863
+ l-0.9-0.4l-0.8-0.5l0,0l-0.6-0.5l-0.6-0.5l0,0l-0.5-0.5l-0.5-0.6l0,0l-0.5-0.7l-0.4-0.7v-0.1l-0.3-0.7l-0.2-0.7v-0.1l-0.2-1
864
+ l-0.1-0.5l-0.1-0.8v-0.6v-0.6v-0.4l0.1-1.1l0.3-1.1l0.4-1l0.5-1l0.7-0.9l0.8-0.8l0.9-0.7l0.3-0.2l0.5-1.1l0.7-1.4l1.2-2.6v-0.1
865
+ v-0.5v-0.7V188v-0.7v-0.7v-0.7l0-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7
866
+ l0.1-0.7l0.1-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7
867
+ l0.2-0.7l0.5-1.4l0.5-1.4l0.5-1.4l0.5-1.4l0.5-1.4l0.6-1.4l0.6-1.4l0.6-1.4l0.6-1.4l0.6-1.4l0.6-1.4l0.6-1.4l0.7-1.4l0.7-1.4
868
+ l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.8-1.3l0.8-1.3l0.8-1.3l0.8-1.2
869
+ l0.8-1.2l0.8-1.2l0.8-1.2l0.3-0.4l0.6-1.1l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l0.5-0.9l0.5-0.9l0.5-0.9l0.5-0.9l0.5-0.9
870
+ l0.5-0.9l0.6-0.9l0.6-0.9l0.6-0.9l0.6-0.9l0.4-0.7l0.2-0.5l0.6-1.3l0.6-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3
871
+ l0.7-1.3l0.7-1.3l0.8-1.3l0.8-1.3l0.8-1.3l0.8-1.3l0.8-1.3l0.8-1.3l0.9-1.3l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7
872
+ l0.5-0.7l0.5-0.7l0.5-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7
873
+ l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.6l0.6-0.6l0.6-0.6l0.6-0.6l0.6-0.6l0.6-0.6l0.6-0.6l1.5-1.5l0.9-0.9l1-1l1-1l1.1-1
874
+ l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.5l0.6-0.5l0.6-0.4l0.6-0.4l0.6-0.4l0.4-0.2l0.3-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.3
875
+ l0.6-0.3l0.8-0.3l0.5-0.1l1-0.2h0.1l0,0l0.2-0.2l0.8-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8
876
+ l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l1-0.8l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1.1-0.7
877
+ l1.1-0.7l1.1-0.7l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.2-0.6l1.2-0.6l1.2-0.5l1.2-0.5l1.2-0.5
878
+ l1.2-0.5l1.2-0.5l1.2-0.5l1.2-0.5l1.3-0.5l1.3-0.5l1.3-0.5l1.3-0.5l1.3-0.4L170,9l1.3-0.4l1.3-0.4l1.4-0.4l1.4-0.4l1.4-0.4
879
+ l1.4-0.4l1.4-0.4l1.4-0.3l1.4-0.3l1.4-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2
880
+ l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.4-0.2l1.4-0.2l1.4-0.2l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1
881
+ l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1L223.3,0.9z M388.7,162.8l-0.7,0.6l0.9-0.7l0.8-0.4L388.7,162.8z M390.5,161.8l-0.5,0.3
882
+ l0.9-0.4L390.5,161.8z M392.2,161.4l0.4-0.1h-0.2L392.2,161.4z"
883
+ />
884
+ <path
885
+ d="M156.3,235.9l1.3-0.1l1.3-0.1h1.4h1.3h1.3h1.4h1.3h1.4h1.3h1.3h1.3h1.3h1.3h1.3l1.3,0.1l1.3,0.1l1.3,0.1
886
+ l1.3,0.1l1.3,0.1l1.3,0.1l2.6,0.2l2.7,0.2l2.6,0.2l2.6,0.2l5.3,0.4l2.6,0.2l2.6,0.2l2.6,0.2l2.6,0.2l2.6,0.2l1.3,0.1l1.3,0.1
887
+ l1.3,0.1l1.3,0.1h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.2h1.2l1.2,0h1.2h1.2l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1
888
+ l1.2-0.1l1.2-0.2l1.2-0.2l1.2-0.2l1.1-0.2l1.1-0.2l1.1-0.2l0.9-0.2l0.9-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.3l1-0.3l1-0.3l1-0.3
889
+ l2.1-0.6l2.1-0.6l2.1-0.6l4.3-1.3l2.2-0.6l2.2-0.6l2.2-0.6l2.3-0.6l1.1-0.3l1.1-0.3l1.2-0.3l1.2-0.3l1.2-0.3l1.2-0.3l1.2-0.3
890
+ l1.2-0.3l1.2-0.3l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1
891
+ l1.2-0.1h1.2h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.6l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1
892
+ l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l2.6,0.5l2.6,0.5l5.4,1.1l2.8,0.6l2.8,0.6l2.9,0.6l2.9,0.6l2.9,0.6l3,0.6l1.5,0.3
893
+ l1.5,0.3l1.5,0.3l1.5,0.3l1.5,0.3l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2
894
+ l1.5,0.2l1.5,0.2l1.5,0.1l1.5,0.1l1.5,0.1l1.5,0.1l1.5,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1h1.4h1.4h1.4h1.4h1.4h1.3l1.3-0.1
895
+ h0.6h0.7h0.7h0.6h0.6h0.6l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1
896
+ l0.6-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.6-0.1l1-0.1l1-0.1l1-0.1l1-0.1l2-0.1l1.9-0.1h0.9
897
+ l0.9-0.1l0.9-0.1l0.8-0.1l0.8-0.1h0.4h0.4l0.4-0.1l0.4-0.1l0.4-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
898
+ l0.3-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.1-0.1l0.1-0.1l0.1-0.1
899
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1v-0.1v-0.1
900
+ v-0.1v-0.1v-0.1v-0.1V228l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0v-0.1v-0.1v-0.1v-0.1v-0.1
901
+ v-0.1v-0.1v-0.1v-0.1V227v-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
902
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.1l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3
903
+ l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3
904
+ l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.8-0.3
905
+ l-0.9-0.3l-1.7-0.6l-1.8-0.6l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.8-0.3l-0.8-0.2l-0.8-0.2l-0.3-0.1l-0.8,0.4l-0.5,0.2
906
+ l-0.6,0.3l-0.7,0.2l-0.4,0.1l-0.9,0.2l-0.9,0.1l0,0h-1l-0.9-0.1l-0.9-0.2l-0.9-0.3l0,0l-1.1-0.5l-1-0.6l-0.9-0.7l-0.8-0.9
907
+ l-0.7-1l0,0l-0.5-0.9l-0.4-1l-0.3-1l-0.1-1v-1l0,0l0.1-1.1l0.2-1.1l0.4-1l0,0l0.4-0.8l0.5-0.8v-0.1l0.7-0.8l0.2-0.3l0.3-0.3
908
+ l0.9-0.8l1-0.7l1.1-0.5l1.2-0.4h0.1l0.2-0.1l0.7-0.3l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.6-0.1l0.7-0.1l0.8-0.1
909
+ l0.8-0.1h0.6h0.5l0.6,0.1l0.5,0.1l0.7,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l1,0.3l1.1,0.3l1,0.3l1,0.3l1,0.3l1,0.3
910
+ l1,0.3l1.8,0.6l1.7,0.6l0.8,0.3l0.8,0.3l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3
911
+ l0.7,0.3l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5
912
+ l0.6,0.5l0.6,0.6l0.6,0.6l0.6,0.6l0.6,0.6l0.6,0.6l0.6,0.7l0.6,0.7l0.3,0.4l0.3,0.3l0.3,0.3l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4
913
+ l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.5l0.2,0.5l0.2,0.4l0.2,0.5l0.1,0.5
914
+ l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5v0.5v0.5v0.5v0.5v0.5v0.5v0.5l-0.1,0.5l-0.1,0.6l-0.1,0.5l-0.1,0.5
915
+ l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5
916
+ l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.5,0.5l-0.6,0.5l-0.6,0.5l-0.6,0.5
917
+ l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2
918
+ l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1
919
+ l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1,0.1l-2,0.1l-1.9,0.1h-0.9l-0.9,0.1l-0.8,0.1l-0.8,0.1h-0.3h-0.4h-0.3h-0.3h-0.3
920
+ l-0.3,0.1H414l-0.3,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1
921
+ l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1h-0.8h-0.8h-0.8h-0.8l-1.5,0.1h-1.5h-1.5h-1.6h-1.6h-1.6h-1.6l-1.6-0.1l-1.6-0.1
922
+ l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2
923
+ l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.3l-1.6-0.3l-1.6-0.3l-1.6-0.3l-1.5-0.3l-1.5-0.3l-1.5-0.3l-3-0.6l-3-0.6
924
+ l-3-0.6l-2.9-0.6l-2.9-0.6l-2.8-0.6l-5.4-1.1l-2.6-0.5l-2.5-0.5l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1
925
+ l-0.5-0.1l-0.5-0.1h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-1l-1,0.1l-1,0.1l-1,0.1
926
+ l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.3l-1.1,0.3
927
+ l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-2.2,0.6l-2.2,0.6l-2.2,0.6l-2.2,0.6l-4.3,1.3l-2.2,0.6l-2.2,0.6l-2.2,0.6l-1.1,0.3
928
+ l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.4,0.3l-1.4,0.2l-1.4,0.2l-1.4,0.2
929
+ l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0h-1.4h-1.4h-1.4
930
+ h-1.4H220h-1.4h-1.4h-1.4h-1.4l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1l-2.7-0.2l-2.7-0.2l-2.7-0.2l-2.7-0.2l-2.7-0.2
931
+ l-5.3-0.4l-2.6-0.2l-2.6-0.2l-2.6-0.2l-2.6-0.2l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.2-0.1l-1.2-0.1h-1.2h-1.2H167h-1.2
932
+ h-1.2h-1.2h-1.2H161h-1.2h-1.2h-1.3h-1.2h-1.3l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-2.6,0.2l-2.6,0.2l-2.6,0.2
933
+ l-2.6,0.2l-5.3,0.4l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1
934
+ l-1.4,0.1h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1
935
+ l-1.4-0.1l-1.4-0.2l-1.4-0.2l-1.4-0.2l-1.4-0.2l-1.3-0.2l-1-0.2l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1
936
+ l-0.9-0.1L69,253l-0.9-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1h-1l-2-0.1l-2-0.1l-2-0.1l-2-0.1h-2h-2l-4.1-0.1l-2.1-0.1
937
+ l-2.1-0.1l-2.1-0.1l-2.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1
938
+ l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2
939
+ l-1.1-0.3l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2L7,246.9l-0.7-0.2l-0.7-0.2L5,246.2l-0.6-0.3l-0.6-0.3l-0.6-0.3
940
+ L2.6,245L2,244.7l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.5-0.3l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4
941
+ l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.2-0.6l-0.2-0.6
942
+ l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6v-0.6v-0.6l0-0.6v-0.6v-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.5
943
+ l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.4
944
+ l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4
945
+ l0.3-0.4l0.4-0.4l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.8-0.7l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6
946
+ l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.4l0.7-0.4l0.1-0.1l0,0l0,0h0.1h0.1l0,0l0.2-0.1l0.2-0.2l0.2-0.2
947
+ l0.3-0.2l0.3-0.3l0.3-0.3l0.3-0.3l0.4-0.3l0.4-0.3l0.8-0.8l0.9-0.8l0.9-0.9l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.5l0.6-0.5l0.6-0.5
948
+ l0.6-0.5l0.6-0.5l0.7-0.5l0.7-0.5l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.3-0.2l1.1-0.5l1.2-0.3l1.2-0.2
949
+ h1.2l1.2,0.2l1.2,0.3l1.1,0.5l1,0.6l0.9,0.8l0.8,0.9l0.7,1l0.6,1.1l0.4,1.1l0.2,1.2l0.1,1.2l-0.1,1.2l-0.3,1.2l-0.4,1.1
950
+ l-0.6,1.1l-0.7,1l-0.8,0.9l-0.9,0.8l-1,0.6l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.3,0.2
951
+ l-0.3,0.2l-0.3,0.2l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.8,0.8l-0.9,0.9l-0.9,0.9l-0.5,0.5
952
+ l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.6,0.5l-0.6,0.5l-0.6,0.5l-0.6,0.4l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
953
+ l-0.3,0.2l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4
954
+ l-0.6,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
955
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2L9.6,225l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2L9.1,226
956
+ L9,226.2l-0.1,0.2l-0.1,0.2l-0.1,0.2L8.6,227l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1l0,0v0.1l0,0l0,0l0,0
957
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.3,0.1l0.3,0.1
958
+ l0.3,0.1l0.3,0.1l0.3,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2
959
+ l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l1,0.1l0.9,0.1l1,0.1l1,0.1
960
+ l1,0.1l1,0.1h1h1l2,0.1l2,0.1l2,0.1l2,0.1l4.1,0.1h2.1h2.1l2.1,0.1l2.1,0.1l2.1,0.1l2.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1
961
+ l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.2l1,0.2l1.2,0.2l1.2,0.2l1.2,0.2
962
+ l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1h1.2h1.2h1.2h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3
963
+ l1.3-0.1l1.3-0.1l1.3-0.1l1.3-0.1l1.3-0.1l1.3-0.1l1.3-0.1l2.6-0.2l2.6-0.2l2.6-0.2l2.6-0.2l2.7-0.2l5.3-0.4l2.7-0.2l2.7-0.2
964
+ l2.7-0.2l2.7-0.2l1.4-0.1l1.3-0.1l1.3-0.1L156.3,235.9z M411.9,211.1L411.9,211.1l0.5-0.6l0.1-0.1L411.9,211.1z"
965
+ />
966
+ </g>
967
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
968
+ <path
969
+ d="M6,210.5h0.6h0.6h0.6H9h1.2h1.1h1.1l1.1,0h1h1l1.9,0.1h0.8H19h0.7h0.6l1,0.1l0.9,0.2l0.9,0.4l0.8,0.5
970
+ l0.7,0.7l0.6,0.8l0.5,0.9l0.3,0.9l0.2,1v1l-0.2,1l-0.3,0.9l-0.5,0.9l-0.6,0.8l-0.7,0.7l-0.8,0.5l-0.9,0.4l-0.9,0.2l-1,0.1h-0.7
971
+ h-0.8H18h-0.9l-1.8-0.1h-1h-1h-1l-1,0h-1h-1h-1H7.8H7.3H6.8H6.3H5.8H5.3H4.8H4.3l-0.5,0.1l-0.4,0.1L3,222.8l-0.4,0.1L2.2,223
972
+ l-0.4,0.1l-0.4,0.1L1,223.3l-0.4,0.1l-0.3,0.1L0,223.6l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.2,0.1l-0.2,0.1l0,0l0.2,0.2l0.2,0.2
973
+ l0.2,0.2l0.2,0.1l0.3,0.1L0,225l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l1.6,0.7l1.6,0.7l1.6,0.7l1.7,0.7l1.7,0.7
974
+ l0.8,0.3l0.9,0.3L12,230l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.2l0.9,0.2l0.8,0.2
975
+ l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.3,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1h0.4H31h0.4h0.5h0.5h0.5
976
+ h0.5h0.5h0.5h0.5h0.5h1.1h1.1h1.1l1.1-0.1L41,235l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1
977
+ l1.2-0.2l1.2-0.2l2.3-0.3l2.2-0.3l4-0.6l0.5-0.1l0.5-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1h0.9h0.9H70h0.9h0.9h0.9h0.9l1.7,0.1
978
+ l1.7,0.1l1.6,0.1h1.6H81h0.8h0.8h0.8h0.8h0.7h0.7h0.7H87l0.7-0.1l0.7-0.1h0.3h0.4l1.7-0.2l1.8-0.2l1.8-0.2l1.8-0.2L98,231
979
+ l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1
980
+ l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1h1.8h1.8h1.8h1.8h1.8h1.1h1.1h1.1h1.1h1.1l1.1,0.1l1,0.1l1,0.1l1,0.1
981
+ l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.2l1,0.2l1,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2
982
+ l0.9,0.2l0.9,0.2l1.8,0.4l1.8,0.4l1.8,0.5l1.8,0.5l1.8,0.5l1.7,0.5l3.5,1l1.8,0.5l1.8,0.5l1.8,0.5l1.8,0.5l1.8,0.5l1.8,0.4
983
+ l1.8,0.4l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.4,0.1l0.4,0.1l0.4,0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4
984
+ h0.4h0.4h0.4l0.4,0h0.4l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.9-0.2l0.9-0.2
985
+ l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l1.9-0.6l1.9-0.7l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1.4-0.4l1.4-0.4
986
+ l1.4-0.4l1.4-0.4l1.5-0.4l1.5-0.4l1.5-0.4l1.5-0.4l1.5-0.4l1.5-0.4l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3
987
+ l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.2l1.5-0.2l1.5-0.2l1.5-0.2l1.5-0.2l1.5-0.2
988
+ l1.1-0.2l1.2-0.1l1.2-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1.1-0.1h1.1h1.1h1.1h1.1h1.1h1.1h1.1h1.1h1.1l1.1,0.1l1.1,0.1l1.1,0.1
989
+ l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l2.1,0.3l2.1,0.3l2.1,0.3l2.1,0.3l4.1,0.6l2,0.3
990
+ l2,0.3l2,0.3l2,0.3l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1h1h1h1h1h1h0.9h0.9h0.9h0.9h0.9h0.9h0.9
991
+ h0.9l0.9,0.1l0.9,0.1l1.7,0.1l1.7,0.1l1.7,0.1l1.7,0.2l1.7,0.2l3.3,0.3l3.3,0.3l1.6,0.2l1.6,0.2l1.6,0.2l1.6,0.1l1.6,0.1
992
+ l1.6,0.1l0.8,0.1h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1
993
+ l0.8-0.1l0.8-0.1l0.7-0.1l0.9-0.1l0.4-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.2
994
+ l0.5-0.2l0.4-0.2l0.4-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
995
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0,0l0,0v-0.1l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2V225v-0.2v-0.2v-0.2v-0.2V224
996
+ v-0.2v-0.2v-0.2v-0.2V223v-0.2v-0.2v-0.2v-0.2v-0.1V222v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1V221v-0.1l0-0.1v-0.1
997
+ v-0.1v-0.1v-0.1l-0.1-0.1v-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
998
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
999
+ l-0.2-0.2l-0.2-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1
1000
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1h-0.4H406h-0.4h-0.4h-0.4h-0.4H404h-0.4h-0.4l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
1001
+ l-0.4,0.1l-0.6,0.2l-0.4,0.1l-0.4,0.1l-0.7,0.1l-0.8,0.1l-0.9,0.1l-1,0.1l-1.1,0.1l-1.1,0.1l-1.2,0.1l-1.2,0.1h-0.6h-0.6h-0.6
1002
+ h-0.5h-0.5h-0.5h-0.5h-0.5l-0.6-0.1l-0.6-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.5-0.2h-0.1l-0.6-0.3h-0.1l-0.5-0.3l-0.4-0.4l0,0
1003
+ l-0.5-0.5l-0.4-0.6l0,0l-0.3-0.6l-0.3-0.6l-0.2-0.7l0,0l-0.1-1v-1l0.2-1l0.3-0.9l0.5-0.9l0.6-0.8l0.7-0.7l0.8-0.5l0.9-0.4
1004
+ l0.9-0.2l1-0.1l1,0.1l0.9,0.2l0.1,0.1h0.2h0.3h0.4h0.4h0.5h0.5h1l1-0.1l1-0.1l1-0.1l0.9-0.1l0.7-0.1l0.6-0.1h0.2l0.4-0.1
1005
+ l0.7-0.2l0.7-0.2l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1h0.7h0.7h0.7h0.7h0.7l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1
1006
+ l0.7,0.1l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.6,0.2l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.4l0.6,0.4l0.5,0.4l0.3,0.2
1007
+ l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3
1008
+ l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.4
1009
+ l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4v0.4v0.4v0.4v0.4l0,0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4
1010
+ l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4L425,228l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.5l-0.2,0.5
1011
+ l-0.2,0.5l-0.2,0.5l-0.3,0.5l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3
1012
+ l-0.3,0.3l-0.3,0.3l-0.4,0.2l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
1013
+ l-0.4,0.2l-0.7,0.3l-0.7,0.3l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1
1014
+ l-0.6,0.1l-0.6,0.1l-1,0.2l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1h-0.9h-0.9H395h-0.9h-0.9
1015
+ h-0.9h-0.9h-0.9h-0.9h-0.9h-0.9h-0.9H386h-0.9l-0.9-0.1l-0.9-0.1l-0.9-0.1l-1.7-0.1l-1.7-0.1l-1.7-0.2l-1.7-0.2l-1.6-0.2
1016
+ l-1.6-0.2l-3.3-0.3l-3.2-0.3l-1.6-0.2l-1.6-0.2l-1.6-0.1l-1.6-0.1l-1.6-0.1l-0.8-0.1h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8
1017
+ h-0.8h-1.1h-1.1h-1.1h-1.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1
1018
+ l-1.1-0.1l-1.1-0.1l-2.1-0.3l-2.1-0.3l-2.1-0.3l-2.1-0.3l-4.1-0.6l-2-0.3l-2-0.3l-2-0.3l-2-0.3l-1-0.1l-1-0.1l-1-0.1l-1-0.1
1019
+ l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1h-1h-1h-1h-1h-1h-1h-1h-1h-1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1
1020
+ l-1,0.1l-1,0.1l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3
1021
+ l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.4
1022
+ l-1.4,0.4l-1.4,0.4l-1.4,0.4l-1.4,0.4l-1.4,0.4l-1.4,0.4l-1.4,0.4l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3
1023
+ l-1.9,0.7l-1.9,0.7l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-0.6,0.1l-0.5,0.1l-0.5,0.1l-0.6,0.1
1024
+ l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1h-0.6h-0.6l-0.6,0h-0.6h-0.6h-0.6h-0.6
1025
+ h-0.6h-0.6l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-1-0.2l-1-0.2l-1-0.2l-1-0.2l-1-0.2l-1-0.2l-1.9-0.5
1026
+ l-1.9-0.5l-1.9-0.5l-1.8-0.5l-1.8-0.5l-1.8-0.5l-1.8-0.5l-3.5-1l-1.7-0.5l-1.7-0.5l-1.7-0.4l-1.7-0.4l-1.7-0.4l-1.7-0.4
1027
+ l-0.8-0.2l-0.8-0.2l-0.9-0.2l-0.8-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.1l-0.9-0.1l-0.9-0.1
1028
+ l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1H151h-1h-1h-1h-1h-1.7h-1.7h-1.7
1029
+ h-1.7h-1.7l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1
1030
+ l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.7,0.2l-1.7,0.2l-1.7,0.2
1031
+ l-1.7,0.2l-1.7,0.2l-0.4,0.1l-0.5,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1h-0.9H85h-0.9h-0.9H82h-0.9h-0.9h-0.9l-1.7-0.1l-1.7-0.1
1032
+ l-1.6-0.1l-1.6-0.1h-0.8h-0.8h-0.8h-0.8h-0.8H68h-0.7h-0.7h-0.7l-0.7,0.1l-0.7,0.1h-0.3h-0.4l-3.9,0.6l-2.2,0.3l-2.3,0.3
1033
+ l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1h-1.3
1034
+ h-1.3H35h-0.6h-0.6h-0.6h-0.6H32h-0.6h-0.6h-0.6h-0.6l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.5-0.1
1035
+ l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2L21,245l-0.9-0.2l-0.9-0.2l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3
1036
+ l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3L8.4,241l-0.9-0.3l-0.9-0.3l-0.9-0.3l-1.8-0.7l-1.8-0.7L0.4,238l-1.7-0.7
1037
+ l-1.7-0.7l-0.3-0.1l-0.3-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3
1038
+ l-0.5-0.3l-0.5-0.3l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.4-0.5l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3
1039
+ l-0.2-0.3l-0.2-0.3l-0.2-0.4L-13,228l-0.2-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.5l-0.1-0.5v-0.5V224v-0.5l0-0.5
1040
+ l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3
1041
+ l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.6-0.3
1042
+ l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1
1043
+ l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1h0.6h0.6L6,210.5z M389.5,208l-0.3-0.4l-0.1-0.1L389.5,208z"
1044
+ />
1045
+ </g>
1046
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
1047
+ <path
1048
+ d="M168.7,64h0.7h0.7h0.7h0.7h0.7l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.2
1049
+ l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3
1050
+ l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4
1051
+ l0.5,0.4l0.5,0.4l0.5,0.4l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5L199,78l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.6
1052
+ l0.3,0.6l0.3,0.6l0.3,0.6L203,84l0.3,0.6l0.3,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.1,0.6L205,90l0.1,0.6
1053
+ l0.1,0.6l0.1,0.6l0.1,0.6V93v0.6v0.6v0.6v0.6V96v0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6L205,99l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6
1054
+ l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6
1055
+ l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.6
1056
+ l-0.4,0.6l-0.4,0.6l-0.4,0.5l-0.4,0.5l-0.4,0.6l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5
1057
+ l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.9,1l-0.9,0.9l-0.9,0.9l-1,0.9l-1,0.9
1058
+ l-1,0.9l-1,0.8l-1,0.8l-1,0.8l-1,0.8l-1,0.7l-0.9,0.7l-0.9,0.7l-0.9,0.7l-0.9,0.6L173,141l-0.9,0.6l-0.9,0.6l-0.9,0.5l-0.9,0.5
1059
+ l-0.8,0.5l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.2l-0.7,0.2
1060
+ l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1h-0.7H153h-0.7h-0.7h-0.7h-0.7
1061
+ l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2
1062
+ l-0.6-0.2l-0.6-0.2l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.4l-0.5-0.4
1063
+ l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.4-0.4l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5
1064
+ l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.3-0.6l-0.3-0.6l-0.3-0.6
1065
+ l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.2-0.6l-0.2-0.6
1066
+ l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.1-0.6l-0.1-0.7l-0.1-0.7
1067
+ l-0.1-0.6l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7v-0.7v-0.7v-0.7v-0.7v-0.7v-0.7l0-0.7v-0.7
1068
+ v-0.7V101l0.1-0.7l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.3-1.5l0.3-1.7l0.3-1.8l0.2-0.9l0.2-0.9l0.2-1l0.2-1
1069
+ l0.2-1l0.2-1l0.2-1l0.3-1l0.3-1l0.3-1l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5
1070
+ l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.3l0.3-0.3
1071
+ l0.3-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2l0.2-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3L132,69l0.3,0.1
1072
+ l0.3,0.1l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3
1073
+ l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.1l-0.1,0.1h-0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.2
1074
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
1075
+ l-0.2,0.3l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.3,0.9
1076
+ l-0.3,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.3,1.8l-0.3,1.7l-0.3,1.5l-0.1,0.6
1077
+ l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.6l-0.1,0.5l-0.1,0.6v0.6v0.6v0.6v0.6v0.6l0,0.6v0.6v0.6v0.6v0.6v0.6l0.1,0.6l0.1,0.6
1078
+ l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6
1079
+ l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5
1080
+ l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.4,0.4l0.4,0.4
1081
+ l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3
1082
+ l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.2l0.4,0.2l0.4,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.1
1083
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5l0.5-0.1l0.5-0.1l0.5-0.1
1084
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.3l0.6-0.3l0.6-0.3l0.3-0.2
1085
+ l0.3-0.2l0.4-0.2l0.4-0.2l0.8-0.4l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.6l0.9-0.6l0.9-0.6l0.9-0.7l0.9-0.7l0.9-0.7l0.9-0.7
1086
+ l0.9-0.7l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.9l0.9-0.9l0.9-0.9l0.4-0.4l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5
1087
+ l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5
1088
+ l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.2-0.5
1089
+ l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5
1090
+ l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5V96v-0.5V95v-0.5V94v-0.5V93v-0.5V92l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.4l-0.1-0.5
1091
+ l-0.1-0.4l-0.1-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4
1092
+ l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4
1093
+ l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3
1094
+ l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
1095
+ l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1h-0.5h-0.5
1096
+ h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
1097
+ l-0.4,0.1l-0.4,0.1l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
1098
+ l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.8,0.5l-0.8,0.5l-0.8,0.5l-0.8,0.5l-0.7,0.5l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.5,0.4l-0.5,0.4
1099
+ l-0.5,0.4l-0.5,0.4l-0.2,0.2h-0.1v0.2l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2
1100
+ l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.2h-0.2h-0.3h-0.1h-0.2h-0.2h-0.1l-0.2-0.1l-0.2-0.1h-0.1l-0.2-0.1l-0.2-0.2l0,0
1101
+ l-0.2-0.1l-0.2-0.2l-0.2-0.2l0,0l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0v-0.3v-0.3V79v-0.2v-0.2v-0.1
1102
+ v-0.2l0.1-0.2V78l0.1-0.3l0.1-0.2l0.1-0.3l0.1-0.2l0.1-0.2l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3
1103
+ l0.6-0.5l0.6-0.5l0.6-0.4l0.6-0.4l0.5-0.3l0.4-0.3l0.5-0.3l0.8-0.5l0.8-0.5l0.8-0.5l0.9-0.5l0.9-0.5l0.5-0.3l0.5-0.3l0.5-0.3
1104
+ L157,68l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2L162,66l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2
1105
+ l0.5-0.1L165,65l0.5-0.1l0.5-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1h0.7L168.7,64z M146,75.9L146,75.9L146,75.9L146,75.9z"
1106
+ />
1107
+ </g>
1108
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
1109
+ <path
1110
+ d="M102.5,119.3h0.5h0.5h0.5h0.5h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.5,0.2
1111
+ l0.5,0.2l0.5,0.2l0.5,0.2l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2
1112
+ l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.3
1113
+ l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3
1114
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3
1115
+ l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.5l-0.4,0.5l-0.5,0.5
1116
+ l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.4
1117
+ l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3
1118
+ l-0.5,0.3l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.1l-0.5,0.1l-0.3,0.1h-0.2l-0.6,0.1l-0.6,0.1h-0.6h-0.5h-0.5
1119
+ h-0.5h-0.5l-0.5-0.1l-0.5-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1L87,156l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1
1120
+ l-0.4-0.2l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3L83,153l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4
1121
+ l-0.2-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4V147v-0.4v-0.4v-0.4v-0.4V145
1122
+ v-0.4v-0.4v-0.4v-0.4V143v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4
1123
+ l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.2-0.5L83,135l0.3-0.8l0.4-0.9l0.4-1l0.5-1l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5
1124
+ l0.2-0.5l0.2-0.5v-0.1V128v-0.2v-0.2v-0.2l0.1-0.2L86,127l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.3-0.3
1125
+ l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3L89,124l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.5-0.2l0.5-0.2l0.5-0.2
1126
+ l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1
1127
+ l0.5-0.1h0.5L102.5,119.3z M102,125.2h-0.4h-0.4l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1L98,126
1128
+ l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l0,0
1129
+ v0.1v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1
1130
+ l-0.2,0.1l-0.2,0.1l-0.2,0.1l0,0l-0.2,0.3l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4L90,133l-0.2,0.5l-0.2,0.5l-0.4,0.9l-0.4,0.9
1131
+ l-0.4,0.8l-0.3,0.7l-0.2,0.6l-0.2,0.4l-0.1,0.2l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3
1132
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3l0.1,0.2
1133
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
1134
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.2,0.1h0.1h0.1h0.1h0.1h0.1H89h0.1h0.1h0.1h0.1h0.2h0.2h0.3h0.3h0.3H91h0.3h0.4l0.4-0.1h0.1h0.1
1135
+ l0.2-0.1l0.2-0.1L93,150l0.3-0.1l0.3-0.1l0.3-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3
1136
+ l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.4-0.4l0.4-0.5
1137
+ l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.2-0.4
1138
+ l0.2-0.4l0.2-0.4l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2v-0.2v-0.2V131v-0.2v-0.2v-0.2v-0.2
1139
+ V130v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1V129v-0.1v-0.1v-0.1v-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
1140
+ l-0.1-0.2l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
1141
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.3-0.1l-0.3-0.1
1142
+ l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1h-0.3h-0.3h-0.3h-0.4h-0.4h-0.4h-0.4L102,125.2z"
1143
+ />
1144
+ </g>
1145
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
1146
+ <path
1147
+ d="M80.8,178.7h0.4h0.4H82h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.6,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2
1148
+ l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2
1149
+ l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.7,0.5l0.7,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l1.2,1l1.2,1.1l0.6,0.5
1150
+ l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.8,0.6l0.8,0.6l0.8,0.6l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.2l0.4,0.2
1151
+ l0.4,0.2l0.4,0.2l0.4,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l0.6,0.2l0.6,0.2
1152
+ l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.5,0.2l0.6,0.2l0.5,0.2l0.5,0.3l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.4,0.2l0.4,0.2l0.4,0.3
1153
+ l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.3,0.4l0.2,0.2l0.2,0.2l0.2,0.2
1154
+ l0.2,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.3v0.3
1155
+ v0.4l-0.1,0.4l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2
1156
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1
1157
+ l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.4,0.1l-0.5,0.1l-0.4,0.1l-0.4,0.1h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1
1158
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3
1159
+ l-0.7-0.3l-1.4-0.6l-0.7-0.3l-0.6-0.3l-0.6-0.2l-0.5-0.2l-0.5-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1h-0.2h-0.1h-0.2l-0.3-0.1
1160
+ l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1
1161
+ l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.4-0.3l-0.4-0.3l-0.8-0.6l-0.8-0.6l-0.8-0.6l-0.4-0.3l-0.4-0.3l-0.4-0.3
1162
+ l-0.4-0.3l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1
1163
+ l-0.5-0.2l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1h-0.5h-0.5h-0.5h-0.5
1164
+ h-0.5h-0.5h-0.5h-0.5h-0.5h-0.6h-0.5h-1.1l-1.1,0.1l-1.1,0.1l-2.3,0.2l-1.2,0.1l-1.2,0.1l-1.2,0.1l-1.2,0.1h-1.2h-0.6H72h-0.6
1165
+ H69h-0.6h-0.6h-0.6h-0.6H66h-0.6l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.2l-0.6-0.2
1166
+ l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2L55,202l-0.5-0.3l-0.5-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3
1167
+ l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.1-0.4
1168
+ l-0.1-0.4l-0.1-0.4l-0.1-0.4V194v-0.4v-0.4v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4
1169
+ l0.2-0.4l0.2-0.4l0.2-0.4l0.3-0.4l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3
1170
+ l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2l0.2-0.1l0,0v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2
1171
+ l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.2l0.2,0.2h0.1l0.5-0.1l0.3-0.1l0.3-0.1l0.3-0.1
1172
+ h0.3h0.4h0.4h0.4h0.4l0.4,0.1h0.3l0.2,0.1L66,181l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
1173
+ h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2l0.2-0.1l0.2-0.1l0.5-0.1l0.5-0.2l0.5-0.2l0.5-0.2l1.1-0.4
1174
+ l0.5-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.4L80.8,178.7z
1175
+ M80.5,184.6h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2l-0.2,0.1l-0.2,0.1l-0.4,0.1L78,185l-0.5,0.2l-0.5,0.2l-0.5,0.2l-1.1,0.4l-0.6,0.2
1176
+ l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.4h-0.4H70h-0.4h-0.4h-0.4h-0.4H68h-0.4
1177
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1L66,187l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.2-0.1l0,0h-0.1H64h-0.2h-0.2h-0.2h-0.2l-0.5,0.1
1178
+ l-0.5,0.1l-0.5,0.1h-0.2l-0.2,0.2L61,187l-0.3,0.1l-0.4,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2
1179
+ l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.1,0.2
1180
+ l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2v0.2l0,0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1
1181
+ v0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.3,0.2
1182
+ l0.3,0.2l0.3,0.2l0.3,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.5,0.2l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
1183
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1h0.5h0.5h0.5h0.5h0.5h0.5h0.6h0.6h0.6H71h1.1l1.1-0.1l1.1-0.1l1.2-0.1l1.2-0.1
1184
+ l2.3-0.2l1.2-0.1l1.2-0.1h1.2h0.6h0.6h0.6H85h0.6h0.6h0.6h0.6H88h0.6l0.6,0.1l0.6,0.1l0.6,0.1L91,199l0.6,0.1l0.6,0.1l0.6,0.1
1185
+ l0.6,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.5,0.3l0.5,0.3
1186
+ l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l0.4,0.3l0.4,0.3l0.8,0.7l0.8,0.6l0.8,0.6l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.2l0.4,0.2l0.4,0.2
1187
+ l0.4,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1h0.2l0.2,0.1
1188
+ l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.6,0.2l0.6,0.3l0.7,0.3l0.7,0.3l0.7,0.3l1.4,0.6l0.7,0.3l0.7,0.3l0.7,0.3
1189
+ l0.7,0.3l0.7,0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1h0.3h0.3h0.2h0.2h0.2h0.2
1190
+ h0.2h0.2h0.2h0.1h0.1h0.1l0,0h0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0v-0.1v-0.1v-0.1V213v-0.1v-0.1
1191
+ l0,0l0,0l0,0l0,0v-0.1v-0.1v-0.1v-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.3
1192
+ l-0.2-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
1193
+ l-0.3-0.2l-0.2-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
1194
+ l-0.5-0.2l-0.5-0.2l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.4l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2
1195
+ l-0.6-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.2-0.2l-0.9-0.7l-0.9-0.7l-0.8-0.6
1196
+ l-0.8-0.6l-0.7-0.6l-0.7-0.6l-0.7-0.6l-0.7-0.6l-1.2-1.1l-1.2-1l-0.6-0.5l-0.6-0.5l-0.5-0.5l-0.6-0.4l-0.5-0.4l-0.6-0.4
1197
+ l-0.6-0.4l-0.6-0.4l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.4-0.2
1198
+ l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2H80
1199
+ h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.2L80.5,184.6z"
1200
+ />
1201
+ </g>
1202
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
1203
+ <path
1204
+ d="M332.3,146.1h0.2h0.2h0.2h0.2h0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0,0l0,0l0.6,0.1
1205
+ l0.6,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
1206
+ l0.2,0.1l0.4,0.3l0.4,0.3l0.4,0.3l0.3,0.3l0.3,0.3l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4
1207
+ l0.2,0.4l0.2,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.8
1208
+ l0.2,0.8l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.3,0.5
1209
+ l0.3,0.7l0.4,0.7l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.1,0.5l0.1,0.5l0.1,0.3v0.3v0.3
1210
+ v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3L350,181l-0.2,0.3l-0.2,0.3
1211
+ l-0.3,0.3l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.3h-0.2
1212
+ h-0.3h-0.3h-0.2H345h-0.2h-0.2h-0.2h-0.2H344h-0.2l-0.2-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
1213
+ l-0.4-0.2l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3
1214
+ l-0.3-0.3l-0.3-0.3l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.5-0.7
1215
+ l-0.5-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.3-0.7l-0.3-0.6l-0.3-0.6l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
1216
+ l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4v-0.4V163v-0.4v-0.4v-0.4v-0.4V161v-0.9v-0.9v-0.8v-1.6v-1.6
1217
+ v-0.7v-0.8v-0.2v-0.1v-0.1v-0.2l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.2l0.1-0.2l0.2-0.4l0.2-0.4l0.1-0.2l0,0v-0.1v-0.1
1218
+ l-0.1-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1
1219
+ l0.1-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.2h0.2h0.2L332.3,146.1z M334.7,152.9l-0.1,0.3l-0.1,0.3v0.1v0.1
1220
+ l0,0v0.6v0.8l-0.1,1.6v1.6v0.8v0.8v0.8v0.4v0.4v0.4v0.4v0.4v0.3v0.3v0.3v0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.1v0.1
1221
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.2,0.5l0.2,0.5l0.3,0.5l0.3,0.6l0.3,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.2,0.3l0.2,0.3l0.2,0.3
1222
+ l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.3,0.3l0.2,0.3l0.2,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.2l0.2,0.2l0.2,0.2
1223
+ l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1h0.2h0.2l0,0h0.1h0.1h0.1
1224
+ h0.1h0.1h0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1V177l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
1225
+ l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.3l-0.3-0.7l-0.3-0.6l-0.3-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5
1226
+ l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.2-0.9l-0.2-0.9l-0.2-0.9
1227
+ l-0.2-0.9l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.7l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
1228
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
1229
+ l-0.2-0.1h-0.1h-0.1l-0.1-0.1h-0.1l-0.1-0.1h-0.1h-0.1H336h-0.1h-0.1h-0.1h-0.1l-0.3-0.1l-0.3-0.1h-0.1L334.7,152.9z"
1230
+ />
1231
+ </g>
1232
+ </g>
1233
+ </g>
1234
+ </g>
1235
+ <g>
1236
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1237
+ <path
1238
+ fill="#B5A47D"
1239
+ d="M-204.2,1379.2L-204.2,1379.2l-0.4-0.9l-0.3-0.8l-0.3-0.9l-0.4-0.9l-0.4-0.9l-0.7-1.9l-0.6-1.7l-0.3-0.8
1240
+ l-0.2-0.7l-0.2-0.7l-0.2-0.8l-0.3-1.2l-0.2-1l-0.2-0.9l-0.2-0.9l-0.2-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.2-1.6
1241
+ l-0.2-1.6l-0.2-1.5l-0.2-1.5l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6
1242
+ l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.2-0.6l-0.5-1.6l-0.5-1.7l-0.5-1.7l-0.5-1.7l-0.5-1.7l-0.5-1.8l-0.5-1.8l-0.4-1.8l-0.4-1.8
1243
+ l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8
1244
+ l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.2-1.8l-0.2-1.8l-0.2-1.8l-0.1-1.2l-0.2-1.2l-0.2-1.2
1245
+ l-0.2-1.2l-0.2-1.2l-0.2-1.2l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5
1246
+ l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.4l-0.1-0.3l-0.5-0.3l-0.6-0.4l-0.4-0.3l-0.4-0.4l-0.6-0.5l-0.4-0.4l-0.8-0.8l-0.1-0.1l-0.8-1
1247
+ l0,0l-0.6-1l0,0l-0.4-0.7l-0.3-0.8l0,0l-0.4-1.2l-0.2-1.2l0,0l-0.1-1.4v-1.4l0,0l0.2-1.2l0.3-1.2l0.4-1.1l0,0l0.3-0.7l-0.1-0.2
1248
+ l-0.3-0.7l-0.3-0.7l-0.2-0.7l-0.2-0.7l-0.1-0.3h-0.2l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
1249
+ l-0.5-0.2l-0.5-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.3-0.3
1250
+ l-0.3-0.3l-0.3-0.3l-0.3-0.4l-0.6-0.6l-0.6-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7
1251
+ l-0.4-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.1-0.3l-0.1-0.1l-0.4-0.4l-0.4-0.4l-0.3-0.4l-0.3-0.4l-0.5-0.7
1252
+ l-0.5-0.7l-0.4-0.7l-0.4-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.5l-0.2-0.5l-0.2-0.5l-0.4-0.9l-0.3-0.8l-0.3-0.6l-0.2-0.4l-0.1-0.2
1253
+ l-0.8-1.1l-0.5-0.7l-0.5-0.7l-0.5-0.8l-0.6-0.9l-0.6-0.9l-0.6-1l-0.6-1l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.6l-0.3-0.6
1254
+ l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.1-0.8
1255
+ l-0.1-0.9l-0.1-0.8v-0.5v-0.5v-0.5v-0.5v-0.5v-0.5v-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.6l0.2-0.5
1256
+ l0.2-0.6l0.2-0.6l0.3-0.6l0.3-0.5l0.3-0.5l0.3-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.4l0.4-0.4l0.5-0.4l0.5-0.4
1257
+ l0.5-0.4l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.6-0.2l0.7-0.2l0.8-0.2l0.8-0.2
1258
+ l0.8-0.1l0.9-0.1l0.8-0.1h0.8h0.9l0.9,0.1h0.4l0.1-0.2l0.4-0.6l0.4-0.6l0.5-0.6l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.4l0.5-0.4l0.5-0.4
1259
+ l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.2l0.8-0.3l0.8-0.3l0.8-0.2l0.7-0.2l0.7-0.2l0.7-0.1
1260
+ l0.7-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.7-0.1l0.5-0.5l0.5-0.5l0.5-0.4l0.5-0.4l0.5-0.3l0.5-0.3l0.5-0.3l0.4-0.3l0.5-0.3l0.8-0.4
1261
+ l0.8-0.4l0.8-0.3l0.8-0.3l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.6-0.1l0.7-0.1l0.6-0.1h0.6h0.6h0.6
1262
+ h0.6h0.7h1.2h1.2h1.2h1.2h1.1l1.1,0.1l1.1,0.1l1,0.1l1.9,0.1l1.7,0.1l1.3,0.1h0.5h0.3h0.1l3-0.1l3.2-0.1l3.2-0.1l3.2-0.1l3.2-0.1
1263
+ l3.2-0.1l3.6-0.2l0.6-0.5l1.2-0.8l1.3-0.6l1.3-0.4l0,0l1.1-0.2l1.2-0.1h1.2h0.1l0.8,0.1l0.8,0.1l0.5,0.1l0.8,0.2l0.6,0.2l0.7,0.2
1264
+ l0.5,0.2l0.4,0.2l0.4,0.2h0.1h0.3h0.7h0.8h0.9h1h0.6h0.5h0.6h0.6h0.6h0.6h0.6h0.6h0.6l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1
1265
+ l0.6-0.1l0.6-0.1l1.2-0.2l1.2-0.2l1.3-0.2l2.7-0.5l1.4-0.2l1.5-0.2l1.5-0.2l0.8-0.1l0.8-0.1l2.5-0.3l2.5-0.3l2.5-0.3l2.5-0.3
1266
+ l2.4-0.2l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1
1267
+ l1.2-0.1h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1
1268
+ l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.2l1.2,0.2l1.3,0.2
1269
+ l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l1.3,0.3l1.3,0.3l1.3,0.3l1.3,0.3l1.2,0.3l1.2,0.3l2.4,0.6h0.1
1270
+ h0.7l1.2-0.1l1.2-0.1h1.2h1.2h0.3l0.7-0.6l1.1-0.7l1.2-0.6l1.2-0.5l1.3-0.3l1.3-0.2l0,0h1.2l1.2,0.1l1.2,0.2l0,0l1.1,0.3l1,0.4
1271
+ l0.4,0.2l0.9,0.4l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3
1272
+ l0.8,0.3h0.6h0.4h0.4h0.4h0.3h0.2l0.3-0.2l0.8-0.5l0.5-0.3l0.5-0.3l0.6-0.3l0.6-0.3l0.6-0.4l0.7-0.4l0.8-0.4l0.8-0.3l0.5-0.2
1273
+ l0.5-0.2l0.5-0.2l0.5-0.2l0.6-0.2l0.6-0.1l0.7-0.1l0.7-0.1l0.8-0.1h0.9h0.9l0.9,0.1l1,0.1l1.1,0.2l1,0.3l0.5,0.2l1,0.5l0.1,0.1
1274
+ l0.9,0.5l0.5,0.4l0.5,0.4l0.8,0.7l0.4,0.4l0.8,0.8l0.7,0.9l0.6,0.9l0.5,0.9l0.4,0.8l0.3,0.9l0.3,0.9l0.2,1l0.1,0.5l0.1,1.1v0.6
1275
+ v0.6l-0.1,0.8l0.3,0.3l0.5,0.4l0.5,0.5l0.4,0.5l0.5,0.5l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.7l0.3,0.7l0.3,0.6l0.3,0.7l0.1,0.3
1276
+ l0.9,0.5l0.1,0.1l1,0.7l0.1,0.1l0.9,0.8l0.1,0.1l0.9,1l0.1,0.1l0.7,1l0.1,0.1l0.6,1l0.1,0.1l0.5,1l0.3,0.6l0.3,1.1l0.2,1l0.1,1
1277
+ l0.1,0.9v0.8v0.8l-0.1,0.7l-0.1,0.7l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.8
1278
+ l-0.3,0.8l-0.4,0.8l-0.3,0.7l-0.4,0.7l-0.3,0.7l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.6,1l-0.6,0.9l-0.5,0.7l-0.3,0.5l-0.1,0.1v0.1
1279
+ l-0.3,0.5l-0.3,0.6l-0.3,0.6l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.4,0.5l-0.7,1l-0.7,1l-0.7,1l-0.7,1l-0.7,0.9l-0.2,0.4
1280
+ l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.5,0.7l-0.5,0.7
1281
+ l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7
1282
+ l-0.5,0.7l-0.4,0.5l0,0l0,0l-0.1,0.1l-0.1,0.1l-0.3,0.5l-0.4,0.6l-0.5,0.7l-0.5,0.8l-0.6,0.9l-0.3,0.5l-0.4,0.5l-0.4,0.5
1283
+ l-0.4,0.5l-0.5,0.6l-0.5,0.6l-0.6,0.6l-0.4,0.4l-0.4,0.4l-0.4,0.3v1.2l-0.1,1.4l-0.3,1.4l-0.4,1.3l-0.2,0.5l-0.5,1.1l-0.3,0.7
1284
+ l-0.3,0.8l-0.3,0.8l-0.2,0.5l-0.2,0.5l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.5l-0.4,0.5
1285
+ l-0.4,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.4l-0.5,0.5
1286
+ l-0.9,0.8l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.4,0.3v0.4l-0.1,0.8l-0.1,0.8l-0.1,0.9l-0.2,0.9l-0.2,0.9
1287
+ l-0.2,0.8l-0.2,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.5l-0.3,0.5l-0.2,0.4l-0.1,0.2l0,0l-0.2,0.4
1288
+ l-0.3,0.5l-0.3,0.6l-0.7,1.4l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.4,0.6l-0.5,0.7l-0.7,0.8l-0.6,0.6
1289
+ l-0.3,0.3l-0.8,0.7l0,0l-0.6,0.4l-0.2,0.5l-1,2.3l-1,2.3l-2,4.6l-3.2,7.4l-3.2,7.4l-3.2,7.4l-3.2,7.4l-3.2,7.5l-3.2,7.4l-3.2,7.5
1290
+ l-3.2,7.5l-3.1,7.5l-3.1,7.5l-3.1,7.5l-3.1,7.5l-6.3,15l-6.3,15l-2.4,5.7l-2.4,5.7l-2.4,5.7l-1.2,2.9l-1.2,2.9l-1.2,2.9l-1.2,2.9
1291
+ l-1.1,2.9l-1.1,2.9l-1.1,2.8l-1.1,2.9l-1.1,2.9l-1.1,2.9l-0.5,1.3l-0.5,1.2l-0.4,1.1l-0.4,1l-0.4,0.9l-0.3,0.8l-0.6,1.4l-0.6,1.4
1292
+ l-0.7,1.5l-0.4,0.9l-0.4,1l-0.5,1.1l-0.5,1.3l-0.2,0.6l-0.2,0.6l-0.3,0.7l-0.3,0.7l-0.4,0.8l-0.4,0.8l-0.3,0.5l-0.3,0.5l-0.3,0.5
1293
+ l-0.3,0.5l-0.3,0.5l-0.4,0.6l-0.4,0.6l-0.5,0.6l-0.6,0.7l-0.7,0.7l-0.5,0.5l-0.5,0.4l-0.6,0.4l-0.7,0.5l-0.8,0.5l-1,0.5l-0.6,0.2
1294
+ l-1.1,0.4h-0.1l-1.2,0.3h-0.1l-0.7,0.1h-0.4l-0.1,0.4l-0.3,0.9l-0.2,0.5l-0.2,0.5l-0.2,0.6l-0.2,0.6l-0.3,0.7l-0.4,0.8l-0.5,0.8
1295
+ l-0.4,0.6l-0.5,0.6l-0.6,0.7l-0.3,0.4l-0.8,0.8h-0.1l-1,0.8h-0.1l-0.7,0.4l-0.7,0.4h-0.1l-0.9,0.4l-0.4,0.1l-0.8,2l-0.8,2.1
1296
+ l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.7,2.1l-0.7,2.1l-0.7,2.1l-0.7,2.1l-0.3,1l-0.3,0.8l0,0v0.2v0.2l-0.1,0.6l-0.2,1.6
1297
+ l-0.1,0.9l-0.1,0.5l-0.1,0.5l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.2,0.7l-0.2,0.8l-0.3,0.8l-0.2,0.6l-0.3,0.6l-0.3,0.6l-0.4,0.7
1298
+ l-0.5,0.8l-0.6,0.8l-0.4,0.4l-0.9,0.9l-0.1,0.1l-1.1,0.8h-0.1l-0.7,0.4l-0.7,0.4h-0.1l-0.8,0.3l-0.6,0.2v0.1l-0.1,0.9v0.1v0.3
1299
+ v0.8v1l-0.1,2.6v1.5l-0.1,1.5v0.8v0.8v0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.5l-0.1,0.5
1300
+ l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.6l-0.3,0.6l-0.3,0.7l-0.4,0.8l-0.5,0.9l-0.4,0.5l-0.7,0.9l-0.1,0.1l-0.8,0.8l-0.9,0.7l0,0
1301
+ l-0.9,0.6l-1,0.5l-1,0.4l0,0l-1.1,0.4l-1.1,0.2l-1.1,0.1h-1.1l0,0l-1.3-0.1l-1.3-0.2l-1.2-0.4l0,0l-1.2-0.5l-1.1-0.6l-1.1-0.8
1302
+ l0,0l-0.8-0.7l-0.7-0.8l-0.6-0.8l0,0l-0.5-0.7l-0.4-0.7l-0.3-0.5l-0.3-0.8l-0.2-0.6l-0.2-0.5l-0.2-0.7l-0.2-0.7l-0.1-0.6
1303
+ l-0.1-0.6l-0.1-0.6l-0.1-0.7l-0.2-1.3l-0.2-1.4l-0.2-1.4l-0.2-1.4l-0.2-1.4l-0.4-2.5l-0.2-1.6l-0.1-0.3l-0.2-0.6l-0.2-0.6
1304
+ l-0.2-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.2-1.1l-0.2-1.1l-0.2-1.1l-0.2-1.1l-0.2-1.1l-0.1-1.1l-0.1-1.1
1305
+ l-0.1-1.1l-0.1-1.1l-0.1-1.1l-0.1-1.1l-0.1-1.1l-0.1-1.1l-0.1-2l-0.3-3.9l-0.1-1.9l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.8l-0.1-0.8
1306
+ l-0.1-0.8l-0.4-2.8l-0.4-2.8l-0.4-2.8l-0.4-2.8l-0.4-2.8l-0.4-2.8l-0.4-2.9l-0.4-2.8l-0.4-2.9l-0.4-2.8l-0.9-5.7l-0.9-5.7
1307
+ l-0.9-5.7l-1.8-11.5l-0.9-5.8l-0.9-5.8l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.3-2.3
1308
+ l-0.3-2.2l-0.6-4.5l-0.3-2.2l-0.2-1.3l-0.2-0.4l-0.3-1.3l-0.2-1.3l-0.6-3.2l-0.7-3.9l-0.3-1.9l-0.3-1.6l-0.2-0.8l-0.2-0.8
1309
+ l-0.2-0.9l-0.2-0.9l-0.2-1l-0.2-1.1l-0.2-1.1l-0.1-0.6l-0.1-0.6l-0.2-1.1l-0.2-1.1l-0.1-1l-0.1-1l-0.1-0.9l-0.1-0.9l-0.1-0.8
1310
+ v-0.1l-0.3-1.1l-0.1-0.2l-0.1-0.3l-0.3-1l-0.8-2.2l-0.3-1.1l-0.2-0.6l-0.2-0.7l-0.2-0.7l-0.1-0.4l-0.1-1.2v-1.2l0,0l0.1-1.4
1311
+ l0.3-1.3l0.4-1.3l0.6-1.2L-204.2,1379.2z M-182.3,1308.4l0.3,1.6h0.1l0,0v-0.1l0.2-0.6l0.1-0.4l-0.1-0.2l-0.7-0.9L-182.3,1308.4z
1312
+ "
1313
+ />
1314
+ </g>
1315
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1316
+ <path
1317
+ fill="#836F40"
1318
+ d="M-165.2,1548.9l0.5-0.9l0.3-0.5l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
1319
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
1320
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.4-0.3l0.8-0.6l0.5-0.3l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1
1321
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.2
1322
+ h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.2h0.1h0.2h0.1h0.1h0.1
1323
+ l0.2,0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.5,0.2l0.9,0.4l0.4,0.2l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
1324
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
1325
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
1326
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
1327
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1v0.2v0.1v0.1v0.2v0.1v0.2v0.1v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2
1328
+ v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.1v0.2v0.1v0.2v0.1v0.1v0.1l-0.1,0.1l-0.1,0.1
1329
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
1330
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1v0.2v0.2v0.2v0.2v0.2v0.2v0.1v0.2v0.2v0.1v0.1v0.2v0.1v0.1l-0.1,0.1l-0.1,0.1
1331
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
1332
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
1333
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
1334
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
1335
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
1336
+ l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1h-0.1h-0.2h-0.1h-0.2h-0.2h-0.1h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2
1337
+ h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.1h-0.2h-0.2
1338
+ h-0.1h-0.1h-0.2h-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
1339
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
1340
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
1341
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
1342
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
1343
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1v-0.1v-0.1v-0.1v-0.2v-0.1v-0.2v-0.2v-0.1v-0.2v-0.2v-0.2v-0.2v-0.2
1344
+ v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.5v-0.6v-0.7l0.1-0.7l0.1-0.8l0.1-0.8l0.1-0.5l0.1-0.5l0.1-0.5
1345
+ l0.1-0.5l0.1-0.5l0.2-0.6l0.2-0.6l0.3-0.7L-165.2,1548.9z M-158.6,1564.1L-158.6,1564.1L-158.6,1564.1L-158.6,1564.1l-0.2-0.1
1346
+ l-0.1-0.1L-158.6,1564.1z"
1347
+ />
1348
+ </g>
1349
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1350
+ <path
1351
+ fill="#836F40"
1352
+ d="M-49.4,1288.3l0.6-1.3l0.6-1.3l0.6-1.2l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6
1353
+ l0.3-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.5-0.6l0.2-0.2l0.4-0.6l0.5-0.8l0.5-1l0.6-1l0.3-0.6l0.3-0.6l0.4-0.6l0.4-0.6l0.4-0.6
1354
+ l0.4-0.6l0.5-0.6l0.5-0.7l0.5-0.6l0.3-0.4l0.3-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.5-0.4l0.5-0.4l0.6-0.4l0.7-0.5l0.8-0.5l1-0.4
1355
+ l0.6-0.2l1.1-0.3h0.1l0.6-0.1l0.6-0.1h0.1l0.7-0.1h0.7h0.1h0.8l0.8,0.1h0.1l0.8,0.1l0.8,0.2h0.1l0.8,0.2l0.8,0.3h0.1l0.7,0.3
1356
+ l0.7,0.4l0.1,0.1l0.6,0.4l0.6,0.4l0.1,0.1l0.6,0.5l0.5,0.5l0.1,0.1l0.5,0.5l0.5,0.6l0.1,0.1l0.4,0.5l0.4,0.6l0.1,0.1l0.3,0.5
1357
+ l0.3,0.6l0.1,0.1l0.4,1l0.2,0.6l0.3,1.1l0.2,1l0.1,0.9l0.1,0.8v0.8v0.7v0.7l-0.1,0.6l-0.1,0.6l-0.1,0.5l-0.1,0.5l-0.1,0.5
1358
+ l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.2,0.8l-0.3,0.8l-0.3,0.8l-0.3,0.7l-0.3,0.7l-0.3,0.7l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6
1359
+ l-0.3,0.5l-0.5,0.9l-0.4,0.8l-0.3,0.6l-0.1,0.2l-0.3,0.5l-0.4,0.9l-0.9,1.6l-0.9,1.6l-0.8,1.6l-1.7,3.1l-0.8,1.5l-0.8,1.5
1360
+ l-0.7,1.4l-0.7,1.4l-1.4,2.8l-1.4,2.9l-1.5,2.9l-0.7,1.5l-0.8,1.5l-0.8,1.5l-0.8,1.5l-0.8,1.5l-0.8,1.5l-0.8,1.5l-0.8,1.5
1361
+ l-0.9,1.5l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.5,0.8l-0.5,0.8l-0.3,0.5l-0.1,0.2l-0.4,0.8l-0.3,0.7l-0.1,0.3l-0.1,0.6l-0.2,0.6
1362
+ l-0.2,0.6l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.4l-0.2,0.5l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.6l0,0l-0.6,1.6l-0.8,2.1
1363
+ l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.9,2l-0.9,2l-0.9,2l-0.7,1.7v0.1l-0.1,0.3l-0.1,0.5l-0.2,0.6
1364
+ l-0.2,0.7l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.6l-0.3,0.6l-0.3,0.7l-0.4,0.7l-0.5,0.8l-0.6,0.8l-0.7,0.9l-0.7,0.8l-0.6,0.5
1365
+ l-0.5,0.4l-0.5,0.4l-0.6,0.4l-0.7,0.4l-0.7,0.3l-0.7,0.3l0,0l-0.2,0.8l-0.2,0.8l-0.2,0.8l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.3,0.7
1366
+ l-0.3,0.7l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.5,1.1l-0.4,1l-0.4,0.9l-0.3,0.7l-0.3,0.7l-0.6,1.3l-0.7,1.4l-0.7,1.4l-0.8,1.5l-0.7,1.4
1367
+ l0,0l-0.1,0.7l-0.1,0.7l-0.1,0.6l-0.1,0.6l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.8l-0.3,0.8l-0.3,0.7l-0.3,0.7l-0.3,0.7l-0.3,0.6
1368
+ l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.6,1.1l-1.1,1.8l-0.4,0.7l-0.1,0.2l-0.1,0.3l-1.1,2.1l-1.2,2.1l-1.2,2.1l-1.2,2.1
1369
+ l-1.2,2.1l-1.2,2.1l-1.3,2.1l-1.3,2.1l-1.3,2.1l-1.3,2.1l-1.3,2.1l-1.3,2.1l-0.1,0.2l-0.5,1.1l-0.8,1.5l-0.7,1.5l-0.7,1.5
1370
+ l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.1,0.1v0.1v0.4l-0.1,0.7l-0.1,0.8
1371
+ l-0.2,1.2l-0.3,1.2l-0.4,1.1l-0.5,1l-0.6,2.4l-0.6,2.5l-0.6,2.5l-0.3,1.3l-0.3,1.3l-0.3,1.3l-0.4,1.3l-0.4,1.3l-0.4,1.3l-0.4,1.3
1372
+ l-0.4,1.3l-0.4,1.3l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.3,0.7l-0.3,0.7l-0.3,0.7l0,0v0.1v0.7v0.6v0.6l-0.1,0.6
1373
+ l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.2,0.8l-0.2,0.8l-0.3,0.8l-0.3,0.7l-0.3,0.7l-0.3,0.7l-0.3,0.6l-0.3,0.6
1374
+ l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.5l-0.3,0.5l-0.6,1l-0.6,1l-0.5,0.9l-0.9,1.5l-0.4,0.6l-0.3,0.5l-0.7,1.2l-0.7,1.1
1375
+ l-0.6,1l-0.6,0.9l-0.5,0.7l-0.3,0.8l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1l-0.5,1l-0.5,1
1376
+ l-0.5,1l-0.6,1l-0.5,1l-0.6,1l-0.6,1l-0.6,1l-0.6,1l-0.6,1l-0.6,1l-0.6,1l-1.2,1.9l-1.2,1.9l-2.3,3.7l-0.2,0.4l-0.3,0.5l-0.8,1.4
1377
+ l-0.5,0.8l-0.5,0.9l-0.4,1l-0.4,1l-0.4,1l-0.4,1l-0.4,1l-0.4,1l-0.3,1l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.4
1378
+ l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.3l-0.1,0.3v0.3v0.3v0.3v0.2v0.2v0.2v0.2v0.1v0.1l0,0v0.1l0.2,1.2
1379
+ l0.1,1.2v1.2l-0.2,1.2l-0.3,1.2l-0.4,1.1l-0.5,1.1l-0.6,1l-0.7,1l-0.8,0.9l-0.9,0.8l-1,0.7l-1,0.6l-1.1,0.5l-1.1,0.4l-1.2,0.3
1380
+ l-1.2,0.1h-1.2l-1.2-0.1l-1.2-0.2l-1.1-0.3l-1.1-0.5l-1.1-0.6l-1-0.7l-0.9-0.8l-0.8-0.9l-0.7-0.9l-0.6-1l-0.5-1.1l-0.4-1.1
1381
+ l-0.3-1.2l-0.1-0.6l-0.1-0.9l-0.1-0.9l-0.1-0.8l-0.1-0.8v-0.8v-0.8v-0.8v-0.8l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7
1382
+ l0.1-0.7l0.1-0.7l0.1-0.7l0.2-0.7l-0.1-0.2l-0.4-1l-0.3-1l-0.2-1l-0.1-1.1l0,0v-1l0.1-1l0.2-1l0.2-1l0,0l0.3-0.8l0.3-0.8l0,0
1383
+ l0.3-0.6l0.4-0.6l0.3-0.5l0.5-0.7l0.4-0.5l0.3-0.4l0.5-0.6l0.4-0.5l0.2-0.2l2.2-3l0.1-0.1l0.3-0.7l0.3-0.8l0.3-0.8l0.7-1.8
1384
+ l0.7-1.8l0.6-1.5l0.6-1.6l1.5-3.9l1.5-3.9l3-7.7l3-7.7l1.5-3.8l1.5-3.8l1-2.6l1-2.6l1.1-2.6l1.1-2.6l1.1-2.6l1.1-2.6l1.1-2.6
1385
+ l1.1-2.6l1.1-2.6l1.1-2.6l1.1-2.6l1.1-2.6l1.1-2.6l1.2-2.6l1.2-2.6l1.2-2.6l1.2-2.6l1.2-2.6l0.2-0.4v-0.2l0.1-0.5l0.1-0.5
1386
+ l0.1-0.5l0.1-0.5l0.2-0.6l0.3-0.8l0.4-0.8l0.4-0.8l0.4-0.7l0.4-0.7l0.4-0.6l0.4-0.6l0.3-0.4l0.1-0.3l0.3-0.8l0.3-0.8l0.3-0.8
1387
+ l0.3-0.8l0.4-1.3h-0.1l-1-0.1h-0.1l-0.8-0.2l-0.8-0.2l-0.8-0.3h-0.1l-0.9-0.4l-0.9-0.5l-0.8-0.5l0,0l-0.8-0.6l-0.7-0.7l-0.7-0.8
1388
+ l0,0l-0.5-0.7l-0.5-0.8l-0.4-0.8v-0.1l-0.4-1l-0.3-1.1v-0.1l-0.2-0.9l-0.1-0.9v-0.1l-0.1-0.7v-0.7v-0.1l0.1-1.1v-0.5l0.1-0.8
1389
+ l0.2-0.7l0.2-0.7l0.3-0.9l0.3-0.8l0.3-0.7l0.3-0.6l0.3-0.6l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.5-0.9l0.5-0.9l0.5-0.8l0.9-1.5
1390
+ l0.3-0.5l0.2-0.4l0.6-1.1l0.6-1.1l0.6-1l0.5-0.9l0.5-0.8l0.5-0.7l0.8-1.2l0.7-1.1l0.3-0.5l0.4-0.6l0.4-0.7l0.5-0.8l0.6-1l0.6-1.1
1391
+ l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l0.9-1.9l0.9-2l0.9-2l0.9-2l0.9-2l0.7-1.5l0.5-1.3l0.5-1.3l0.5-1.3
1392
+ l0.5-1.2l0.9-2.3l0.4-1.1l0.4-1l0.4-0.9l0.3-0.9l0.3-0.8l0.1-0.3l0.1-0.4v-0.1l0.5-1.1l0.6-1.1l0.7-1l0.8-0.9l0.9-0.9l0.9-0.8
1393
+ l1-0.7l1.1-0.6l1.1-0.4l1.2-0.3l1.2-0.2l1.2-0.1l1.2,0.1l1.2,0.2l1.2,0.3l1.1,0.4l0.6,0.3l0.7-1.4l1.4-2.7l1.4-2.7l1.3-2.7
1394
+ l1.3-2.7l1.3-2.7l0.6-1.3l0.7-1.4l0.3-0.7l0.4-0.7l0.4-0.6l0.5-0.8l0.4-0.5l0.7-0.8l0.8-0.7l0,0l0.7-0.6l0.2-0.1l0.5-1.1l0.6-1.2
1395
+ l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.6-1.1l0.6-1.1l1.2-1.9l0.5-0.9l0.4-0.8l0,0l0.1-0.1l0.1-0.3l0.2-0.4l0.2-0.5l0.3-0.6l0.3-0.7
1396
+ l0.4-0.7l0.3-0.5l0.3-0.4l0.3-0.5l0.4-0.5l0.5-0.6l0.6-0.7l0.4-0.4l0.8-0.8l0.1-0.1l0.9-0.7l0.4-0.3l0.8-0.5l0.5-0.2l0.6-0.3l0,0
1397
+ l0.8-2.2l1.1-2.8l0.5-1.4l0.5-1.4l0.5-1.4l0.6-1.4l0.6-1.4l0.6-1.4L-49.4,1288.3z"
1398
+ />
1399
+ </g>
1400
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1401
+ <path
1402
+ fill="#836F40"
1403
+ d="M-235.9,1180.2l0.5-0.9l0.5-0.8l0.6-0.8l0.7-0.7l0.7-0.7l0.8-0.6l0.8-0.5l0.9-0.5l0.9-0.4l0.9-0.3l1-0.2
1404
+ l1-0.2l1-0.1h0.1h0.5h0.3h0.1l0,0l0.4-0.3l0.4-0.2l0.5-0.3l0.5-0.2l0.5-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.7-0.2l0.7-0.2l0.7-0.1
1405
+ l0.7-0.1l0.7-0.1h0.7h0.7l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.8,0.4l0.8,0.4l0.4,0.2l1.1-0.1l1.2-0.1
1406
+ l1.2-0.1l1.2-0.1l1.2-0.1l2.5-0.2l2.5-0.2l2.5-0.3l2.5-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l5.2-0.7
1407
+ l5.2-0.7l5.2-0.7l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2-0.2l2-0.2l2-0.2l2-0.2l2-0.2l2-0.2l2-0.2l2-0.1l2-0.1l2-0.1
1408
+ l2-0.1l2-0.1l2-0.1l2-0.1l2-0.1l2-0.1l2-0.1l2-0.1l1.9-0.1l2-0.1l1.9-0.1l2-0.1h1.9h2h1.9h2l3.9-0.1h3.9h3.9h3.9h3.9h3.9h3.9h3.8
1409
+ h3.8l7.7,0.1l7.7,0.1l7.6,0.1h3.8h3.8h3.8h3.8h1l1,0.1l1,0.2l0.9,0.3l0.9,0.4l0.9,0.4l0.8,0.5l0.8,0.6l0.7,0.6l0.7,0.7l0.6,0.8
1410
+ l0.6,0.8l0.5,0.8l0.4,0.9l0.4-0.2l0.6-0.2l0.7-0.3l0.8-0.3l0.5-0.2l0.5-0.1l0.5-0.1l0.5-0.2l0.6-0.1l0.6-0.1l0.6-0.1l0.7-0.1
1411
+ l0.8-0.1l0.8-0.1h0.9h1l0.7,0.1l0.6,0.1l0.7,0.1l0.7,0.2l0.8,0.2l0.8,0.3l0.9,0.4l0.9,0.5l0.5,0.3l0.4,0.3l0.4,0.3l0.1,0.1
1412
+ l0.4,0.3l0.4,0.4l0.1,0.1l0.4,0.4l0.4,0.4l0.1,0.1l0.4,0.5l0.4,0.5l0.1,0.1l0.3,0.5l0.3,0.5v0.1l0.3,0.5l0.3,0.5v0.1l0.2,0.5
1413
+ l0.2,0.5l0.2,0.6l0.3,1.1l0.2,1.1l0.1,1v0.8v0.8v0.7l-0.1,0.7l-0.1,0.7l-0.1,0.8l-0.2,0.7l-0.2,0.7L14,1187l-0.3,0.7l-0.3,0.7
1414
+ l-0.3,0.7l-0.3,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.6l-0.4,0.6l-0.5,0.6l-0.5,0.6l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.4l-0.5,0.4
1415
+ l-0.5,0.4l-0.5,0.4l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2
1416
+ l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.9,0.1l-1,0.1l-1,0.1h-1h-0.9
1417
+ h-0.9h-0.9h-0.9h-0.9h-0.9l-0.9-0.1l-0.9-0.1l-0.9,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.2l-1,0.2l-0.9,0.2
1418
+ l-0.9,0.2l-1.7,0.4l-1.6,0.3l-1.4,0.3l-1.1,0.2l-1.1,0.2l-0.7,0.1l-0.8,0.1l-0.6,0.1h-0.6h-0.6h-0.6l-1.3,0.1l-1.5,0.1l-1.6,0.1
1419
+ h-1.6H-45h-1.6h-1.5h-2.7h-0.3l-1.1,0.2l-1.4,0.3l-1.4,0.2l-1.4,0.2l-1.4,0.2l-0.9,0.1l-0.1,0.1h-0.1l-0.7,0.3l-0.7,0.3l-0.4,0.2
1420
+ l-0.8,0.3l-0.7,0.2l-0.6,0.1l-0.5,0.1l-0.5,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1h-0.9h-0.6h-0.6h-0.6h-0.6h-1h-1h-0.9h-0.8h-0.7h-0.3
1421
+ h-0.3h-1l-1,0.1l-1,0.1l-1,0.1l-2.2,0.2l-2.2,0.2l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.9,0.1l-1.9,0.2l-1.9,0.2l-1,0.1l-1,0.1l-1,0.1
1422
+ l-1.1,0.1l-1.1,0.1h-1.1h-1.1h-1.2h-0.8h-0.5l-0.8-0.1l-0.8-0.2l-0.8-0.2l0,0l-0.6-0.2h-1.1h-1.4l-1.4-0.1l-1.4-0.1l-1.4-0.1
1423
+ l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.2l-0.7-0.1l-0.8-0.1l-0.9-0.1l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2
1424
+ l-0.9-0.2l-0.9-0.2l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.7-0.3l-0.7-0.3
1425
+ l-0.7-0.3l-0.7-0.3l-0.6-0.3l-0.9,0.1l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.1l-1.4,0.1l-1.4,0.1
1426
+ l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.3
1427
+ l-1.5-0.1l-0.7-0.1l-0.8-0.1l-0.7-0.1l-0.7-0.1l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
1428
+ l-0.4-0.2l-0.5-0.2l-0.2-0.1h-0.7l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.2l-1.3-0.2l-1.4-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2
1429
+ l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.3-0.4l-1.2-0.4l-1.2-0.4l-1.2-0.4l-0.4-0.1h-0.1l-1.3,0.1
1430
+ l-1.3,0.1h-1.3h-1.3h-1.3h-1.3h-1.3h-1.3h-0.4h-1l-1-0.1l-1-0.2l-0.9-0.3l-0.9-0.4l-0.9-0.4l-0.9-0.5l-0.8-0.6l-0.8-0.7l-0.7-0.7
1431
+ l-0.6-0.8l-0.6-0.8l-0.5-0.9l-0.4-0.9l-0.3-0.9l-0.3-1l-0.2-1l-0.1-1v-1l0.1-1l0.1-1l0.2-1l0.3-0.9L-235.9,1180.2z"
1432
+ />
1433
+ </g>
1434
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1435
+ <path
1436
+ d="M-214.1,1345.5L-214.1,1345.5l0.2-0.3l0.1-0.1l0.2-0.3l0.3-0.4l0.2-0.2l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3
1437
+ l0.3-0.3l0.3-0.3l0.3-0.3l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3
1438
+ l0.5-0.3l0.5-0.3l0.5-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l1.3-1.1l1.4-1.1l2.8-2.3l1.4-1.2l1.4-1.2l1.4-1.2l0.7-0.6
1439
+ l0.7-0.6l0.7-0.6l0.7-0.6l0.8-0.6l0.7-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5
1440
+ l0.8-0.5l0.8-0.4l0.9-0.5l0.9-0.5l0.9-0.5l0.9-0.5l0.9-0.6l0.9-0.6l0.9-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6
1441
+ l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l1.5-1.4l1.5-1.4
1442
+ l1.5-1.4l1.5-1.4l1.5-1.4l3-2.9l3-2.9l1.5-1.5l1.5-1.5l1.5-1.4l1.6-1.4l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7
1443
+ l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.3-0.2l0.4-0.3l0.9-0.7l2.4-1.8l1.4-1.1l1.5-1.1l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6
1444
+ l0.8-0.6l0.8-0.6l0.7-0.6l0.7-0.6l0.7-0.6l0.6-0.6l0.6-0.5l0.5-0.5l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.1-0.2
1445
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.3l0.1-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.4-0.1l0.4-0.1h0.4h0.4l0.4,0.1
1446
+ l0.4,0.1l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.4l0.1,0.4v0.4v0.2v0.3v0.3l-0.1,0.3l-0.1,0.4l-0.2,0.4
1447
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.6,0.6
1448
+ l-0.7,0.6l-0.7,0.6l-0.7,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-1.5,1.2l-1.4,1.1
1449
+ l-2.4,1.8l-0.9,0.7l-0.3,0.3l-0.3,0.2l-0.8,0.6l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7
1450
+ l-0.8,0.7l-0.8,0.7l-0.8,0.7l-1.5,1.4l-1.5,1.4l-1.5,1.4l-1.5,1.4l-3,2.9l-3,2.9l-1.5,1.5l-1.5,1.5l-1.5,1.4l-1.5,1.4l-1.6,1.4
1451
+ l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7
1452
+ l-0.9,0.7l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.5
1453
+ l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5
1454
+ l-0.7,0.6l-0.7,0.6l-0.7,0.6l-0.7,0.6l-0.7,0.6l-1.4,1.2l-1.4,1.2l-1.4,1.2l-2.8,2.3l-1.4,1.1l-1.4,1.1l-0.4,0.4l-0.5,0.4
1455
+ l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3
1456
+ l-0.4,0.2l0,0l0,0l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.2l-0.2,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.2,0.3l-0.1,0.1l0,0l-0.2,0.3
1457
+ l-0.3,0.3l0,0l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.4h-0.4l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.3
1458
+ l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.4v-0.4v-0.4l0.1-0.3l0.1-0.3L-214.1,1345.5z M-112,1262.3L-112,1262.3L-112,1262.3
1459
+ L-112,1262.3L-112,1262.3z M-209,1348.5L-209,1348.5L-209,1348.5L-209,1348.5L-209,1348.5z"
1460
+ />
1461
+ </g>
1462
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1463
+ <path
1464
+ d="M-199.4,1433l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.4l0.3-0.4l0.7-0.8l0.7-0.8l0.8-0.8
1465
+ l0.8-0.8l0.8-0.8l1.5-1.5l2.3-2.3l1-1l1-1l1-1l1-1l1-1l1-1l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l1-1l1-1
1466
+ l1-1l1-1l1-1l1-1l1.7-1.7l1.7-1.7l1.7-1.7l1.7-1.7l1.7-1.7l1.7-1.7l1.7-1.6l1.7-1.6l1.7-1.6l1.7-1.6l1.8-1.6l1.8-1.6l1.8-1.6
1467
+ l1.8-1.6l1.8-1.6l1.8-1.6l1.8-1.6l1.8-1.6l3.6-3.2l3.6-3.2l3.6-3.2l3.6-3.2l3.6-3.2l7.2-6.3l7.2-6.3l3.6-3.2l3.6-3.2l3.6-3.2
1468
+ l3.6-3.2l3.5-3.2l1.8-1.6l1.8-1.6l1.8-1.6l1.8-1.6l1.7-1.6l1.8-1.6l1.7-1.6l1.7-1.6l1.7-1.6l1.7-1.6l1.7-1.6l1.7-1.6l1.7-1.6
1469
+ l1.7-1.6l1.7-1.7l1.7-1.7l1.7-1.7l1.7-1.7l0.9-0.9l0.9-0.9l0.9-0.9l0.9-0.9l1-0.9l1-0.9l1-0.8l1-0.8l1-0.8l1-0.8l1-0.8l1-0.8
1470
+ l2-1.6l2-1.6l1.9-1.6l1.9-1.6l1-0.8l1-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.8-0.8
1471
+ l0.4-0.4l0.5-0.5l1.3-1.4l0.7-0.8l0.8-0.8l0.8-0.9l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4
1472
+ l0.4-0.3l0.4-0.3l0.4-0.3l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.2h0.3h0.1h0.5
1473
+ l0.5,0.1l0.5,0.2l0.4,0.3l0.4,0.3l0.3,0.4l0.2,0.5l0.2,0.5l0.1,0.5v0.5l-0.1,0.5l-0.2,0.5l-0.3,0.4l-0.3,0.4l-0.4,0.3l-0.5,0.2
1474
+ l-0.5,0.2h-0.3l0,0h-0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.3,0.2l-0.3,0.2l-0.3,0.3l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.4
1475
+ l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.8,0.8l-0.8,0.8l-0.7,0.8l-1.3,1.4l-0.5,0.6l-0.5,0.5l-0.9,0.9l-0.9,0.9
1476
+ l-0.9,0.9l-0.9,0.9l-0.9,0.9l-0.9,0.8l-1,0.8l-1,0.8l-1,0.8l-1,0.8l-1,0.8l-1,0.8l-1.9,1.6l-2,1.6l-1.9,1.6l-1.9,1.6l-1,0.8
1477
+ l-1,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.9l-0.9,0.9l-1.7,1.7l-1.7,1.7l-1.7,1.7
1478
+ l-1.7,1.7l-1.7,1.7l-1.7,1.7l-1.7,1.7l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.8,1.6l-1.8,1.6l-1.8,1.6l-1.8,1.6l-1.8,1.6
1479
+ l-1.8,1.6l-1.8,1.6l-3.6,3.2l-3.6,3.2l-3.6,3.2l-3.6,3.2l-3.6,3.2l-7.2,6.3l-7.2,6.3l-3.6,3.2l-3.6,3.2l-3.6,3.2l-3.6,3.2
1480
+ l-3.5,3.2l-1.8,1.6l-1.8,1.6l-1.8,1.6l-1.8,1.6l-1.8,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6
1481
+ l-1.7,1.6l-1.7,1.6l-1.7,1.7l-1.7,1.7l-1.7,1.7l-1.7,1.7l-1,1l-1,1l-1,1l-1,1l-1,1l-1,1l-2,1.9l-2,1.9l-2,1.9l-2,1.9l-2,1.9
1482
+ l-2,1.9l-2,1.9l-2,1.9l-2,1.9l-2,1.9l-1,1l-1,1l-1,1l-1,1l-1,1l-1,1l-2.3,2.3l-1.5,1.5l-0.8,0.8l-0.8,0.8l-0.7,0.8l-0.7,0.7
1483
+ l-0.6,0.7l-0.3,0.3l-0.3,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.1,0.1l0,0l-0.2,0.4l-0.3,0.4l-0.4,0.4l-0.4,0.3l-0.5,0.2l-0.5,0.1
1484
+ l-0.5,0.1h-0.5l-0.5-0.1l-0.5-0.2l-0.4-0.3l-0.4-0.4l-0.3-0.4l-0.2-0.5l-0.1-0.5v-0.5v-0.5v-0.1l0.1-0.4v-0.1l0.1-0.3l0.1-0.2
1485
+ L-199.4,1433z M-1.4,1257.3L-1.4,1257.3L-1.4,1257.3L-1.4,1257.3L-1.4,1257.3z M-194.1,1435.5L-194.1,1435.5l0.1-0.3v-0.1
1486
+ L-194.1,1435.5z"
1487
+ />
1488
+ </g>
1489
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1490
+ <path
1491
+ d="M-186.5,1518.6l0.2-0.4l0.2-0.5l0.3-0.5l0.3-0.6l0.4-0.6l0.4-0.6l0.4-0.7l0.4-0.6l0.4-0.6l0.2-0.3l0.2-0.3
1492
+ l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.2l0.3-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.4
1493
+ l0.2-0.4l0.4-0.8l0.4-0.8l0.4-0.8l0.4-0.8l0.4-0.8l0.2-0.4l0.2-0.4l0.2-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4
1494
+ l0.3-0.4l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l1.7-2.2l1.7-2.3l1.7-2.3l1.7-2.3
1495
+ l1.7-2.3l1.7-2.3l1.7-2.3l3.3-4.6l3.3-4.6l0.9-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3
1496
+ l1-1.3l2-2.5l2-2.5l2-2.5l2.1-2.5l2.1-2.5l2.1-2.5l2.1-2.5l2.1-2.4l2.1-2.4l2.1-2.4l2.1-2.4l2.1-2.4l2.2-2.4l2.2-2.4l2.2-2.4
1497
+ l2.2-2.4l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l0.3-0.3l0.3-0.3l0.6-0.7l0.7-0.7l0.7-0.8
1498
+ l0.7-0.8l0.7-0.8l0.7-0.9l0.7-0.9l1.5-1.8l1.6-1.9l1.6-1.9l0.8-1l0.8-1l0.8-1l0.8-1l0.8-0.9l0.8-0.9l0.8-0.9l0.4-0.4l0.4-0.4
1499
+ l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3
1500
+ l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.1h0.5h0.5l0.4,0.1l0.4,0.2l0.4,0.2l0.4,0.3l0.3,0.3l0.2,0.4l0.2,0.4
1501
+ l0.1,0.4v0.5v0.5l-0.1,0.4l-0.2,0.4l-0.2,0.4l-0.3,0.4l-0.4,0.3l-0.4,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2
1502
+ l-0.3,0.2l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4
1503
+ l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.8,0.9l-0.8,0.9l-0.8,0.9l-0.8,0.9l-0.8,0.9l-0.8,0.9l-0.8,1l-1.6,1.9l-1.6,1.9l-1.5,1.9l-0.8,0.9
1504
+ l-0.7,0.9l-0.7,0.9l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.7l-0.3,0.4l-0.3,0.3l-2.2,2.2l-2.2,2.3l-2.2,2.3l-2.2,2.3l-2.2,2.3
1505
+ l-2.2,2.3l-2.2,2.3l-2.2,2.3l-2.2,2.3l-2.2,2.3l-2.2,2.4l-2.2,2.4l-2.1,2.4l-2.1,2.4l-2.1,2.4l-2.1,2.4l-2.1,2.4l-2.1,2.4
1506
+ l-2.1,2.4l-2.1,2.4l-2,2.5l-2,2.5l-2,2.5l-2,2.5l-2,2.5l-1,1.2l-1,1.3l-1,1.3l-1,1.3l-1,1.3l-1,1.3l-1,1.3l-1,1.3l-1,1.3l-1,1.3
1507
+ l-0.9,1.3l-0.9,1.3l-0.9,1.3l-0.9,1.3l-3.3,4.6l-3.3,4.6l-1.7,2.3l-1.7,2.3l-1.7,2.3l-1.7,2.3l-1.7,2.3l-1.7,2.3l-1.7,2.3
1508
+ l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.2,0.3l-0.2,0.3l-0.2,0.3
1509
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.2,0.4
1510
+ l-0.2,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.4,0.4l-0.3,0.4l-0.1,0.1l-0.1,0.1
1511
+ l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.4,0.5l-0.4,0.5l-0.4,0.6l-0.3,0.6l-0.3,0.5l-0.3,0.5l-0.1,0.2l-0.1,0.2l-0.2,0.4
1512
+ l-0.2,0.4l-0.1,0.2l-0.2,0.2l-0.1,0.1l-0.2,0.2l-0.2,0.2l0,0l-0.3,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1h-0.4l0,0h-0.5l-0.5-0.1
1513
+ l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.3-0.4l-0.2-0.4l-0.2-0.4l0,0l-0.1-0.4v-0.4v-0.4l0.1-0.4l0,0l0.1-0.4l0.1-0.1L-186.5,1518.6z"
1514
+ />
1515
+ </g>
1516
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1517
+ <path
1518
+ d="M-226.1,1292.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.9-0.6l0.9-0.6l1-0.7l1.1-0.7
1519
+ l1.1-0.8l1.2-0.8l1.2-0.9l1.3-0.9l2.7-1.9l2.8-2l2.9-2.1l1.5-1.1l1.5-1.1l1.5-1.1l1.5-1.1l1.6-1.1l1.6-1.1l1.6-1.1l1.6-1l1.6-1
1520
+ l1.6-1l1.5-1l1.5-1l0.8-0.5l0.8-0.5l0.8-0.4l0.8-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.3l0.2-0.1
1521
+ l0.2-0.1l0.2-0.1h0.2h0.2h0.2h0.2h0.2h0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.1,0.2l0.1,0.2
1522
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2v0.2v0.2v0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
1523
+ l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.7,0.3l-0.7,0.3l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4
1524
+ l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-1.5,0.9l-1.5,1l-1.5,1l-1.5,1l-1.5,1l-1.5,1l-1.5,1.1l-1.5,1.1l-1.5,1.1l-1.5,1.1
1525
+ l-1.5,1.1l-1.5,1.1l-2.9,2.1l-2.8,2l-2.7,1.9l-1.3,0.9l-1.2,0.9l-1.2,0.8l-1.1,0.8l-1.1,0.7l-1,0.7l-1,0.6l-0.9,0.6l-0.2,0.1
1526
+ l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1
1527
+ l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2l0.1-0.2l0.1-0.2
1528
+ L-226.1,1292.2z"
1529
+ />
1530
+ </g>
1531
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1532
+ <path
1533
+ d="M-223.1,1301.8l0.2-0.4l0.3-0.3l0.3-0.3l0.4-0.2l0.4-0.2l0.4-0.1h0.4h0.4l0.4,0.1l0.4,0.1l0.5,0.1l0.5,0.1
1534
+ l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.3l1,0.5l1,0.6l1,0.6
1535
+ l1,0.6l1,0.6l1,0.6l1,0.6l1,0.6l1,0.7l1,0.7l1,0.7l1,0.7l2,1.3l1.9,1.3l1.8,1.2l1.7,1.1l0.8,0.5l0.8,0.5l0.8,0.5l0.7,0.4l1.9,1.1
1536
+ l1.9,1.1l1.8,1.1l1.8,1.1l1.8,1.1l1.8,1.1l1.8,1.1l1.8,1.1l1.7,1.1l1.7,1.1l1.7,1.1l1.7,1.1l1.7,1.1l1.7,1.1l1.7,1.1l1.7,1.1
1537
+ l1.7,1.2l1.7,1.2l1.7,1.2l1.7,1.2l1.7,1.2l1.6,1.2l1.7,1.2l1.6,1.2l1.7,1.3l1.7,1.3l1.7,1.3l1.7,1.3l1.7,1.3l1.7,1.4l1.7,1.4
1538
+ l1.7,1.4l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.7,0.5l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4
1539
+ l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l2.8,1.6l2.8,1.5l2.8,1.6l1.4,0.8
1540
+ l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.8,0.5l0.7,0.5l0.7,0.5
1541
+ l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l1.3,1l1.2,1l1.2,1l1.2,1l1.2,0.9l0.6,0.5l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4
1542
+ l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.4,0.2l0.3,0.3l0.3,0.3l0.2,0.4l0.2,0.4l0.1,0.4l0.1,0.4v0.4
1543
+ l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.3,0.4l-0.3,0.3l-0.4,0.3l-0.4,0.2l-0.4,0.1l-0.4,0.1h-0.4h-0.4l-0.4-0.1l-0.4-0.2l-0.8-0.4
1544
+ l-0.8-0.4l-0.8-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-1.2-1
1545
+ l-1.2-1l-1.2-1l-1.2-1l-1.2-1l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.6-0.4l-0.6-0.4
1546
+ l-0.6-0.4l-0.6-0.4l-0.6-0.4l-0.7-0.4l-1.3-0.8l-1.3-0.8l-1.3-0.8l-1.4-0.8l-1.4-0.8l-1.4-0.8l-1.4-0.8l-2.8-1.5l-2.8-1.6
1547
+ l-2.9-1.6l-1.4-0.8l-1.4-0.8l-1.4-0.8l-1.4-0.8l-1.4-0.8l-1.4-0.9l-1.4-0.9l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.5
1548
+ l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.6-0.5
1549
+ l-1.7-1.4l-1.7-1.4l-1.6-1.3l-1.6-1.3l-1.6-1.3l-1.6-1.3l-1.6-1.3l-1.6-1.2l-1.6-1.2l-1.6-1.2l-1.6-1.2l-1.6-1.2l-1.6-1.2
1550
+ l-1.6-1.2l-1.6-1.1l-1.6-1.1l-1.6-1.1l-1.6-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1
1551
+ l-1.8-1.1l-1.8-1.1l-1.8-1.1l-1.8-1.1l-1.8-1.1l-1.9-1.1l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.9-0.6l-1.8-1.2l-1.8-1.2l-1.9-1.3l-2-1.3
1552
+ l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.5l-0.9-0.5l-0.9-0.5l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
1553
+ l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.4-0.1l-0.4-0.1
1554
+ l-0.4-0.2l-0.4-0.3l-0.3-0.3l-0.3-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4v-0.4v-0.4l0.1-0.4L-223.1,1301.8z"
1555
+ />
1556
+ </g>
1557
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1558
+ <path
1559
+ d="M-183.5,1261.5l0.2-0.3l0.3-0.3l0.3-0.3l0.4-0.2l0.4-0.2l0.4-0.1h0.1l0.2-0.1l0.3-0.1l0.4-0.1l0.3-0.1h0.2
1560
+ h0.3h0.1h0.3h0.1l0.4,0.1h0.1l0.2,0.1l0.2,0.1h0.1l0.3,0.1l0.5,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.4l0.6,0.4l0.6,0.4
1561
+ l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.5,0.4l0.5,0.4l1.3,1.1l1.3,1.1l1.3,1.1l1.3,1.1l2.6,2.3l2.6,2.2l1.3,1.1
1562
+ l1.3,1.1l1.3,1.1l1.3,1.1l1.3,1.1l0.6,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.7
1563
+ l2.2,1.7l4.3,3.3l4.3,3.3l4.3,3.3l4.3,3.4l4.3,3.3l4.3,3.3l4.3,3.3l2.2,1.7l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6
1564
+ l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6l0.3,0.2l0.4,0.3l0.7,0.6l0.8,0.6l0.8,0.6l0.8,0.7l0.8,0.7l1.7,1.5l1.8,1.5l0.9,0.8
1565
+ l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3
1566
+ l0.5,0.3l0.5,0.3l0.5,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1h0.2
1567
+ h0.2h0.2h0.2h0.1h0.1h0.1h0.2h0.4l0.4,0.1l0.4,0.2l0.4,0.2l0.3,0.3l0.3,0.3l0.2,0.3l0.2,0.4l0.1,0.4l0.1,0.4v0.4v0.4l-0.1,0.4
1568
+ l-0.2,0.4l-0.2,0.4l-0.3,0.3l-0.3,0.3l-0.3,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1H-50h-0.2h-0.3h-0.3h-0.3h-0.3h-0.3H-52h-0.3l-0.5-0.1
1569
+ l-0.6-0.1l-0.6-0.1l-0.5-0.2l-0.6-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3
1570
+ l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-1.1-0.8l-1-0.8
1571
+ l-1-0.8l-1-0.8l-1-0.8l-1-0.8l-1-0.8l-1.8-1.6l-1.7-1.5l-0.8-0.7l-0.8-0.6l-0.7-0.6l-0.7-0.6l-0.7-0.5l-0.3-0.2l-0.3-0.2
1572
+ l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.7l-2.2-1.7l-4.3-3.3
1573
+ l-4.3-3.3l-4.3-3.3l-4.3-3.4l-4.3-3.3l-4.3-3.3l-4.3-3.3l-2.1-1.6l-2.2-1.6l-2.1-1.6l-2.1-1.6l-2.2-1.6l-2.2-1.6l-0.7-0.5
1574
+ l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-1.3-1.1l-1.3-1.1l-1.3-1.1l-1.3-1.1l-1.3-1.1l-2.6-2.2l-2.6-2.2l-1.3-1.1
1575
+ l-1.3-1.1l-1.3-1.1l-1.3-1.1l-0.4-0.3l-0.4-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.4l-0.6-0.4l-0.6-0.3l-0.6-0.3l-0.6-0.3
1576
+ l-0.6-0.3l-0.6-0.3l-0.5-0.3l-0.4-0.2l-0.2,0.1l-0.3,0.1l0,0h-0.2h-0.2l0,0h-0.3h-0.3l0,0l-0.4-0.1l-0.4-0.1l-0.3-0.2l0,0
1577
+ l-0.3-0.2l-0.3-0.2l-0.2-0.3l-0.2-0.3l0,0l-0.2-0.4l-0.1-0.4l-0.1-0.4l0,0v-0.4v-0.4l0,0v-0.2v-0.2l0,0l0.1-0.4L-183.5,1261.5z
1578
+ M-178.1,1263.7v-0.2v-0.2V1263.7z M-178,1263.2v-0.2v-0.1V1263.2z"
1579
+ />
1580
+ </g>
1581
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1582
+ <path
1583
+ d="M-82.3,1264.1l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1
1584
+ l0.3-0.1h0.3h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.3,0.3l0.3,0.3l0.3,0.3
1585
+ l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.3,0.5l0.3,0.5l0.3,0.5l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.1l0.1,0.1l0.1,0.1
1586
+ l0.1,0.1l0,0l0,0l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.6l0.7,0.6l0.7,0.6l0.6,0.6l0.6,0.6l0.6,0.6l0.6,0.6
1587
+ l0.6,0.6l1.2,1.2l1.2,1.2l1.2,1.2l1.2,1.2l1.2,1.2l1.2,1.2l1.2,1.2l2.4,2.4l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.4l0.5,0.4
1588
+ l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l1.2,0.8l1.2,0.8l1.2,0.8l1.2,0.8l1.2,0.8
1589
+ l1.2,0.8l2.3,1.5l0.3,0.2l0.4,0.2l0.9,0.6l0.5,0.3l0.6,0.3l0.6,0.4l0.6,0.4l0.6,0.4l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2
1590
+ l0.3,0.2l0.3,0.2l0.3,0.3l0.3,0.3l0.3,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.2l0.1,0.3v0.1v0.1v0.1v0.1v0.2v0.2v0.1v0.3v0.3v0.3
1591
+ l-0.1,0.3l-0.1,0.3l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1h-0.3
1592
+ h-0.3H-30h-0.3l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.1
1593
+ l0,0l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-1-0.6l-0.4-0.3
1594
+ l-0.4-0.2l-2.3-1.5l-1.2-0.8l-1.2-0.8l-1.2-0.8l-1.2-0.8l-1.2-0.8l-1.2-0.9l-0.6-0.4l-0.6-0.4l-0.6-0.4l-0.6-0.5l-0.6-0.5
1595
+ l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.5-0.5l-2.4-2.4l-1.2-1.2
1596
+ l-1.2-1.2l-1.2-1.2l-1.2-1.2l-1.2-1.1l-1.2-1.1l-1.2-1.1l-0.6-0.5l-0.6-0.6l-0.6-0.6l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5
1597
+ l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.7-0.5l-0.2-0.1l-0.2-0.2l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.2-0.3
1598
+ l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.3-0.5l-0.3-0.5l-0.3-0.4l-0.1-0.2l-0.1-0.2l0,0h-0.1H-80h-0.3l-0.3-0.1
1599
+ l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.3l-0.1-0.3v-0.3v-0.3v-0.3
1600
+ v-0.3l0.1-0.3l0.1-0.2L-82.3,1264.1z M-33,1307.9L-33,1307.9L-33,1307.9L-33,1307.9z"
1601
+ />
1602
+ </g>
1603
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1604
+ <path
1605
+ d="M-214.8,1340L-214.8,1340l0.2-0.3l0.1-0.2l0,0l0.2-0.2l0,0l0.3-0.3l0,0l0.3-0.2l0,0l0.3-0.2l0,0l0.3-0.1l0,0
1606
+ l0.2-0.1h0.2h0.1h0.3h0.3h0.1h0.2h0.2h0.1l0.3,0.1h0.1l0.2,0.1l0.2,0.1l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2
1607
+ l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.5l0.9,0.9l0.9,1l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.4l0.4,0.4l0.4,0.4l0.4,0.4
1608
+ l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l1.1,0.6
1609
+ l1.1,0.6l1.1,0.6l1,0.6l1,0.6l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1.9,1.5l1.9,1.5
1610
+ l1.9,1.5l1.9,1.5l1.9,1.5l1.8,1.4l3.7,2.9l3.7,2.9l3.7,2.9l3.7,2.9l3.7,3l3.7,3l3.7,3l3.7,3l3.7,3l3.7,3l3.7,3l3.6,3l3.6,3l3.6,3
1611
+ l3.6,3.1l3.6,3.1l0.2,0.2l0.2,0.2l0.2,0.2l0.3,0.2l0.6,0.4l0.6,0.4l0.6,0.4l0.7,0.4l0.7,0.5l0.7,0.5l1.5,1l1.5,1l1.6,1l0.8,0.5
1612
+ l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.6l0.8,0.6l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3
1613
+ l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.4l0.3,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.3l0.2,0.4l0.1,0.4
1614
+ l0.1,0.4v0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1h-0.4H-91l-0.4-0.1
1615
+ l-0.4-0.1l-0.4-0.2l-0.3-0.2l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2
1616
+ l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.3l-0.3-0.2l-0.3-0.3l-0.3-0.2
1617
+ l-0.3-0.3l-0.3-0.2l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-1.5-1l-1.5-1l-1.5-1l-0.7-0.5l-0.7-0.5
1618
+ l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.6-0.5l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-3.6-3.1l-3.6-3l-3.6-3l-3.6-3l-3.6-3l-3.6-3l-3.6-3
1619
+ l-3.7-3l-3.7-3l-3.7-3l-3.7-3l-3.7-2.9l-3.7-2.9l-3.7-2.9l-3.7-2.9l-3.7-2.9l-1.8-1.4l-1.9-1.5l-1.9-1.5l-1.9-1.5l-1.9-1.5
1620
+ l-1.9-1.5l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6
1621
+ l-1-0.6l-1-0.5l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.3-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
1622
+ l-0.3-0.2l-0.3-0.2l-0.5-0.4l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.9-1l-0.9-0.9l-0.4-0.4l-0.4-0.4l-0.4-0.4
1623
+ l-0.3-0.3h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.3-0.2l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.4l-0.1-0.4l-0.1-0.4v-0.4v-0.3v-0.3
1624
+ l0.1-0.3v-0.1l0.1-0.4v-0.1l0.1-0.2L-214.8,1340z"
1625
+ />
1626
+ </g>
1627
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1628
+ <path
1629
+ d="M-204.5,1408.5l0.2-0.3l0.2-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1h0.4h0.4h0.4l0.3,0.1l0.3,0.1
1630
+ l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3
1631
+ l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.8,0.8l0.9,0.8l0.9,0.8l0.9,0.8
1632
+ l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1.1,0.8l2.1,1.6l2.1,1.6l2.1,1.6l1,0.8l1,0.8l1,0.8l0.9,0.8l0.9,0.8l0.9,0.7l3.8,3.3l3.9,3.3
1633
+ l1.9,1.7l2,1.7l2,1.7l2,1.7l2,1.7l2,1.7l2,1.7l2,1.6l2,1.6l2,1.6l2,1.6l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8
1634
+ l1,0.8l1,0.8l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.6
1635
+ l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.3l0.2,0.3l0.1,0.3
1636
+ l0.1,0.3l0.1,0.4v0.4v0.4l-0.1,0.4l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.4,0.1
1637
+ h-0.4h-0.4l-0.4-0.1l-0.3-0.1l-0.3-0.1l-1.1-0.6l-1.1-0.6l-1.1-0.6l-1.1-0.6l-1.1-0.6l-1.1-0.6l-1.1-0.6l-1.1-0.7l-1.1-0.7
1638
+ l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.8
1639
+ l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1-0.8l-1-0.8l-1-0.8l-2.1-1.6l-2.1-1.6
1640
+ l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-3.9-3.3l-3.8-3.3l-0.8-0.7l-0.9-0.7l-0.9-0.7l-0.9-0.8l-1-0.8
1641
+ l-1-0.8l-2.1-1.6l-2.1-1.6l-2.1-1.6l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1-0.8l-1-0.8l-1-0.8l-1-0.8l-1-0.8l-0.9-0.8l-0.9-0.8l-0.4-0.4
1642
+ l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4
1643
+ l-0.3-0.4l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.1-0.3l-0.1-0.3v-0.4v-0.4v-0.4l0.1-0.3l0.1-0.3L-204.5,1408.5z"
1644
+ />
1645
+ </g>
1646
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1647
+ <path
1648
+ d="M-196.1,1467.1l0.1-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0,0l0.2-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3
1649
+ h0.3h0.3l0,0l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.1,0.1l0.2,0.2l0.3,0.4l0.4,0.4l0.4,0.5
1650
+ l0.5,0.5l1,1.1l0.9,1l0.7,0.7l0.2,0.2l0.1,0.1l0.4,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.9,0.7l0.9,0.7
1651
+ l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l2,1.4l2.1,1.4l0.9,0.6l0.9,0.6l0.9,0.6l0.9,0.6l0.9,0.5l0.9,0.5l0.9,0.5l0.9,0.5l0.9,0.5
1652
+ l0.9,0.5l0.9,0.5l0.9,0.5l1.8,1l1.8,1l1.9,1l1.9,1l1.9,1l1.9,1l1.9,1l1.9,1l0.9,0.5l0.9,0.5l0.9,0.5l1,0.5l0.5,0.3l0.6,0.3
1653
+ l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l1.2,0.8l1.2,0.9l1.2,0.9l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4
1654
+ l0.6,0.3l0.6,0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
1655
+ l0.2,0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.1,0.3l0.1,0.3
1656
+ l0.1,0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1
1657
+ l-0.3,0.1h-0.3h-0.3h-0.3h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1
1658
+ l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4
1659
+ l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.6-0.4l-1.3-0.9l-1.2-0.9l-1.2-0.8l-0.5-0.4l-0.5-0.4l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.4-0.3
1660
+ l-0.9-0.5l-0.9-0.5l-0.9-0.5l-0.9-0.5l-1.9-1l-1.9-1l-1.9-1l-1.9-1l-1.9-1l-1.9-1l-1.9-1l-1.9-1l-0.9-0.5l-0.9-0.5l-0.9-0.5
1661
+ l-0.9-0.5l-0.9-0.5l-0.9-0.5l-0.9-0.6l-0.9-0.6l-0.9-0.6l-0.9-0.6l-0.9-0.6l-0.9-0.6l-2.1-1.4l-2-1.4l-1-0.7l-1-0.7l-1-0.7
1662
+ l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.8l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.5l-0.2-0.2
1663
+ l-0.3-0.3l-0.8-0.8l-0.9-1l-1-1.1l-0.5-0.6l-0.5-0.5l-0.4-0.5l-0.4-0.5l-0.3-0.4l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.2-0.3v-0.1
1664
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.3v-0.3v-0.3v-0.3l0,0l0.1-0.3l0.1-0.3L-196.1,1467.1z"
1665
+ />
1666
+ </g>
1667
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1668
+ <path
1669
+ fill="#DACEB3"
1670
+ d="M-197.1,1289.5l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2
1671
+ l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.3-0.2l0.2-0.1l0.3-0.1h0.1l0.1-0.1h0.1h0.1h0.2h0.2h0.1h0.3h0.1h0.2h0.2h0.1h0.3h0.1h0.3h0.1
1672
+ l0.3,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0,0l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.2-0.2l0.2-0.1l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1
1673
+ l0.2-0.1l0,0l0.2-0.1l0.2-0.1l0,0h0.2h0.2l0,0h0.2h0.2l0,0h0.2h0.2l0,0h0.2h0.2l0,0l0.2,0.1l0.2,0.1h0.1l0.2,0.1l0.2,0.1l0.1,0.1
1674
+ l0.2,0.2l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.3,0.5l0.3,0.6l0.3,0.6l0.4,0.6l0.4,0.7
1675
+ l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.3,0.7l0.2,0.3l0.2,0.1l0.3,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3
1676
+ l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.2l0.2,0.4l0.2,0.5l0.2,0.5l0.1,0.5l0.1,0.4l0.1,0.3v0.2l0.1,0.8
1677
+ l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,1.5l0.1,1.5l0.1,1.5l0.1,1.5l0.1,1.6v1.6v1.6v1.6v1.6v1.6v1.6v0.7l0,0l0.2,0.2
1678
+ l0.2,0.2l0,0l0.2,0.2l0.2,0.2l0,0l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2v0.1v0.2v0.2v0.2l0.1,0.6v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0.5
1679
+ v0.5v0.5v0.1v0.2v0.5v0.5v0.5v0.5v0.5v0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.8
1680
+ l-0.2,0.8l-0.2,0.8l-0.2,0.8l-0.1,0.3l-0.2,0.7l-0.1,2l-0.1,3l-0.1,3v0.4v0.5v1.1v1.3v1.5v0.8v0.8v0.8v0.9v0.9v0.9l-0.1,0.9
1681
+ l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.1,0.5l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4
1682
+ l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.3,0.3l-0.3,0.3
1683
+ l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1h-0.3
1684
+ h-0.3h-0.3h-0.3h-0.3h-0.3l-0.3-0.1l-0.3-0.1h-0.1l-0.2,0.1l0,0l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.3h-0.3l-0.3-0.1l0,0
1685
+ l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l0,0l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2v-0.2
1686
+ v-0.3v-0.2l-0.1-0.4v-0.5v-0.6v-0.7v-0.8l-0.1-1.7l0,0v-0.1l-0.3-0.6l-0.3-0.7l-0.3-0.7l-0.3-0.8l-0.3-0.8l-0.3-0.9l-0.3-0.9
1687
+ l-0.3-0.9l-0.3-0.9l-0.6-1.8l-0.6-1.8l-0.5-1.7l-0.5-1.6l-0.8-2.5v-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
1688
+ v-0.2l-0.1-0.3l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.1-0.8l-0.1-0.8
1689
+ l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.6l-0.1-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.3
1690
+ l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.2-0.5l-0.2-0.5l-0.2-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6
1691
+ l-0.1-0.6l-0.1-0.6l-0.1-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.5v-0.1v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6
1692
+ v-0.6v-0.6v-0.6l0.1-1.2l0.1-1.2l0.1-1.2l0.1-1.2l0.1-1.2l0.1-1.2l0.2-1.2l0.2-1.2l0.2-1.2l0.2-1.2l0.2-1.2l0.4-2.3l0.4-2.3
1693
+ l0.1-0.5l0.1-0.5l0.2-1.3l0.1-0.7l0.1-0.7l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4L-197.1,1289.5l0-0.4l0.2-0.4
1694
+ L-197.1,1289.5z M-184.6,1294.6L-184.6,1294.6v-0.2l-0.1-0.3L-184.6,1294.6z"
1695
+ />
1696
+ </g>
1697
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1698
+ <path
1699
+ fill="#DACEB3"
1700
+ d="M-182,1397.3L-182,1397.3L-182,1397.3l0.2-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0,0v-0.3
1701
+ v-0.1v-0.1v-0.1l0,0v-0.2v-0.2v-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
1702
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1h0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.1h0.2h0.1l0.1,0.1l0.1,0.1
1703
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1
1704
+ v0.1v0.1v0.2v0.4v0.4v0.5l0.1,1.3v0.7h0.1h0.1h0.1h0.1l0,0h0.1h0.1h0.1h0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1
1705
+ l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1v0.1v0.1v0.1v0.1
1706
+ v0.1v0.1v0.1v0.1v0.2v0.2v0.1v0.1v0.3v0.4l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.6l-0.2,0.6l-0.1,0.3v0.1v0.5v0.5v0.6v0.6
1707
+ v0.6v0.6v0.6v0.6v0.6v0.6v0.6v0.6v0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.3l-0.1,0.3l-0.1,0.3
1708
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.1,0.1
1709
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0h-0.1h-0.1h-0.1l0,0h-0.1h-0.1
1710
+ h-0.1h-0.1l0,0h-0.1h-0.1h-0.1h-0.1l0,0h-0.2h-0.2h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l0,0h-0.1h-0.1h-0.1h-0.1l-0.1-0.1
1711
+ l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0
1712
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.3l-0.1-0.3l-0.1-0.4l-0.1-0.4v-0.2l0,0l-0.2-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4
1713
+ l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4l0.1-0.8l0.1-0.8l0.1-0.9l0.1-0.6
1714
+ v-0.1v-0.5v-0.6v-0.6v-0.4v-0.6v-0.8v-0.8v-0.8v-0.8v-0.4v-0.4v-0.4v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.3v-0.1
1715
+ v-0.1v-0.1l0.1-0.1L-182,1397.3z"
1716
+ />
1717
+ </g>
1718
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1719
+ <path
1720
+ fill="#DACEB3"
1721
+ d="M-240.6,1222l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
1722
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.4-0.2l0.4-0.2l0.3-0.1l0.5-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.2-0.1l0,0l0.1-0.1l0.1-0.1
1723
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.2l0.1-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.4-0.1l0.4-0.1
1724
+ h0.4h0.3h0.3h0.3h0.3h0.3h0.3l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.5,0.1l0.5,0.1l0.8,0.2h0.2h0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1
1725
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.5,0.2h0.1l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3
1726
+ l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l1.5,0.7l1.5,0.7l1.5,0.7l1.5,0.7l1.4,0.7l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3
1727
+ l0.7,0.3l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.3,0.1l0.4,0.1l0.3,0.1h0.2h0.2h0.4h0.5h0.5h0.5h0.5l0.5,0.1l1,0.1
1728
+ l0.5,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.2,0.1h0.1l0.2,0.1l0.2,0.1l0,0l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0,0
1729
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2v0.2v0.2v0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2l-0.2,0.2
1730
+ l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l0,0l-0.2,0.1h-0.2h-0.2h-0.1h-0.1h-0.1h-0.2l0,0l0.1,0.2l0.1,0.2v0.2
1731
+ l0,0v0.2v0.2l0,0v0.2v0.2l0,0v0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l0,0
1732
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1l-0.2,0.1l-0.2,0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3l-0.5,0.1h-0.5
1733
+ h-0.5h-0.5h-0.5h-0.5h-0.6h-0.6h-0.6h-0.6h-0.6l-1.1-0.1l-1.1-0.1l-1-0.1l-0.9-0.1l-0.8-0.1l-0.6-0.1l-0.3-0.1l-0.3-0.1l-0.7-0.2
1734
+ l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3
1735
+ l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.4l-0.6-0.3l-0.7-0.1l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-2.5-0.4l-2.5-0.4
1736
+ l-2.5-0.4l-2.5-0.5h-0.1h-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.3-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
1737
+ l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2
1738
+ l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.2v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.2v-0.2v-0.1v-0.2
1739
+ v-0.2v-0.1v-0.2l0.1-0.2v-0.1l0.1-0.2l0.1-0.2L-240.6,1222z"
1740
+ />
1741
+ </g>
1742
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1743
+ <path
1744
+ d="M-236.9,1244.6l0.5-0.8l0.6-0.7l0.7-0.6l0.8-0.4l0.9-0.3l0.9-0.2h0.9l0.9,0.1l0.9,0.3l0.8,0.4l0.8,0.5
1745
+ l0.7,0.6l0.1,0.1l0.5,0.6l0.1,0.1l0.4,0.6v0.1l0.3,0.7v0.1l0.2,0.8v0.1l0.1,0.6v0.1v0.7v0.1v0.5v0.3l-0.1,0.5l-0.1,0.5l-0.1,0.4
1746
+ l-0.1,0.4l-0.2,0.5l-0.2,0.5l-0.1,0.2v0.1v0.4v0.4v0.3l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.3,1.6l0.3,1.6
1747
+ l0.3,1.6l0.3,1.5l0.3,1.5l0.3,1.5l0.3,1.5l0.3,1.5l0.3,1.5l0.6,2.9l0.6,2.9l0.6,2.9l1.2,5.9l0.6,3l0.6,3l0.6,3l0.3,1.5l0.3,1.5
1748
+ l0.3,1.5l0.3,1.5l0.3,1.5l0.3,1.5l0.2,1.5l0.2,1.6l0.2,1.6l0.3,2.4l0.1,0.8l0.1,0.9l0.1,0.8l0.3,1.7l0.3,1.7l0.3,1.7l0.3,1.7
1749
+ l0.3,1.7l0.4,1.7l0.4,1.7l0.4,1.7l0.4,1.7l0.4,1.7l0.8,3.5l0.8,3.5l0.8,3.5l0.8,3.5l0.4,1.8l0.4,1.8l0.4,1.8l0.4,1.8l0.4,1.8
1750
+ l0.4,1.8l0.3,1.8l0.3,1.8l0.3,1.8l0.3,1.8l0.1,0.9l0.1,0.9l0.1,0.9l0.1,0.9l0.5,3.8l0.5,3.8l0.6,3.8l0.6,3.8l0.6,3.8l0.6,3.8
1751
+ l0.6,3.8l0.6,3.8l0.6,3.8l0.6,3.8l0.6,3.8l0.6,3.8l1.3,7.5l1.3,7.5l1.3,7.5l1.3,7.5l2.6,15l1.3,7.5l1.3,7.5l1.3,7.5l1.3,7.5
1752
+ l0.4,2.6l0.4,2.6l0.4,2.6l0.4,2.6l0.4,2.6l0.4,2.6l0.4,2.6l0.4,2.6l0.7,5.2l0.7,5.2l0.7,5.1l0.7,5.1l0.7,5.1l0.4,2.5l0.4,2.5
1753
+ l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.5,2.5l0.5,2.5l0.5,2.5v0.2v0.2l0.1,0.2v0.2l0.1,0.4
1754
+ l0.1,0.4l0.1,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.5l0.2,0.5l0.2,0.5l0.5,1l1.1,2.1l0.6,1.1l0.3,0.6
1755
+ l0.3,0.6l0.3,0.6l0,0l0.2-0.4l0.4-1l0.4-1.1l0.2-0.6l0.2-0.6l0.2-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.4-0.6
1756
+ l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7
1757
+ l0.5-0.7l0.5-0.7l0.5-0.8l0.5-0.8l0.5-0.8l0.9-1.5l0.9-1.5l0.9-1.6l0.9-1.6l0.9-1.6l0.9-1.6l0.9-1.6l0.9-1.6l1.7-3.3l1.7-3.3
1758
+ l1.8-3.3l0.9-1.7l0.9-1.7l0.9-1.7l0.9-1.7l0.9-1.7l0.9-1.6l1-1.6l1-1.6l0.5-0.8l0.5-0.8l0.5-0.8l0.5-0.8l0.9-1.4l0.9-1.4l0.9-1.4
1759
+ l0.8-1.4l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.6
1760
+ l1.5-3.1l3-6.3l1.5-3.2l1.5-3.1l0.8-1.6l0.8-1.6l0.8-1.6l0.8-1.6l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7
1761
+ l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7l1.2-2.7l1.2-2.7l1.2-2.7l1.2-2.7l2.5-5.5l2.4-5.5l2.4-5.5l2.4-5.5l4.9-11l2.4-5.5
1762
+ l2.4-5.5l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1
1763
+ l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3l1.4-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.1-2.1
1764
+ l1.1-2.1l1-2.1l1-2.1l1-2.2l1-2.2l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.4-1.1l0.4-1.1
1765
+ l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.1-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4
1766
+ l0.2-0.3l0.2-0.3l0.4-0.6l0.4-0.6l0.6-1l0.3-0.4l0.2-0.4l0.1-0.2l0.1-0.1l0.1-0.1v-0.1l0.1-0.4l0.3-0.9l0.4-0.8l0.5-0.8l0.6-0.7
1767
+ l0.7-0.6l0.8-0.4l0.9-0.3l0.9-0.2h0.9l0.9,0.1l0.9,0.3l0.8,0.4l0.8,0.5l0.7,0.6l0.6,0.7l0.4,0.8l0.3,0.9l0.2,0.9v0.9v0.4
1768
+ l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.2,0.5l-0.2,0.5l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.4,0.6l-0.4,0.6l-0.7,1
1769
+ l-0.3,0.4l-0.3,0.4l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1v0.1v0.1l0,0v0.1l-0.4,1.1l-0.4,1.1l-0.4,1.1l-0.4,1.1l-0.4,1.1l-0.4,1.1
1770
+ l-0.4,1.1l-0.4,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1
1771
+ l-0.5,1.1l-1,2.2l-1.1,2.2l-1.1,2.2l-1.1,2.2l-1.1,2.2l-1.1,2.1l-1.5,3l-1.5,3l-1.5,3l-1.5,3l-1.5,3l-1.5,3l-1.5,3l-1.5,3l-1.5,3
1772
+ l-1.5,3l-1.5,3l-1.5,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3.1l-1.4,3.1l-1.4,3.1l-1.4,3.1
1773
+ l-1.4,3.1l-1.4,3.1l-1.4,3.1l-1.4,3.1l-1.4,3.1l-1.4,3.1l-1.4,3.1l-2.4,5.5l-2.4,5.5l-4.9,11l-2.4,5.5l-2.4,5.5l-2.5,5.5
1774
+ l-2.5,5.5l-1.2,2.8l-1.2,2.8l-1.3,2.8l-1.3,2.8l-1.3,2.8l-1.3,2.8l-1.3,2.8l-1.3,2.7l-1.3,2.7l-1.3,2.7l-1.3,2.7l-1.3,2.7
1775
+ l-1.3,2.7l-1.3,2.7l-1.3,2.7l-1.3,2.7l-0.8,1.5l-0.8,1.5l-0.8,1.5l-0.7,1.5l-1.5,3.1l-1.5,3.1l-3,6.3l-1.5,3.2l-0.8,1.6l-0.8,1.6
1776
+ l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.9,1.6l-0.9,1.5l-0.9,1.5l-0.9,1.5
1777
+ l-0.9,1.5l-0.9,1.5l-0.9,1.5l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6
1778
+ l-0.9,1.6l-0.9,1.6l-1.7,3.3l-1.7,3.3l-1.7,3.3l-0.9,1.7l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6l-1,1.6l-0.5,0.8
1779
+ l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.6,0.8
1780
+ l-0.6,0.8l-0.5,0.7l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4
1781
+ l-0.2,0.4l-0.2,0.5l-0.2,0.5l-0.4,1l-0.4,1.1l-0.5,1.1l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.4,0.6
1782
+ l-0.4,0.6l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.4,0.3
1783
+ l-0.5,0.3l-0.4,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.1l-0.5,0.1l-0.4,0.1h-0.4h-0.4h-0.5h-0.4l-0.5-0.1l-0.4-0.1l-0.6-0.2l-0.5-0.2
1784
+ l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3
1785
+ l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.4l-0.3-0.4l-0.3-0.5l-0.2-0.5l-0.2-0.7l-0.2-0.5l-0.2-0.5l-0.2-0.5
1786
+ l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.5-1l-1.1-2.1l-0.6-1.1l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6
1787
+ l-0.3-0.6l-0.3-0.7l-0.3-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.5-2.6l-0.5-2.5
1788
+ l-0.5-2.5l-0.5-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.7-5.1
1789
+ l-0.7-5.1l-0.7-5.1l-0.7-5.1l-0.7-5.1l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.5l-0.4-2.5l-0.4-2.5l-1.2-7.4
1790
+ l-1.3-7.4l-1.3-7.5l-1.3-7.5l-2.6-15l-1.3-7.5l-1.3-7.5l-1.3-7.5l-1.3-7.5l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.6-3.8
1791
+ l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.5-3.8l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.8l-0.3-1.7l-0.3-1.7
1792
+ l-0.3-1.7l-0.3-1.7l-0.3-1.7l-0.4-1.7l-0.4-1.7l-0.4-1.7l-0.4-1.7l-0.4-1.7l-0.8-3.5l-0.8-3.5l-0.8-3.5l-0.8-3.5l-0.4-1.8
1793
+ l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.2-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9
1794
+ l-0.2-1.5l-0.2-1.5l-0.2-1.5l-0.2-1.5l-0.2-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.6-3l-0.6-2.9l-0.6-2.9l-1.2-5.9
1795
+ l-0.6-3l-0.6-3l-0.6-3l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.6l-0.3-1.6l-0.3-1.7l-0.1-0.9l-0.1-0.9
1796
+ l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9v-0.5v-0.5v-0.5v-0.5v-0.5v-0.6v-0.5l0.1-0.5l0.1-0.5l0.1-0.4l0.1-0.4l0.1-0.4
1797
+ l0.2-0.5l0.1-0.2v-0.3l0.1-0.9l0.3-0.9L-236.9,1244.6z M-3,1245.6v0.2l0,0V1245.6L-3,1245.6z M-236.3,1251.3l0.2,0.2l-0.4-0.6
1798
+ L-236.3,1251.3z"
1799
+ />
1800
+ </g>
1801
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1802
+ <path
1803
+ d="M-269.9,1186.4l0.1-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.2l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2
1804
+ l0.3-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2
1805
+ l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3
1806
+ l0.1,0.3v0.3l0,0v0.3v0.3v0.3v0.3l0,0v0.2v0.2l-0.1,0.2l-0.1,0.3l-0.1,0.4l-0.2,0.4l-0.3,0.9l-0.4,0.9l-0.4,0.9l-0.3,0.8
1807
+ l-0.1,0.3l-0.1,0.2l-0.2,1.4l-0.1,0.9l-0.1,0.9l-0.1,1l-0.1,1l-0.1,0.5l-0.1,0.5v0.5v0.5v0.5v0.5v0.5v0.5v0.4v0.4v0.4v0.4v0.4
1808
+ v0.3v0.3v0.3v0.3l0.1,0.2v0.1v0.1v0.1v0.1l0.4,1.1l0.4,1.2l0.5,1.3l0.2,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7
1809
+ l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7
1810
+ l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.5,0.7l0.5,0.7l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.5l0.2,0.3l0.2,0.3
1811
+ l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2
1812
+ l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
1813
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.3h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1
1814
+ l0.3,0.1l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3
1815
+ l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
1816
+ l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
1817
+ l-0.3,0.1h-0.3h-0.3h1.6h-0.4h-0.5h-0.5h-0.5l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1
1818
+ l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
1819
+ l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3
1820
+ l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.4l-0.6-0.7l-0.6-0.7l-0.6-0.7l-0.6-0.8l-0.6-0.8l-0.6-0.8
1821
+ l-0.6-0.8l-0.6-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.4-0.8l-0.4-0.8
1822
+ l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.3-0.8l-0.3-0.8l-0.3-0.8l-0.3-0.8l-0.3-0.8
1823
+ l-0.3-0.8l-0.3-0.7l-0.3-0.7l-0.5-1.4l-0.5-1.4l-0.4-1.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.4l-0.1-0.6l-0.1-0.7l-0.1-0.7
1824
+ l-0.1-0.7l-0.1-0.7v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-1.1l0.1-1.1l0.2-1l0.2-1
1825
+ l0.3-1.8l0.1-0.3l0.1-0.4l0.1-0.5l0.2-0.5l0.2-0.5l0.4-1l0.4-1l0.3-0.9l0.3-0.7v-0.1v-0.2l0.1-0.3l0.1-0.3L-269.9,1186.4z
1826
+ M-270.5,1188.7v0.6v-0.3V1188.7l0.1-0.3v-0.1L-270.5,1188.7z M-270.4,1187.7L-270.4,1187.7L-270.4,1187.7L-270.4,1187.7z"
1827
+ />
1828
+ </g>
1829
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1830
+ <path
1831
+ d="M-5,1240.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2
1832
+ l0.3-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.3-0.1l0.4-0.1l0.3-0.1l0.3-0.1l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2
1833
+ l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.3l0.3-0.3l0.3-0.3
1834
+ l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3
1835
+ l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4
1836
+ l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.5-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9
1837
+ l0.3-0.9l0.3-0.9l0.3-0.9l0.3-0.9l0.3-0.9l0.3-0.9l0.3-1l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.1-0.9
1838
+ l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9v-0.9v-0.9v-0.9v-0.4v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.2-0.3l0.2-0.3l0.2-0.3
1839
+ l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.4h0.4h0.4
1840
+ l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.3l0.3,0.3l0.2,0.3l0.2,0.3l0.2,0.3
1841
+ l0.2,0.3l0.2,0.3l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4v0.4v0.4v1v1.1v1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.2,1.1
1842
+ l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.4,1.1l-0.4,1.1l-0.4,1.1
1843
+ l-0.4,1.1l-0.4,1.1l-0.4,1.1l-0.4,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1l-0.5,1l-0.5,1l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5
1844
+ l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5
1845
+ l-0.3,0.5l-0.4,0.5l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4
1846
+ l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.3l-0.5,0.3l-0.5,0.3
1847
+ l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.2l-0.5,0.2
1848
+ l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1H0.8H0.4H0h-0.4l-0.4-0.1
1849
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3
1850
+ l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.4l-0.1-0.4l-0.1-0.4v-0.4v-0.4v-0.4v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4L-5,1240.4z"
1851
+ />
1852
+ </g>
1853
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1854
+ <path
1855
+ d="M-271.2,1188.2l0.2-0.4l0.2-0.4l0.1-0.2l0.3-0.4l0.3-0.4l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.3-0.3l0.3-0.3
1856
+ l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.6-0.3l0.6-0.3l0.7-0.3l0.6-0.3l0.6-0.3
1857
+ l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.4-0.1l0.4-0.1l0.5-0.1h0.5h0.5h0.4h0.4h0.4h0.4h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1
1858
+ l0.4,0.1l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3
1859
+ l0.8,0.3l1.5,0.6l1.4,0.5l1.3,0.5l1.1,0.5l1,0.4l1.1,0.4l1,0.4l1.1,0.4l1,0.4l1,0.4l1.1,0.4l1.1,0.4l1.1,0.4l1.1,0.4l1.1,0.4
1860
+ l1.1,0.4l1.1,0.4l1.1,0.4l1.1,0.4l1.1,0.4l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3
1861
+ l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2
1862
+ l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1
1863
+ l1.1,0.1l1.1,0.1l1.1,0.1h1.1h1.1h1.1h1.1h1.1h1.1h1.6h1.6h1.6h1.6h1.6l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1
1864
+ l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l3.2,0.3l3.2,0.3l3.2,0.3l6.5,0.6l3.2,0.3l3.2,0.3l3.2,0.3l3.2,0.3l3.2,0.3
1865
+ l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1h1.6h1.6h1.6h1.6h1.6
1866
+ h1.6h1.6h1.6h1.6l1.6-0.1l1.6-0.1l1.6-0.1l1.6-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1
1867
+ l0.9-0.1l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.3
1868
+ l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l1.8-0.7l1.8-0.7l1.8-0.7
1869
+ l1.8-0.7l1.8-0.7l1.8-0.7l1.8-0.7l1.8-0.7l1.8-0.7l1.8-0.7l3.5-1.5l3.5-1.5l0.5-0.2l0.5-0.2l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3
1870
+ l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l1.1-0.7l1.1-0.7l1.2-0.7l1.2-0.7l0.6-0.4l0.6-0.4l0.6-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4
1871
+ l0.7-0.4l0.7-0.3l0.7-0.3l0.7-0.3l0.8-0.3l0.8-0.3l0.4-0.1l0.4-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.5h0.5h0.5l0.5,0.1
1872
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.2,0.3
1873
+ l0.2,0.2l0.2,0.3l0.4,0.4l0.3,0.4l0.3,0.4l0.5,0.7l0.2,0.3l0.2,0.2v0.1l0.5,0.1l0.7,0.3l0.7,0.4l0.6,0.4l0.6,0.5l0.5,0.6l0.4,0.7
1874
+ l0.3,0.7l0.2,0.7l0.1,0.8v0.8l-0.1,0.8l-0.2,0.8l-0.3,0.7l-0.4,0.7l-0.4,0.6l-0.5,0.6l-0.6,0.5l-0.7,0.4l-0.7,0.3l-0.7,0.2
1875
+ l-0.8,0.1h-0.8h-0.4h-0.5l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.3l-0.3-0.3
1876
+ l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.2-0.4l-0.2-0.3l-0.3,0.1
1877
+ l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-1.1,0.7l-1.2,0.7
1878
+ l-1.2,0.8l-1.2,0.8l-0.6,0.4l-0.6,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.3l-0.7,0.3l-0.7,0.3l-3.6,1.5
1879
+ l-3.6,1.5l-1.8,0.8l-1.8,0.8l-1.8,0.8l-1.8,0.8l-1.8,0.7l-1.9,0.7l-1.9,0.7l-1.9,0.7l-1.9,0.7l-1.9,0.7l-1,0.3l-1,0.3l-1,0.3
1880
+ l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.2l-1,0.2l-1,0.2l-1,0.2
1881
+ l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1.7,0.1
1882
+ l-1.7,0.1l-1.7,0.1l-1.7,0.1h-1.7h-1.7h-1.7h-1.7h-1.7h-1.7H-80h-1.6h-1.6l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1
1883
+ l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-3.3-0.3l-3.3-0.3l-3.3-0.3l-3.2-0.3l-3.2-0.3
1884
+ l-6.5-0.6l-3.2-0.3l-3.2-0.3l-3.2-0.3l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1
1885
+ l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1h-1.6h-1.6h-1.6h-1.6h-1.6h-1.2h-1.2h-1.2h-1.2h-1.2h-1.2l-1.2-0.1l-1.2-0.1l-1.2-0.1
1886
+ l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2
1887
+ l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3
1888
+ l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.4l-1.1-0.4
1889
+ l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4
1890
+ l-1.1-0.4l-1.1-0.4l-1.1-0.4l-0.9-0.4l-1.1-0.4l-1.2-0.5l-1.3-0.5l-1.4-0.5l-0.7-0.3l-0.7-0.3l-0.7-0.3l-0.7-0.3l-0.7-0.3
1891
+ l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.6-0.2l-0.6-0.1l-0.6-0.1l-0.6-0.1h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2
1892
+ h-0.2h-0.1h-0.1h-0.1h-0.1h-0.1l0,0l0,0l0,0l-0.2,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
1893
+ l-0.4,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0l-0.1,0.1l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.2,0.3v0.1l0.1-0.1l-0.4,0.6l-0.5,0.6
1894
+ l-0.6,0.5l-0.6,0.4l-0.7,0.3l-0.7,0.2l-0.8,0.1h-0.8l0,0l-0.8-0.1l-0.8-0.2l-0.7-0.3l-0.7-0.4l-0.6-0.4l-0.6-0.5l-0.5-0.6
1895
+ l-0.4-0.7l-0.3-0.7l-0.2-0.7l-0.1-0.8v-0.8l0.1-0.8l0.2-0.8L-271.2,1188.2L-271.2,1188.2z M-260.6,1193.4l0.2-0.4l0,0
1896
+ L-260.6,1193.4L-260.6,1193.4z"
1897
+ />
1898
+ </g>
1899
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1900
+ <path
1901
+ d="M-265.5,1181.6l0.4-0.7l0.5-0.6l0.6-0.5l0.4-0.3l0.4-0.4l0.4-0.3l0.4-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3
1902
+ l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2
1903
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.9-0.3l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l1.8-0.3l1.7-0.3l0.8-0.2l0.8-0.2l0.8-0.2
1904
+ l0.8-0.2l0.8-0.2l0.7-0.2l0.7-0.2l0.7-0.2l1.3-0.4l1.3-0.4l1.3-0.4l1.3-0.4l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3
1905
+ l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2
1906
+ l1.4-0.2l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1l5.1-0.3l5.1-0.3l5.2-0.3l5.2-0.3l10.4-0.7l5.2-0.3l5.2-0.3l5.2-0.3
1907
+ l5.2-0.3l5.2-0.3l5.2-0.3l5.2-0.3l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1
1908
+ l2.6-0.1l2.6-0.1l2.6-0.1h2.6h2.6h2.6h2.6h2.6h2.6h2.6h2.6h2.6h2.6l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1
1909
+ l2.6,0.1l2.6,0.2l2.6,0.2l2.6,0.2l2.6,0.2l2.6,0.2l2.6,0.2l3.2,0.3l3.2,0.3l1.7,0.1l1.7,0.2l1.7,0.2l1.7,0.2l1.7,0.2l1.7,0.2
1910
+ l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2
1911
+ l0.9,0.2l0.9,0.2l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.8,0.3l0.8,0.3l0.8,0.4l0.8,0.4l0.8,0.4l0.8,0.4l0.8,0.4
1912
+ l0.8,0.4l0.8,0.4l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3
1913
+ l0.4,0.3l0.4,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.5,0.6l0.4,0.6l0.3,0.7l0.3,0.7l0.2,0.8l0.1,0.8v0.8l-0.1,0.8l-0.2,0.7
1914
+ l-0.3,0.7l-0.4,0.6l-0.5,0.6l-0.6,0.5l-0.6,0.4l-0.7,0.3l-0.7,0.3l-0.8,0.2l-0.8,0.1H22l-0.8-0.1l-0.7-0.2l-0.7-0.3l-0.6-0.4
1915
+ l-0.6-0.5l-0.3-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
1916
+ l-0.3-0.2l-0.3-0.2l-0.6-0.4l-0.6-0.4l-0.6-0.4l-0.6-0.4l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.7-0.3
1917
+ l-0.7-0.3l-0.7-0.3l-0.7-0.3l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2
1918
+ l-0.8-0.2l-0.8-0.2l-0.8-0.2l-0.8-0.2l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1L-9,1173l-0.8-0.1l-0.8-0.1l-0.8-0.1
1919
+ l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.1l-3.2-0.3l-3.2-0.3l-2.6-0.2l-2.5-0.2l-2.5-0.2l-2.5-0.2l-2.6-0.2
1920
+ l-2.6-0.2l-2.6-0.1l-2.6-0.1l-2.6-0.1l-2.6-0.1l-2.6-0.1l-2.6-0.1l-2.6-0.1l-2.6-0.1h-2.6h-2.6h-2.6h-2.6h-2.6h-2.6h-2.6h-2.6
1921
+ h-2.6h-2.6l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1
1922
+ l-2.6,0.1l-2.6,0.1l-5.2,0.3l-5.2,0.3l-5.2,0.3l-5.2,0.3l-5.2,0.3l-5.2,0.3l-5.2,0.3l-10.4,0.7l-5.2,0.3l-5.2,0.3l-5.2,0.3
1923
+ l-5.1,0.3l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2
1924
+ l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3
1925
+ l-1.2,0.3l-1.2,0.3l-1.3,0.3l-1.3,0.3l-1.3,0.4l-1.3,0.4l-1.3,0.4l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2
1926
+ l-0.9,0.2l-0.9,0.2l-1.7,0.3l-1.7,0.3l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.4,0.1l-0.4,0.1
1927
+ l-0.4,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
1928
+ l-0.3,0.1l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.6,0.5l-0.7,0.4
1929
+ l-0.7,0.3l-0.8,0.2l-0.8,0.1h-0.8l-0.8-0.1l-0.7-0.2l-0.7-0.3l-0.7-0.4l-0.6-0.5l-0.5-0.6l-0.5-0.6l-0.4-0.7l-0.3-0.7l-0.2-0.8
1930
+ l-0.1-0.8v-0.8l0.1-0.8l0.2-0.7L-265.5,1181.6z"
1931
+ />
1932
+ </g>
1933
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1934
+ <path
1935
+ d="M-231.8,1244l0.4-0.6l0.4-0.5l0.5-0.5l0.5-0.4l0.6-0.4l0,0l0.5-0.2l0.5-0.2l0.6-0.1l0.6-0.1l0,0h0.5h0.5h0.3
1936
+ l0.5,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.8,0.3l0.9,0.3l1,0.4l2.1,0.8l2.2,0.9l1.1,0.4l1,0.4l0.9,0.3l0.4,0.1l0.4,0.1l0.3,0.1
1937
+ l0.2,0.1h0.2h0.1l1.5,0.3l1.6,0.4l1.5,0.4l1.5,0.4l1.5,0.4l1.5,0.4l6.1,1.6l1.5,0.4l1.5,0.4l1.5,0.4l1.5,0.4l1.5,0.4l1.5,0.3
1938
+ l1.5,0.3l1.5,0.3l1.5,0.3l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1
1939
+ l0.7,0.1l0.7,0.1l0.7,0.1h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.7l1.6-0.1l1.6-0.1h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6
1940
+ l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l3.2,0.2l3.2,0.2l3.2,0.2l3.2,0.2l3.2,0.2l3.2,0.2l3.2,0.2
1941
+ l3.2,0.2l3.2,0.2l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6l1.6-0.1l1.5-0.1
1942
+ l1.5-0.1l1.5-0.1l1.5-0.1l1.5-0.1l1.5-0.1l1.5-0.2l1.5-0.2l1.5-0.2l1.2-0.1l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.1-0.2
1943
+ l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3
1944
+ l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.4l1.1-0.4l1.1-0.4l1.1-0.4l1.1-0.4l1-0.4l1-0.4l1-0.4l1-0.4
1945
+ l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.5l1-0.5l1-0.5l2.1-0.9l2.1-1l2.1-1l2.1-1l2.1-1l2.1-1L5,1233
1946
+ l0.6-0.3l0.7-0.2l0.7-0.1h0.7h0.7l0.7,0.1l0.7,0.2l0.6,0.3l0.6,0.3l0.5,0.4l0.5,0.5l0.4,0.5l0.4,0.6l0.3,0.6l0.2,0.6l0.2,0.7
1947
+ l0.1,0.7v0.7l-0.1,0.7l-0.2,0.7l-0.2,0.6l-0.3,0.6l-0.4,0.6l-0.4,0.5l-0.5,0.5l-0.6,0.4l-0.6,0.3l-2.2,1.1l-2.2,1.1l-2.2,1
1948
+ l-2.2,1l-2.2,1l-2.2,1l-2.2,1l-1.1,0.5l-1.1,0.5l-1.1,0.5l-1.1,0.5l-1.1,0.5l-1.1,0.5l-1.1,0.5l-1.1,0.4l-1.1,0.4l-1.1,0.4
1949
+ l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4
1950
+ l-1.1,0.4l-1.1,0.4l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3
1951
+ l-1.2,0.3l-1.2,0.3l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.3,0.2l-1.3,0.2
1952
+ l-1.3,0.2l-1.6,0.2l-1.7,0.2l-1.6,0.2l-1.7,0.1l-1.6,0.1l-1.7,0.1l-1.6,0.1l-1.6,0.1l-1.6,0.1l-1.6,0.1h-1.6h-1.6h-1.6h-1.6h-1.6
1953
+ h-1.6h-1.6h-1.6h-1.6h-1.6l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-3.2-0.2l-3.2-0.2l-3.2-0.2l-3.2-0.2l-3.2-0.2
1954
+ l-3.2-0.2l-3.2-0.2l-3.2-0.2l-3.2-0.2l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1h-1.6h-1.6h-1.6h-1.6h-1.6
1955
+ h-1.6h-1.6h-1.6h-1.5h-1.5h-1.5l-1.5,0.1l-1.6,0.1h-0.8h-0.9h-0.9h-0.9h-0.9h-0.9h-0.8h-0.8h-0.9l-0.8-0.1l-0.8-0.1l-0.8-0.1
1956
+ l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1
1957
+ l-0.8-0.2l-1.6-0.3l-1.6-0.3l-1.6-0.4l-1.6-0.4l-1.6-0.4l-1.6-0.4l-1.6-0.4l-1.6-0.4l-1.5-0.4l-3.1-0.8l-3-0.8l-1.5-0.4l-1.5-0.4
1958
+ l-1.5-0.4l-1.5-0.4l-1.5-0.3l-1.5-0.3l-0.4-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-1-0.4l-1.1-0.4l-1.1-0.4l-2.3-0.9
1959
+ l-2.1-0.8l-0.9-0.4l-0.8-0.3l-0.6-0.2h-0.1h-0.1l-0.7-0.2l-0.6-0.3l-0.6-0.3l-0.6-0.4l-0.5-0.5l-0.5-0.5l-0.4-0.6l-0.3-0.6
1960
+ l-0.3-0.6l-0.2-0.7l-0.1-0.7v-0.7l0.1-0.7l0.1-0.7l0.2-0.7L-231.8,1244z M-226.5,1252.7l0.5-0.1l0,0L-226.5,1252.7h-0.3H-226.5z"
1961
+ />
1962
+ </g>
1963
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1964
+ <path
1965
+ d="M-196.9,1287.6l0.2-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0,0
1966
+ l0.2-0.1h0.3l0,0h0.3h0.3h0.3l0,0h0.3l0.3,0.1l0.2,0.1h0.1l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.3-0.2l0.3-0.1l0.3-0.1
1967
+ l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.3h0.3h0.3h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1
1968
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.4l0.4,0.4
1969
+ l0.4,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5
1970
+ l0.3,0.5l0.3,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.4,0.9l0.4,0.9l0.4,0.9l0.3,0.8l0.3,0.8l0.3,0.8l0.2,0.7
1971
+ l0.2,0.7l0.2,0.6l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8
1972
+ l0.1,0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,1.6l-0.2,1.6
1973
+ l-0.2,1.6l-0.2,1.6l-0.2,1.6l-0.2,1.6l-0.2,1.5l-0.2,1.5l-0.4,3.1l-0.4,3l-0.2,1.5l-0.2,1.5l-0.2,1.5l-0.2,1.5l-0.1,1.1l-0.1,1.2
1974
+ l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6
1975
+ l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.3,0.6l-0.3,0.6l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
1976
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2
1977
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3
1978
+ h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1
1979
+ l-0.2-0.1l-0.2-0.1l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.4l-0.3-0.4l-0.3-0.4
1980
+ l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.4-0.8l-0.4-0.8l-0.4-0.8
1981
+ l-0.4-0.8l-0.3-0.7l-0.3-0.7l-0.3-0.6l-0.5-1.1l-0.4-0.8l-0.1-0.3l-0.1-0.2l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7
1982
+ l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8
1983
+ l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8
1984
+ l-0.1-0.8v-0.8v-0.8v-0.8v-0.8l-0.1-1.6v-1.6v-1.6v-1.6v-1.6v-1.6v-1.6v-1.6v-3.1v-3.1v-1.5v-1.5v-0.5v-0.5v-0.5v-0.5l0.1-0.5
1985
+ l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.3-1l0.3-1l0.3-1
1986
+ l0.3-0.9l0.3-0.9l0.3-0.9l0.3-0.9l0.1-0.3l0.1-0.3l0.3-0.6l0.3-0.6l0.3-0.6l0.7-1.3l0.3-0.6l0.3-0.6v-0.1v-0.2v-0.3v-0.3v-0.3
1987
+ l0.1-0.3l0.1-0.3L-196.9,1287.6z M-194.5,1297.5l-0.3,0.9l-0.3,0.9l-0.3,0.9l-0.3,0.9l-0.3,0.9l-0.3,0.9l-0.1,0.4l-0.1,0.4
1988
+ l-0.1,0.5l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4v0.4v0.4v0.4v0.4v0.4v1.5
1989
+ v1.5v3.1v3.1v1.6v1.6v1.6v1.6v1.6v1.6v1.6v1.6v0.8v0.8v0.8v0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8
1990
+ l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7
1991
+ l0.2,0.7l0.2,0.7l0.2,0.6l0.2,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.7l0.1,0.3l0.2,0.4l0.4,0.9l0.5,1.1l0.3,0.6l0.3,0.6
1992
+ l0.3,0.7l0.3,0.7l0.3,0.7l0.4,0.7l0.4,0.7l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3
1993
+ l0.2,0.3l0.2,0.3l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0,0h0.1h0.1l0,0l0,0h0.1h0.1l0,0l0,0
1994
+ l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0h0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2
1995
+ l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.5
1996
+ l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6
1997
+ l0.1-0.6l0.1-0.6l0.1-0.5l0.1-1.1l0.1-1.1l0.2-1.5l0.2-1.5l0.2-1.5l0.2-1.5l0.4-3l0.4-3.1l0.2-1.5l0.2-1.5l0.2-1.5l0.2-1.5
1998
+ l0.2-1.5l0.2-1.5l0.1-1.5l0.1-1.5l0.1-0.8l0.1-0.8v-0.8v-0.8v-0.8v-0.8v-0.8v-0.8v-0.8v-0.8v-0.7v-0.8v-0.7v-0.7v-0.7v-0.7v-0.7
1999
+ v-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.2-0.7
2000
+ l-0.2-0.7l-0.1-0.5l-0.2-0.5l-0.2-0.6l-0.2-0.7l-0.3-0.7l-0.3-0.8l-0.3-0.8l-0.3-0.8l-0.4-0.8l-0.2-0.4l-0.2-0.4l-0.2-0.4
2001
+ l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.3-0.4
2002
+ l-0.2-0.4l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2
2003
+ l-0.2-0.1h-0.1l-0.1-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l0,0l0,0h-0.1l0,0l0,0l0,0l0,0h-0.1
2004
+ h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.1,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.3l-0.3-0.1l-0.2-0.1
2005
+ l-0.1,0.1l-0.1,0.3l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.6,1.2l-0.3,0.6l-0.3,0.5l-0.2,0.5l-0.1,0.2l-0.1,0.2L-194.5,1297.5z"
2006
+ />
2007
+ </g>
2008
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
2009
+ <path
2010
+ d="M-181.5,1393.6L-181.5,1393.6l0.2-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.2l0.2-0.2
2011
+ l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.2h0.2h0.2h0.3h0.4h0.5h0.4l0.4,0.1l0.4,0.1l0.4,0.1
2012
+ l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.3,0.2l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3
2013
+ l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.4l0.1,0.3l0.1,0.3l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4
2014
+ l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4l-0.1,0.4
2015
+ l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4
2016
+ l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
2017
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.1
2018
+ l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2
2019
+ l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.3
2020
+ l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.1-0.5l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6
2021
+ l-0.1-0.6l-0.1-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-1.1v-1.1v-1l0.1-0.9v-0.4v-0.4v-0.4v-0.4l0.1-0.4l0.1-0.3
2022
+ l0.1-0.3l0.1-0.3l0.1-0.4l0.1-0.2l0.1-0.2l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0,0l0,0l-0.1-0.2v-0.2v-0.2v-0.2
2023
+ v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2l0.1-0.2L-181.5,1393.6z M-176.3,1397.1v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2
2024
+ l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0v0.1v0.3v0.3v0.3v0.4l-0.1,0.8v0.9v0.9v1v0.5v0.5v0.5v0.5v0.5v0.6v0.5v0.5v0.5
2025
+ v0.5v0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.3l0.1,0.2l0,0l0.1-0.1l0.1-0.2
2026
+ l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3
2027
+ l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3v-0.3v-0.3v-0.4v-0.3v-0.3v-0.3v-0.3
2028
+ v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.2
2029
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1
2030
+ l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1h-0.2h-0.2L-176.3,1397.1L-176.3,1397.1L-176.3,1397.1z M-180.9,1400.2
2031
+ l0.2,0.1l-0.1-0.1H-180.9L-180.9,1400.2l-0.2-0.2L-180.9,1400.2z"
2032
+ />
2033
+ </g>
2034
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
2035
+ <path
2036
+ d="M-240.4,1219l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.3
2037
+ l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
2038
+ l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.3h0.3h0.3h0.3h0.4h0.3h0.1h0.1h0.1l0.2,0.1l0.2,0.1h0.1l0.1,0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1
2039
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0,0l0.1,0.1l0.1,0.2l0,0l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2l0,0v0.2v0.2l0,0v0.2v0.2
2040
+ v0.1v0.2v0.2v0.1v0.1v0.1v0.2l-0.1,0.3l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1
2041
+ l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2h-0.3h-0.2h-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l0,0l0,0h-0.2h-0.2
2042
+ h-0.2h-0.2l-0.1,0.1h-0.1h-0.1h-0.1h-0.1h-0.1l0,0l0,0h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.2l-0.1,0.2
2043
+ l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2v0.2v0.2v0.2v0.2l0,0v0.1l0,0v0.1v0.1l0,0
2044
+ l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.1l0.4,0.3l0.4,0.3l0.5,0.3
2045
+ l0.5,0.3l0.5,0.3l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2
2046
+ l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l1.3,0.2l1.3,0.2l1.3,0.2l1.3,0.2l2.7,0.3l1.3,0.2l1.3,0.2
2047
+ l1.3,0.2l1.3,0.2l1.3,0.2l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.7,0.2
2048
+ l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1h0.5h0.5h0.4h0.4h0.4h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2
2049
+ h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0v-0.1v-0.1v-0.1v-0.1l0,0v-0.1l0,0l0,0l0,0
2050
+ v-0.1l0,0v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2051
+ l-0.1-0.1l-0.1-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
2052
+ l-0.3-0.2l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-1-0.3l-1-0.3
2053
+ l-1-0.3l-1-0.3l-1-0.3l-1-0.3l-1-0.3l-2.1-0.5l-2.1-0.5l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3
2054
+ l-1.1-0.3l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
2055
+ l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2
2056
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.2v-0.2v-0.3v-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2
2057
+ l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.2h0.2h0.3h0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.3
2058
+ l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.5,0.2l0.5,0.2l0.5,0.2
2059
+ l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l1,0.3l1,0.3l1,0.3l1,0.3l1,0.3l1,0.3l1,0.3l1,0.3l2.1,0.5l2.1,0.5l1.1,0.3l1.1,0.3l1.1,0.3
2060
+ l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.3,0.1l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2
2061
+ l0.4,0.2l0.4,0.2l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.2,0.2l0.2,0.2l0.2,0.2
2062
+ l0.2,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.3
2063
+ v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
2064
+ l-0.3,0.3l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
2065
+ l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.6h-0.6h-0.6h-0.6l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1
2066
+ l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.4-0.1l-0.8-0.2l-0.7-0.2l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1
2067
+ l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-1.2-0.2l-1.2-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-2.7-0.3l-1.4-0.2l-1.4-0.2
2068
+ l-1.4-0.2l-1.4-0.2l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2
2069
+ l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.6-0.2l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3
2070
+ l-0.6-0.4l-0.6-0.4l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
2071
+ l-0.3-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.3l-0.1-0.2l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
2072
+ l-0.1-0.3v-0.2v-0.3v-0.2v-0.2v-0.2v-0.2v-0.3v-0.4l0.1-0.5l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.2-0.4L-240.4,1219z
2073
+ M-233.2,1215.7L-233.2,1215.7L-233.2,1215.7L-233.2,1215.7z"
2074
+ />
2075
+ </g>
2076
+ <path
2077
+ d="M402.7,260L402.7,260h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2078
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1
2079
+ l0.1,0.1v0.1v0.1l0.1,0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1v0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2080
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2081
+ l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1L403,266l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
2082
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.1,0.2l-0.2,0.2l-0.1,0.2
2083
+ l-0.2,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2v0.1l-0.1,0.2l-0.1,0.3l-0.1,0.3l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.1,0.5
2084
+ l-0.1,0.3l0,0v0.1v0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2085
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1h-0.1h-0.1
2086
+ h-0.1h-0.1h-0.1H394h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1H393h-0.1h-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2087
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2088
+ l-0.1-0.1l-0.1-0.1l0,0v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1V275v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1l0.1-0.3l0.1-0.5l0.1-0.6
2089
+ l0.2-0.7l0.2-0.8l0.2-0.8l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.3l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3
2090
+ l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.2-0.3l0.3-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.2-0.3l0.3-0.3l0.3-0.2l0.3-0.2
2091
+ l0.3-0.2l0.3-0.2l0.4-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1
2092
+ h1.5V260z"
2093
+ />
2094
+ <path
2095
+ d="M413.3,271L413.3,271h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2096
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.1,0.1
2097
+ v0.1v0.1l0.1,0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1v0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1L416,275l-0.1,0.1l-0.1,0.1
2098
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1L415,276l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2099
+ l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.5,0.3l-0.5,0.3l-0.5,0.4l-0.5,0.4l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.2,0.2l-0.3,0.2
2100
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.1,0.2l-0.1,0.1v0.1l0,0v0.1l0.1,0.2
2101
+ l0.1,0.4l0.1,0.4l0.1,0.4l0.2,0.5l0.1,0.5l0.1,0.3l0.1,0.3l0.1,0.3v0.2v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1v0.1v0.1l-0.1,0.1v0.1
2102
+ l0,0l-0.1,0.1v0.1l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1h-0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1
2103
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1H407l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1l0,0h-0.1
2104
+ h-0.1h-0.1h-0.1H406h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l0,0h-0.1H405h-0.1h-0.2l-0.3-0.1h-0.2h-0.1H404h-0.1h-0.1h-0.1
2105
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2106
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1V286v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1
2107
+ v-0.1l0.1-0.1v-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0,0l-0.1-0.1l-0.1-0.5l-0.2-0.5l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.4
2108
+ v-0.4v-0.4l0.1-0.4v-0.3l0.1-0.2l0.1-0.3l0.1-0.3l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.3-0.3l0.2-0.3l0.3-0.3l0.2-0.3
2109
+ l0.3-0.3l0.3-0.3l0.4-0.3l0.3-0.3l0.3-0.3l0.4-0.3l0.3-0.3l0.4-0.3l0.3-0.3l0.4-0.3l0.3-0.3l0.7-0.5l0.7-0.4l0.7-0.4l0.6-0.4
2110
+ l0.3-0.2l0.3-0.2l0.2-0.2l0.2-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h1.2V271z M406.4,283.1L406.4,283.1
2111
+ L406.4,283.1L406.4,283.1z"
2112
+ />
2113
+ <path
2114
+ d="M393,250.3L393,250.3h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2115
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1
2116
+ l0.1,0.1v0.1v0.1l0.1,0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1l-0.1,0.1v0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2117
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1L395,255l-0.1,0.1l-0.1,0.1l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.3,0.2
2118
+ l-0.3,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.5,0.3l-0.5,0.3l-0.5,0.2l-0.5,0.2l-0.4,0.2l-0.4,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1
2119
+ l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2120
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.4l-0.1,0.4l-0.2,0.9l-0.1,0.5l-0.1,0.3l-0.1,0.3l-0.1,0.3
2121
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3L385,266l-0.2,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2122
+ L384,267l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1H383h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1H382h-0.1
2123
+ h-0.1h-0.1h-0.1h-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2124
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1l-0.1-0.1v-0.1
2125
+ v-0.1v-0.1v-0.1v-0.1v-0.1V264l0.1-0.1v-0.1l0.1-0.1v-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
2126
+ l0.1-0.1l0.1-0.1l0,0h0.1v-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.4l0.2-0.9l0.1-0.5l0.2-0.5l0.1-0.3l0.1-0.3l0.1-0.3
2127
+ l0.2-0.3l0.1-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.2-0.3l0.3-0.3l0.3-0.2l0.2-0.2l0.3-0.2l0.3-0.2l0.2-0.2
2128
+ l0.3-0.2l0.2-0.2l0.3-0.2l0.2-0.2l0.5-0.3l0.5-0.3l0.5-0.2l0.5-0.2l0.4-0.2l0.4-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.1-0.1
2129
+ l0.2-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1h0.1h0.1h0.1h0.1
2130
+ h0.1h0.1h0.1h0.1h0.1h0.1h0.1L393,250.3z"
2131
+ />
2132
+ <path
2133
+ d="M400,91h0.2h0.1h0.2h0.1h0.2h0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2134
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1L403,93l0,0v0.1l0.1,0.1v0.1v0.1v0.1l0,0v0.1
2135
+ l-0.1,0.1v0.1v0.1l-0.1,0.1v0.1l-0.1,0.1v0.1l-0.1,0.2l-0.1,0.3l-0.1,0.3l-0.3,0.5l-0.2,0.5l-0.4,0.6l-0.7,1.2l-0.7,1.2l-0.4,0.6
2136
+ l-0.2,0.5l-0.2,0.4l-0.1,0.2l-0.1,0.1l-0.3,0.8l-0.4,0.8l-0.3,0.8l-0.2,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.4l-0.1,0.4l-0.1,0.4
2137
+ l-0.2,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4
2138
+ l-0.1,0.4v0.4l-0.1,0.4l-0.1,0.4v0.4v0.4v0.4v0.2l-0.1,0.2v0.2v0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2139
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1h-0.1
2140
+ h-0.2H393h-0.2h-0.2h-0.1h-0.2h-0.2H392h-0.2h-0.2h-0.1h-0.2l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1
2141
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2v-0.2l-0.1-0.2V114v-0.2
2142
+ v-0.2v-0.5v-0.5l0.1-0.5v-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5
2143
+ l0.2-0.5l0.1-0.5l0.2-0.5l0.1-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.1-0.5l0.2-0.5l0.2-0.5l0.4-0.9l0.4-0.9l0.4-0.9l0.1-0.3l0.2-0.3
2144
+ l0.2-0.6l0.4-0.6l0.4-0.6l0.7-1.2l0.7-1.2l0.2-0.3l0,0v-0.2v-0.2l0.1-0.2V92l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
2145
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.2l0.2-0.2l0.1-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.1-0.1h0.1h0.1
2146
+ h0.1h0.2h0.1h0.1h0.2l0,0h0.1h0.2V91z"
2147
+ />
2148
+ <path
2149
+ d="M408.1,107.3h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2150
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1
2151
+ v0.1v0.1l0,0v0.1v0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.3l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.3,0.9l-0.4,1l-0.4,1.1l-0.5,1.2
2152
+ l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.1l-0.4,1l-0.4,0.8l-0.3,0.7l-0.2,0.4l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2153
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1
2154
+ h-0.1h-0.2h-0.1h-0.1h-0.1h-0.3h-0.1H402h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2155
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2156
+ l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1l-0.1-0.1v-0.1v-0.1v-0.1v-0.1l0.1-0.1v-0.1V124l0.1-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1
2157
+ l0.2-0.4l0.3-0.6l0.4-0.8l0.4-0.9l0.4-1.1l0.5-1.1l0.5-1.2l0.5-1.2l0.5-1.2l0.5-1.2l0.4-1.1l0.4-1l0.3-0.8l0.1-0.3l0.1-0.3
2158
+ l0.1-0.2V110v-0.1v-0.1l0.1-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
2159
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.1h0.1h0.1h-0.2V107.3z
2160
+ M405,110.4v0.2V110.4L405,110.4L405,110.4L405,110.4z"
2161
+ />
2162
+ <path
2163
+ fill="#25B3FF"
2164
+ d="M483.4,329.1L483.4,329.1h0.3h0.1h0.1h0.1h0.2h0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2165
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1h0.1l1.4-0.3l0.8-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.6-0.1h0.4
2166
+ h0.4h0.2h0.3h0.2h0.1h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.2l0.1,0.1l0.1,0.1l0,0l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0
2167
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2v0.1l0.1,0.1v0.1l0.1,0.2v0.2v0.1v0.2l-0.1,0.2
2168
+ v0.1v0.2l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2169
+ l-0.1,0.1l0,0L494,334l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
2170
+ l-0.4,0.1l-0.9,0.2l-0.8,0.2l-0.9,0.2l-0.2,0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0l-0.2,0.1l-0.1,0.1h-0.1h-0.1h-0.1
2171
+ h-0.2h-0.1h-0.1H486l-1.4,0.1l-0.5,0.1l-0.5,0.1h-0.1l0,0l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1h-0.2h-0.1h-0.2h-0.1h-0.2h-0.2
2172
+ h-0.1h-0.2h-0.2h-0.1h-0.1l-0.7,0.4l-0.8,0.4l-0.8,0.4l-0.5,0.2l-0.4,0.2l-0.4,0.2l-0.5,0.2l-0.4,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2
2173
+ l-0.5,0.2l-0.4,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1h-0.2h-0.2h-0.3h-0.2h0.4H472h-0.3h-0.3l-0.3-0.1l-0.2-0.1h-0.1l-0.1-0.1h-0.1
2174
+ l-0.1-0.1l-0.2-0.1h-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2175
+ l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1h-0.1v-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.2v-0.2l0,0v-0.1v-0.1v-0.1
2176
+ l0.1-0.1v-0.1l0.1-0.1V337v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1V336l0.1-0.1l0.1-0.1
2177
+ l0.1-0.1l0.1-0.1l0.2-0.2l0.2-0.2l0.2-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.2-0.1l0,0l0.2-0.1l0.2-0.1l0.2-0.1
2178
+ l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.1l0.5-0.1l0.4-0.1l0.5-0.1l0.4-0.1l0.4-0.1l0.5-0.1l0.9-0.2l0.4-0.1
2179
+ l0.1-0.1v-0.2l0.1-0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
2180
+ l0.2-0.1h0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.1h0.1L483.4,329.1L483.4,329.1z"
2181
+ />
2182
+ <path
2183
+ fill="#25B3FF"
2184
+ d="M489.4,325L489.4,325h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2185
+ l0.1,0.1l0.1,0.1l0.1,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.2,0.2l0.2,0.2l0.1,0.1v0.1l0.1,0.1l0.1,0.3l0.1,0.3
2186
+ l0.1,0.1v0.1l0.1,0.1l0.1,0.3l0.1,0.4l0.1,0.4v0.4v0.4v0.4l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3
2187
+ l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.2l-0.2,0.2l-0.1,0.2l-0.2,0.2l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4
2188
+ l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3L486,339l-0.4,0.3l-0.3,0.2l-0.3,0.2l-0.2,0.2l0,0l-0.3,0.4
2189
+ l-0.4,0.5l-0.4,0.5l-0.5,0.7l-0.7,0.8l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2190
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1H481h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.2h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1
2191
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0h-0.1L478,343l-0.3-0.1l-0.1-0.1h-0.1
2192
+ h-0.1h-0.1h-0.1h-0.1H477h-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.2L476,342l-0.2-0.2l-0.1-0.2l-0.1-0.2v-0.1
2193
+ l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1V340v-0.1v-0.1v-0.1v-0.1v-0.1v-0.2
2194
+ V339l0.1-0.3l0.1-0.3l0.1-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.2-0.3
2195
+ l0.3-0.3l0.5-0.6l0.3-0.3l-0.1-0.3l-0.1-0.2l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1
2196
+ v-0.1l-0.1-0.1v-0.1v-0.1V331v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1l0.1-0.1l0,0v-0.1V330l0.1-0.1v-0.1l0.1-0.1v-0.1l0.1-0.1v-0.1
2197
+ h0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2l0.4-0.2l0.3-0.2l0.4-0.2
2198
+ l0.3-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.8-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1
2199
+ l0.4-0.1l0.4-0.1l0.4-0.1h0.3h0.4h0.3L489.4,325L489.4,325z"
2200
+ />
2201
+ </g>
2202
+ <path
2203
+ fill="#0096FF"
2204
+ d="M447.3,221.9h0.8h0.8h0.7h0.7h0.7h0.7l0.7,0.1l0.7,0.1l0.7,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.5,0.1l0.5,0.1
2205
+ l0.5,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.3,0.3l0.1,0.2l0.1,0.1
2206
+ l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.1l0.1,0.2v0.2l0.1,0.1v0.2l0.1,0.2v0.1v0.1v0.1v0.2v0.3l-0.1,0.2
2207
+ v0.3l-0.1,0.3l-0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3
2208
+ l0.1,0.2l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.3,0.3l0.3,0.3l0.1,0.2l0.1,0.2l0.5,0.8l0.2,0.4
2209
+ l0.1,0.1l0.1,0.1l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.3,0.6l0.4,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.2,0.6l0.3,0.6l0.2,0.6
2210
+ l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.3,1.2l0.7,2.5
2211
+ l0.4,1.2l0.3,1.2l0.4,1.1l0.2,0.4l0.4,0.5l0.4,0.6l0.3,0.6l0.4,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.2,0.6l0.3,0.6l0.2,0.6l0.1,0.3
2212
+ l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3l0.1,0.3v0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.3
2213
+ l-0.1,0.3v0.2l0.1,0.6l0.2,1.1l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5v0.5v0.4v0.3v0.2v0.2l-0.1,0.3
2214
+ l-0.1,0.3l-0.1,0.2v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.2l-0.1,0.2v0.1l-0.1,0.2l-0.2,0.2l0,0l-0.2,0.2l-0.1,0.2l-0.2,0.1h-0.1l-0.1,0.1
2215
+ l-0.1,0.1h-0.1l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.2l-0.2,0.2
2216
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1l-0.1,0.1l-0.2,0.1l0,0h-0.1h-0.2h-0.1h-0.1h-0.1h-0.1h-0.2h-0.1h-0.1H476h-0.1h-0.1h-0.2h-0.2
2217
+ h-0.1h-0.2l-0.2-0.1h-0.1l-0.2-0.1l-0.2-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.3-0.2l-0.2-0.2
2218
+ l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3l-0.3-0.5l-0.3-0.5l-0.2-0.4h-0.1h-0.4H470h-0.4h-0.4h-0.4h-0.4
2219
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1L466,280l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.3-0.2
2220
+ l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.3-0.3l-0.4-0.3l-0.3-0.3
2221
+ l-0.4-0.3l-0.3-0.3l-0.3-0.3l-0.4-0.3l-0.3-0.3l-0.3-0.3l-0.6-0.6l-0.7-0.6l-0.5-0.6l-0.6-0.6l-0.6-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7
2222
+ l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.4-0.7l-0.5-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.2-0.4l-0.1-0.4l-0.1-0.2
2223
+ l0,0h-0.1h-0.1l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2
2224
+ l-0.2-0.2l-0.2-0.2l-0.5-0.4l-0.5-0.5l-0.7-0.6l-0.7-0.7l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.5l-0.4-0.5l-0.4-0.5
2225
+ l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5L433,249l-0.2-0.3l-0.1-0.3l-0.2-0.3l-0.1-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
2226
+ l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3l0,0h-0.1l-0.4-0.4l-0.5-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4
2227
+ l-0.3-0.4l-0.4-0.4l-0.1-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.2-0.2l-0.1-0.2h-0.1l-0.1-0.1l-0.3-0.2l-0.2-0.3l-0.3-0.3
2228
+ l-0.3-0.3l-0.2-0.3l-0.1-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.2l-0.1-0.1v-0.1v-0.2l-0.1-0.2v-0.1l0.1-0.1v-0.1
2229
+ v-0.1v-0.1v-0.1l0.1-0.1v-0.1l0.1-0.2l0.1-0.2l0.1-0.1l0,0l-0.1-0.1l0,0l-0.5-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.4-0.1l-0.3-0.1
2230
+ l-0.4-0.1l-0.4-0.2l-0.3-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.2l-0.1-0.2H420
2231
+ l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.3l0,0v-0.2v-0.2v-0.1v-0.1l0.1-0.1v-0.3l0.1-0.4l0.1-0.4l0.1-0.3l0.2-0.3l0.2-0.3l0.2-0.3
2232
+ l0.2-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.2-0.1
2233
+ l0.3-0.1l0.6-0.2l0.6-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.8-0.1l0.7-0.1l0.7-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1
2234
+ l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1h0.8h0.8h0.8h0.8h0.8h0.8h2.5V221.9z M463.1,271.3l-0.2,0.1l0,0l-0.2,0.1
2235
+ l-0.2,0.1h-0.1h-0.2H462h-0.2l0,0l0,0l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.2,0.2
2236
+ l0.2,0.1l0.3,0.1l0.2,0.1l0.1,0.1l-0.7-0.9l-0.7-1L463.1,271.3l-0.1-0.1l-0.2-0.1L463.1,271.3z"
2237
+ />
2238
+ <path
2239
+ d="M438.7,215.5h0.6h0.6h0.5h0.6h0.5h0.6h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l1,0.1l0.9,0.2l0.9,0.2
2240
+ l0.8,0.2l0.8,0.2l0.7,0.2l0,0h0.1h0.2h0.2h0.2h0.3l0.6-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.8-0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4
2241
+ l0.4,0.1l0.4,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.3,0.2l0.2,0.2l0.2,0.2l0.5,0.5l0.5,0.5l0.4,0.5l0.5,0.5l0.4,0.5
2242
+ l0.5,0.5l0.4,0.5l0.5,0.5l0.4,0.5l0.4,0.5l0.4,0.5l0.5,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6
2243
+ l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.3,0.7l0.4,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7
2244
+ l0.3,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.1,0.8l0.2,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8
2245
+ l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8v0.8v0.8v0.8l-0.1,0.8v0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.4l-0.1,0.4l-0.1,0.5
2246
+ l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.1,0.4l-0.2,0.4l-0.1,0.4l-0.2,0.4l-0.1,0.4
2247
+ l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.2,0.3
2248
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.2,0.3l-0.3,0.2l-0.2,0.2
2249
+ l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.4,0.2l-0.3,0.2l-0.3,0.1l-0.4,0.1l-0.3,0.1
2250
+ l-0.4,0.1l-0.4,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1h-0.4h-0.4h-0.4h-0.3h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4
2251
+ h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.4-0.1l-0.4-0.1
2252
+ l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2
2253
+ l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.3-0.3
2254
+ l-0.4-0.4l-0.4-0.4l-0.3-0.4l-0.4-0.4l-0.3-0.4l-0.4-0.4l-0.3-0.4l-0.4-0.4l-0.3-0.4l-0.3-0.4l-0.4-0.4l-1-1.4l-1-1.3l-0.9-1.3
2255
+ l-0.9-1.3l-0.9-1.3l-0.9-1.3l-0.9-1.3l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6
2256
+ l-0.4-0.6l-0.4-0.6l-0.3-0.6l-0.4-0.6l-0.3-0.6l-0.4-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.2-0.6l-0.3-0.6l-0.2-0.6l-0.2-0.7l-0.2-0.7
2257
+ l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.1-0.7l-0.2-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7
2258
+ l-0.1-0.7l-0.1-0.7v-0.7v-0.7V231l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
2259
+ l-0.1-0.2L419,229l-0.1-0.3l-0.1-0.3v-0.3v-0.3v-0.3l0.1-0.3v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3
2260
+ l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2
2261
+ l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.5-0.2
2262
+ l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.6-0.2l0.5-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.6-0.1h0.6h0.5h0.6h0.6h0.6h0.6h3.2
2263
+ V215.5z M437.6,221.4h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5l-0.4,0.1l-0.5,0.1l-0.4,0.1l-0.5,0.1l-0.4,0.1L432,222l-0.4,0.1l-0.4,0.1
2264
+ l-0.4,0.1l-0.4,0.1l-0.3,0.1l-0.4,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l0,0l0.1,0.2l0.1,0.2
2265
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3v0.3l-0.1,0.3l-0.1,0.7l-0.1,0.6l-0.1,0.6v0.6l-0.1,0.6v0.6v0.6v0.6v0.6v0.6l0.1,0.6v0.6
2266
+ l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.2,0.6l0.1,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6
2267
+ l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.3,0.6l0.2,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.4,0.6l0.3,0.6l0.4,0.6l0.3,0.6
2268
+ l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.8,1.2l0.9,1.2l0.9,1.3l0.9,1.3l0.9,1.3l0.9,1.3l1,1.3l0.3,0.4
2269
+ l0.3,0.4l0.3,0.4l0.3,0.4l0.2,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.2,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.2,0.3
2270
+ l0.3,0.3l0.3,0.3l0.2,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.3,0.2l0.3,0.2
2271
+ l0.2,0.2l0.2,0.2l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
2272
+ l0.2,0.1l0.2,0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2l0.2-0.1l0.2-0.1l0.2-0.1
2273
+ l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.2
2274
+ l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.3l0.1-0.3
2275
+ l0.2-0.3l0.2-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.1-0.3l0.1-0.4l0.2-0.4l0.1-0.4
2276
+ l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.5l0.1-0.3l0.1-0.3l0.1-0.7
2277
+ l0.1-0.6l0.1-0.6l0.1-0.7l0.1-0.7v-0.6v-0.7v-0.7v-0.7l-0.1-0.7V252l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7
2278
+ l-0.2-0.7l-0.1-0.7l-0.2-0.7l-0.1-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.3-0.6l-0.2-0.6
2279
+ l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.4-0.6l-0.3-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.5
2280
+ l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.4l-0.4-0.4
2281
+ l-0.4-0.4l-0.4-0.4l-0.4-0.4h-0.1h-0.2h-0.2h-0.3h-0.2h-0.3h-0.3l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1h-0.4h-0.4H450h-0.4
2282
+ h-0.4h-0.4h-0.4l-0.3-0.1l-0.8-0.2l-0.7-0.2l-0.8-0.2l-0.8-0.1l-0.8-0.1l-0.9-0.1l-0.4-0.1l-0.5-0.1l-0.5-0.1h-0.5h-0.5h-0.5h-0.5
2283
+ h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h0.7V221.4z"
2284
+ />
2285
+ <path
2286
+ fill="#0096FF"
2287
+ d="M481.7,317.6L481.7,317.6h0.3h0.2h0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.2l0.4,0.2
2288
+ l0.4,0.2l0.7,0.4l0.2,0.2l0.2,0.1l0.2,0.1h0.1l0,0l0.2,0.1l0.7,0.2l0.9,0.3l1,0.3l0.6,0.2l0.6,0.2l0.7,0.2l0.7,0.2l0.7,0.3l0.7,0.3
2289
+ l0.7,0.3l0.3,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.3
2290
+ l0.3,0.3l0.2,0.3l0.2,0.3l0,0l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.1l0.5-0.1l0.5-0.1h0.5h0.5h0.4h0.5h0.5h0.5l0.5,0.1l0.4,0.1
2291
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.9,0.2l0.9,0.2l0.4,0.1l0.2-0.1l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.1
2292
+ l0.7-0.1l0.7-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.8-0.1l0.7-0.1h0.5h0.3h0.2h0.3l0.3,0.1l0.2,0.1l0.2,0.1
2293
+ l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.1l0.2,0.1l0.2,0.2l0.2,0.2h0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2h0.1l0.1,0.2l0.1,0.2h0.1
2294
+ l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.2,0.1l0,0l0.2,0.1l0.1,0.1l0,0l0.2,0.1l0.1,0.1l0,0l0.2,0.2l0.2,0.2l0,0l0.1,0.2l0.1,0.2
2295
+ l0.1,0.2l0,0l0.1,0.2v0.2l0.1,0.2l0,0v0.2l-0.1,0.2v0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.2,0.2l0,0l-0.1,0.2
2296
+ l-0.2,0.2l0,0l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1H523l-0.1,0.3
2297
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.2l-0.2,0.3l-0.3,0.5l-0.4,0.5l-0.4,0.4l-0.4,0.4l-0.4,0.4
2298
+ l-0.4,0.4l-0.7,0.8l-0.2,0.2v0.1l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3
2299
+ l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l0,0l-0.1,0.1l-0.2,0.1h-0.1l-0.2,0.1l-0.2,0.1h-0.1
2300
+ l-0.2,0.1h-0.2h-0.2l0,0h-0.3h-0.2h-0.3h-0.1h-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1h-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l0,0
2301
+ l-0.2-0.2l-0.1-0.2l-0.2-0.2l0,0l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2l0,0v-0.1v-0.1l-0.1-0.2v-0.3v-0.2l0.1-0.3v-0.2l0.1-0.3
2302
+ l0.1-0.3l0.1-0.1l-0.4,0.5l-0.4,0.5l-0.3,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.1,0.2l0,0l-0.1,0.1v0.1v0.1l-0.1,0.1l0,0l0.1,0.1
2303
+ l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.4l0.2,0.4l0.1,0.4l0.1,0.4l0.1,0.4v0.4l-0.1,0.4l0.5,0.2
2304
+ l0.8,0.3l0.8,0.3l0.8,0.3l0.2,0.1h0.2l1.3,0.2l0.7,0.1l0.7,0.1l0.7,0.1l0.6,0.1l0.7,0.1l0.6,0.2l0.5,0.2l0.4,0.1l0.5-0.1l0.4-0.1
2305
+ l0.4-0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
2306
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.4,0.2l0.2,0.1l0.2,0.1h0.1l0.2,0.2l0,0
2307
+ l0.2,0.1l0.1,0.1h0.1l0.1,0.2l0.2,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.3l0.1,0.3l0.1,0.3l0,0v0.2v0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
2308
+ l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l0,0l-0.2,0.2l-0.2,0.2l-0.2,0.1l0,0l-0.2,0.1l-0.2,0.1H535h-0.2h-0.1h-0.2h-0.1
2309
+ h-0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.4,0.1l-0.2,0.1h-0.3h-0.3l-0.5,0.1h-0.6h-0.5h-0.6l-1.2,0.1h-0.5h-0.5h-0.4h-0.3h-0.2h-0.4
2310
+ l-0.7,0.1l-0.8,0.1l-0.8,0.1l-0.9,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5l-0.5-0.1h-0.3h-0.1
2311
+ l-0.9,0.4l-1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-0.7,0.2l-0.6,0.2l-0.6,0.2l-0.7,0.2l-0.7,0.2l-0.6,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2
2312
+ l-0.7,0.2l-0.6,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.6,0.1h-0.7h-0.7h-0.6h-0.3h-0.3h-0.4h-0.3h-0.3H496
2313
+ h-0.3h-0.3l-0.3-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.2-0.2
2314
+ l-0.3-0.2l-0.2-0.2l-0.3-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l0,0h-0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1
2315
+ l-0.5,0.1h-0.4H487h-0.4h-0.4h-0.4h-0.5h-0.8h-0.9h-0.8H482h-0.8h-0.9h-0.8l-0.8-0.1l-1.5-0.1l-1.5-0.1l-1.4-0.1h-0.7H473h-0.6
2316
+ h-0.5h-0.2h-0.2h-0.6h-0.7l-0.8,0.1l-0.8,0.1l-0.8,0.1H467h-0.4h-0.4h-0.4h-0.4H465h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.2-0.1
2317
+ l-0.3-0.1l-0.3-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.1-0.2l-0.2-0.2H461l-0.1-0.2l-0.1-0.2v-0.1
2318
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.1l-0.1-0.2v-0.2v-0.2v-0.1v-0.3v-0.3v-0.1l0.1-0.2l0.1-0.2V356l0.1-0.2l0.1-0.2v-0.1l0.1-0.1
2319
+ l0.1-0.1v-0.1l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.2l0.2-0.1l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.1l0.4-0.1l0.4-0.1
2320
+ l0.5-0.1l0.4-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.6-0.1l1.1-0.2l0.6-0.1l0,0l0.1-0.2l0.1-0.2l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4
2321
+ l0.3-0.4l0.2-0.4l0.3-0.4l0.3-0.4l0.4-0.4l0.3-0.3l0.3-0.4l0.3-0.3l0.4-0.3l0.3-0.3l0.3-0.3l0.4-0.3l0.3-0.3l0.3-0.3l0.3-0.3
2322
+ l0.3-0.2l0.3-0.2l0.4-0.3l0.4-0.3l0.4-0.3l0.5-0.3l0.6-0.3l0.5-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.4-0.2l0,0l-0.3-0.1l-0.3-0.1
2323
+ l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.2-0.2l-0.3-0.2l-0.3-0.2
2324
+ l-0.2-0.2l-0.3-0.2l-0.2-0.2l-0.3-0.2l-0.2-0.2l-0.3-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.1h-3.7
2325
+ h-0.3h-0.2l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.2-0.2l-0.1-0.3l-0.1-0.3
2326
+ l-0.1-0.3v-0.3v-0.3v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.3-0.1l0.2-0.1
2327
+ l0.3-0.1h0.2h0.3h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2l0.2-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.6-0.2l0.5-0.2l0.6-0.2
2328
+ l0.6-0.2l0.3-0.1l-0.1-0.2v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.3l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1
2329
+ l0.2-0.1l0.3-0.1h0.3h0.3h0.2h0.1h0.4h0.4l0.5-0.1l0.5-0.1l0.5-0.1h0.2l0.1-0.1l0.3-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2
2330
+ l0.3-0.2l0.3-0.2l0.2-0.2l-0.4-0.1l-0.5-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.3-0.2
2331
+ l-0.3-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.1l-0.1-0.2
2332
+ l-0.1-0.2l-0.1-0.1l-0.1-0.2v-0.2l-0.1-0.1v-0.2v-0.2l-0.1-0.1v-0.2v-0.2l0.1-0.1v-0.2v-0.2l0.1-0.2l0.1-0.2v-0.1l0.1-0.1l0,0
2333
+ l0.1-0.2l0.1-0.2l0,0l0.1-0.2l0.1-0.2l0,0l0.1-0.1l0.2-0.1l0,0l0.2-0.2l0.2-0.1l0,0l0.2-0.1l0.2-0.1h0.1l0.2-0.1l0.2-0.1l0,0
2334
+ l0.2-0.1l0.2-0.1l0,0h0.2h0.2h0.1h0.3L481.7,317.6z M492.7,346.7l-1.1,0.8l-1.1,0.8l-1.1,0.8l-1.2,0.8l-1.1,0.8l-0.8,0.6l0.4-0.1
2335
+ l0.6-0.2l0.7-0.2l0.5-0.2l0.2-0.1l0.2-0.2l0.7-0.4l0.6-0.4l0.6-0.4l0.6-0.4l0.6-0.4l0.9-0.7l0,0v-0.1v-0.1v-0.1v-0.1v-0.1V347v-0.1
2336
+ v-0.1l-0.1-0.1v-0.1L492.7,346.7L492.7,346.7L492.7,346.7L492.7,346.7z M491.1,334.8v0.3l0.1,0.3v0.3l0,0h0.2l0.3,0.1l0.2,0.1
2337
+ l0.2,0.1l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.1-0.1h-0.2h-0.4h-0.5h-0.4h-0.4H491L491.1,334.8z"
2338
+ />
2339
+ <path
2340
+ d="M521.4,320.1h0.5h0.5l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.4,0.1l0.4,0.2l0.2,0.1l0.2,0.1l0.2,0.1
2341
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.2,0.4l0.2,0.4
2342
+ l0.1,0.4l0.2,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4v0.4v0.4v0.4v0.3l-0.1,0.4l-0.1,0.3l-0.1,0.3
2343
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
2344
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.4,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.3l-0.5,0.3l-0.5,0.3
2345
+ l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.9,0.6l-0.9,0.6l-0.8,0.5l-0.4,0.3l-0.4,0.3l-0.4,0.2l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.2,0.2l-0.2,0.2
2346
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l0,0l0,0h-0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0
2347
+ l0,0v0.1v0.1l0,0l0.1,0.1v0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1h0.2h0.3h0.3h0.4l0.8,0.1
2348
+ l0.9,0.1l1.1,0.1l2.4,0.1l1.2,0.1l1.4,0.1l1.3,0.1l1.4,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1
2349
+ l0.7,0.1l0.7,0.1l0.6,0.1l0.7,0.1l0.6,0.2l0.7,0.2l0.6,0.2l0.5,0.2l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.3,0.1
2350
+ l0.2,0.1l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3
2351
+ l0.1,0.3l0.1,0.3l0.1,0.4l0.1,0.4l0.1,0.4v0.4v0.4l-0.1,0.4l-0.1,0.4l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3
2352
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.4,0.4l-0.3,0.4l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3
2353
+ l-0.4,0.3l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
2354
+ l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1h-0.4h-0.4H530h-0.4h-0.8H528h-0.8h-0.8h-0.8h-1.5h-1.5h-0.7h-0.7h-0.7h-0.7h-0.7
2355
+ h-0.3h-0.4l-2.6,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.1l-1.4,0.1l-1.4,0.1
2356
+ l-1.3,0.1H486h-1.4h-1.3h-1.4h-1.4h-1.4h-1.3h-1.4H475h-0.3h-0.4h-0.4h-0.4l-1.1,0.1l-1.2,0.1l-1.3,0.1l-1.4,0.1l-0.7,0.1h-0.7
2357
+ h-0.8h-0.7h-0.8H464h-0.7h-0.8h-0.7h-0.7h-0.4h-0.4h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.4-0.1l-0.4-0.1
2358
+ l-0.3-0.1l-0.4-0.1l-0.3-0.1l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3l-0.2-0.3
2359
+ l-0.1-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3l-0.1-0.3v-0.3l0.1-0.3v-0.3l0.1-0.3l0.1-0.3
2360
+ l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.4
2361
+ l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.5-0.4l0.4-0.4l0.5-0.4l0.5-0.3l0.5-0.3l0.4-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3
2362
+ l0.5-0.3l1-0.6l1-0.6l0.9-0.6l1-0.6l0.9-0.5l1.8-1l0.8-0.5l0.7-0.4l0.3-0.2l0.3-0.2l0.3-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.1-0.1l0,0
2363
+ h0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0h-0.1l0,0l0,0h-0.1l0,0h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2364
+ l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.2l-0.2-0.2l-0.3-0.2l-0.3-0.2l-0.4-0.2l-0.3-0.1l-0.4-0.1l-0.4-0.1
2365
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.8-0.3l-0.8-0.3l-1.6-0.5l-0.8-0.2l-0.7-0.2l-0.7-0.2l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.4-0.1
2366
+ l-0.3-0.1l-0.3-0.2l-0.4-0.2l-0.3-0.2L457,339l-0.3-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.1l-0.1-0.2v-0.1
2367
+ l-0.1-0.2l-0.1-0.2v-0.1l-0.1-0.2l-0.1-0.2v-0.1v-0.2v-0.2v-0.1v-0.2v-0.2v-0.1l0.1-0.2v-0.2l0.1-0.1v-0.2l0.1-0.2l0.1-0.1l0.1-0.1
2368
+ l0.1-0.1l0.1-0.1l0.1-0.2l0.1-0.1l0.2-0.2l0.1-0.1l0.2-0.2l0.4-0.4l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3
2369
+ l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.2l0.4-0.2l0.4-0.2l0.4-0.2
2370
+ l0.5-0.2l0.4-0.2l0.5-0.2l0.4-0.2l0.5-0.2l0.4-0.2l0.5-0.2l0.4-0.2l0.5-0.2h0.1L470,325l-0.3-0.3l-0.2-0.3l-0.3-0.3l-0.1-0.2
2371
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.2l-0.1-0.3v-0.3v-0.3v-0.2V321l0.1-0.2l0.1-0.2l0.1-0.2
2372
+ l0.1-0.3l0.1-0.3l0.1-0.2l0.1-0.3l0.2-0.4l0.2-0.3l0.3-0.3l0.2-0.3l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2
2373
+ l0.3-0.2l0.3-0.2l0.3-0.1l0.4-0.1l0.3-0.1l0.4-0.1l0.6-0.3l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l1.2-0.3
2374
+ l1.1-0.3l0.4-0.1l0.4-0.1h0.5h0.4h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.4,0.2l0.4,0.2
2375
+ l0.3,0.2l0.4,0.2l0.3,0.2l0.3,0.2l0.4,0.2l0.6,0.4l0.6,0.4l0.7,0.4l0.6,0.4l0.6,0.4l0.5,0.4l0.6,0.4l1.1,0.8l0.5,0.4l0.5,0.4
2376
+ l0.5,0.4l0.5,0.3l0.5,0.3l0.5,0.3l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.2,0.1h0.1h0.1h0.1l0,0h0.1
2377
+ h0.1h0.2h0.2h0.2h0.3h0.2h0.3l0.7-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.9-0.1l2-0.3l1-0.2l1-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1-0.1
2378
+ h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5L521.4,320.1z M485.3,319L485.3,319L485.3,319h-0.2l-1.1,0.3l-1.2,0.3l-0.6,0.2l-0.6,0.2l-0.6,0.2
2379
+ l-0.6,0.2l-0.6,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.1h0.1l0.2,0.2l0.3,0.2l0.4,0.2
2380
+ l0.4,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3h0.1l0.3,0.1l0.3,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2
2381
+ l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2
2382
+ l-0.2,0.2l-0.3,0.2l-0.2,0.1l-0.3,0.1H480h-0.1l-0.3,0.1l-0.7,0.1l-1.9,0.3l-1.1,0.2l-0.9,0.2l-0.4,0.1l-0.4,0.1H474h-0.1l-0.4,0.1
2383
+ l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
2384
+ l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.2,0.1l0.5,0.1l1.6,0.5l0.8,0.3l0.9,0.3l0.4,0.2l0.5,0.2
2385
+ l0.4,0.2l0.4,0.2l0.5,0.2l0.4,0.2l0.5,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.2,0.2
2386
+ l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.2,0.2l0.1,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3
2387
+ l0.1,0.3l0.1,0.3v0.3l0.1,0.3v0.3v0.3v0.3l-0.1,0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.2
2388
+ l-0.2,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.2l-0.8,0.5
2389
+ l-0.8,0.5l-1.8,1l-0.9,0.5l-0.9,0.5l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.4,0.3l-0.5,0.3l-0.5,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3
2390
+ l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2391
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1v0.1l0,0l0,0h-0.1l0,0l0,0l0,0h0.1v0.1h0.1l0.1,0.1v0.1h0.1h0.1h0.1h0.1h0.1h0.1
2392
+ h0.2h0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.3h0.2h0.6h0.7h0.6h0.7h0.7h0.7h0.7h0.7h0.7h0.7l1.4-0.1l1.3-0.1l1.2-0.1l1.1-0.1h0.5
2393
+ h0.5h0.5h0.5h1.3h1.4h1.3h1.3h1.3h1.4h1.3h1.4h1.3l1.3-0.1l1.4-0.1l1.3-0.1l2.6-0.1l2.7-0.2l2.7-0.2l2.7-0.2l2.6-0.2l2.7-0.2
2394
+ l2.7-0.2l2.6-0.2l2.7-0.2l2.7-0.2h0.4h0.4h0.8h0.8h0.8h0.8h0.8h1.5h1.5h0.7h0.7h0.7h0.7h0.7h0.4h0.3h0.3h0.4h0.3h0.3l0.3-0.1
2395
+ l0.3-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1
2396
+ l0.2-0.1l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.3l0.2-0.3l0.1-0.1l0.1-0.1l0.1-0.1
2397
+ l0.1-0.1l0.1-0.1v-0.1l0,0h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.2-0.1
2398
+ l-0.2-0.1l-0.2-0.1l-0.4-0.1l-0.4-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.7-0.1
2399
+ l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-1.3-0.1l-1.3-0.1l-1.2-0.1l-1.3-0.1l-2.4-0.1l-1.1-0.1l-1.1-0.1l-0.9-0.1h-0.5l-0.4-0.1
2400
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.1h-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1
2401
+ l-0.4-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
2402
+ L510,346l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3v-0.3v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.3l0.1-0.3
2403
+ l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.5-0.3
2404
+ l0.4-0.3l0.5-0.3l0.4-0.3l0.9-0.6l0.9-0.6l0.9-0.6l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.3-0.3l0.4-0.3
2405
+ l0.3-0.3l0.1-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1v-0.1
2406
+ l0.1-0.1l0.1-0.1l0.1-0.1v-0.1l0.1-0.1v-0.1l0.1-0.1V330v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.2l-0.1-0.2v-0.2l-0.1-0.2l-0.1-0.2
2407
+ l-0.1-0.2L524,328l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.1h-0.1l0,0h-0.1l-0.2-0.1l-0.1-0.1L523,327h-0.2h-0.2h-0.3H522h-0.4h-0.3h-0.4
2408
+ h-0.4h-0.4h-0.4h-0.4h-0.4h-0.5H518h-0.5l-0.9,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-0.9,0.1l-2,0.3l-0.9,0.1l-0.9,0.1l-0.8,0.1
2409
+ l-0.8,0.1l-0.8,0.1h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.4-0.1l-0.3-0.1
2410
+ l-0.3-0.1l-0.4-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.6-0.4l-0.5-0.4l-0.6-0.4l-0.6-0.4l-0.5-0.4l-0.6-0.4l-1.1-0.8
2411
+ l-0.5-0.4l-0.5-0.4l-0.6-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.3l-0.5-0.3l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1L487,320
2412
+ l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1h-0.2h-0.2h-0.1h-0.1h-0.1h-0.1h-0.2V319z"
2413
+ />
2414
+ <path
2415
+ fill="#25B3FF"
2416
+ d="M486.3,321.2h0.2h0.1h0.2h0.1h0.2h0.1l0.1,0.1l0.2,0.1l0.1,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.3,0.2l0.2,0.2
2417
+ l0.1,0.1l0,0h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.4,0.1h0.1
2418
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2
2419
+ l0.1,0.2l0.1,0.2v0.2l0.1,0.1h0.2l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.5,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.3,0.1
2420
+ l0.2,0.1l0.3,0.1l0.3,0.1l0.2,0.2l0.3,0.2l0.1,0.1h0.2h0.3h0.3h0.3h0.3h0.3h0.3h0.3l0.3,0.1l0.4,0.1l0.3,0.1l0.3,0.1l0.4,0.1
2421
+ l0.3,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.3,0.3l0.3,0.3l0.2,0.3l0.2,0.4l0.2,0.4l0.2,0.4l0.1,0.4l0.1,0.4l0.1,0.3v0.2v0.2v0.2v0.3v0.3
2422
+ l-0.1,0.2l-0.1,0.2v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2423
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.2,0.1l-0.3,0.1l-0.3,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1
2424
+ l-0.5,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.5,0.1l-0.4,0.1h-0.4h-0.4H500l-0.9,0.1h-0.3l0.1,0.1l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2
2425
+ v0.2l0.1,0.2v0.2v0.1v0.2l-0.1,0.2v0.2v0.2l-0.1,0.1v0.1l-0.1,0.1L499,341v0.1l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.2,0.3l-0.1,0.2
2426
+ l-0.2,0.2l-0.2,0.2l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.8,0.6l-0.9,0.6l-0.9,0.6l-0.8,0.5
2427
+ l-0.8,0.5l-0.2,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.2l0.1,0.1l0.1,0.2l0,0l0.1,0.1v0.1l0.1,0.1l0,0v0.1l0.1,0.1v0.2l0,0
2428
+ l-0.1,0.2v0.2l0,0v0.2l-0.1,0.2l0,0l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2429
+ l-0.1,0.2l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.5,0.5l-0.5,0.5l-1.1,0.9l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.2,0.2l-0.2,0.2l-0.1,0.1
2430
+ l-0.2,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2l-0.2-0.1l-0.2-0.1
2431
+ l-0.2-0.1l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
2432
+ l-0.1-0.2l-0.1-0.2V354v-0.2v-0.2v-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.2-0.1
2433
+ l0.2-0.3l0.3-0.3l0.5-0.5l0.1-0.1l-0.1-0.1L482,350l-0.1-0.1l0,0l-0.2-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1
2434
+ l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0v-0.2l-0.1-0.2v-0.2l0,0V348v-0.2v-0.1l0,0v-0.2v-0.2l0.1-0.2l0,0
2435
+ l0.1-0.2l0.1-0.2l0.1-0.2v-0.1l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1
2436
+ l0.4-0.2l0.4-0.2l0.4-0.2l0.7-0.4l0.7-0.3l0.2-0.1l0.2-0.1l0.5-0.3l0.5-0.3l0.6-0.4l0.3-0.2h-0.1H487h-0.4l-0.4-0.1l-0.4-0.1
2437
+ l-0.4-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.1
2438
+ l-0.1-0.1l-0.1-0.1l-0.1-0.2h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l0,0v-0.1h-0.1h-0.1l-0.5,0.2l-0.5,0.2l-0.5,0.2
2439
+ l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1h-0.2h-0.2h-0.3h-0.2h-0.3h-0.3l-0.3-0.1l-0.4-0.1l-0.2-0.1l-0.2-0.1
2440
+ l-0.1-0.1h-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1L474,339l-0.1-0.1l-0.1-0.1
2441
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.2l-0.1-0.1l-0.8-0.2l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1
2442
+ l-0.1-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2
2443
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2v-0.2v-0.2v-0.2v-0.2l0.1-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0,0
2444
+ l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.2-0.1h0.1l0.1-0.1l0.2-0.1l0.2-0.1h0.1h0.2
2445
+ h0.1h0.2h0.1h0.2h0.2h0.6h0.3h0.1l0.2-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.5-0.1l0.4-0.1h-0.1v-0.2L475,330l0,0v-0.2l-0.1-0.2v-0.2v-0.2
2446
+ V329l0.1-0.1v-0.1v-0.2l0.1-0.1v-0.1l0.1-0.2v-0.1l0.1-0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.3l0.2-0.4
2447
+ l0.3-0.3l0.2-0.3l0.3-0.3l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.4-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
2448
+ l0.4-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.2l0,0l0.1-0.2v-0.1l0.1-0.2v-0.2h0.1v-0.1l0.1-0.1l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0.1-0.1
2449
+ l0.1-0.1h0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.2-0.1l0,0l0.1-0.1l0.2-0.1l0.1-0.1l0.2-0.1l0.1-0.1h0.1l0.2-0.1l0.1-0.1h0.2h0.2h0.2l0,0
2450
+ h0.2h0.2L486.3,321.2z"
2451
+ />
2452
+ <path
2453
+ fill="#25B3FF"
2454
+ d="M455.7,235.5L455.7,235.5h0.2h0.1h0.1h0.2l0,0h0.1h0.2l0.1,0.1l0,0l0.2,0.1l0.1,0.1l0.2,0.1l0,0l0.1,0.1
2455
+ l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1v0.1h0.1v0.1
2456
+ l0.1,0.1v0.1l0,0l0.1,0.2v0.2v0.2v0.2v0.2v0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.1h0.1h0.2h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1
2457
+ l0.1,0.1l0.1,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1
2458
+ l0.1,0.1l0,0l0.1,0.2l0.1,0.2l0,0l0.1,0.1l0.1,0.1v0.1l0.1,0.1v0.1l0.1,0.2v0.3v0.2v0.1v0.1v0.1v0.1l-0.1,0.2v0.2l-0.1,0.2
2459
+ l-0.1,0.4l-0.2,0.5l-0.2,0.5l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.2l0,0l0.1,0.1l0.1,0.2
2460
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2v0.2l0.1,0.2v0.2l-0.1,0.2v0.2l-0.1,0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1
2461
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1h-0.2h-0.2H459
2462
+ h-0.2h-0.2h-0.2h-0.1h-0.1H458h-0.1h-0.1h-0.2h-0.1l-0.2-0.1h-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1
2463
+ h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2v-0.1l-0.1-0.1l-0.1-0.1
2464
+ l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.3l-0.1-0.3V249v-0.3v-0.4l0.1-0.4v-0.4l0.1-0.1h-0.1l-0.6,0.3l-0.7,0.3l-0.7,0.3l-0.4,0.2
2465
+ l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.5,0.1l-0.5,0.1l-0.4,0.1l-0.5,0.1L447,250h-0.5H446h-0.5h-0.3
2466
+ H445h-0.2h-0.2h-0.3l-0.2-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2467
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.1L441,248l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1
2468
+ l-0.1-0.1l-0.1-0.1l0,0v-0.1h-0.1h-0.1h-0.2H440h-0.2h-0.1h-0.1h-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1
2469
+ l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1
2470
+ l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1v-0.2v-0.1v-0.1l0,0l0.1-0.2V244l0.1-0.2l0,0l0.1-0.1v-0.1l0.1-0.1l0.1-0.1
2471
+ l0.1-0.1l0.1-0.1l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.3l0.3-0.3l0.3-0.2l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.6-0.4l0.7-0.4l0.7-0.4
2472
+ l0.5-0.3H442l-0.8,0.1h-0.4h-0.5h-0.4h-0.4h-0.4h-0.5h-0.4h-0.4h-0.4h-0.5l-0.4-0.1l-0.4-0.1l-0.5-0.1l-0.4-0.1l-0.2-0.1l-0.2-0.1
2473
+ l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1
2474
+ l-0.1-0.1h-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.1v-0.1l-0.1-0.1l0,0l0,0l-0.4-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.2-0.1
2475
+ l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2476
+ v-0.1l-0.1-0.2l-0.1-0.2L429,234l-0.1-0.2v-0.1v-0.2l-0.1-0.2v-0.2v-0.2v-0.1v-0.2v-0.2l0.1-0.2V232l0.1-0.1v-0.1l0.1-0.1l0.1-0.1
2477
+ v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.2l0.3-0.3l0.2-0.2l0.2-0.2l0.3-0.2l0.2-0.2l0.2-0.2l0.3-0.1
2478
+ l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.2-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.5-0.1h0.6
2479
+ h0.5h0.6l1.1-0.1l2.1-0.1l0.9-0.1h0.4h0.4h0.3h0.3h0.2h0.2l0.8-0.2l0.8-0.2l0.8-0.2l0.8-0.2l0.1-0.1l0.2-0.1l0.2-0.1l0.5-0.2
2480
+ l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.1l0.2-0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2l0.2,0.1l0.1,0.1l0.2,0.1l0.2,0.1
2481
+ l0.1,0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2l0.1,0.2
2482
+ v0.2v0.2v0.2v0.2l-0.1,0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2483
+ l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l0,0l-0.2,0.1L454,231l-0.2,0.1l-0.4,0.2l-0.6,0.2l-0.7,0.3l-0.5,0.2l0,0l0.1,0.2v0.2v0.2v0.2
2484
+ v0.2l-0.1,0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1h0.1l0.1,0.1
2485
+ l0.1,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.2l0.1,0.2v0.1l0.1,0.1v0.1l0.1,0.1v0.1v0.1v0.1
2486
+ l0.2-0.1h0.1h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.1L455.7,235.5z M458.8,246.9L458.8,246.9h-0.2H458.8z"
2487
+ />
2488
+ <g>
2489
+ <g transform="matrix(1,0,0,1,454.698,46.683)">
2490
+ <path
2491
+ d="M343.4,257.1h0.9h0.9h0.9h0.9h0.5h0.2l0.3-0.1l0.4-0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.3h0.3h0.3h0.3h0.3h0.3h0.3
2492
+ l0.3,0.1l0.7,0.1l0.7,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.4,0.1l0.6,0.1l0.6,0.1h0.2h0.2h0.3h0.3l0.8,0.1
2493
+ l0.9,0.1l1,0.1l1.1,0.1l1.1,0.2l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.5,0.1l0.5,0.2l0.5,0.2
2494
+ l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.1,0.1l0.2,0.3
2495
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.3v0.2v0.2v0.2v0.1v0.2v0.2l0,0v0.3v0.3l0,0v0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2
2496
+ l-0.1,0.2l0,0l-0.2,0.2l-0.2,0.2l-0.2,0.2l0,0l-0.2,0.1l-0.2,0.1l-0.2,0.1l0,0l-0.2,0.1l-0.2,0.1l0,0H374h-0.2l0,0h-0.3h-0.1
2497
+ h-0.2H373h-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.5-0.2l-0.5-0.2l-1.1-0.5l-0.5-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1
2498
+ l-0.2-0.1l-0.2-0.1h-0.1h-0.1h-0.1l0,0h-0.3h-0.4h-0.4h-0.3h-0.3h-0.3h-0.3H365l-0.3-0.1l-0.3-0.1l-0.7-0.1l-0.7-0.1l-0.6-0.2
2499
+ l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-1.2-0.4l-0.5-0.2l-0.4-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1
2500
+ l-0.7-0.1l-0.7-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1H349l-0.4,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1
2501
+ l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-1.4,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1h-1.5h-1.5h-1.5h-1.5h-2.4h-0.9l0,0
2502
+ l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.3l-0.7,0.3l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
2503
+ l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
2504
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1h0.1l0.3,0.1l0.3,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.9,0.1l1,0.1l1,0.1
2505
+ l1,0.1l2,0.2l1,0.1l1,0.1l0.9,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1
2506
+ l0.4,0.2l0.4,0.2l0.2,0.1l0.3,0.2h0.1l0.1,0.1l0.1,0.1l0.4,0.2l0.4,0.2l0.5,0.2l0.5,0.3l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2
2507
+ l0.3,0.2l0.3,0.2l0.3,0.3l0.3,0.3l0.3,0.3l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3
2508
+ l0.1,0.3v0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2
2509
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1
2510
+ l-0.5,0.2l-0.5,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1
2511
+ l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-1.4,0.2l-1.4,0.1l-1.4,0.1l-1.3,0.1L312,289l-1.2,0.1
2512
+ l-1.2,0.1l-1.1,0.1h-1l-1.8,0.1h-1.3h-0.5h-0.2h-0.1h-0.3H303h-0.3l-0.3-0.1l-0.3-0.1l-0.3-0.1l0,0l-0.3-0.2l-0.2-0.2l-0.2-0.2
2513
+ l-0.2-0.2l-0.2-0.2l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3v-0.3V286l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0,0l0.2-0.2l0.2-0.2
2514
+ l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0,0h0.2h0.2h0.2h0.4h0.5h1.3l1.7-0.1h1l1.1-0.1l1.1-0.1l1.2-0.1l1.2-0.1
2515
+ l1.3-0.1l1.3-0.1l1.3-0.1l1.3-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1
2516
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1l0.4-0.1l0.4-0.2l0.3-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0,0
2517
+ h-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.4-0.2l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.2-0.1l0,0h-0.1h-0.1
2518
+ l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1h-0.4l-0.9-0.1l-0.9-0.1l-1-0.1
2519
+ l-2-0.2l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.4-0.1l-0.4-0.1
2520
+ l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2
2521
+ l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3v-0.3v-0.3v-0.3l0.1-0.3l0.1-0.3
2522
+ l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.3l0.3-0.3
2523
+ l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0,0l-1.4-0.1l-1.4-0.1l-1.3-0.1l-1.3-0.1l-1.2-0.2l-0.4-0.1h-0.5l-1.1-0.1
2524
+ l-1.2-0.1l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1
2525
+ l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.3
2526
+ l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4V255
2527
+ v-0.5V254v-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2
2528
+ l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2
2529
+ l0.4-0.2l0.4-0.2l0.4-0.2l0.8-0.4l0.8-0.4l1.4-0.7l0.6-0.3l0.5-0.3l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
2530
+ l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.3h0.3h0.6h0.6h0.6h0.5h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
2531
+ l0.5,0.1l0.5,0.1l1,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1
2532
+ l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1h0.7h0.7h0.8h0.8h0.8l1.5,0.1h1.5h1.5h1.5h1.5h3h2.9h1.1h1.1h1.1l1.1-0.1l1.1-0.1l1.1-0.1
2533
+ l1.1-0.1l1.1-0.1l1.1-0.1l1.1-0.2l1.1-0.2l1.1-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.1h0.1
2534
+ l0.2-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.6-0.3l0.6-0.3l0.6-0.3l0.7-0.3l0.6-0.3l0.6-0.3l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
2535
+ l0.4-0.1l0.3-0.1h0.3h0.2h0.2h0.2h0.1h0.2h0.2l0,0l0.3,0.1l0.3,0.1l0,0l0.2,0.1l0.2,0.1l0.2,0.2l0,0l0.2,0.2l0.2,0.2l0.2,0.2l0,0
2536
+ l0.1,0.2l0.1,0.2l0.1,0.3l0,0l0.1,0.2v0.2v0.2l0,0v0.3v0.3v0.1v0.2v0.2v0.1l-0.1,0.3l-0.1,0.2l-0.1,0.3l-0.1,0.2l-0.1,0.2
2537
+ l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.3h-0.2l0,0l-0.6,0.3l-0.6,0.3
2538
+ l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.4,0.2l-0.4,0.2l-0.4,0.1L357,248l-0.4,0.1l-0.3,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1
2539
+ l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.1l-1.2,0.1l-1.2,0.1l-1.2,0.1l-1.2,0.1h-1.2
2540
+ h-1.2h-1.2h-2.9h-3h-1.5h-1.6h-1.6h-1.6l-1.6-0.1h-0.8h-0.8h-0.8h-0.8l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1
2541
+ l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-1-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.4-0.1l-0.4-0.1
2542
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1H304h-0.4h-0.4h-0.4h-0.4H302h-0.2h-0.2h-0.2h-0.2H301h-0.2h-0.2h-0.2h-0.2H300l-0.2,0.1l-0.2,0.1
2543
+ l-0.2,0.1l-0.2,0.1L299,248l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.6,0.3l-0.7,0.3l-1.4,0.6l-0.7,0.3l-0.7,0.4l-0.4,0.2l-0.3,0.2
2544
+ l-0.3,0.2L293,251l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1
2545
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1v0.1v0.1l0,0l0,0l0,0l0,0l0,0l0,0v0.2v0.2v0.2v0.2v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1
2546
+ v0.1v0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
2547
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1
2548
+ l0.6,0.1l1.1,0.1l1.1,0.1l0.5,0.1l0.5,0.1l1.2,0.1l1.2,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1
2549
+ l1.4,0.1l1.5,0.1h1.5h1.4h0.1l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l1-0.1l0.9-0.1
2550
+ l1-0.1l1-0.1h0.9h0.9h0.9h0.9h0.9h0.9h0.9L343.4,257.1z M303.7,289.4L303.7,289.4L303.7,289.4L303.7,289.4z"
2551
+ />
2552
+ </g>
2553
+ <g transform="matrix(1,0,0,1,381.866,45.2348)">
2554
+ <path
2555
+ d="M-30.6-41.7h1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.2l1,0.2l1,0.2l1,0.2l1,0.2l1,0.3l1,0.3l0.5,0.2
2556
+ l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2
2557
+ l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.2l0.9,0.7l0.8,0.8l0.7,0.9l0.6,1l0.5,1l0.3,1.1l0.2,1.1l0.1,1.1
2558
+ l-0.1,1.1l-0.2,1.1L-2-23.3l-0.5,1l-0.6,0.9l-0.7,0.8l-0.8,0.8l-0.9,0.6l-1,0.5l-1,0.4L-8.6-18l-1.1,0.1h-1.1l-1.1-0.2l-1.1-0.3
2559
+ l-1-0.4l-1-0.6l-0.3-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1
2560
+ l-0.3-0.1l-0.3-0.1L-19-21l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.6-0.2l-0.6-0.2
2561
+ l-0.6-0.2l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1h-0.7h-0.7h-0.7h-0.7h-0.7h-0.7h-0.7h-0.7
2562
+ h-0.7l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.6,0.2l-0.6,0.2
2563
+ l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
2564
+ l-0.3,0.1l-0.3,0.2l-0.3,0.1l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
2565
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.7,0.7l-0.7,0.7l-1.4,1.4l-1.5,1.4
2566
+ l-1.5,1.4l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.6,0.7l-0.3,0.3L-66.5-3l-0.3,0.4
2567
+ l-0.3,0.3L-67.4-2l-0.3,0.3L-68-1.4l-0.3,0.3l-0.3,0.3l-0.2,0.3L-69-0.2l-0.2,0.3l-0.2,0.3l-0.2,0.3L-69.8,1L-70,1.3l-0.2,0.3
2568
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3L-71,2.8l-0.1,0.3l-0.1,0.3l-0.1,0.3L-71.4,4l-0.1,0.3l-0.1,0.3l-0.1,0.3l0,0.1v0.2v0.1v0.2v0.4v0.4
2569
+ l-0.1,0.5l-0.1,1.3l-0.2,3l-0.1,1.7l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.2,0.9l-0.2,0.9l-0.1,0.5
2570
+ l-0.1,0.4l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.5l-0.3,0.6l-0.4,0.6l-0.4,0.6l-0.7,0.4
2571
+ l-0.3,0.4l-0.6,0.6l-0.4,0.3l-0.5,0.4L-79,30l-0.5,0.3l-0.4,0.2l-1.9,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,1l-1.7,1
2572
+ l-1.7,1l-1.7,1l-1.7,1l-1.7,1l-1.7,1l-1.7,1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1
2573
+ l-1.7,1.1l-1.7,1.1l-1.7,1.2l-1.7,1.2l-3.4,2.3l-3.4,2.4l-3.4,2.4l-6.9,4.8l-3.5,2.4l-3.5,2.4l-3.5,2.4l-3.5,2.4l-1.8,1.2
2574
+ l-1.8,1.2l-1.8,1.2l-1.8,1.2l-1.8,1.2l-1.8,1.2l-1.8,1.2l-1.8,1.2l-1.8,1.1l-1.8,1.1l-1.8,1.1L-177,93l-1.8,1.1l-1.8,1.1
2575
+ l-1.8,1.1l-1.8,1.1l-1.8,1.1l-1.8,1.1l-1.9,1l-1.8,1l-4.2,2.4l-4.2,2.4l-4.2,2.4l-4.2,2.4l-4.2,2.4l-4.2,2.4l-2.1,1.2l-2.1,1.2
2576
+ l-2.1,1.2l-2.1,1.2l-2.1,1.2l-2.1,1.2l-2.1,1.2l-2.1,1.2l-2.1,1.2l-2.1,1.3l-2.1,1.3l-2.1,1.3l-2.1,1.3l-2.1,1.3l-2.1,1.3
2577
+ l-2.1,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.4l-2,1.4
2578
+ l-2,1.4l-2,1.4l-2,1.4l-2,1.4l-2,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4
2579
+ l-1.9,1.4l-1.9,1.5l-1.9,1.5l-1.9,1.5l-1.9,1.5l-1.9,1.5l-1,0.8l-1,0.8l-1,0.8l-1,0.8l-1,0.7l-1,0.7l-1,0.7l-1,0.7l-1,0.7l-1,0.7
2580
+ l-1,0.7l-1,0.7l-2,1.3l-2,1.3l-4,2.6l-2,1.3l-1,0.6l-1,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.7
2581
+ l-0.9,0.7l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2v0.4l-0.1,1.1l-0.2,1.1l-0.3,1.1l-0.5,1l-0.6,0.9
2582
+ l-0.7,0.9l-0.8,0.8l-0.9,0.7l-1,0.5l-1,0.4l-1.1,0.3l-1.1,0.1h-1.1l-1.1-0.1l-1.1-0.3l-1-0.4l-1-0.5l-0.9-0.7l-0.8-0.8l-0.7-0.9
2583
+ l-0.3-0.4l-0.4-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.7l-0.2-0.7l-0.2-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7v-0.7v-0.6l0.1-0.6l0.1-0.6l0.1-0.6
2584
+ l0.1-0.6l0.1-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.4-0.6l0.4-0.6l0.4-0.6l0.5-0.5
2585
+ l0.4-0.5l0.4-0.5l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.3l0.4-0.3l0.7-0.6l0.7-0.5l0.6-0.5l1-0.8l1-0.7l1-0.7l1-0.7
2586
+ l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l2-1.3l4-2.6l2-1.3l2-1.3l1-0.6l1-0.6l0.9-0.6l0.9-0.6l0.9-0.6l0.9-0.6l0.9-0.7l0.9-0.7
2587
+ l0.9-0.7l0.9-0.7l0.9-0.7l0.9-0.7l1.9-1.5l1.9-1.5l1.9-1.5l1.9-1.5l1.9-1.5l1.9-1.5l2-1.5l2-1.5l2-1.5l2-1.5l2-1.5l2-1.4l2-1.4
2588
+ l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2.1-1.4l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3
2589
+ l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3
2590
+ l2.1-1.3l2.1-1.2l2.1-1.2l2.1-1.2l2.1-1.2l4.2-2.4l4.2-2.4l4.2-2.4l4.2-2.4l4.2-2.4l4.2-2.4l1.8-1l1.7-1l1.7-1l1.7-1l1.8-1l1.7-1
2591
+ l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.2l1.7-1.2l1.7-1.2l3.5-2.4
2592
+ l3.5-2.4l3.5-2.4l3.5-2.4l6.9-4.8l3.5-2.4l3.5-2.4l3.5-2.4l1.7-1.2l1.8-1.2l1.8-1.2l1.8-1.2l1.8-1.2l1.8-1.2l1.8-1.2l1.8-1.1
2593
+ l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1l1.8-1l1.8-1l1.8-1l1.8-1l1.8-1l1-0.5
2594
+ v-0.2l0.1-0.6l0.1-0.6l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.8l0.1-0.8l0.1-1.5l0.2-3l0.1-1.4l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7
2595
+ l0.1-0.4l0.1-0.4l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6
2596
+ l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5
2597
+ l0.4-0.5l0.4-0.5l0.8-0.9l0.8-0.9l0.8-0.9l0.8-0.9l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l1.5-1.5l1.5-1.4l1.4-1.3l0.6-0.6
2598
+ l0.6-0.6l0.3-0.3l0.4-0.4l0.4-0.4l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3
2599
+ l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2l0.5-0.2l0.5-0.2l0.4-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2
2600
+ l0.5-0.2l0.5-0.2l0.5-0.2l0.9-0.4l1-0.4l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.1l1-0.1l1-0.1l1-0.1
2601
+ l1-0.1l1-0.1h1h1h1L-30.6-41.7z M-356,204.7l-0.1-0.1l-0.2-0.3v-0.1L-356,204.7z"
2602
+ />
2603
+ <path
2604
+ d="M-5.6-32.2l0.8,0.1l0.7,0.2l0,0l0.7,0.2l0.7,0.3l0.6,0.3l0,0l0.8,0.5l0.7,0.6l0,0l0.4,0.4l0.4,0.5l0.3,0.3
2605
+ l0.4,0.5l0.3,0.4l0.3,0.6l0.3,0.5l0.3,0.5l0.4,0.9l0.4,0.9l0.2,0.3l0.1,0.3l0.1,0.1l0,0l0.1,0.1l0.2,0.2l0.6,0.6l0.4,0.4L5-22
2606
+ l0.4,0.6L5.7-21l0.2,0.4l0.3,0.4l0.3,0.4l0.3,0.5L7-18.8l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.6L8-16.1l0.1,0.4l0.1,0.5l0.1,0.4
2607
+ l0.1,0.5l0.2,0.5l0.2,0.6L9-12.6l0.2,0.7l0.2,0.7l0.3,0.7L10-9.7l0.3,0.8l0.3,0.8l0.3,0.8l0.3,0.8l0.4,0.8L12-4.9l0.4,0.8
2608
+ l0.4,0.8l0.4,0.8l0.2,0.3l0.2,0.3l0.2,0.3L14-1.3L14.2-1l0.2,0.3l0.2,0.3l0.2,0.3L15,0.2l0.2,0.2l0.2,0.2l0.2,0.2L15.8,1l0.1,0.2
2609
+ L16,1.4l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.2,0.1L17,2.1l0.5,0.3L18,2.7L18.5,3L19,3.3l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4L21,5.3
2610
+ l0.4,0.4l0.4,0.4l0.3,0.4l0.3,0.4l0.3,0.4L23,7.7l0.3,0.4l0.3,0.4l0.2,0.4L24,9.3l0.2,0.4l0.2,0.4l0.2,0.4l0.4,0.7l0.3,0.7
2611
+ l0.3,0.7l0.3,0.7l0.3,0.6l0.3,0.6l0.5,1.1l0.2,0.5l0.2,0.5l0.2,0.4l0.2,0.4l0.2,0.3l0.2,0.3l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2612
+ l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0,0l0.1,0.1l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5
2613
+ l0.4,0.5l0.4,0.5l0.4,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.6,1l0.6,1l0.6,1l0.6,1l0.5,1l0.5,1l0.5,1
2614
+ l0.5,1l0.5,1l0.5,1l0.5,1l0.5,1l0.4,1l0.4,1l0.4,1l0.4,1l0.4,1l0.4,1l0.8,2l0.8,2l1.5,4l0.8,2l0.8,2l0.4,1l0.4,1l0.4,0.9l0.4,0.9
2615
+ l0.4,0.9l0.4,0.9l0.4,0.9l0.4,0.9l0.4,0.9l0.4,0.9l0.4,0.9l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.5,0.8l0.2,0.3
2616
+ l0.2,0.4l0.2,0.4l0.2,0.3l0.2,0.4l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.3,0.3l0.3,0.4l0.5,0.6l0.5,0.6l0.5,0.6l0.4,0.7
2617
+ l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7
2618
+ l0.3,0.7l0.3,0.7l0.2,0.7l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.4,1.3l0.4,1.3l0.4,1.2l0.4,1.2l0.4,1.2l0.7,2.4l0.3,1.1l0.3,1.1
2619
+ l0.3,1.1l0.3,1.1l0.3,1.1l0.4,1.1l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.4l0.2,0.4
2620
+ l0.2,0.5l0.9,1.7l0.9,1.8l0.9,1.8l0.9,1.8l0.9,1.9l0.9,1.9l0.9,1.9l0.9,2l0.9,2l0.9,2l0.9,2l0.8,2l0.8,2.1l0.8,2.1l0.8,2.1
2621
+ l0.8,2.1l0.8,2.1l0.8,2.2l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.3,1.1l0.3,1.1
2622
+ l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.2l0.3,1.1l0.3,1.2
2623
+ l0.3,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.1,1.2
2624
+ l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.1v1.1v1.1v1.1v1.1v1.1v1.1v1.1v1.1v1.1
2625
+ l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.2,1.1
2626
+ l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.4,1.1l-0.4,1l-0.4,1l-0.4,1l-0.4,1
2627
+ l-0.4,1l-0.5,1l-0.5,1l-0.5,1.1l-0.3,0.6l-0.4,0.6l-0.4,0.5l-0.4,0.5l-0.4,0.4l-0.4,0.4l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.3,0.2
2628
+ l-0.3,0.2l-0.4,0.2l-0.6,0.4l-0.6,0.3l-0.6,0.3L89,261l-0.6,0.3l-0.6,0.2l-0.6,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-1,0.4l-1,0.3
2629
+ l-0.9,0.3l-0.8,0.3l-0.3,0.1l-0.3,0.1l-0.2,0.1L81,264l-0.1,0.1l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.2l-0.4,0.3l-0.8,0.5l-0.8,0.4
2630
+ l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2
2631
+ l-0.9,0.2l-0.9,0.2l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1h-0.9h-0.9h-0.9h-0.9h-0.9H53h-0.9h-0.9h-0.9l-0.9-0.1
2632
+ l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1
2633
+ l-0.8-0.2l-0.8-0.2l-0.8-0.2L35,269l-1.6-0.3l-1.6-0.4l-1.5-0.4l-1.5-0.4l-1.6-0.4l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.6-0.3
2634
+ l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-1.1-0.5l-2.1-1.1l-1-0.5l-0.9-0.4l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.3-0.1l-0.2-0.1
2635
+ l-0.2-0.1h-0.1h-0.3l-1-0.2l-0.9-0.3l-0.9-0.4l-0.9-0.5L9,259.1l-0.7-0.7l-0.6-0.8l-0.6-0.8l-0.5-0.9L6.2,255L6,254l-0.1-1v-1
2636
+ l0.1-1l0.2-1l0.3-0.9l0.4-0.9l0.5-0.9l0.6-0.8l0.7-0.7l0.8-0.6l0.8-0.6l0.9-0.5l0.9-0.4l1-0.3l1-0.1h1h0.3h0.5l0.5,0.1l0.5,0.1
2637
+ l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.7,0.2l0.7,0.2l0.7,0.2l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l1.1,0.5l1.1,0.5l2.1,1l1,0.5
2638
+ l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.3,0.1l0.3,0.1l0.2,0.1l0.2,0.1h0.1h0.2l1.3,0.3l1.4,0.3l1.4,0.3l1.4,0.3l1.4,0.3l1.4,0.3
2639
+ l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1
2640
+ l0.7,0.1H52h0.6h0.6h0.6h0.6H55h0.6h0.6h0.6h0.6H58h0.6l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.5-0.1
2641
+ l0.5-0.1l0.5-0.1l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.3l0.5-0.3l0.2-0.1l0.2-0.1
2642
+ l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.3l0.5-0.3l0.6-0.3l0.6-0.3l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.9-0.3l0.9-0.3l0.9-0.3
2643
+ l0.9-0.3l0.4-0.1l0.4-0.1l0.4-0.1l0.3-0.1l0.2-0.4l0.3-0.8l0.3-0.8l0.3-0.8l0.3-0.8l0.3-0.8l0.3-0.8l0.3-0.8l0.3-0.8l0.2-0.8
2644
+ l0.2-0.8l0.2-0.8l0.2-0.8l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9
2645
+ l0.1-0.9l0.1-0.9l0.1-0.9V221v-1v-1v-1v-1v-1v-1v-1v-1v-1v-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1
2646
+ l-0.1-1l-0.1-1l-0.1-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1.1l-0.2-1.1l-0.2-1.1l-0.2-1.1
2647
+ l-0.2-1.1l-0.2-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1l-0.3-1l-0.3-1.1l-0.3-1
2648
+ l-0.3-1l-0.3-1l-0.3-1l-0.3-1l-0.3-1l-0.3-1l-0.3-1l-0.4-1l-0.4-1l-0.4-1l-0.4-1l-0.4-1l-0.7-2l-0.8-2l-0.8-2l-0.8-2l-0.8-2
2649
+ l-0.8-2l-0.8-1.9l-0.8-1.9l-0.8-1.9l-0.8-1.9l-0.8-1.9l-0.8-1.8l-0.8-1.8l-0.8-1.8l-0.8-1.8l-0.8-1.7l-0.8-1.7l-0.8-1.7l-0.3-0.6
2650
+ l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.6l-0.2-0.7l-0.2-0.7l-0.2-0.6l-0.2-0.7l-0.4-1.3l-0.4-1.3
2651
+ l-0.4-1.2l-0.4-1.2l-0.4-1.2l-0.3-1.2l-0.7-2.3l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.4-1.1l-0.2-0.5l-0.2-0.5l-0.2-0.5
2652
+ L51,99.4l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5L50,96.9l-0.2-0.5l-0.2-0.5l-0.2-0.4l-0.2-0.4L49,94.7l-0.2-0.4l-0.2-0.4l-0.2-0.4
2653
+ l-0.2-0.4L48,92.7l-0.2-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4L46,89.9l-0.3-0.4L45.3,89l-0.4-0.5L44.5,88l-0.4-0.5
2654
+ L43.8,87l-0.3-0.5L43.2,86l-0.3-0.5L42.6,85l-0.3-0.5L42,84l-0.6-1l-0.6-1l-0.6-1l-0.6-1l-0.5-1l-0.5-1l-0.5-1l-0.5-1l-0.5-1
2655
+ l-0.5-1l-0.5-1l-0.5-1l-0.4-1l-0.4-1l-0.4-1L34,68l-0.4-1l-0.4-1l-0.8-2l-0.8-2l-1.5-4l-0.8-2l-0.8-2l-0.4-1l-0.4-0.9l-0.4-0.9
2656
+ l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8
2657
+ l-0.5-0.8l-0.5-0.7l-0.2-0.3l-0.2-0.4l-0.2-0.3l-0.2-0.3L20.1,37l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3L19,35.5l-0.2-0.3l-0.3-0.3
2658
+ l-0.3-0.3l-0.3-0.3L17.6,34l-0.3-0.3L17,33.4l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.4-0.4l-0.3-0.4L14.8,31l-0.3-0.4l-0.3-0.4
2659
+ l-0.3-0.4l-0.3-0.4L13.4,29l-0.2-0.4L13,28.2l-0.2-0.4l-0.4-0.7L12,26.4l-0.3-0.7L11.4,25l-0.3-0.6l-0.3-0.6l-0.5-1.1l-0.2-0.5
2660
+ l-0.2-0.5l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4L9,20l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1
2661
+ l-0.1-0.1L8.1,19l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l-0.2-0.1l-0.5-0.3l-0.6-0.4l-0.6-0.4l-0.6-0.4L5.1,17
2662
+ l-0.5-0.4l-0.5-0.4l-0.4-0.4l-0.4-0.4L2.9,15l-0.4-0.4l-0.4-0.5l-0.4-0.4l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5
2663
+ l-0.3-0.5l-0.3-0.5L-1,9.2l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.5-1l-0.5-1l-0.5-1l-0.5-1l-0.4-1l-0.4-1l-0.4-1l-0.4-1l-0.4-1
2664
+ l-0.4-1l-0.3-1l-0.3-0.9l-0.3-0.9l-0.3-0.9l-0.3-0.9l-0.2-0.8L-8.5-9l-0.2-0.7l-0.2-0.2l-0.3-0.3l-0.4-0.4l-0.4-0.5l-0.4-0.5
2665
+ l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.3-0.4l-0.3-0.6l-0.3-0.5l-0.2-0.5l-0.2-0.5l-0.3-0.7l-0.5-0.5l-0.5-0.8l-0.5-0.9l-0.4-0.9l-0.2-1
2666
+ l-0.1-1v-0.5v-0.5v-0.7l0.1-0.7v-0.1l0.1-0.7l0.2-0.7l0.2-0.6l0,0l0.3-0.7l0.4-0.7l0.4-0.7l0,0l0.6-0.7L-12-29l0.7-0.5l0.7-0.5
2667
+ l0,0l0.7-0.4l0.8-0.3l0.8-0.2l0.8-0.2l0.8-0.1l0,0h0.8L-5.6-32.2z M14.2,260.9h0.2l0,0H14H14.2z M2.1-22.5L2.1-22.5v-0.2V-22.5z
2668
+ M2.1-23.1v-0.5v-0.2V-23.1z"
2669
+ />
2670
+ <path
2671
+ d="M-358.4,223.5l1.1,0.2l0,0l0.6,0.2l0.6,0.2l0.2,0.1l1.3,0.5l1.7,0.7l0.7,0.3l0.5,0.2l0.2,0.1l0.2,0.1
2672
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1l1.2,0.2l1.3,0.3l0.7,0.2l0.8,0.2l0.8,0.2l0.7,0.2
2673
+ l0.4,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.8,0.1
2674
+ l0.8,0.1l1.6,0.1l1.6,0.1l1.7,0.1l1.7,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l1,0.1l1,0.1l1,0.2l1,0.2l0.9,0.2l1.2,0.2
2675
+ l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.1l1.2,0.1
2676
+ l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l2.6,0.2l2.6,0.1l2.6,0.1
2677
+ l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1h2.6h2.6h2.6h2.6h2.5h2.5h5h5.3h5.3h5.3l5.3,0.1l5.3,0.1l5.3,0.1
2678
+ l5.3,0.1l5.3,0.1l5.3,0.1l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.3l5.3,0.3l5.3,0.3
2679
+ l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.4l5.3,0.4l5.2,0.4l1.7,0.1l1.7,0.1l3.4,0.2l3.4,0.2
2680
+ l3.4,0.2l3.5,0.2l3.5,0.2l3.5,0.1l3.5,0.1l3.5,0.1l3.5,0.1l3.5,0.1l3.4,0.1h3.4h3.4h3.4h3.3h0.6h0.6h0.7h0.7h0.7l0.8-0.1l1.7-0.1
2681
+ l1.8-0.1l1.9-0.1l1-0.1l1-0.1l1-0.1l1-0.1h1h1.1h1.1h1.1h1.1h0.6h0.5h0.5h0.5h0.5h0.5l0.5,0.1L12,245l0.6,0.1l0.5,0.1l0.6,0.1
2682
+ l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.3l0.4,0.2l1,0.5l0.9,0.7l0.8,0.8l0.7,0.9
2683
+ l0.6,0.9l0.5,1l0.3,1.1l0.2,1.1l0.1,1.1l-0.1,1.1l-0.2,1.1l-0.4,1.1l-0.5,1l-0.6,0.9l-0.7,0.9l-0.8,0.8l-0.9,0.7l-1,0.5l-1,0.4
2684
+ l-1.1,0.3l-1.1,0.1h-1.1l-1.1-0.1l-1.1-0.3l-1-0.4l-0.2-0.1l0,0h-0.1h-0.1H12h-0.1h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.3h-0.3H9.8
2685
+ H9.5H9.2H8.9H8.6H8.3H7.9H7.6H6.8H6H5.2H4.4H3.5H2.6l-0.9,0.1l-0.9,0.1l-0.9,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-0.9,0.1l-0.9,0.1
2686
+ h-0.9h-0.9H-10h-0.8h-3.5h-3.5h-3.5h-3.5l-3.5-0.1l-3.5-0.1l-3.5-0.1l-3.5-0.1l-3.5-0.1l-3.5-0.1l-3.5-0.2l-3.5-0.2l-3.5-0.2
2687
+ l-3.5-0.2l-3.5-0.2l-1.7-0.1l-1.7-0.1l-5.2-0.4l-5.2-0.4l-5.2-0.4l-5.2-0.4l-5.2-0.3l-5.2-0.3l-5.2-0.3l-5.3-0.3l-5.2-0.3
2688
+ l-5.3-0.3l-5.3-0.3l-5.3-0.3l-5.3-0.3l-5.3-0.3l-5.3-0.2l-5.3-0.2l-5.3-0.2l-5.3-0.2l-5.3-0.2l-5.3-0.2l-5.3-0.2l-5.3-0.2
2689
+ l-5.3-0.1l-5.3-0.1l-5.3-0.1l-5.3-0.1l-5.2-0.1l-5.2-0.1l-5.2-0.1h-5.2h-5.2h-5.2h-5.1h-2.6h-2.6h-2.6h-2.6h-2.6h-2.6h-2.6
2690
+ l-2.6-0.1l-2.7-0.1l-2.7-0.1l-2.7-0.1l-2.7-0.1l-2.7-0.1l-2.7-0.1l-2.7-0.2l-2.7-0.2l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1
2691
+ l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2
2692
+ l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.2-0.2l-0.7-0.1l-0.7-0.1
2693
+ l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.8-0.1l-0.8-0.1l-1.6-0.1l-1.6-0.1l-1.7-0.1l-1.7-0.1l-0.9-0.1
2694
+ l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-1-0.1l-1-0.2l-1-0.2l-1-0.2l-1-0.2l-0.5-0.1l-0.5-0.1l-0.5-0.1
2695
+ l-0.4-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-1.2-0.2l-1.3-0.3l-0.7-0.2l-0.7-0.2l-0.8-0.2l-0.8-0.2l-0.8-0.2l-0.4-0.1
2696
+ l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.8-0.3l-0.9-0.4l-1.7-0.8l-0.8-0.3l-0.7-0.3l-0.3-0.1l-1-0.6l-0.9-0.7l-0.8-0.8
2697
+ l-0.7-0.9l-0.6-1l-0.4-1l-0.3-1.1l-0.2-1.1v-1.1l0.1-1.1l0.3-1.1l0.4-1.1l0.5-1l0.7-0.9l0.8-0.8l0.9-0.7l1-0.6l1-0.5l1.1-0.4
2698
+ l1.1-0.2l1.1-0.1L-358.4,223.5z"
2699
+ />
2700
+ <path
2701
+ d="M-365,199.4h0.3h0.3h0.3l0.4,0.1l0.7,0.2l0.4,0.1l0.3,0.1l0.3,0.1l0.3,0.1h0.1l0.2,0.1l0.2,0.1l0.2,0.1
2702
+ l0.2,0.1h0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2h0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.1l0.2,0.2l0.2,0.2
2703
+ l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3v0.1l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.1l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3
2704
+ l0.1,0.3v0.3v0.1v0.3v0.3v0.3v0.3v0.3v0.1v0.3v0.3v0.3v0.3l-0.1,0.3v0.1l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3v0.1l-0.1,0.3
2705
+ l-0.1,0.3l-0.1,0.3l-0.2,0.4l-0.4,0.7l-0.3,0.5l-0.3,0.4l-0.3,0.4l-0.5,0.6l-0.5,0.5l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.7,0.6
2706
+ l-0.7,0.6l-0.3,0.3l-0.3,0.3l-0.3,0.2l-0.1,0.1l-0.1,0.5v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.2v0.2v0.2
2707
+ v0.2v0.2v0.2v0.2v0.2v0.2v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1l0,0v0.1h0.1l0.1,0.1h0.1l0.1,0.1
2708
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.1l0.3,0.1l0.3,0.1
2709
+ l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2
2710
+ l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3
2711
+ v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3
2712
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2
2713
+ l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.3
2714
+ h-0.3h-0.3h-0.3h-0.3h-0.3l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.6-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.3l-0.7-0.3l-0.6-0.3l-0.6-0.3
2715
+ l-0.6-0.3l-0.6-0.3l-0.6-0.4l-0.6-0.4l-0.6-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.4-0.5l-0.4-0.5
2716
+ l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6
2717
+ l-0.2-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.5l-0.1-0.6v-0.6v-0.5v-0.5v-0.5v-0.5v-0.5v-0.6v-0.5
2718
+ v-0.5v-0.5v-0.5v-0.5v-0.5l0.1-0.5l0.1-0.5l0.1-1l0.1-1l0.2-1.1l0.1-0.7l0.2-0.7l0.2-0.7l0.2-0.6l0.3-0.6l0.3-0.5l0.3-0.5
2719
+ l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.3l0.3-0.3l0.3-0.3l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.4l0.5-0.4l0.4-0.4l0,0l0.1-0.2l0.1-0.3
2720
+ l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2
2721
+ l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.3h0.3
2722
+ L-365,199.4z M-366.9,217h0.1H-366.9L-366.9,217z"
2723
+ />
2724
+ </g>
2725
+ </g>
2726
+ </g>
2727
+ </svg>
{images/previews → assets/img}/cap.jpg RENAMED
File without changes
{images/previews → assets/img}/collection.jpg RENAMED
File without changes
assets/img/grid.svg ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="231" height="252" fill="none">
2
+ <rect width="65.374" height="65.374" x=".162" y=".779" fill="#E1E3E6" rx="3"/>
3
+ <rect width="47.266" height="5.148" x="9.216" y="76.153" fill="#E1E3E6" rx="2.574"/>
4
+ <rect width="62.8" height="15" x="1.565" y="101.448" fill="#E1E3E6" rx="5"/>
5
+ <rect width="65.374" height="65.374" x=".162" y="136.277" fill="#E1E3E6" rx="3"/>
6
+ <rect width="47.266" height="5.148" x="9.216" y="211.651" fill="#E1E3E6" rx="2.574"/>
7
+ <rect width="62.8" height="15" x="1.565" y="236.946" fill="#E1E3E6" rx="5"/>
8
+ <rect width="65.374" height="65.374" x="82.478" y=".779" fill="#E1E3E6" rx="3"/>
9
+ <rect width="47.266" height="5.148" x="91.532" y="76.153" fill="#E1E3E6" rx="2.574"/>
10
+ <rect width="62.8" height="15" x="83.882" y="101.448" fill="#E1E3E6" rx="5"/>
11
+ <rect width="65.374" height="65.374" x="82.478" y="136.277" fill="#E1E3E6" rx="3"/>
12
+ <rect width="47.266" height="5.148" x="91.532" y="211.651" fill="#E1E3E6" rx="2.574"/>
13
+ <rect width="62.8" height="15" x="83.882" y="236.946" fill="#E1E3E6" rx="5"/>
14
+ <rect width="65.374" height="65.374" x="164.788" y=".779" fill="#E1E3E6" rx="3"/>
15
+ <rect width="47.266" height="5.148" x="173.843" y="76.153" fill="#E1E3E6" rx="2.574"/>
16
+ <rect width="62.8" height="15" x="166.192" y="101.448" fill="#E1E3E6" rx="5"/>
17
+ <rect width="65.374" height="65.374" x="164.788" y="136.277" fill="#E1E3E6" rx="3"/>
18
+ <rect width="47.266" height="5.148" x="173.843" y="211.651" fill="#E1E3E6" rx="2.574"/>
19
+ <rect width="62.8" height="15" x="166.192" y="236.946" fill="#E1E3E6" rx="5"/>
20
+ <rect width="6.177" height="6.177" x="13.283" y="86.301" fill="#E1E3E6" rx="3"/>
21
+ <rect width="6.177" height="6.177" x="21.498" y="86.301" fill="#E1E3E6" rx="3"/>
22
+ <rect width="6.177" height="6.177" x="29.713" y="86.301" fill="#E1E3E6" rx="3"/>
23
+ <rect width="6.177" height="6.177" x="37.927" y="86.301" fill="#E1E3E6" rx="3"/>
24
+ <rect width="6.177" height="6.177" x="46.238" y="86.301" fill="#E1E3E6" rx="3"/>
25
+ <rect width="6.177" height="6.177" x="95.599" y="86.301" fill="#E1E3E6" rx="3"/>
26
+ <rect width="6.177" height="6.177" x="103.814" y="86.301" fill="#E1E3E6" rx="3"/>
27
+ <rect width="6.177" height="6.177" x="112.029" y="86.301" fill="#E1E3E6" rx="3"/>
28
+ <rect width="6.177" height="6.177" x="120.243" y="86.301" fill="#E1E3E6" rx="3"/>
29
+ <rect width="6.177" height="6.177" x="128.554" y="86.301" fill="#E1E3E6" rx="3"/>
30
+ <rect width="6.177" height="6.177" x="177.909" y="86.301" fill="#E1E3E6" rx="3"/>
31
+ <rect width="6.177" height="6.177" x="186.124" y="86.301" fill="#E1E3E6" rx="3"/>
32
+ <rect width="6.177" height="6.177" x="194.339" y="86.301" fill="#E1E3E6" rx="3"/>
33
+ <rect width="6.177" height="6.177" x="202.553" y="86.301" fill="#E1E3E6" rx="3"/>
34
+ <rect width="6.177" height="6.177" x="210.864" y="86.301" fill="#E1E3E6" rx="3"/>
35
+ <rect width="6.177" height="6.177" x="13.283" y="221.798" fill="#E1E3E6" rx="3"/>
36
+ <rect width="6.177" height="6.177" x="21.498" y="221.798" fill="#E1E3E6" rx="3"/>
37
+ <rect width="6.177" height="6.177" x="29.713" y="221.798" fill="#E1E3E6" rx="3"/>
38
+ <rect width="6.177" height="6.177" x="37.927" y="221.798" fill="#E1E3E6" rx="3"/>
39
+ <rect width="6.177" height="6.177" x="46.238" y="221.798" fill="#E1E3E6" rx="3"/>
40
+ <rect width="6.177" height="6.177" x="95.599" y="221.798" fill="#E1E3E6" rx="3"/>
41
+ <rect width="6.177" height="6.177" x="103.814" y="221.798" fill="#E1E3E6" rx="3"/>
42
+ <rect width="6.177" height="6.177" x="112.029" y="221.798" fill="#E1E3E6" rx="3"/>
43
+ <rect width="6.177" height="6.177" x="120.243" y="221.798" fill="#E1E3E6" rx="3"/>
44
+ <rect width="6.177" height="6.177" x="128.554" y="221.798" fill="#E1E3E6" rx="3"/>
45
+ <rect width="6.177" height="6.177" x="177.909" y="221.798" fill="#E1E3E6" rx="3"/>
46
+ <rect width="6.177" height="6.177" x="186.124" y="221.798" fill="#E1E3E6" rx="3"/>
47
+ <rect width="6.177" height="6.177" x="194.339" y="221.798" fill="#E1E3E6" rx="3"/>
48
+ <rect width="6.177" height="6.177" x="202.553" y="221.798" fill="#E1E3E6" rx="3"/>
49
+ <rect width="6.177" height="6.177" x="210.864" y="221.798" fill="#E1E3E6" rx="3"/>
50
+ </svg>
assets/img/no-matching-products.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg viewBox="0 0 797.12 564.08" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="m216.92 118.87 1 .15 1 .25.61.2.7.28.25.12.67.35.25.13.63.4.54.37.78.63.7.7.63.72.55.73.52.8.42.77.36.81.29.8.23.8.17.77.11.77.07.71v2.14l-.13 1.16-.22 1.2-.26 1.17-.34 1.13-.45 1.07-.42 1.1-.45 1.1-.5 1.09-.28.61.41.57.37.6.08.13.27.52.22.53.06.17.3 1v.18l.07.28.72-.48.75-.48.76-.47.79-.45.83-.43.9-.4 1-.39.73-.23.79-.18.4-.09.76-.11.49-.07h1.35l.78.08h.17l.86.17h.15l.95.3.14.05.5.2.46.23.14.08.5.29.46.33.14.08.43.35.42.39.11.1.39.4.36.43.1.12.32.41.28.45.09.14.45.86.08.17.3.8.07.18.21.74.12.53.13.85.07.82v1.21l-.07 1.2-.13 1.19-.2 1.15-.27 1.11-.31 1.09-.35 1.06-.09.24.62-.34 1-.55 1.1-.53 1.12-.48.72-.29.71-.23.8-.22.87-.18.62-.08.76-.07h1.52l.57.07.57.1.25.05.63.17.63.21.24.09.68.3.67.38.2.12.66.45.62.51.18.17.55.57.5.61.15.2.4.6.35.64.14.25.25.56.21.6.1.3.22.84.17.8.15 1.11.06 1.1v1.67h.17l1.45-.08h2.88l1.44.07 1.43.11 1.42.15 1.41.2 1.42.24 1.4.26.58.12 1.14-.27 1.35-.25 1.35-.18 1.38-.15 1.4-.1h5.85l1.52.08 1.55.12 1.58.15 1.6.17 1.63.2 1.65.21 1.67.25 1.7.27 1.7.3 1.73.32 1.74.35 1.75.35 1.76.38 1.79.4 1.78.42 1.8.43 1.78.47 1.8.46 1.8.49 1.8.5 1.79.51 1.78.54 1.78.53 1.77.57 1.77.55 1.75.58 1.71.58 1.72.6 1.7.6 1.67.62 1.65.62 1.61.63 1.6.63 1.57.64 1.53.65 1.52.65 1.47.66 1.43.65 1.4.67 1.37.67 1.31.68 1.29.68 1.23.69 1.2.68 1.17.7 1.1.72 1.08.71 1 .74 1 .76.95.8.91.84.85.86.74.82.66.8.64.83.6.85.56.87.52.87.48.88.47.9.42.9.4.9.36.92.35.91.32.94.28.91.27.94.25.93.22.93.2.94.18.93.17.93.16.94.14 1 .23 1.84.17 1.86.13 1.87.1 1.85.07 1.83v1.15l.09.14.83 1.38.82 1.43.78 1.47.73 1.48.7 1.52.65 1.52.29.68.56.05h.15l.87.17h.15l.88.27h.14l.8.35.15.07.73.4.13.1.65.45.14.1.56.46.37.35.55.59.3.38.48.67.22.31.45.79.35.7.42 1 .31 1 .25 1 .2.93.17.92.12.92.08.91.08.92.05.93v4.82l-.08 2-.12 2-.17 2.05-.18 2.07v.62l.15.35.32.8.25.8.23.8.18.8.14.78.1.78.08.77v.53l.18-.21 1.23-1.6.65-.8.55-1.15.42-.8.38-.69.37-.6.52-.83.7-1.07.85-1.26 1-1.4.58-.77.58-.77.64-.8.66-.78.69-.82.73-.8.77-.8.81-.78.87-.78.92-.77 1-.75 1-.67.62-.36.6-.34.61-.31.65-.3.7-.27.74-.25.78-.22.82-.16.86-.14.92-.06h.93l1 .08 1 .15 1 .25 1 .33.94.42.9.5.83.55.78.62.65.6.59.6.5.53.48.57.47.56.45.57.41.6.42.58.38.62.39.6.38.67.63 1.21.6 1.29.55 1.3.49 1.33.43 1.33.38 1.35.34 1.37.3 1.38.25 1.39.21 1.4.19 1.41.13 1.42.12 1.43.08 1.44.05 1.45v3.91l.66.27.72.4.13.07.65.43.6.48.14.12.48.47.45.51.12.14.33.46.32.47.1.17.45.85.08.2.3.71.18.54.22.83.15.77.1.73.07.7.05.68v3.29l-.06 1.61-.12 1.62-.17 1.62-.2 1.6-.25 1.58-.3 1.58-.33 1.57-.38 1.55-.4 1.55-.45 1.53-.49 1.54-.51 1.51-.55 1.5-.59 1.49-.6 1.48-.63 1.47-.67 1.46-.68 1.45-.7 1.44-.73 1.43-.75 1.42-.77 1.41-.78 1.4-.82 1.39-.82 1.38-.85 1.37-.85 1.36-.86 1.35-.87 1.34-.9 1.35-.43.61-.77 3.07-.43 1.63-.42 1.54-.42 1.43-.43 1.4-.59 1.56-.5 1.4-.55 1.4-.6 1.49-.68 1.56-.75 1.7-1.82 4.05-.36.75-.44.82-.46.83-.52.84-.55.83-.58.85-.62.85-.68.87-.77.86-.83.84-.6.51-.64.5-.46.3-.67.4-.18.1-.49.24-.5.21-.16.07-.67.22-.68.16h-.17l-.93.13h-1.09l-.76-.05-.75-.14-.75-.2-.14-.05-.78-.28-.43-.22-1.45 2-1.33 1.88-.24.35-.23.37-.23.38-.22.4-.52 1-.51 1.05-.54 1.16-.58 1.25-.62 1.32-.66 1.38-.74 1.4-.41.77-.45.75-.47.75-.5.77-.55.76-.58.77-.64.75-.7.75-.73.73-.8.72-.4.32-.45 1.06-.8 1.84-.8 1.8-.83 1.76-.84 1.75-.85 1.74-.88 1.7-.88 1.66-.92 1.65-.93 1.62-.95 1.57-1 1.55-1 1.5-1 1.48-1 1.43-1.08 1.39-1.1 1.35-1.15 1.3-1.15 1.23-.62.63-.61.6-.62.59-.63.56-.64.55-.65.55-.66.52-.67.52-.7.5-.75.51-.57.35-.7.37-.43.2-.73.27-.15.05-.85.23h-.14l-1 .15h-1.98l-.59-.09h-.11l-.62-.13-.6-.19h-.1l-.57-.21-.55-.27-.1-.05-.51-.3-.5-.32-.09-.08-.43-.32-.38-.35-.1-.08-.65-.7-.09-.1-.51-.65-.07-.12-.53-.88-.13-.31-.23-.46-.18-.49-.12-.31-.25-.77-.08-.32v.05l-.2 1.15-.24 1.1-.26 1.07-.3 1.05-.34 1-.36 1-.44 1-.5 1-.4.65-.4.6-.75.94-.73.85-.77.8-.8.76-.81.72-.85.68-.89.64-.88.58-.92.55-.91.5-.95.47-.95.41-1 .39-1 .35-1 .3-1 .26-1 .24-1 .18-1 .17-1 .13-1 .1-1 .07-1 .05h-2l-1-.05-1-.05-1-.1-1-.12-1-.13-1-.15-.95-.19-.95-.21-.95-.22-.94-.25-.15-.05-.06.07-.84.55-.83.55-.87.51-.88.49-.9.46-.92.45-.93.4-.95.39-1 .35-1 .31-.8.22-.81.18-.79.15-.8.14-.76.08-.77.07h-2.98l-1.34-.08-1.33-.15-1-.14-.2.1-1.17.59-1.2.55-1.23.51-1.25.45-1.28.4-1.27.34-.72.16-.68.14-.7.1-.7.08-.72.07h-2.26l-.79-.06-.81-.1-.84-.17-.85-.22-.88-.28-.87-.37-.88-.43-.8-.5-.82-.57-.71-.55-.22-.18-.92.2-1.48.3-1.48.25-1.42.18-.8.09-.73.05h-2.35l-.82-.07-.88-.13-.89-.18-.88-.25-.83-.29-.8-.33-.77-.38-.75-.4-.7-.45-.67-.49-.63-.5-.6-.51-.55-.54-.19-.55-.49-.57-.46-.58-.44-.59-.4-.58-.38-.62-.35-.6-.32-.6-.31-.61-.3-.67-.5-1.18-.44-1.24-.38-1.25-.33-1.25-.27-1.25-.22-1.25-.18-1.25-.13-1.25-.09-1.25-.01-1.21v-2.42l.07-1.2.11-1.2.15-1.18.2-1.17.24-1.17.3-1.15.36-1.15.42-1.15.48-1.06.34-.65.25-.42.5-.78.16-.24.59-.7.41-.46.65-.64.64-.56.65-.55.7-.57.71-.55-.06-.22-.19-.81-.13-.69-.1-.68-.07-.68v-.25l-.82.05h-.18l-.69-.05-.66-.09h-.17l-.85-.2-.82-.28h-.15l-.91-.44-.85-.55-.14-.1-.56-.45-.54-.5-.48-.55-.08-.11-.6-.84-.49-.9-.06-.15-.32-.8-.25-.81v-.19l-.14-.66-.06-.67v-1.78l.06-1 .14-1 .16-.95.22-.92.25-.92.28-.88.32-.85.35-.83.37-.84.38-.8.2-.4-.9-.53-1.92-1.17-1.91-1.2-1.94-1.25-1.97-1.29-2-1.3-2-1.34-2-1.35-2-1.4-2-1.4-2-1.43-2-1.45-1.95-1.48-2-1.49-1.93-1.5-1.95-1.53-1.92-1.53-1.92-1.54-1.88-1.55-1.88-1.56-1.85-1.57-1.57-1.58-1.8-1.58-1.79-1.59-1.75-1.56-1.71-1.57-1.7-1.57-.49-.45-.56.32-1.2.55-1.25.53-1.26.54-1.3.51-1.34.49-1.33.46-1.37.44-1.36.41-1.4.4-1.39.35-1.41.34-1.4.28-1.42.25-1.4.2-1.42.17-1.43.1-1.32-.02h-1.5l-.71-.05-.74-.06-.73-.09-.75-.11-.75-.15-.77-.19-.76-.21-.77-.27-.78-.3-.85-.4-.64-.35-.73-.47-.3-.2-.77-.61-.25-.24-.4-.36-.36-.4-.2-.25-.37-.45-.32-.49-.16-.25-.32-.51-.27-.54-.11-.28-.24-.53-.18-.57-.08-.3-.14-.55-.11-.55v-.3l-.06-.53v-2.09l.12-.83.11-.68.12-.4h-.4l-.85-.05-.48-.05-.79-.13-.78-.2-.78-.27-.74-.31-.73-.37-.68-.42-.64-.46-.58-.49-.37-.33-.51-.55-.49-.58v-.07l-.46-.72-.4-.76-.32-.8v-.09l-.21-.71-.14-.74-.08-.73v-.92l.07-.81v-.1l.12-.6.15-.62v-.12l.29-.8.06-.13.4-.85.17-.28.4-.65.37-.54.53-.7.5-.61.52-.59 1-1.1 1.06-1.13 1.05-1.13 1-1.17.47-.55.45-.55.43-.52.39-.51.33-.47.28-.42.09-.15-.09-.3-.15-.73v-.17l-.1-.88v-1.38l.07-.62.12-.62v-.11l.15-.64.22-.61v-.1l.26-.62.32-.58.05-.1.33-.52.35-.48.09-.09.33-.4.37-.38.08-.08.43-.39.45-.35.2-.15.74-.46.33-.75.42-.95.4-1 .4-1 .36-1 .37-1 .37-1.05.35-1.07.23-.73h-.67l-1-.06-1-.19-1-.31-.92-.42-.86-.53-.79-.64-.71-.73-.62-.8-.27-.47-1 .17-1 .05-1-.05-1-.19-.92-.28-.88-.37-.74-.46-.7-.51-.65-.59-.58-.63-.5-.7v-.08l-.44-.75-.36-.8-.27-.84v-.11l-.15-.69-.09-.68v-2.18l.13-1 .13-.82-.33-.5-.16.25-.54.71-.53.72-.55.68-.58.67-.64.67-.66.65-.77.66-.57.44-.63.41-.33.2-.84.45-.3.15-.85.34-.46.15-.47.11-.75.17h-.13l-.85.08h-1.48l-1-.11-.52-.1-.48-.14-.79-.26-.11-.05-.82-.35-.12-.07-.78-.47-.12-.06-.76-.59-.1-.08-.69-.65-.08-.08-.63-.75-.07-.1-.5-.74-.07-.11-.4-.77v-.12l-.21-.51-.19-.55-.08-.25-.15-.62-.12-.63v-.29l-.08-1v-1.83l.15-.93.19-.85.21-.77.24-.73.23-.69.28-.7.5-1.2.57-1.2.57-1.13.56-1.07 1-1.83.82-1.5.58-1.08.65-1.14.65-1.11.67-1.1.67-1.09.66-1.08 1.35-2.05 1.35-2 1.32-2 1.3-1.94 1.27-1.9 3.05-4.7.15-.26 1-1.94 1.39-2.6.45-.86-.17-1-.25-1.65-.22-1.67-.18-1.7h-.2l-1-.07h-.1l-.95-.16-.93-.29h-.1l-.8-.35-.75-.4-.1-.07-.59-.4-.55-.43-.1-.1-.4-.38-.38-.4-.1-.12-.55-.72-.3-.41-.42-.72-.31-.67-.25-.56-.3-.79-.27-.73-.25-.75-.25-.78-.42-1.47-.36-1.52-.3-1.53-.25-1.53-.2-1.54-.15-1.56-.1-1.55v-4.7l.08-1.59.12-1.56.16-1.59.22-1.58.23-1.58.27-1.59.32-1.56.05-.25-.27-.42-.42-.7-.36-.68-.32-.7-.3-.7-.25-.7-.22-.69-.18-.7-.15-.66-.13-.69-.12-.73-.15-1.23-.08-1.3v-2.54l.07-1.23.12-1.22.15-1.2.18-1.2.22-1.16.23-1.15.25-1.14.27-1.11.26-1.09.3-1.06.3-1.07.6-1.95.6-1.83.57-1.67 1-2.68.36-.95.4-1 .42-1 .47-1 .48-1 .5-1.05.55-1 .57-1.07.58-1.08.62-1.09.63-1.1.67-1.1.68-1.11.72-1.12.73-1.12.75-1.13.78-1.13.8-1.14.82-1.13.83-1.13.87-1.14.88-1.13.9-1.13.92-1.14.93-1.11 1-1.1 1-1.12 1-1.08 1-1.09 1-1.06 1-1.07 1-1 1.06-1 1.09-1 1.1-1 1.11-1 1.14-1 1.15-.94 1.15-.9 1.18-.86 1.18-.85 1.2-.84 1.24-.78 1.23-.77 1.25-.71 1.27-.7 1.28-.65 1.3-.62 1.32-.57 1.33-.53 1.35-.48 1.37-.42 1.4-.38 1.4-.32 1.43-.27 1.38-.2.79-.06.73-.07h3.7l.75.07.73.08.75.1.75.12.75.15.75.16.74.19.75.21.88.27.47.2.81.37.2.1.84.5.16.11.79.62.15.13.71.7.14.15.63.79.12.16.48.77.08.18.39.8.08.19.27.73.18.55.18.88.12.84.05.76v1.52l-.11 1.13-.14.65.24-.15 1-.56.62-.3.6-.27.63-.25.65-.23.7-.22.72-.18.78-.15.82-.12h1.75zm129.63 298.13.09.2.06.2v-.6zm-128.31-72.17.33.25-.1-.31zm-4.72-18.38v2.33h.5l.16-.05-.48-2-.12-.5zm84.25-11.62.4 1.1.33 1.12.3 1.12.25 1.11.24 1.14.2 1.16.06.49.17-.55.2-.79.15-.73.13-.73v-3.09l-.09-.07-.31-.25-.35-.28-.35-.25-.34-.23-.33-.22-.32-.2-.25-.15zm-143.22-.53v.05zm83.1-12.25-.36 1-.34 1-.31 1-.3 1-.29.95-.28.95-.23.95-.24.94-.21.93-.2.92-.07.35.48-.55.89-1.07.1-.53.4-2 .45-2 .45-2 .45-1.85-.27-.17zm-55.83 6.58-.22.7.5.1-.11-1.2v-.2zm235.7-17.1-1.75 1.94-1.2 1.33.05.18.18.77.15.75.12.77.1.73.07.75.05.73v1.4l.05-.06.75-1.45.75-1.4.75-1.35.25-.45v-.07l.18-1.32.19-1.31.16-1.32.14-1.3.06-.55zm.3-19-.38 1.13-.42 1.1-.47 1.1-.35.84.49.21.88.54.8.65.65.66-.07-1.1-.08-1.05-.1-1-.12-1-.15-.95-.16-.91-.19-.87-.06-.22zm-60-41.38.47-.07.71-.08h.42l-.1-.06-.42-.25-.42-.24-.4-.2-.4-.18-.23-.12zm-7.7-26.54.23 1.3.24 1.09.08.36.1.37.42 1.53.73 2.67.15.55h2.73l1 .06 1 .12 1 .13 1 .19.86.2-.06-.2-.19-.5-.18-.47-.2-.47-.2-.43-.22-.42-.21-.38-.24-.38-.23-.35-.23-.34-.25-.33-.25-.3-.24-.27-.23-.25-.33-.28-.42-.35-.52-.4-.6-.43-.7-.47-.76-.48-.84-.52-.91-.52-1-.55-.56-.3zm-105.47 1.85.19.64.31 1 .12.49.43.06 1.1.22-.45-.7-.78-1.23-.38-.65zm25.4-4.35h-2.76l-1.4.08-1.44.1-1.43.13h-.1l.1.12.48.51.49.52.48.5.52.5.5.48.53.47.53.47.54.46.55.45.55.44.4.3.43-.65.45-.64.43-.6.47-.58.48-.57.5-.58.54-.55.56-.57.62-.53.37-.32h-2.04zm48.82-10.11 1.37 1 .28.2.3.2.43.27.55.3.64.33.7.35 1.66.82 1.84.86 2 1 2.05 1 .9.46v-2.85l-1.25-.43-1.61-.55-1.62-.53-1.63-.52-1.65-.52-1.65-.5-1.67-.5-1.57-.45zm-121.77-39-1.35 1.3-1.35 1.34-1.35 1.36-1.35 1.37-1.35 1.36-1.33 1.4-1.32 1.4-1.31 1.42-1.3 1.43-1.3 1.44-1.29 1.45-1.25 1.46-.26.3-.49.92-1.58 3.05-3.22 6.16-.4.75.39-.51.56-.75.74-1 1.85-2.27 5.13-6.25 2-2.5 1.2-1.67 1.4-1.93 1.42-1.92 1.45-1.91 1.5-1.92 1.53-1.92 1.57-1.88.83-1 .82-.95.33-.36.35-.49zm480.9-96.23.8.13.52.13.76.25h.17l.9.4.15.07.55.3.52.35.11.08.57.44.53.5.1.1.39.41.36.45.4.55.55.87.47.9.38 1 .3.93.22 1 .15.94v.25l1.18-.84 1.73-1.23 1.8-1.27 1-.65 1-.63 1-.65 1-.62 1-.6 1.08-.58 1.12-.57 1.16-.51 1.17-.45.68-.25.65-.2.67-.19.67-.16.7-.15.71-.14.78-.13.76-.08h2.37l.8.09.83.13.84.17.81.23.82.27.82.33.8.37.76.43.75.47.72.5.73.56.64.57.63.65.55.67.5.7.45.71.38.72.34.72.28.71.25.7.2.72.17.68.11.69.1.66.09.74.08 1.23v1.28l-.05 1.27-.12 1.25-.16 1.25-.2 1.27-.25 1.26-.29 1.27-.33 1.28-.35 1.3-.38 1.3-.45 1.33-.43 1.33-.25.72h.55l.78-.05h1.57l.8.07.88.11.68.14.77.2.35.1.8.3.33.13.8.38.3.17.8.5.27.2.62.48h.05l.56-.23h.09l.75-.25.75-.18h.1l.91-.1h1l1 .1 1 .23h.09l.93.34.88.43h.09l.73.47.67.55.08.06.52.52.46.55.09.08.31.45.3.47.07.12.42.81.2.44.16.48.24.77.18.68.27 1.53.18 1.44.13 1.45.07 1.46v2.92l-.07 1.48-.1 1.49-.15 1.5-.18 1.5-.23 1.51-.25 1.52-.29 1.53-.31 1.54-.35 1.55-.37 1.56-.4 1.57-.4 1.48-.45 1.58-.46 1.58-.49 1.6-.5 1.6-.53 1.62-.53 1.6-.55 1.62-.59 1.63-1.18 3.23-1.22 3.24-1.3 3.25-1.29 3.23-1.3 3.2-1.31 3.17-1.32 3.13-2.57 6.12-2.46 5.87-1.15 2.8-1.1 2.71-1 2.62-1 2.48-.88 2.39-.38 1.1-.39 1.1-.33 1.05-.32 1-.28.95-.12.4-.16 1.25-.29 2.1-.36 2.7-.47 3.21-.52 3.57-.63 3.8-.34 2-.35 2-.38 2-.38 2-.42 2-.42 1.91-.45 1.87-.43 1.72-.48 1.75-.5 1.65-.27.85-.28.78-.28.78-.32.79-.32.75-.36.76-.39.77-.45.78-.53.8-.42.55-.48.59-.25.25-.53.53-.07.77-.13 1.2-.17 1.2-.2 1.2-.22 1.18-.26 1.2-.29 1.18-.3 1.2-.35 1.19-.35 1.18-.38 1.18-.42 1.19-.43 1.18-.45 1.18-.47 1.19-.5 1.18-.5 1.17-.53 1.18-.55 1.17-.55 1.16-.58 1.17-.59 1.17-.61 1.16-.64 1.17-1.26 2.28-1.32 2.29-1.37 2.26-.61.95-.4 2.07-.24 1.17-.3 1.35-.7 3-1.78 7.28-1 4.14-.52 2.15-.5 2.2-.5 2.23-.5 2.27-.46 2.26-.19.94.6.06.84.12.68.15.77.2.38.12.8.3.35.15.83.41.32.19.82.51.28.22.75.62.25.23.68.72.22.25.57.76.2.29.45.76.16.32.35.75.14.33.25.72.2.68.21 1 .14 1 .06.95v1.75l-.09.83-.11.82-.14.78-.16.78-.19.75-.2.75-.21.72-.25.73-.25.7-.29.75-.56 1.35-.64 1.35-.66 1.32-.7 1.3-.75 1.25-.77 1.23-.8 1.17-.82 1.13-.85 1.09-.86 1-.89 1-.51.51-.5.47-.52.47-.57.45-.61.45-.67.45-.77.43-.55.27-.7.3-.23.08-.9.28-.22.05-.58.12-.57.08h-.21l-.72.05h-.9l-.82-.1-.78-.17h-.18l-.85-.28-.82-.37-.17-.08-.78-.47-.73-.53-.15-.14-.6-.55-.55-.61-.14-.17-.31-.43-.3-.45-.47-.77-.55-1.07-.47-1.06-.38-1.07-.33-1.05-.27-1.07-.23-1.06-.19-1.07-.15-1.07-.11-1.08-.07-.82-1.13.55-1.33.76-1.33.8-1.34.84-1.36.86-1.35.89-1 .66-.07.62-.11.77-.14.75-.16.75-.2.73-.22.72-.23.71-.25.7-.29.69-.3.66-.31.65-.34.65-.35.64-.36.61-.39.62-.41.65-.79 1.12-.88 1.13-.92 1.08-1 1.05-1 1-1.05 1-.67.58-.13.53-.2.69-.25.66-.25.65-.29.62-.3.62-.31.56-.37.64-.67 1-.73 1-.77.92-.8.86-.81.8-.84.77-.83.7-.85.68-.85.64-.85.6-.85.56-.85.54-.83.51-.85.5-1.57.87-1.53.8-1.4.7-1.27.6-1 .47-.37.18-.47.25-1.36.75-1.59.88-.91.5-1 .47-1 .47-1.05.43-.72.23-.75.22-.51.1-.77.13h-.23l-.52.05h-1.47l-.73-.12h-.17l-1-.25-1-.4-.13-.07-.79-.42-.71-.48-.67-.58-.12-.1-.63-.67-.57-.75-.43-.75-.25.23-.8.62-.88.5-.94.4-1 .28-1 .17h-1l-1-.08-1-.2-1-.33-.92-.44-.85-.55-.67-.55-.78 2.35-1 2.9-.51 1.47-.33 1.38-.53 1.43-.55 1.45-.57 1.42-.6 1.4-.63 1.38-.67 1.39-.7 1.33-.75 1.28-.42.69-.41.65-.45.63-.47.63-.48.62-.5.62-.54.6-.63.65-.8.73-.65.52-.4.26-.68.44-.15.06-.47.25-.48.2-.14.05-.7.24-.71.18h-.12l-1 .13h-1.09l-.85-.08-.81-.17-.82-.25h-.07l-.83-.35-.77-.45-.73-.52-.07-.07-.58-.51-.53-.57-.49-.62-.05-.06-.46-.77-.4-.82v-.1l-.23-.61-.18-.64v-.11l-.16-.9v-.15l-.07-1v-1.19l.06-.7.15-1 .19-.88.2-.87.23-.85.25-.88.55-1.75v-.12l-.38-.48-.62-.95-.52-.95-.4-.9-.35-.88-.33-.87-.3-.9-.28-.92-.29-1-.28-1-.53-2.09-.57-2.25-.2-.86-.47-.09.14 1.07.1 1v1.89l-.11.85-.2.83-.29.8-.36.78-.55.87-.65.81-.75.72-.82.62-.9.51-1 .39-1 .28-.8.12-.1.81-.17 1-.2 1-.22 1-.26 1-.32 1-.37 1-.41 1-.5 1-.57 1-.65 1-.77 1-.81.87-.55.52-.52.41-.53.42-.57.38-.6.37-.65.33-1 .47-1 .38-1.05.34-1 .25-1 .18-1.05.12-1 .05h-1l-1-.06-1-.1-1-.14-.95-.18-.92-.23-.9-.25-.88-.29-.87-.31-.85-.34-.83-.35-.82-.38-.8-.4-.78-.43-.77-.44-.77-.45-.75-.48-.75-.48-.73-.49-.72-.51-.73-.54-1.35-1.05-1.49-1.04-1.32-1.14-1.26-1.16-1.22-1.19-.92-.91-.6.28-.66.28-.69.24-.71.2-.74.16-.76.12-.79.07h-1.6l-.8-.08-.8-.15-.76-.19-.77-.25-.73-.28-.67-.32-.75-.38-.68-.4-.67-.43-.65-.47-.63-.47-.6-.5-.57-.51-.55-.55-.53-.55-.5-.57-.49-.58-.45-.59-.43-.61-.42-.62-.38-.62-.37-.63-.35-.65-.33-.65-.1-.22-.37.32-.78.62-.87.51-.91.4-1 .3-1 .19h-1l-1-.07-1-.18-1-.3-.82-.47-.85-.51-.8-.62-.7-.72-.61-.8-.52-.86-.42-.92-.28-1-.18-1-.05-1 .06-1 .19-1 .3-1 .41-.91.54-.85.61-.79.59-.58.1-.13.11-.22.14-.28.16-.33.17-.39.18-.43.19-.45.4-1.1.41-1.22.42-1.33.43-1.4.9-3.12.94-3.3.48-1.71.5-1.74.53-1.73.55-1.73.59-1.74.61-1.71.65-1.67.37-.87.37-.83.38-.83.4-.82.42-.82.43-.8.48-.8.5-.78.54-.78.58-.77.62-.75.68-.75.75-.73.8-.7.9-.67.67-.43.08-.15.82-1.27.86-1.23.9-1.2.94-1.15 1-1.14 1-1 .57-.55.55-.51.56-.5.57-.5.58-.47.6-.47.62-.45.63-.43.64-.4.66-.4.67-.38.68-.37v-.01l.15-1.37.18-1.38.2-1.42.24-1.43.25-1.45.26-1.47.3-1.48.32-1.5.35-1.5.35-1.52.4-1.52.4-1.51.42-1.54.45-1.51.46-1.5.5-1.52.5-1.5.54-1.47.55-1.48.56-1.45.59-1.42.6-1.41.63-1.39.65-1.36.67-1.32.7-1.32.73-1.26.22-.35.45-1 .48-1.05.52-1 .53-1 .55-1 .58-1 .6-1 .65-1 .67-.93.7-.92.73-.9.79-.86.9-.95.51-.47.65-.52.42-.31.42-.27.8-.42.11-.06.52-.22.53-.2h.12l.67-.19.68-.11h.1l.82-.08h.91l.92.1.88.2h.1l.87.3.82.38.08.05.75.45.68.52.07.06.53.5.5.55.07.07.35.47.32.46.4.17.8.37.78.41.75.45.72.49.36.28.29-.25.73-.63.75-.62.77-.58.78-.59.8-.55.82-.55.83-.51.83-.49.87-.46.87-.45.9-.44.9-.4.91-.36.94-.35 1-.32 1-.28 1-.27 1-.23 1-.19 1-.16 1-.15 1-.1 1.05-.07h2.31l-.41-.61-.1-.17-.37-.67-.23-.5-.3-.78-.22-.67-.23-.85-.19-.78-.18-.78-.17-.8-.15-.79-.15-.81-.21-1.55-.15-1.57-.1-1.58v-3.15l.06-1.57.1-1.55.15-1.57.2-1.55.24-1.53.16-1.64.32-1.54.35-1.51.38-1.52.42-1.52.45-1.5.47-1.5.5-1.48.51-1.48.55-1.49.57-1.46.58-1.47.62-1.47.47-1.11v-.09l-.72-3.18-.68-3.2-.63-3.25-.25-1.35-.42.42-.7.75-.73.76-.75.75-.75.74-.79.71-.78.7-.8.69-.8.66-.83.65-.85.62-.87.6-.88.57-.92.55-.93.53-1 .48-1 .45-1 .42-1 .38-.82.24-.87.21-.6.09-.82.15h-1.97l-.55-.08h-.2l-.63-.14-.62-.18-.18-.07-.69-.26-.65-.34-.16-.08-.67-.42-.62-.46-.15-.12-.56-.52-.52-.56-.12-.14-.43-.58-.4-.63-.1-.17-.28-.55-.25-.58-.07-.19-.18-.53-.15-.53v-.22l-.15-.88v-.22l-.06-.77v-1.25l-.16-.56-.27-1.19-.2-1.23-.13-1.23-.07-1.22v-2.4l.1-1.18.14-1.19.18-1.16.22-1.17.25-1.15.28-1.15.32-1.15.33-1.15.37-1.15.4-1.15.41-1.13.12-.32-.18-.22-.42-.53-.4-.53-.38-.57-.37-.57-.35-.58-.33-.58-.3-.6-.27-.6-.27-.6-.23-.62-.23-.68-.35-1.19-.29-1.25-.2-1.25-.13-1.23-.07-1.23v-1.22l.07-1.22.11-1.18.17-1.17.23-1.16.27-1.14.3-1.13.33-1.1.39-1.1.41-1.08.44-1.07.46-1.05.5-1 .52-1 .55-1 .55-1 .6-1 .6-1 .62-1 .65-1 .65-.95.66-.93.69-.92.7-.92.71-.9.72-.88.72-.87.73-.86.75-.84.75-.83.75-.82.77-.81 1.5-1.52 1.53-1.47 1.52-1.4 1.51-1.31 1.5-1.24 1.45-1.13.75-.57.74-.51.71-.5.55-.37.12-1.4.27-3.25.33-3.22.35-3.18.38-3.1.39-3.18.28-2.12.33-2.4.42-2.6.25-1.38.25-1.42.28-1.45.32-1.47.33-1.5.37-1.5.4-1.51.43-1.52.47-1.52.52-1.51.55-1.5.6-1.5.63-1.44.37-.75.36-.73.4-.72.4-.71.42-.7.45-.7.47-.7.5-.67.51-.68.55-.65.59-.65.61-.64.67-.61.68-.59.74-.56.78-.55.82-.5.8-.44 1-.48.94-.42 1-.38.95-.37 1-.31 1-.29 1-.23 1-.22 1-.16 1-.12 1-.08h1l.42-.25.6-.33.61-.33.64-.32.65-.28.66-.29.69-.25.7-.23.71-.22.74-.18.75-.15.76-.13.77-.1.78-.05h1.62l.82.05.81.09.82.11.83.17.82.22.8.23.82.28.78.34.78.35.77.4.75.43.45.3.7-.47 1.52-.95.93-.57 1-.58 1.05-.6 1.13-.62 1.18-.65.97-.79 1.3-.65 1.35-.65 1.39-.63 1.41-.64 1.47-.6 1.48-.56 1.52-.54 1.53-.5 1.54-.43.81-.22.8-.18.82-.17.8-.15.83-.13.82-.1.85-.08.85-.07h2.65l.92.09 1 .15 1 .2 1 .25 1 .35 1 .41 1 .5.95.6.93.69.88.78.55.6.49.55.5.65.66 1 .55 1 .44 1 .31.85.27.76.15.54.3-.09 1-.31 1-.29 1-.26 1-.25 1-.22 1-.2 1-.17 1-.13 1.08-.08h1.08l.75.05zm-149 296.91-.48.89-.5.86-.5.84-.52.81-.15.22-.1.3-.38 1.12-.39 1v1.15l-.07 2.09v1.86l-.12 1-.1.42.33.33 1 .92 1 .88 1 .85 1 .8 1 .77.47.33.47.33.46.34.47.3.47.28.45.27.43.25.42.23.41.2.4.18.37.17.37.13.33.14.32.1.28.08.27.05.23.05h.15l.1-.33.08-.43.1-.49.09-.51.08-.59.07-.61.05-.67v-4.63l-.07-1.77-.1-1.82-.15-1.85-.18-1.9-.2-1.91-.13-1.1-3-.95-3.9-1.2-1.15-.34zm136.2-52.88-.48.6-1.13 1.42-1.22 1.53-1.3 1.65-.78 1 .76-.38 1.45-.68 1.44-.65.56-.25.14-.82.43-2.45.18-1zm-34.2 3.82-1.77 2.2.89-.09h1.23l1.12.05-.12-.65-.15-1.27-.08-1.26v-.34zm-29.5-12.25v.83l-.06.52-.1.5.75.41.45.29.68.5.57.5.55.51.66.74.65.8.55.81.49.8.43.82.38.82.32.8.3.8.25.81.23.8.2.8.1.42 1-1.3 2.62-3.28.75-.95-.45-.1-.72-.19-.71-.21-.72-.24-.7-.28-.7-.3-.7-.33-.67-.37-.66-.4-.64-.43-.63-.45-.62-.49-.6-.5-.56-.53-.84-.83-.78-.85-.75-.9-.27-.35zm-22-24.77-.78.58-.77.59-.75.58-.7.55-1.28 1.1-1.15 1-.93.85-.67.64-.32.31-.31.37-.34.4-.35.43-.35.49-.36.53-.37.57-.38.6-.39.63-.36.67-.39.7-.36.73-.39.77-.36.78-.35.8-.37.85-.35.85-.33.87 1.33-1.62 1.87-2.35 1.86-2.35 1.85-2.37 3.67-4.73 1.82-2.35 1.26-1.6zm17.12 13-.43 1.28-.45 1.3-.15.4.51.22.14.05.51.26.5.3.12.09.17.13-.24-.88-.23-1.07-.17-1.07-.13-1.06v-.37zm40.38-12.53-.45.7-1.48 2.23-1 1.5-1.07 1.68-1.26 1.82-.82 1.16.72-.55.55-.41.3-.39 2.91-3.85 1.59-2.11.26-2v-.18zm-17-4.55-.47.61-.45.64-.45.63-.43.63-.43.62-.4.63-.39.62-.1.17.12-.07 1.14-1.6 1.08-1.59 1-1.51v-.09zm-9.85-14.9h-1.32v.68l.1 1v.31l.37-.45 1.35-1.55zm-18.68-5.7-.5.86-.5.85-.54.84-.13.2h.5l.83.05.82.1v-3.72zm36.23-12.7-.32.95-.31.91-.34.9-.35.9-.35.85.67-.48 1-.73v-.62l.18-2.45.12-1.4zm52.73-36.69-1.6 3.79-.43 1 .43.14.82.31.77.4.55.38v-7.39zm-60.2-23.4-.46.72-.49.7-.45.72-.93 1.5-.88 1.51-.87 1.57-.83 1.58-.82 1.62-.78 1.65-.79 1.68-.73 1.7-.73 1.72-.52 1.27 1.9-2.92.13-.2.49-1.1.7-1.55.4-.85.41-.83.45-.85.49-.85.51-.87.57-.87.62-.86.7-.89.76-.86.57-.57.23-1 .39-1.95.18-1.05v-.2zm-30.83 5.94-.1.13.2 1.65.08.58.2-.38v-2.45zm49.12-40.7-2.52 1.56-2.55 1.59-2.6 1.58-5.18 3.13-2.14 1.29h.09l.86-.26.37-.09.5-.1.53-.08h1.84l.63.05.65.1.28.05.67.15.65.22.27.1.61.25.6.32.25.13.55.33.52.39.23.18.44.37.41.4.2.21.55.64 1-2.72 1.25-3.32 1.27-3.3 1.32-3.26.45-1.07zm76.9-28.07-.8.65-.84.72-.86.75-.89.81-.88.85-.92.92-.91.93-.94 1-.95 1-1 1-.33.37-.27.53-1.35 2.5-1.3 2.4-1.18 2.34-1.18 2.11v1.22l-.05.57-.1.86-.13.95-.32 2.22-.37 2.55-.35 2.6-.15 1.18-.11 1.09-.09.88v.68l-.05 1.12v2.92l.15-.35 1.11-2.69 1.15-2.68 2.29-5.28 2.31-5.25 2.32-5.2 2.32-5.29.36-.75.52-1 .63-1.33.75-1.6.82-1.82.4-.93.42-1 .4-1 .38-1 .23-.61zm-107.42-8.3-1 1.5-1 1.5-1 1.53-1 1.55-1 1.55-.95 1.57-1 1.58-.35.62.08.06.33.35.62-.91 1.45-2.19 1.42-2.21 1.4-2.27.66-1.12.67-1.13.65-1.13.22-.39v-.8zm49.22 6h.06l.42-.47zm48.15-30.5-.62.33-.66.39-.7.43-.74.47-.75.5-.76.51-1.65 1.17-.34.23v.27l.06.92v2.7l-.06.88-.09.88-.11.87-.12.88-.17.87-.16.87-.19.88-.2.87-.23.9-.47 1.7-.53 1.75-.58 1.75-.62 1.75-.61 1.73-.68 1.75-.72 1.75-.72 1.7.14.2.26.45.44-.81 1.3-2.59 1.28-2.61 1.25-2.62 1.22-2.6 1.16-2.55 1.1-2.57.5-1.22.5-1.23.46-1.2.44-1.18.41-1.17.4-1.12.35-1.08.34-1 .3-1 .26-1 .22-.92.2-.85.15-.8.07-.35zm-55.18-10.15-.35.05-.39.07-.4.06-.43.09-.45.11-.43.1-1 .3-1 .34-1.08.38-1.1.43-1.12.45-1.13.5-1.12.5-1.08.54-1.11.53-1 .53-1 .54-.94.51-.86.5-.8.47-.7.42-1.2.75-.15.11.08.37.17.73.15.75.11.75.1.74.07.75v.73l.05.75v.53l.82-.78.91-.87.94-.86.93-.84 1-.83 1-.82 1-.81 1-.79 1-.78 1-.77 1-.75 1-.73 1-.72 1.05-.71 1.06-.69 1.09-.66 1.1-.67 1.02-.65.31-.17v-.23l-.05-.27zm-150.99 344.98 1.34.1 1.33.15 1.37.2.7.14.71.16.7.19.69.21.66.24.67.28.67.28.63.34.62.35.6.38.58.4.57.43.53.45.52.47.48.48.47.5.43.54.42.51.36.54.42.61.58 1 .07.13.43-.33 1.34-.95 1.3-.87.71-.45.69-.4.7-.4.7-.37.73-.35.75-.35.78-.3.82-.3.87-.25.93-.21 1-.15.71-.07h2.09l.33.05.52.1.53.11.3.09.38.11.39.14.38.15.27.13.4.18.38.2.37.24.25.15.36.26.37.27.33.3.24.2.31.3.3.32.29.33.2.23.25.34.23.33.22.35.16.28.19.34.18.35.22.5.3.71.25.72.21.77.17.78.12.78.08.8v1.64l-.08.8-.12.8-.18.76-.23.75-.27.74-.28.68-.34.65-.35.62-.38.6-.38.56-.42.54-.42.5-.48.53-.83.82-.92.8-.95.71-1 .67-1 .6-1 .57-1 .53-1 .5-1.05.47-1.08.45-1.1.41-1.12.39-1.13.38-1.15.35-1.17.35-1.18.32-1.18.3-1.22.3-1.22.26-1.21.27-1.22.23-.33.37-.54.72-1.51 2-.62.8-.3.35-.38.42-.44.42-.43.36-.48.34-.5.3-.52.28-.53.23-.55.19-.55.16-.57.12-.58.07-.59.05h-1.16l-.57-.1-.57-.12-.56-.17-.55-.2-.52-.25-.52-.26-.5-.32-.46-.35-.44-.38-.41-.4-.39-.44-.36-.46-.32-.49-.28-.51-.25-.52-.1-.25h-5.38l-1-.05-1-.07-1-.08-1-.1-1-.12-.95-.15-.94-.16-.93-.2-.93-.25-.95-.3-1-.39-.68-.31-.35-.19-.33-.18-.64-.37-1-.7-.77-.6-.37.33-.4.3-.42.27-.43.27-.43.21-.55.27-.7.3-.72.27-.72.23-.72.39-.72.16-.72.15-.71.14-.7.1-.7.06-.7.05h-2.1l-1.27-.08-1.28-.17-1.25-.21-1.22-.27h-.18l-.45.07-1.07.37-1.08.35-1.12.32-1.11.28-1.14.27-1.16.21-1.19.2-1.2.15-1.21.1-1.24.07h-1.65l-.55-.05-.55-.07-.53-.13-.53-.15-.54-.19-.5-.21-.5-.27-.47-.28-.43-.32-.32.1-.56.14-.59.08-.58.05h-1.15l-.58-.08-.57-.12-.57-.15-.55-.18-.53-.23-.52-.27h-.05l-.58-.07-1.17-.18-1.2-.22-.71-.18-.72-.19-.75-.25-.8-.3-.87-.38-.6-.32-.33-.18-.32-.22-.28-.18-.38-.28-.39-.3-.23-.2-.3-.25-.28-.29-.27-.28-.18-.22-.34-.4-.3-.41-.08-.12-.2-.32-.2-.31-.07-.12-.21-.42-.2-.43-.09-.2-.2-.52-.16-.53-.05-.2-.1-.4-.07-.4-.07-.42v-2.45l.07-.41v-.19l.09-.38.1-.38.11-.39.07-.16.18-.5.22-.49.08-.18.22-.42.25-.4.1-.16.23-.35.25-.34.35-.43.6-.63.57-.54.63-.51.2-.14v-.27l.05-.43.08-.43.1-.44.07-.3.13-.45.17-.43.25-.65.45-.93.48-.82.48-.75.52-.68.42-.49v-.26l.06-1.14.14-1.11.18-1.1.23-1.07.27-1.05.32-1 .36-1 .39-1 .43-1 .47-1 .5-.91.51-.92.55-.9.59-.87.6-.86.61-.84.65-.81.69-.8.68-.79.72-.76.73-.74.75-.73.77-.7.78-.68.82-.67.81-.63.85-.62.85-.6.87-.57.88-.55.92-.51.92-.5.93-.47.95-.43 1-.4 1-.39 1-.33 1-.3 1-.27 1.05-.23 1.07-.18 1.07-.14 1.1-.08h2.4l.41.07.44.08.25.07.5.11.48.17.48.18.22.1.52.24.5.28.46.32.19.11.36.27.34.28.33.3.32.32.15.17.35.41.33.44.3.45.12.2.23.41.22.44.2.45.08.21.13.39.14.36.1.39.05.25.1.5.06.48v1.67l-.05.9v.11h.19l.88.07.92.11.95.17 1 .27.68.23.4.15.39.17.35.16.46.24.45.26.3.2.47.32.43.33.27.22.3.27.28.28.27.28.22.25.25.29.23.31.23.32.19.27.3.5.26.51.15.3.22.49.18.5.1.31.15.47.12.48.07.35.08.44.05.45v1.86l-.08 1.05-.1.69.2-.09 1.07-.41 1.06-.4 1.1-.37 1.14-.35 1.13-.33 1.15-.29 1.18-.26 1.2-.24 1.22-.18 1.25-.17 1.25-.11 1.27-.07h2.6zm-.2 17.3-.45.6-.48.59-.5.53-.35.33 1.75-.11 1.83-.17v-1.57l-.05-.23-.05-.2-.05-.15h-.08l-.79-.11-.33-.05z" fill="#808080"/><path d="m105.75 43.78.9.19 1 .31.92.42.85.53.8.64.7.71v.07l.55.7.46.75.39.8v.13l.2.54.16.55.12.46.1.55.13 1.09v1.08l-.03 1.08-.3 1-.43 1v.1l-.13 1.27-.19 1.92-.3 3.3-.25 2.03-.17 1.9-.16 1.91-.14 1.94-.13 1.91-.12 1.94-.1 2-.08 1.93-.15 3.9-.1 3.88-.07 3.9v9.36l-.05 2.78-.09 2.77-.1 2.76-.11 2.77-.14 2.75-.15 2.77-.33 5.46-.37 5.47-.4 5.43-.44 5.47-.4 5.42-.4 5.38-.35 5.37-.33 5.35-.13 2.65-.14 2.66-.11 2.67-.1 2.65-.07 2.65-.07 2.63v82.92l-.06 15.6v7.8l-.07 7.8-.08 7.82-.1 7.8-.12 7.81-.15 7.8-.17 7.82-.18 7.8-.22 7.8-.25 7.82-.28 7.8-.3 7.8-.35 7.78-.37 7.8-.41 7.78-.45 7.79-.5 7.76-.54 7.77-.58 7.77-.62 7.73-.15 1.07-.3 1.05-.43 1-.57.93-.66.87-.79.75-.88.65-1 .53-1 .4-1.07.27-1.08.13h-1.08l-1.09-.23-1-.29-1-.43-.93-.57-.85-.66-.77-.79-.65-.88-.53-1-.4-1-.27-1.05-.13-1.08v-1.08l.61-7.69.59-7.66.51-7.69.49-7.68.45-7.7.41-7.7.37-7.72.35-7.71.3-7.74.27-7.73.25-7.73.21-7.75.19-7.75.16-7.77.15-7.75.12-7.77.1-7.76.08-7.77.07-7.77.05-7.78.07-15.55v-83.12l.06-2.78.09-2.77.1-2.77.11-2.75.14-2.76.15-2.75.33-5.47.37-5.47.38-5.45.42-5.41.4-5.4.38-5.39.37-5.36.33-5.37.13-2.65.14-2.67.11-2.65.09-2.65.08-2.65.07-2.65v-13.35l.1-4.08.17-4.07.08-2.07.12-2.05.12-2 .13-2 .15-2 .17-2 .18-2 .18-2 .3-3.28.2-2.05.22-2 .12-1 .13-1 .18-1 .15-.69.22-.73v-.15l.37-1 .06-.1.39-.73.45-.69.53-.63.05-.07.8-.76.9-.67 1-.53 1-.39.88-.22.9-.12h.92zm-9.12 10.47.1.35-.1-.37z"/><path d="m619.78 0 1.3.1 1.29.14 1.25.16 1.21.22 1.17.26 1.16.25 1.14.29 1.11.3 1.07.3 1.08.31 2 .64 2 .65 1.88.6 1.83.58.87.25.87.23.85.24.83.2.82.18.81.17.8.13.82.12 2.63.3 2.7.3 2.7.25 2.72.23 2.73.2 2.75.2 2.75.15 2.79.15 2.78.12 2.8.11 2.8.1 2.82.09 5.68.13 5.7.12 11.48.2 5.79.13 5.78.17 2.9.1 2.92.11 2.9.14 2.91.15 2.9.16 2.92.2 2.92.22 2.91.25 1.37.15 1.37.15 1.33.17 1.32.16 1.3.2 1.26.22 1.27.23 1.23.25 1.2.25 1.2.29 1.17.3 1.15.3 1.13.33 1.1.33 1.1.37 1.07.38 1 .39 1 .41 1 .44 1 .43 1 .47 1 .48.94.5.91.52.9.53.87.55.87.57.83.58.82.6.8.62.78.63.75.65.73.67.72.66.7.7.67.72.65.72.63.73.6.75.58.77.57.76.55.79.52.8.5.8.48.81.45.84.43.83.42.83.4.85.38.85.37.87.33.87.34.86.3.89.3.88.26.88.27.89.23.9.24.9.21 1 .39 1.78.31 1.85.29 1.85.23 1.87.2 1.88.15 1.9.12 1.92.08 1.91.05 1.94v6l-.05 2-.07 2-.08 2-.08 2-.24 4.05-.26 4.12-.23 4.06-.3 4.12-.25 4.2-.24 4.23-.1 2.1-.08 2.12-.07 2.11v26.73l.05 6.84.06 6.81.1 6.85.1 6.85.12 6.85.13 6.85.15 6.87.19 6.87.18 6.86.2 6.89.22 6.86.23 6.89.27 6.86.26 6.87.3 6.88.3 6.87.34 6.87.33 6.85.37 6.85.38 6.85.4 6.85.42 6.83.43 6.83.47 6.82.46 6.8.5 6.8.52 6.78.53 6.77.55 6.77.82 9.8.78 9.73.39 4.87.35 4.85.35 4.85.31 4.86.3 4.89.25 4.88.24 4.92.2 4.93.16 5 .12 5 .07 5.05v6.35l.1 1.65.13 1.88.15 2.08.17 2.24.16 2.36.12 2.44.05 1.28v3.87l-.05 1.31-.08 1.32-.12 1.33-.15 1.34-.2 1.33-.27 1.35-.3 1.28-.21.74-.2.66-.24.69-.25.68-.26.67-.3.68-.34.68-.36.67-.4.67-.42.66-.47.65-.5.65-.53.62-.58.6-.54.53-.56.49-.59.45-.6.43-.63.38-.65.37-.65.32-.67.3-.66.25-.67.21-.68.17-.65.15-.67.12-.73.08-1.17.08h-1.2l-1.15-.09-1.08-.15-1.05-.18-1-.23-.95-.25-.9-.29-.86-.28-.84-.32-.81-.3-1.49-.6-1.38-.58-1.27-.52-1.15-.45-.46-.16-.45-.15-.39-.12-.26-.07-.27-.05-.25-.05-1.28-.17-1.42-.17-1.45-.16-1.48-.14-1.54-.11-1.55-.12-1.58-.08-1.62-.09-1.63-.05h-8.4l-1.7.05-1.7.06-1.7.1-1.68.1-1.69.12-1.66.15-1.65.17-1.64.18-1.6.2-1.58.22-1.55.23-1.52.27-1.46.26-1.45.29-1.39.31-1.35.32-1.28.35-1.25.35-2 .62-2 .66-2 .69-2 .73-2 .77-2 .78-2 .82-2 .83-2.05.85-2 .87-4.13 1.78-4.17 1.82-4.2 1.81-2.11.92-2.15.9-2.15.88-2.17.89-2.18.85-2.2.85-2.24.81-2.23.79-2.27.75-2.28.71-2.3.69-2.33.65-2.34.58-1.2.3-1.2.27-1.2.25-1.2.23-1.21.23-1.22.2-1.93.32-2 .28-1.92.25-1.93.22-1.92.2-1.9.17-1.9.13-1.9.13-1.88.09-1.89.08-1.86.05h-9.25l-1.84-.07-1.81-.08-1.82-.08-1.83-.12-3.59-.25-3.58-.3-3.55-.33-3.55-.35-3.52-.4-3.5-.4-7-.84-6.9-.83-3.43-.4-3.42-.37-3.41-.35-3.4-.31-3.42-.27-1.68-.12-1.7-.11-1.7-.1-1.7-.09-1.7-.06-1.69-.05h-10.2l-1.73.04-1.73.08-25.8 1.55-25.8 1.52-12.9.75-12.9.71-12.92.69-12.9.65-6.46.3-6.47.3-6.47.28-6.46.25-6.47.25-6.47.23-6.48.22-6.48.2-6.49.18-6.48.15-6.5.14-6.5.11-6.5.09-6.52.06h-21.2l-2.73-.05-5.43-.14-5.42-.18-5.42-.22-5.38-.25-5.4-.28-5.37-.3-10.71-.62-10.69-.67-5.32-.3-5.31-.28-5.29-.25-5.28-.24-5.27-.2-5.26-.15-2.62-.06h-15.67l-2.6.05-2.6.07-2.58.08-2.6.08-2.58.14-2.57.06-2.58.15-2.58.18-2.57.2-2.58.24-2.57.25-2.57.28-2.55.3-2.56.32-2.55.36-2.57.37-2.55.42-2.55.43-2.53.47-2.55.5-2.6.53-1.9.4-2.84.55-3.63.68-4.27.77-4.78.83-2.57.42-2.63.43-2.7.42-2.75.42-2.78.4-2.8.38-2.8.37-2.8.33-2.75.32-2.74.26-2.66.24-2.59.2-2.51.15-2.4.08h-5.67l-1.07-.07-1-.08-1-.13-1-.15-1-.2-1-.25-1.07-.32-1.23-.45-1.07-.52-.7-.42-.61-.43-.64-.5-.38-.33-.6-.62-.22-.25-.6-.77-.18-.26-.45-.72-.17-.3-.33-.68-.28-.64-.32-.95-.25-.9-.18-.86-.14-.85-.08-.8-.07-.82v-2.33l.05-.82.11-1.52.17-1.56.22-1.57.26-1.6.3-1.62.34-1.63.35-1.65.36-1.65.39-1.65.8-3.27.81-3.21.77-3.07.7-2.88.32-1.32.26-1.25.25-1.13.19-1 .15-.88.1-.73.06-.59v-.45l.15-1.44.42-1.4.63-1.3.85-1.18 1-1 1.22-.82 1.32-.58 1.41-.35 1.45-.1 1.44.17 1.4.4 1.3.63 1.18.85 1 1.05.82 1.22.58 1.31.35 1.42.1 1.45v1.25l-.12 1.27-.18 1.31-.22 1.34-.26 1.36-.29 1.4-.31 1.44-.35 1.48-.74 3-.8 3.11-.78 3.15-.77 3.14-.35 1.51-.35 1.5-.3 1.45-.28 1.4-.25 1.34-.2 1.23-.17 1.17-.08.76h4.03l2.09-.08 2.2-.14 2.35-.16 2.43-.22 2.53-.27 2.6-.28 2.65-.33 2.69-.34 2.68-.38 2.68-.38 2.65-.4 2.62-.4 2.55-.42 2.47-.4 4.67-.74 4.15-.73 3.48-.67 2.7-.53 1.82-.37 2.67-.55 2.73-.53 2.73-.5 2.74-.48 2.73-.44 2.73-.4 2.74-.38 2.73-.35 2.73-.32 2.72-.3 2.73-.26 2.72-.24 2.73-.21 2.72-.19 2.72-.18 2.71-.13 2.72-.14 2.72-.1 2.71-.08 2.72-.07h16.23l2.7.05 2.72.05 5.38.16 5.39.2 5.38.24 5.37.25 5.36.3 5.37.3 10.7.61 10.67.64 5.31.28 5.32.28 5.32.25 5.3.22 5.3.17 5.3.13 2.63.05h20.8l6.45-.07 6.45-.08 6.43-.12 6.44-.13 6.45-.15 6.43-.19 6.42-.18 6.43-.22 6.43-.23 6.44-.25 6.41-.27 6.44-.26 6.43-.3 6.42-.3 12.86-.65 12.85-.69 12.87-.71 12.87-.74 25.8-1.53 25.85-1.53 1.88-.1 1.9-.09 1.88-.05h7.49l1.86.05h1.84l1.85.06 1.81.1 1.84.1 1.81.12 1.82.13 3.6.29 3.57.33 3.56.35 3.54.4 3.5.4 7 .83 6.9.84 3.44.4 3.4.36 3.41.35 3.39.32 3.38.28 3.4.24 1.67.1 1.68.08 1.68.08 1.69.05h10.08l1.68-.06 1.69-.09 1.68-.1 1.68-.13 1.7-.15 1.69-.17 1.7-.2 1.7-.21 1.7-.25 1.7-.27 1-.17 1-.2 1-.2 1-.2 1-.23 1-.23 2-.52 2-.55 2-.6 2-.63 2-.67 2-.72 2-.73 2-.77 2-.8 2-.81 2-.85 2.05-.87 2-.87 4.15-1.8 4.17-1.81 4.2-1.82 2.13-.9 2.15-.9 2.15-.88 2.17-.87 2.18-.85 2.22-.83 2.21-.8 2.25-.79 2.25-.73 2.3-.72 1.59-.45 1.63-.43 1.67-.4 1.7-.38 1.71-.35 1.75-.32 1.77-.3 1.8-.28 1.8-.25 1.83-.22 1.85-.22 1.85-.18 1.87-.15 1.87-.15 1.88-.12 1.88-.1 1.89-.06 1.86-.07h9.3l1.82.06 1.8.09 1.77.1 1.76.11 1.74.15 1.7.15 1.66.19 1.65.2 1.69.21 1 .17 1 .22.93.25.89.26.86.29.85.31 1.5.59 1.44.58 1.33.55 1.25.52.53.2.52.18.48.17.44.13.38.1h.1v-.11l.07-.2.08-.24.07-.23.06-.23.15-.64.14-.66.11-.75.09-.79.08-.86v-5.84l-.1-2.15-.15-2.17.12-2.08-.16-2.12-.14-2.06-.11-2v-6.9l-.07-4.89-.11-4.85-.15-4.83-.2-4.82-.22-4.78-.27-4.78-.28-4.79-.32-4.78-.33-4.78-.35-4.8-.38-4.8-.79-9.69-.81-9.8-.55-6.8-.54-6.81-.51-6.84-.5-6.85-.49-6.85-.45-6.86-.45-6.87-.41-6.88-.4-6.9-.39-6.89-.36-6.9-.35-6.91-.34-6.9-.3-6.92-.3-6.92-.26-6.91-.27-6.92-.23-6.92-.24-6.9-.2-6.91-.18-6.92-.17-6.9-.16-6.92-.14-6.9-.11-6.88-.1-6.88-.09-6.89-.08-6.86v-29.69l.05-2.26v-2.27l.07-2.23.08-2.24.1-2.21.25-4.37.25-4.3.29-4.2.26-4.13.27-4 .22-3.93.08-1.9.08-1.89.07-1.85v-8.78l-.08-1.64-.09-1.6-.13-1.55-.15-1.51-.36-1.47-.22-1.43-.25-1.39-.28-1.35-.15-.61-.17-.64-.17-.61-.16-.62-.19-.6-.2-.58-.2-.59-.2-.55-.21-.55-.24-.55-.23-.51-.25-.52-.25-.5-.25-.5-.27-.48-.28-.47-.28-.47-.3-.45-.3-.45-.32-.43-.33-.42-.3-.43-.35-.4-.36-.4-.39-.4-.38-.38-.4-.39-.42-.38-.43-.37-.45-.36-.45-.35-.48-.37-.5-.35-.52-.33-.55-.34-.55-.33-.57-.32-.6-.31-.6-.32-.63-.3-.67-.3-.68-.3-.72-.28-.73-.27-.77-.27-.78-.26-.82-.25-.83-.25-.87-.24-.9-.21-.92-.22-1-.2-1-.2-1-.18-1-.17-1-.17-1.1-.15-1.1-.13-1.15-.13-1.18-.12-2.78-.2-2.77-.2-2.77-.2-2.78-.17-2.8-.13-2.8-.14-2.82-.16-2.81-.1-5.67-.15-5.7-.14-11.45-.18-5.75-.11-5.76-.15-2.89-.09-2.9-.1-2.88-.1-2.88-.13-2.94-.15-2.89-.17-2.88-.2-2.86-.23-2.89-.25-2.88-.27-2.88-.32-2.9-.35-1.25-.16-1.24-.22-1.21-.23-1.19-.2-1.16-.28-1.14-.3-1.1-.3-1.08-.34-2.05-.63-2-.63-1.89-.62-1.81-.57-.85-.25-.85-.25-.84-.21-.8-.2-.78-.17-.78-.17-.75-.11-.74-.1-.71-.09-.72-.05h-2.07l-.7.05-.68.1-.73.12-1 .23-1.05.25-1 .3-1.07.33-1.06.37-1.09.4-1.08.43-1.08.45-1.1.5-1.12.52-1.12.53-1.11.57-1.14.58-1.11.6-2.32 1.29-2.33 1.31-2.4 1.34-2.39 1.4-2.41 1.4-2.45 1.38-1.25.7-1.25.69-1.29.66-1.28.65-1.28.64-1.3.61-2 .89-1.95.86-2 .85-2 .84-2 .83-2.05.82-2.09.8-2.08.78-2.12.78-2.13.75-2.15.75-2.17.74-2.18.71-2.22.72-2.21.68-2.24.69-2.25.66-2.26.65-2.29.64-2.28.61-2.3.62-2.32.58-2.31.59-2.34.55-2.33.55-2.35.53-2.37.5-2.35.5-2.38.48-2.37.47-2.33.45-2.37.43-2.38.42-2.4.4-2.38.38-2.39.35-2.38.35-2.38.34-2.39.31-2.38.29-2.38.28-2.37.25-2.36.23-2.37.24-2.35.2-2.35.18-2.35.15-2.33.15-2.34.12-2.31.11-2.3.09h-13.59l-2.21-.06-2.2-.09-2.19-.11-2.18-.01-2.15-.17-2.12-.16-2.1-.2-3.68-.47-3.65-.4-3.64-.4-3.61-.43-7.17-.88-7.12-.89-7.06-.86-3.52-.42-3.5-.42-3.5-.38-3.48-.38-3.47-.35-3.47-.32-3.45-.3-3.45-.27-3.43-.2-3.45-.18-3.43-.17-3.45-.1-3.45-.07h-8.57l-1.73.05-1.72.07-1.71.1-1.74.08-1.71.12-1.74.13-1.71.15-1.74.17-1.73.16-1.73.2-1.74.22-1.73.23-1.75.25-1.7.27-1.7.28-3.45.59-3.45.63-3.47.72-3.48.71-3.47.74-3.5.76-3.5.79-7.07 1.63-7.08 1.63-3.57.84-3.58.8-3.6.8-3.6.78-3.63.75-3.64.73-3.65.69-3.66.65-3.67.6-1.85.28-1.85.28-1.87.25-1.85.25-1.86.22-1.87.22-1.87.18-1.88.18-1.87.15-1.88.15-1.9.12-1.88.08-1.9.09h-9.54l-1.91-.05-1.94-.1-1.91-.12-1.94-.08-1.63-.15-1.63-.18-1.64-.2-1.6-.23-1.63-.24-1.6-.29-1.6-.3-1.59-.31-1.58-.34-1.57-.36-1.54-.4-1.52-.4-1.55-.4-1.55-.42-1.53-.43-1.55-.45-3-.92-3-1-3-1-3-1-2.95-1-2.92-1-5.8-2-2.85-1-2.83-1-2.82-.92-2.78-.87-2.87-.69-1.37-.38-1.37-.39-1.35-.36-1.33-.37-1.35-.32-1.35-.32-1.33-.3-1.32-.26-1.31-.25-1.32-.24-1.32-.21-1.28-.2-1.3-.17-1.28-.13-1.29-.12-1.26-.1-1.27-.07h-5l-1.32.07h-1.46l-1.42-.38-1.35-.55-1.22-.77-1.08-1-.9-1.14-.67-1.28-.45-1.38-.2-1.45v-1.45l.3-1.42.55-1.35.82-1.21 1-1.07 1.14-.9 1.28-.68 1.38-.44 1.45-.2 1.52-.08h4.82l1.6.06 1.6.09 1.58.11 1.58.15 1.57.19 1.57.2 1.56.23 1.55.25 1.57.27 1.53.3 1.55.31 1.54.35 1.53.35 1.52.37 1.51.4 1.52.4 1.52.42 1.51.43 3 .88 3 .94 3 1 2.95 1 2.93 1 5.82 2 2.9 1 2.88 1 2.87 1 2.85.94 2.83.9 2.85.85 1.38.4 1.4.4 1.4.38 1.4.37 1.4.33 1.39.33 1.38.32 1.38.3 1.29.15 1.37.25 1.36.24 1.37.21 1.37.2 1.35.17 1.35.15 1.35.12 1.7.13 1.68.1 1.7.08 1.7.07h6.8l1.7-.05 1.7-.07 1.7-.1 1.72-.1 1.7-.13 1.71-.14 1.72-.16 1.72-.19 1.71-.18 1.72-.22 1.72-.21 1.73-.24 1.72-.25 1.71-.26 3.49-.59 3.46-.61 3.47-.65 3.5-.7 3.48-.72 3.5-.77 3.52-.76 3.52-.8 3.53-.82 7.1-1.65 7.1-1.63 3.58-.8 3.6-.79 3.59-.76 3.61-.74 3.62-.71 3.63-.67 3.64-.62 1.83-.3 1.83-.28 1.92-.27 1.9-.26 1.9-.24 1.9-.21 1.88-.19 1.9-.18 1.89-.17 1.86-.13 1.89-.13 1.86-.1 1.87-.1 1.87-.07h11.07l3.65.06 3.66.12 3.64.17 3.63.2 3.62.23 3.61.28 3.6.32 3.59.33 3.61.29 3.58.39 3.57.41 3.57.42 3.55.42 7.11.88 7.1.88 7.12.87 3.55.42 3.57.41 3.56.39 3.55.36 1.94.19 1.93.15 1.95.15 2 .11 2 .1 2 .07 2.05.07h10.55l2.15-.07 2.17-.08 2.17-.09 2.2-.11 2.2-.15 2.21-.15 2.22-.17 2.23-.18 2.24-.22 2.25-.22 2.25-.25 2.25-.26 2.26-.27 2.27-.3 2.27-.32 2.26-.33 2.27-.33 2.27-.37 2.26-.38 2.27-.4 2.27-.4 2.26-.44 2.27-.45 2.25-.45 2.25-.46 2.23-.5 2.24-.5 2.23-.52 2.22-.53 2.2-.55 2.2-.55 2.18-.59 2.17-.58 2.16-.6 2.15-.62 2.12-.63 2.12-.63 2.1-.67 2.08-.67 2-.66 2.05-.7 2-.7 2-.72 2-.72 1.95-.73 1.93-.75 1.9-.77 1.89-.76 1.85-.77 1.83-.78 1.8-.8 1.75-.8 1.07-.52 1.06-.52 1.09-.55 1.1-.58 1.1-.6 1.11-.6 2.29-1.3 2.36-1.37 2.37-1.4 2.43-1.4 2.45-1.42 2.54-1.4 1.3-.7 1.34-.68 1.34-.67 1.33-.65 1.37-.63 1.38-.62 1.4-.58 1.41-.57 1.45-.53 1.47-.5 1.5-.47 1.52-.43 1.57-.35 1.58-.38 1.4-.25 1.42-.19 1.4-.11 1.38-.07h1.35z"/><path d="m201.17 342.78h1.11l.35.07.27.06.28.07.27.08.28.09.35.13.22.1.22.1.21.1.22.12.22.1.28.18.2.12.2.15.2.13.2.15.18.15.25.22.2.18.2.18.19.19.16.2.24.28.15.17.13.2.15.18.12.18.18.3.13.22.12.22.12.23.16.33.1.22.09.22.08.21.07.24.08.21.07.27.06.23.07.24v.23l.05.25v3.48l-.05.29-.07.28-.07.27-.08.28-.08.27-.1.26-.12.27-.1.27-.13.25-.14.25-.15.25-.15.23-.15.23-.16.24-.17.23-.18.22-.2.21-.2.2-.2.2-.2.19-.22.2-.23.16-.22.17-.23.17-.25.15-.24.15-.25.13-.26.13-.25.12-.27.12-.27.1-.26.08-.27.08-.28.09-.27.06-.28.05h-.29l-.2.27-.78 1.08-.8 1.17-.82 1.23-.83 1.3-.83 1.32-.82 1.35-.78 1.32-.74 1.3-.7 1.25-.63 1.18-.37.7v2.43l-.07.29-.06.26-.07.29-.08.26-.1.27-.1.27-.12.26-.12.25-.13.27-.13.23-.15.25-.15.24-.17.23-.17.23-.18.22-.18.22-.2.21-.2.2-.2.2-.47.42-.45.35-.18.17-.22.15-.2.13-.22.15-.2.12-.2.13-.21.12-.22.11-.22.1-.16.09-.25.11-.25.1-.25.1-.27.1-.27.07-.26.08-.18.24-.27.05h-.13l-.28.05h-2.55l-.27-.05-.25-.05-.25-.07-.27-.06-.25-.07-.23-.08-.25-.1-.25-.1-.23-.1-.24-.12-.25-.14-.25-.13-.23-.15-.23-.17-.24-.15-.23-.18-.22-.18-.21-.19-.2-.2-.18-.18-.18-.2-.19-.2-.16-.22-.15-.2-.17-.22-.13-.23-.15-.22-.14-.23v-.05l-.14-.25-.13-.25-.1-.25-.12-.25-.1-.27-.08-.26-.08-.25-.07-.29-.07-.26v-.14l-.05-.26v-2.66l.05-.27.08-.58.2-.84.24-.75.43-1.16.5-1.2.58-1.24.64-1.28.7-1.33.75-1.4.8-1.45.85-1.49.9-1.5.91-1.51.94-1.5 1-1.5 1-1.45 1-1.4 1-1.37 1-1.28 1-1.24.95-1.11.55-.59.53-.55.57-.55.63-.55.73-.56.54-.35.23-.15.23-.14.25-.13.25-.13.2-.12.22-.1.22-.08.21-.1.22-.09.23-.08.25-.08.27-.09.25-.06.27-.07-.2-.05.27-.05h1.87zm16.38 18.75h1.25l.25.05.23.05.25.07.24.06.25.07.23.08.23.1.24.1.23.1.22.1.23.14.22.11.21.14.2.13.22.15.2.15.2.15.18.17.2.16.19.17.16.18.17.19.17.18.16.2.15.2.15.2.15.22.14.2.13.21.12.24.11.21.12.24.1.21.08.24.1.25.09.23.06.23.07.25.05.25.07.24v3.35l-.07.25v.25l-.06.23-.09.25-.08.23-.08.24-.1.23-.1.23-.12.22-.12.23-.13.22-.12.22-.15.2-.13.21-.15.2-.17.2-.15.19-.18.18-.17.18-1.05 1.07-1 1.08-1.12 1.19-1 1.16-2.2 2.52-2.25 2.57-2.26 2.58-1.17 1.3-1.17 1.28-1.2 1.24-1.2 1.21-1.26 1.14-1.15 1-.19.17-.2.15-.18.16-.22.15-.2.14-.21.13-.22.13-.22.12-.21.12-.24.11-.23.1-.23.1-.24.09-.23.08-.25.07-.23.06-.25.07-.25.05-.24.05h-2.51l-.25-.05-.25-.05h-.24l-.25-.05-.25-.08-.23-.07-.23-.08-.24-.1-.23-.08-.23-.12-.24-.1-.21-.12-.22-.13-.22-.13-.21-.14-.2-.15-.2-.15-.2-.15-.2-.16-.19-.17-.18-.17-.17-.18-.18-.18-.17-.19-.15-.2-.16-.2-.15-.2-.14-.2-.13-.21-.13-.22-.12-.22-.12-.23-.11-.22-.1-.23-.1-.23-.09-.24-.08-.23-.07-.25-.06-.23-.07-.25-.05-.25v-3l.05-.25v-.25l.06-.24.07-.25.07-.23.15-.22.1-.23.08-.24.12-.21.1-.24.12-.21.13-.22.13-.22.14-.21.15-.2.15-.2.15-.2.16-.2.17-.19.17-.18.18-.18.18-.17.95-.87.9-.86.95-1 1-1 1-1.1 1-1.16 2.18-2.47 2.23-2.57 2.29-2.6 1.18-1.31 1.18-1.29 1.19-1.28 1.15-1.17.18-.18.18-.17.2-.16.19-.17.2-.15.2-.15.21-.13.22-.14.22-.13.21-.13.22-.12.23-.1.24-.1.23-.1.23-.08.24-.09.23-.08.25-.07h.25l.23-.05.25-.05h1.52zm58.37-103.15h.4l.4.05.38.05.4.08.38.1.39.12.36.13.37.15.37.17.35.18.33.2.33.22.32.23.32.25.3.27.28.27.27.3.25.3.25.31.23.32.2.33.2.35.18.35.15.37.15.37.1.33.32.12 2.73 1 1.5.57.8.33.82.33.82.37.83.42.85.45.88.51.89.6.76.59 1.07.86.92.75 2 1.54 2 1.53 2.09 1.53 2.11 1.55 2.17 1.57 4.4 3.18 2.22 1.62 2.21 1.67 2.22 1.68 2.17 1.72 1.1.88 1.08.9 1.07.9 1.05.92 1.05.93 1 .95 1 1 .95.91.28.29.25.3.25.31.24.32.21.33.2.34.19.35.16.36.17.37.12.37.11.38.1.38.09.4.06.39v1.98l-.07.38-.06.4-.09.39-.11.38-.12.37-.15.38-.17.35-.16.37-.2.33-.22.33-.22.34-.25.31-.25.3-.28.29-.28.28-.3.27-.3.23-.32.23-.33.22-.35.22-.35.18-.35.17-.37.15-.38.13-.41.07-.38.08-.38.08-.4.07h-2.37l-.38-.09-.39-.08-.38-.12-.38-.11-.37-.15-.37-.15-.35-.19-.35-.2-.33-.21-.32-.22-.31-.25-.3-.25-.3-.27-.84-.83-.81-.78-.85-.77-.87-.78-.9-.77-.9-.78-.95-.77-.93-.77-2-1.56-2-1.55-2.07-1.58-2.14-1.55-4.35-3.15-2.2-1.6-2.2-1.6-2.2-1.64-2.18-1.66-2.15-1.69-1.08-.88-.92-.75-.1-.07h-.05l-.15-.1-.27-.13-.35-.17-.4-.18-.48-.22-.52-.2-1.23-.47-1.32-.48-1.43-.52-1.43-.53-.79-.32-.78-.33-.78-.37-.82-.4-.85-.46-.88-.57-.64-.45-.28-.23-.3-.25-.58-.52-.59-.6-.5-.6-.5-.68-.26-.45-.2-.35-.19-.35-.06-.17-.12-.25-.1-.23-.1-.27-.07-.15-.1-.3-.08-.3-.08-.3v-.17l-.06-.3-.07-.3v-3.04l.05-.3.06-.3v-.18l.06-.28.09-.3.08-.29.07-.18.13-.37.15-.35.08-.2.15-.33.19-.33.25-.47.46-.72.34-.43.25-.3.26-.3.29-.28.28-.29.3-.25.32-.25.33-.21.33-.22.34-.2.36-.17.35-.16.39-.15.36-.12.39-.12.38-.08.4-.07.38-.05h.8z"/><path d="m315.58 245.38h.82l.4.07.4.08.4.1.38.12.39.13.38.17.37.18.35.18.35.22.35.23.31.25.32.25.3.29.28.28.29.32.25.31.25.32.21.35.22.35.18.37.19.36.15.39.05.15.1.28.1.28.08.29v.16l.07.27.05.28v.45l.05.37v2.27l-.05.38-.07.38-.08.42v.28l-.09.29-.08.28-.23.77-.42 1-.45.93-.48.89-.5.83-.54.82-.55.8-.58.78-.6.8-.65.82-1.25 1.68-1.43 1.65-1.57 1.7-1.6 1.74-1.65 1.78-3.46 3.63-3.57 3.77-1.72 1.88-1.75 1.9-1.74 1.9-1.68 1.88-1.6 1.85-1.55 1.84-.7.88-.7.88-.68.87-.64.83-.6.84-.56.8-.54.78-.48.75-.45.72-.4.68-.35.65-.32.6-.26.55-.21.5-.15.43-.12.37-.07.27-.05.26v.97l-.07.42-.07.4-.1.4-.11.38-.15.38-.15.39-.17.36-.2.37-.2.35-.23.35-.24.32-.26.31-.27.32-.3.28-.3.29-.32.25-.31.25-.35.23-.35.2-.35.2-.37.17-.38.16-.39.14-.4.13-.38.1-.4.07-.42.06-.4.05h-1.63l-.4-.07-.4-.08-.4-.08-.4-.12-.38-.15-.39-.15-.36-.17-.35-.2-.37-.2-.33-.23-.34-.25-.31-.25-.3-.27-.3-.3-.27-.3-.27-.31-.23-.32-.23-.35-.22-.35-.18-.35-.19-.37-.16-.38-.14-.38-.11-.4-.1-.39-.09-.4-.06-.41v-2.42l.06-.67.1-.71.24-1.2.3-1.22.38-1.18.42-1.15.48-1.12.52-1.1.55-1.08.58-1.09.62-1.05.65-1.05.68-1.05.72-1.05.73-1 .75-1 .78-1.05.8-1 .82-1 .85-1 1.72-2.05 1.76-2 1.82-2 1.83-2 1.85-2 1.85-2 3.6-3.8 3.4-3.6 1.59-1.69 1.48-1.61 1.37-1.5 1.21-1.42 1.07-1.3.45-.55.42-.53.35-.49.3-.43.13-.2v-.72l.07-.4.08-.4.1-.4.12-.38.15-.38.15-.39.18-.36.2-.37.2-.35.23-.33.25-.34.27-.3.27-.3.3-.3.3-.26.31-.27.34-.23.33-.24.35-.2.37-.18.36-.18.39-.15.38-.14.4-.11.4-.1.4-.09h1.22zm-8.16 11 .1.29-.12-.37zm-20.55-118.71h1l.31.05.34.07.31.08.32.08.32.1.31.12.3.13.3.14.3.16.29.15.28.19.27.18.26.2.27.2.25.22.23.23.24.23.23.25.2.25.2.27.2.27.18.28.17.28.15.29.15.3.13.3.14.31.1.32.1.32.08.31.07.32.06.33.05.34v2.43l-.1.52-.22 1.11-.27 1.42-.26 1.52-.22 1.28v3.25l-.05.15-.05.17-.05.15-.05.16-.07.15-.05.15-.06.15-.07.15-.07.15-.39.15-.07.15-.08.15-.08.14-.09.15-.1.13-.08.15-.1.13-.08.14-.1.13-.1.13-.12.14-.1.11-.12.14-.1.11-.11.12-.12.12-.07.06-.11.12-.12.12-.12.1-.13.11-.12.1-.13.1-.13.1-.12.1-.13.09-.14.1-.15.08-.13.08-.13.09-.15.08-.14.08-.15.07-.15.08-.15.07-.15.07-.15.06-.15.07-.15.05-.15.07-.15.05h-.32l-.15.05h-4.33l-.17-.05h-.17l-.15-.06-.15-.05h-.16l-.15-.07-.15-.07-.15-.06-.15-.07-.15-.07-.15-.08-.15-.08-.14-.09-.15-.08-.13-.08-.15-.09-.13-.1-.14-.1-.13-.08-.13-.12-.12-.1-.13-.1-.14-.11-.11-.1-.12-.12-.12-.12-.11-.11-.12-.12-.12-.13-.1-.12-.11-.13-.1-.13-.1-.13-.1-.12-.08-.13-.1-.14-.08-.13-.09-.15-.08-.13-.08-.14-.09-.15-.06-.13-.09-.15-.06-.15-.07-.15-.07-.15-.05-.15-.06-.15-.05-.15-.05-.15v-.15l-.05-.15-.05-.17v-2.88l.06-.92.1-.88.14-.88.26-1.7.32-1.72.28-1.48.2-1-.06.31v.22-1.85l.05-.17v-.15l.07-.17v-.15l.05-.15.07-.16.06-.15.07-.15.08-.15.07-.15.08-.14.09-.15.08-.15.08-.13.09-.15.1-.13.08-.14.1-.13.1-.13.1-.14.12-.11.1-.14.11-.11.1-.14.12-.11.12-.12.11-.12.14-.11.11-.1.14-.12.11-.1.14-.1.13-.1.13-.1.14-.1.15-.08.13-.09.15-.1.13-.08.15-.07.15-.08.14-.08.15-.07.15-.07.16-.06.15-.07.15-.05.15-.07h.17l.15-.05.17-.05h2.45zm17.26-13h1.22l.3.06h.3l.28.09.3.08.29.1.28.1.28.12.29.13.26.13.27.15.27.17.25.17.25.16.23.19.25.2.22.2.23.2.2.23.22.22.18.23.2.23.17.25.16.25.17.27.15.27.15.26.12.27.13.28v.12l.19.2.2.23.18.25.17.25.16.25.17.27.13.27.15.26.12.27.12.28.11.29.09.3.08.28.08.3.07.3.05.3v4.2l-.05.08v.29l-.21.5-.25.46-.05.09v.08l-.05.08-.05.07-.05.08-.05.09v.08l-.05.07-.05.08-.05.08-.05.07-.08.12-.05.08-.07.07-.66.23-.06.08-.07.09v.06l-.07.09-.06.06-.07.09-.07.06-.06.09-.07.06-.07.07-.06.08-.09.07-.06.07-.07.06-.07.07-.06.07-.09.06-.06.07-.09.07-.06.06-.09.07-.06.05-.09.07-.08.06h-.07l-.08.07h-.08l-.09.07-.05.18-.07.05h-.08l-.08.05-.09.06h-.08l-.08.05h-.09l-.08.05h-.1l-.08.05-.09.05h-.18l-.1.05h-6.95l-.09-.05h-.1l-.08-.05h-.25l-.08-.05-.1-.05h-.17l-.08-.05-.1-.05h-.09l-.08-.05-.08-.06h-.09l-.08-.05-.08-.07-.09-.05-.06-.07-.09-.05-.08-.06h-.08l-.07-.07-.08-.07h-.07l-.08-.06-.07-.07-.08-.07-.07-.06-.07-.07-.08-.07-.07-.06-.06-.07-.07-.07-.07-.06-.06-.09-.07-.06-.07-.07-.06-.08-.07-.09-.07-.06-.06-.07-.05-.08-.07-.07-.05-.08-.07-.07-.05-.08-.06-.07-.05-.08-.05-.09v-.06l-.07-.09v-.08l-.05-.08-.12-.2-.05-.09-.05-.08-.05-.08v-.09l-.05-.08-.05-.08v-.09l-.05-.08v-.27l-.26-.56-.3-.82-.2-.68-.19-.65-.23-1-.15-.87-.07-.43v-4.24l.05-.1v-.18l.05-.1v-.18l.05-.09v-.08l.05-.1.05-.08v-.1l.05-.09.05-.08.05-.08.06-.09v-.1l.05-.08.05-.08.07-.09.05-.08.07-.08.06-.09.05-.06.07-.09.07-.08.06-.08.07-.07.07-.08.06-.07.07-.08.07-.07.06-.08.07-.07.08-.08.07-.07.07-.07.08-.06.07-.07.08-.07.08-.06.07-.07.08-.07.09-.06.08-.07.07-.05.08-.07h.08l.09-.06h.08l.08-.07h.17l.1-.07h.35l.08-.05h4zm8.2 7.63v.3-.32zm-14.33-.18-.07.15.05-.1v-.07zm36.07-22.42h1.23l.3.05.3.06.3.07.3.08.3.1.28.12h.12l.37.07.3.06.3.09.3.1.28.1.3.11.28.12.27.15.28.13.27.17.25.17.27.16.25.19.23.2.23.2.24.21.21.22.2.23.22.24.18.23.19.25.18.27.15.26.17.27.13.27.13.28.14.28.1.29.11.3.09.3.08.3.07.3v.3l.05.3v5.03l-.05.08v.27l-.05.07v.06l-.05.07v.13l-.05.07-.05.07-.05.06v.07l-.05.07-.05.06v.07l-.05.07-.05.06-.05.07-.05.05-.05.07-.05.06h-.05l-.05.07h-.05v.07l-.07.05-.05.06h-.16l-.07.05h-.05l-.07.07h-.05l-.06.05h-.3l-.05.05h-.92l-.08.05h-11.31l-.07-.05h-.25l-.06-.05h-.32l-.05-.05h-.18l-.07-.05h-.13l-.05-.05-.05-.07h-.12l-.1-.1-.05-.06h-.1l-.05-.07-.05-.07h-.05l-.05-.06-.05-.05v-.07h-.05l-.05-.07-.05-.06-.05-.07v-.07l-.05-.06v-.07l-.31-.47-.05-.06v-.2l-.05-.07v-.07l-.05-.06v-.14l-.05-.06v-7.98l.05-.07v-.13l.05-.07v-.13l.05-.07v-.06l.05-.07v-.07l.05-.06h.05v-.14l.05-.06h.05l.05-.07v-.07h.05l.05-.06.05-.07.05-.07h.05l.05-.06h.05l.07-.07h.05l.05-.07.06-.05h.1l.07-.06h.05l.07-.05h.18l.07-.05h.55l.06-.05h.4l.07-.05h4.13zm6.73 3.53.1.12-.1-.13zm54.28-11.66h.94l.46.06.45.1.47.12.43.15.44.17.43.2.42.21.4.25.38.25.37.29.36.31.34.32.31.35.3.35.29.38.25.4.23.4.22.42.18.43.17.44.13.45.12.45.08.46.07.47v2.75h-12.44v-1.11.36-3.03h.3-1.18 3.64l.5-.05h.85zm-5.66 15.1.2.15h-.1zm10.4-13 .2.18-.22-.23-.3-.22zm36.78 11.73h1.32l.31.06.32.07.33.08.3.1.32.12.3.13.3.14.3.15.28.16.29.17.28.18.27.19.26.21.25.22.24.22.23.23.23.23.22.27.2.25.18.27.19.28.18.28.2.34.15.3.15.28.12.3.1.23.11.32.1.32.1.31.07.32.07.33.06.32v5.4l-.05.07v.13l-.05.08v.07l-.05.07v.06l-.05.07-.05.07v.06l-.06.1v.14l-.05.06-.05.07-.05.05v.07l-.05.06-.05.07-.05.07-.05.06v.05l-.05.07-.05.07-.06.05-.05.06v.07l-.05.05-.07.07-.05.05h-.07l-.05.06-.06.05v.06l-.05.07v.07l-.05.06-.05.07-.05.07-.05.06v.07l-.05.05-.05.07-.07.06-.05.07-.05.05-.05.07-.07.06h-.05v.07l-.06.07h-.05l-.07.06-.05.05-.07.05-.06.07h-.05l-1.61.41h-.07l-.05.05h-.06l-.07.05-.07.06-.06.05h-.07l-.07.05h-.06l-.07.05h-.07l-.06.05h-.07l-.07.05-.06.05h-.14l-.08.05h-.42l-.08.05h-.37l-.08.05h-7l-.07-.05h-.37l-.06-.05h-.09l-.06-.05h-.14l-.08-.05h-.07l-.06-.05h-.07l-.07-.05h-.13l-.07-.05-.06-.05h-.07l-.07-.05h-.06l-.07-.07-.07-.05h-.06l-.07-.05v-.07l-.07-.05-.06-.06h-.05l-.07-.05-.05-.07-.07-.07-.05-.05-.06-.06-.05-.05-.05-.07-.07-.07-.05-.05v-.06l-.05-.07-.23-.14-.05-.07-.07-.05-.05-.07v-.06l-.05-.07-.05-.07v-.08l-.05-.07-.05-.06v-.07l-.05-.07-.05-.06v-.09l-.05-.06v-.07l-.05-.07v-.15l-.05-.06v-6.33l.07-.22v-1.55l.09-.18.05-.07v-.22l.05-.06v-.07l.05-.08v-.2l.05-.07v-.07l.05-.06.05-.07.05-.07v-.06l.05-.07.05-.07.05-.06.05-.06v-.24l.05-.06v-.22l.05-.07v-.06l.05-.09v-.13l.05-.07.05-.06.05-.07v-.13l.05-.07.05-.07.05-.06.05-.07v-.07l.06-.06.05-.07h.05l.05-.07v-.06h.07v-.07l.07-.07.05-.06.06-.05.05-.07h.07l.07-.07h.11l.07-.06h.12l.06-.05h.07l.07-.07h.06l.05-.05h.35l.07-.05h.2l.07-.05h.36l.07-.05h4.61zm-7.53 12.12.23.41v-.51zm14.7-1v.63l.05-.13v-.52zm18.36 20.83h1.42l.28.07.29.07.26.06.29.09.26.1.27.1.27.11.25.12.25.13.25.14.25.15.25.16.23.15.22.19.23.18.22.18.2.2.2.2.2.2.18.22.18.22.19.23.16.23.15.24.15.25.14.25.13.25.13.26.12.25.1.27.1.28.08.27.07.27.08.28.05.28v3.82l-.05.15v.13l-.05.14-.05.13-.05.13-.05.14v.13l-.05.13-.06.14v.21l.05.72.07.73v3.09l-.05.13v.28l-.05.14-.05.13-.05.13v.14l-.05.13-.05.13-.05.14-.06.13-.07.12-.05.13-.07.13-.06.12-.09.13-.06.12-.07.13-.08.12-.09.12-.06.11-.09.12-.1.12-.08.11-.08.12-.09.1-.1.12-.1.1-.08.11-.1.1-.1.1-.1.1-.1.1-.12.1-.1.1-.11.09-.1.1-.12.08-.12.1-.1.08-.11.09-.12.08-.12.08-.13.07-.12.08-.11.07-.14.08-.11.07-.14.07-.11.06-.14.07h-.13l-.13.07h-.14l-.11.05-.14.06h-.41l-.14.05h-4.93l-.13-.05h-.14l-.13-.05h-.13l-.14-.07-.13-.05-.13-.05-.14-.06-.11-.07-.14-.07-.13-.06-.12-.07-.13-.07-.12-.06-.11-.09-.14-.08-.11-.07-.12-.08-.12-.08-.11-.09-.1-.1-.12-.08-.12-.08-.1-.1-.11-.1-.1-.1-.1-.09-.1-.1-.1-.11-.1-.1-.1-.1-.1-.12-.09-.1-.1-.12-.08-.1-.08-.11-.09-.12-.08-.12-.08-.11-.09-.12-.08-.13-.07-.12-.08-.12-.07-.13-.06-.12-.07-.13-.07-.12-.06-.13-.05-.13-.07-.14-.05-.13-.05-.13-.05-.14v-.13l-.05-.13-.05-.14v-.28l-.05-.13v-1.89l-.05-.68-.09-1.05v-3.05l.09-1 .18-1.08.18-.75v-.72l.15-.45.33-.78.27-.49.07-.11.06-.12.07-.13.08-.12.07-.12.08-.11.1-.15.07-.1.08-.1.07-.1.08-.1.07-.1.08-.1.09-.1.08-.1.1-.12.1-.1.08-.1.09-.1.1-.08.08-.1.1-.09.1-.1.1-.08.1-.08.12-.1.1-.1.11-.09.1-.08.12-.1.12-.08.11-.09.12-.06.13-.09.12-.08.12-.07.11-.08.14-.07.13-.06.12-.07.13-.07.13-.05.12-.06h.13l.14-.07h.13l.13-.05h.27l.15-.05h.13l.14-.05h.98-.57 1.15zm5.77 14.27-.1.1-.1.08-.12.1-.1.1.34-.28.1-.12zm6.32 23.13h.96l.32.05.32.06.31.07.3.08.32.1.3.12.3.12.3.13.28.13.29.17.26.15.29.18.25.19.26.2.25.2.24.21.23.22.22.23.21.25.2.25.2.25.12.19.17.21.15.19.2.2.78.73.87.83.21.24.24.23.2.23.2.27.2.25.16.27.19.28.15.27.15.3.13.28.13.3.12.3.1.3.08.32.09.3.06.31.05.32.05.33v3.9l-.05.1v.29l-.05.1v.1l-.05.1-.05.1v.08l-.05.1-.05.1-.05.08-.06.1v.09l-.05.1-.07.08-.05.1-.07.08-.05.09-.06.1-.07.08-.07.08-.06.09-.07.08-.07.08-.06.09-.07.08-.07.08-.08.09-.07.06-.06.09-.09.08-.06.07-.09.08-.08.07-.07.08-.08.07-.08.06-.09.07-.08.07-.08.08-.09.07h-.08l-.08.06-.09.07-.08.07-.1.06h-.08l-.09.07h-.1l-.08.07-.1.05-.08.05h-.1l-.1.05h-.09l-.1.05-.1.05h-.1l-.08.05h-.2l-.1.05h-.2l-.1.05h-5.98l-.1-.05h-.1l-.1-.05h-.19l-.1-.05-.1-.05h-.1l-.08-.05h-.1l-.1-.05-.08-.05-.1-.06h-.09l-.1-.05-.08-.07-.08-.05-.1-.07-.09-.06-.08-.07-.08-.05-.09-.07-.08-.06-.08-.07-.09-.08-.08-.07-.08-.07-.09-.06-.08-.09-.07-.06-.85-.82-1-.92-.64-.65-.68-.75-.72-.88-.5-.73-.06-.09-.05-.1-.07-.08-.05-.1-.05-.08-.07-.1-.05-.09-.05-.1v-.1l-.05-.08-.05-.1-.05-.1v-.1l-.05-.1-.05-.08v-.1l-.05-.1v-.2l-.05-.1v-1.79.05-3.82l.05-.1v-.2l.05-.1v-.2l.05-.08v-.1l.05-.1.05-.1.05-.08.05-.1v-.09l.07-.1v-.1l.05-.08.06-.08.05-.1.07-.09.07-.08.06-.1.05-.08.07-.09.07-.08.06-.08.07-.09.08-.08.07-.08.07-.07.06-.08.09-.09.06-.06.09-.09.06-.08.09-.07.08-.06.08-.09.07-.06.08-.07.09-.07.08-.06.08-.07.09-.07.08-.06.1-.07.08-.07.09-.06.08-.05.1-.07h.08l.1-.07h.09l.1-.05h.08l.1-.06.1-.05.08-.05h.2l.1-.05.1-.05h.29l.1-.05h3.15zm14.66 34.8h1.22l.25.05.23.05h.24l.23.06.23.07.24.08.23.09.23.1.22.1.22.1.21.11.22.12.22.12.2.13.2.13.2.15.2.15.18.15.2.17.17.17.18.16.17.17.16.18.17.19.15.2.15.18.13.2.55.23.77.37.22.12.21.11.2.12.22.13.2.14.2.13.2.15.2.15.18.15.19.17.16.16.19.19.16.16.17.19.15.2.15.18.15.2.13.2.14.2.13.22.12.2.11.21.12.24.1.21.1.22.08.23.09.24.08.23.07.23.05.24.06.23.05.25v3.87l-.05.11v.24l-.05.11v.24l-.05.11v.22l-.05.12-.05.1-.07.11-.05.12-.05.1-.06.12-.07.1-.05.1-.07.11-.06.1-.07.1-.07.1-.06.1-.07.1-.08.1-.07.1-.08.1-.07.09-.08.1-.09.1-.08.08-.07.1-.08.08-.1.09-.08.08-.09.1-.08.08-.1.09-.08.08-.1.07-.09.08-.1.08-.1.07-.08.08-.1.07-.1.08-.1.07-.1.07-.1.06-.1.07-.12.07-.1.06-.1.05-.11.07-.1.07-.12.05h-.1l-.12.06-.1.05-.11.05h-.24l-.1.05-.11.05h-6.32l-.12-.05-.11-.05h-.22l-.12-.06-.11-.05-.52-.25-.32-.14-.25-.1-.21-.08-.62-.22-.55-.2-.43-.18-.12-.05-.1-.05h-.12l-.11-.07-.1-.05-.12-.06-.1-.05-.18-.1-.1-.07-.1-.05-.1-.07-.1-.06-.1-.07-.1-.07-.1-.06-.1-.07-.1-.07-.09-.06-.16-.14-.1-.06-.09-.09-.1-.06-.08-.09-.08-.06-.1-.09-.09-.08-.08-.08-.08-.09-.09-.08-.08-.08-.15-.17-.08-.08-.07-.09-.08-.08-.07-.08-.08-.09-.07-.08-.07-.1-.06-.08-.09-.09-.06-.1-.14-.2-.06-.1-.07-.1-.07-.1-.06-.1-.07-.1-.07-.1-.06-.1-.29-.5-.36-.75-.45-1.06-.05-.1v-.12l-.05-.12v-.11l-.05-.12v-4.98l.05-.11v-.24l.05-.11v-.12l.05-.12.05-.11.05-.1v-.12l.05-.12.05-.1.07-.11.05-.1.05-.12.06-.1.07-.1.07-.12.05-.1.06-.1.07-.1.08-.1.07-.1.07-.1.08-.1.07-.1.08-.1.07-.08.08-.1.08-.08.09-.1.08-.09.08-.1.09-.08.08-.08.08-.09.1-.08.09-.08.1-.09.08-.08.1-.07.1-.08.08-.07.1-.08.1-.07.1-.06.1-.09.1-.06.12-.07.1-.07.1-.05.1-.06.12-.07h.1l.11-.07h.1l.12-.05h.1l.12-.05.11-.05h.12l.1-.05h.23l.12-.35h2.88zm22 25.07h1.35l.49.08h.23l.23.05h.22l.23.07.22.06.22.09.23.08.22.08.2.1.21.1.2.1.22.12.25.15.5.15h.38l.24.05h.23l.22.05.23.07.22.08.21.07.22.08.22.1.21.1.22.1.2.1.2.12.22.12.18.13.2.13.18.14.2.13.17.15.18.15.19.15.16.17.17.16.15.17.17.18.15.19.13.18.15.18.13.19.12.2.13.2.12.2.12.2.1.21.1.2.1.22.08.22.08.21.09.24.06.21.07.22v.47l.05.23v4.38l-.05.12v.22l-.05.1v.21l-.05.12v.1l-.05.12v.2l-.05.1v.11l-.06.1v.1l-.07.1v.1l-.07.1-.06.1-.07.1-.07.09-.06.1-.07.1-.07.08-.06.1-.09.1-.06.08-.07.09-.08.1-.09.08-.75.08-.09.09-.08.08-.08.08-.09.09-.08.08-.08.08-.1.07-.09.08-.08.09-.1.06-.08.07-.1.08-.09.07-.1.07-.1.06-.08.07-.1.07-.1.06-.1.07-.1.05-.1.07-.1.05-.1.06-.1.05-.1.05-.12.07-.1.05h-.21l-.1.05h-.12l-.1.05h-.22l-.11.05h-4.55l-.5-.1-1.1-.29-1.1-.35-1.05-.35-1.05-.38-.69-.3-.1-.05h-.11l-.1-.05-.1-.05-.1-.05-.1-.05-.12-.07-.1-.05-.1-.06-.1-.05-.1-.07-.1-.07-.1-.06-.08-.05-.1-.07-.1-.07-.09-.06-.1-.07-.08-.08-.1-.07-.08-.07-.09-.08-.1-.07-.08-.08-.08-.07-.09-.08-.06.35-.08-.09-.09-.06-.06-.09-.09-.08-.08-.08-.07-.1-.08-.09-.07-.08-.06-.08-.09-.1-.06-.09-.07-.1-.07-.08-.06-.1-.07-.1-.07-.08-.06-.1v-.1l-.07-.1-.05-.1-.06-.12v-.1l-.05-.1-.07-.1-.05-.1-.05-.11-.05-.1-.05-.1v-.12l-.05-.1-.22-.15v-.21l-.05-.12v-5.25l.05-.1v-.34l.05-.11v-.1l.05-.12.05-.1v-.1l.05-.12.05-.1.05-.1.06-.1v-.1l.05-.11.07-.1.07-.1v-.09l.06-.1.07-.1.07-.1.06-.1.07-.08.08-.1.07-.08.07-.1.08-.09.07-.1.08-.08.08-.08.07-.09.08-.08.09-.08.35-.17.09-.08.08-.09.1-.08.1-.08.08-.07.09-.08.1-.07.08-.07.1-.06.08-.07.1-.07.1-.06.09-.07.1-.07.1-.06.1-.05.1-.07.1-.05h.1l.1-.07.1-.05.1-.05h.1l.1-.05h.21l.1-.05.12-.05h3.19zm-.68 16.66h-.35zm5.57-15.28h.23-.2zm27 17.12h.95l.25.05h.23l.23.05.22.05.23.06.24.07.21.08.24.07.21.1.22.08.22.1.21.12.22.1.2.13.2.12.2.13.2.14.22.15.31.05h.24l.23.05.23.05.24.07.21.06.24.09.21.06.24.1.21.09.22.1.22.1.2.11.21.12.2.13.2.12.2.13.19.15.18.14.18.15.19.16.18.17.17.15.16.18.17.17.15.18.15.19.15.18.13.2.14.2.13.2.12.2.11.2.12.22.1.21.1.22.1.22.08.21.09.24.06.21.07.24.07.23.05.23v4.35l-.05.1v.24l-.05.11v.22l-.05.1v.22l-.05.11v.1l-.07.1v.12l-.06.1v.1l-.07.1-.07.1-.05.1-.06.1-.07.1-.07.1-.08.1-.07.1-.06.08-.07.1-.08.1-.09.09-.06.08-.09.1-.08.08-.08.09-.09.08-.08.1-.08.08-.09.09-.08.06-.08.09-.1.08-.09.08-.1.07-.08.08-.1.07-.08.07-.1.06-.1.09-.1.06-.1.07-.1.07-.1.05-.1.06-.1.07-.1.05-.12.07-.1.05h-.1l-.12.06-.1.05-.1.05-.11.05h-.12l-.1.05-.12.05h-.1l-.11.05h-.24l-.1.05h-3.2l-.75-.07-1.8.52-.72-.12-.66-.15-.7-.16-.74-.2-.81-.29-.57-.23h-.2l-.1-.05-.1-.05-.1-.05-.1-.05h-.12l-.25-.14-.1-.05-.1-.06-.1-.05-.1-.05-.08-.07-.1-.07-.1-.05-.1-.06-.08-.07-.1-.07-.09-.06-.2-.15-.08-.07-.08-.07-.1-.06-.09-.07-.08-.07-.08-.08-.09-.07-.08-.08-.08-.07-.09-.08-.08-.08-.08-.09-.07-.06-.07-.09-.08-.08-.08-.08-.09-.1-.06-.09-.09-.08-.06-.1-.09-.08-.06-.1-.07-.1-.07-.09-.06-.1-.07-.1v-.08l-.07-.08-.06-.1v-.1l-.07-.1-.07-.1v-.2l-.06-.1v-.12l-.05-.1v-.42l-.05-.11v-6.59l.05-.1v-.2l.05-.11v-.1l.05-.1v-.19l.05-.1v-.1l.05-.1.07-.1.05-.1.06-.08v-.1l.07-.1.07-.1.06-.08.07-.1.07-.09.06-.1.07-.08.07-.08.08-.1.07-.07.06-.1.09-.08.06-.09.09-.08.08-.08.08-.09.09-.08.08-.08.08-.09.09-.08.08-.07.08-.08.1-.08.1-.07.09-.08.1-.07.08-.08.1-.07.1-.07.1-.06.1-.07.1-.07.1-.06.1-.07.1-.07h.1l.1-.06.1-.05.12-.07.1-.05.1-.05.11-.05h.1l.12-.05.1-.05h.12l.11-.05.1-.05h.24l.11-.05h2.62zm5.78 14.16-.08.09-.09.08-.08.08-.1.09-.08.08-.09.08.44-.38.15-.18zm.83-1 .06-.07v-.05zm36.42-31.73h1.23l.3.07.3.06.3.09.3.08.3.1.29.12.28.11.28.14.27.15.27.15.26.16.27.17.25.18.23.19.24.2.23.21.22.22.21.22.2.23.2.25.19.25.18.25.17.27.15.26.15.27.13.28.13.29.12.28.1.28.1.3.08.3.07.3.07.3v4.22l-.05.15v.15l-.05.13-.07.15-.07.13v.15l-.06.14-.09.15-.06.13-.07.13-.08.14-.09.13-.08.13-.08.14-.09.11-.08.14-.1.13-.08.12-.1.11-.1.12-.1.13-.1.12-.1.1-.12.12-.1.11-.12.1-.11.12-.1.1-.12.1-.13.1-.12.1-.12.1-.13.08-.12.1-.13.09-.12.08-.13.08-.5.09-.14.08h-.08l-.11.1-.15.13-.47.45-.53.54-.55.6-.57.63-.53.62-1 1.21-.81 1-.32.35-.1.1-.1.1-.1.12-.12.1-.1.1-.11.1-.12.1-.12.1-.11.1-.12.08-.12.1-.13.09-.12.08-.13.08-.12.09-.13.08-.13.08-.14.07-.13.07-.13.06-.14.07-.13.07-.15.06-.13.07h-.14l-.15.05-.13.05-.15.05-.15.05h-.15l-.15.05h-4.28l-.15-.05h-.3l-.15-.05-.15-.05-.14-.05-.15-.07-.13-.05-.15-.06-.13-.07-.15-.07-.14-.06-.13-.07-.13-.08-.15-.07-.12-.08-.13-.09-.14-.08-.13-.08-.12-.1-.13-.09-.12-.1-.13-.1-.12-.1-.11-.1-.12-.1-.12-.1-.1-.11-.11-.1-.1-.12-.12-.12-.1-.1-.1-.11-.1-.14-.1-.11-.08-.12-.1-.13-.09-.12-.1-.13-.08-.14-.08-.11-.09-.14-.06-.13-.09-.13-.06-.15-.07-.14-.07-.13-.06-.15-.05-.15-.07-.13-.05-.15-.06-.15v-.15l-.05-.14v-4.67l.05-.15v-.3l.05-.15v-.14l.07-.15v-.15l.07-.13.06-.15.07-.13.07-.17.06-.12.07-.13.07-.12.06-.11.07-.14.07-.11.25-.39.08-.13.08-.13.09-.12.08-.13.1-.12.1-.13.08-.12.1-.12.1-.11.1-.12.12-.12.1-.11.12-.1.1-.12.11-.1.12-.1.12-.1.11-.1.64-.75.68-.8.75-.84.82-.86.85-.89.88-.83.53-.48.52-.44.57-.45.63-.45.72-.46.51-.29.14-.06.15-.09.13-.06.13-.07.15-.07h.14l.15-.06.15-.05h.13l.15-.05.15-.05h.3l.15-.05h2.03zm24.52-21.67h1.63l.23.05h.22l.23.06.22.07.22.08.23.09.22.08.2.1.21.1.22.12.2.11.2.12.2.12.2.13.18.13.2.15.19.14.16.16.19.15.16.17.17.17.17.16.15.17.15.18.15.19.13.18.13.2.14.2.13.2.12.2.11.2.1.22.1.2.1.21.09.22.08.23.08.22.07.22.07.23.05.22v5.25l-.05.12v.22l-.05.1v.21l-.05.1v.1l-.05.07v2.75l-.05.11v.54l-.05.11v.1l-.05.1v.22l-.06.1v.1l-.07.1v.1l-.07.1-.06.1-.07.1-.07.1-.06.1-.07.1-.07.08-.06.1-.09.09-.06.1-.07.08-.08.1-.09.08-.06.09-.09.08-.08.08-.08.09-.09.08-.08.08-.08.09-.1.08-.09.07-.08.08-.1.07-.08.08-.1.07-.09.08-.1.07-.1.06-.08.07-.1.07-.1.06-.1.05-.12.09-.1.06h-.1l-.1.07h-.11l-.1.07-.1.05-.1.05h-.1l-.12.05h-.1l-.1.05h-.12l-.1.05h-.2l-.11.05h-7.51l-.1-.05h-.22l-.1-.05-.12-.05h-.1l-.1-.05h-.1l-.1-.05-.11-.05-.1-.07h-.1l-.09-.05-.1-.07-.1-.06h-.05l-.1-.06-.1-.05-.08-.07-.1-.07-.1-.06-.08-.09-.09-.06-.1-.07-.08-.07-.08-.08-.09-.07-.1-.08-.08-.07-.08-.08-.09-.08-.06-.09-.09-.08-.08-.08-.08-.09-.07-.08-.08-.08-.07-.09-.07-.08-.08-.1-.07-.08-.06-.1-.07-.09-.07-.1-.06-.08-.07-.1-.07-.1-.07-.1v-.1l-.06-.1-.05-.1-.07-.1-.05-.1v-.1l-.05-.1v-.22l-.05-.1v-.1l-.05-.11v-5.17l.12-.62.23-.85.24-.73.23-.67.28-.7.47-1.08.32-.63.35-.64.25-.4.05-.1.06-.08v-.08l.07-.1v-.09l.07-.08.06-.08.07-.09.07-.08.1-.15.08-.08.07-.09.08-.1.07-.08.08-.08.08-.1.09-.09.06-.08.09-.08.08-.09.1-.06.08-.09.09-.08.08-.08.1-.07.08-.08.1-.07.09-.07.1-.06.1-.09.08-.06.1-.07.1-.07h.1l.1-.06.1-.07.1-.05.1-.07.1-.05h.12l.1-.06.1-.05.11-.05h.1l.1-.05h.12l.1-.05h.22l.11-.05h1.49-.6 1.29zm6.58 13.3-.07.09-.06.1.18-.24zm-11.73-8.25-.37.24.1-.07h.1l.1-.07h.1l.1-.06zm1.26-.56h-.06.09zm26.22-33.62h.88l.44.05.43.08.42.12.38.1.82.26.41.17.4.17.4.2.39.21.36.24.37.26.33.27.34.3.31.3.3.33.29.34.25.36.25.37.21.38.2.39.19.4.16.41.14.42.11.43.09.44.06.43v4.77h-9.72l-1.86 4.05h-.7v-13.1h.85-.15 2.38z"/><path d="m677.68 113.33 1.27.17 1.25.25 1.22.35 1.21.42 1.19.51 1.15.57 1.13.67 1.08.71 1.07.79 1 .85.51.45.49.48.45.5.43.5.4.52.43.6.62 1 .58 1.1.5 1.12.4 1.12.34 1.11.26 1.14.2 1.11.17 1.12.1 1.12.05 1.1v2.21l-.07 1.12-.1 1.1-.11 1.12-.17 1.1-.18 1.11-.22 1.1-.23 1.1-.27 1.1-.28 1.1-.32 1.1-.35 1.1-.35 1.09-.38 1.08-.42 1.08-.42 1.07-.45 1.07-.46 1.06-.49 1-.5 1.05-.53 1-.55 1-.57 1-.56 1-.6 1-.64 1-.63.93-.65.92-.68.88-.7.89-.72.85-.75.83-.77.8-.8.78-.81.75-.85.72-.9.7-.92.65-1 .62-1 .56-1.06.54-1.1.46-1.15.4-1.22.34-1.17.23-.73.08-.65.07h-2.02l-.68-.05-.68-.1-.69-.12-.66-.15-.69-.18-.65-.22-.63-.25-.63-.26-.6-.32-.6-.33-.57-.37-.53-.38-.6-.49-.6-.55-.19-.18-.18-.18-.18-.2-.34-.37-.25-.28-.21-.3-.52-.69-.63-1-.54-1-.45-1-.36-1-.32-1-.23-1-.2-1-.14-1-.11-1-.05-1v-3l.07-1 .1-1 .08-.61v-.24l-.22-1-.16-1-.14-1-.1-1v-4l.07-1 .08-1 .12-1 .15-1 .18-1 .18-1 .24-1 .23-1 .27-1 .3-1 .31-1 .34-1 .36-1 .39-.95.4-1 .43-.94.47-.91.46-.92.5-.9.54-.88.55-.89.58-.85.62-.85.63-.81.67-.8.68-.79.73-.76.77-.74.8-.7.85-.68.88-.65.92-.6 1-.57 1-.51 1.06-.47 1.09-.42 1.15-.33 1.16-.27 1.22-.2 1.23-.1h1.25zm-3.53 35.54v-.65zm-.13-5-.2.19-.24.23-.25.25-.26.3-.27.33-.27.35-.28.4-.27.42-.28.43-.15.29.35-.44.48-.58 1-1.37.65-.83z" fill="#fff"/><path d="m684.42 115.93h2.15l.38-.05h2.5l.35.07.35.08h.1l.37.1.33.12.5-.18.69-.24.7-.2.71-.18.74-.13.75-.1.75-.07h2.3l.76.08.77.12.75.15.75.2.73.21.74.27.7.28.7.34.68.35.67.36.65.4.63.44.62.45.56.43.54.43.51.47.52.48.48.5.47.52.43.53.44.54.4.55.38.56.37.59.33.6.32.58.28.62.27.61.25.62.21.62.22.68.32 1.2.23 1.25.15 1.27.08 1.23v1.23l-.05 1.22-.06.6.15.37.28.93.18.87.14.81.1.79v3.41l-.11 1.22-.15 1.12-.17 1-.18 1-.32 1.48-.22 1-.36 1.52-.25.9-.25.92-.29.95-.31 1-.35 1-.37 1-.4 1-.43 1-.47 1.06-.5 1.07-.55 1.07-.58 1.06-.64 1.07-.68 1-.73 1.05-.8 1-.84 1-.5.55-.48.48-.5.49-.53.46-.55.47-.59.45-.64.7-.64.41-.66.4-.69.37-.73.33-.75.32-.77.27-.81.25-.82.18-.85.17-.87.1-.86.06h-1.77l-.88-.08-.87-.14-.88-.18-.85-.23-.85-.27-.84-.3-.7-.3-.7-.33-.66-.37-.65-.38-.64-.4-.61-.44-.59-.45-.55-.46-.51-.53-.52-.52-.5-.52-.46-.53-.44-.55-.41-.57-.4-.56-.14-.19-.65-.11-.71-.17-.64-.17-.65-.18-.65-.22-.63-.21-.63-.27-.64-.27-.65-.31-.83-.45-.85-.5-.8-.54-.77-.56-.75-.62-.7-.65-.66-.67-.62-.7-.58-.73-.54-.75-.5-.75-.45-.78-.41-.79-.37-.8-.33-.8-.3-.8-.25-.8-.24-.81-.2-.8-.15-.8-.15-.8-.1-.79-.08-.8-.07-.78v-3.91l.07-.78.15-1.45.2-1.47.26-1.45.32-1.42.35-1.4.38-1.36.42-1.34.45-1.31.47-1.27.5-1.25.51-1.2.54-1.15.53-1.13.57-1.07.56-1 .6-1 .6-1 .55-.8.64-.82.68-.8.78-.78.6-.5.2-.17.2-.15.22-.15.33-.23.24-.15.21-.15.24-.13.35-.2.25-.14.23-.11.25-.12.37-.15.23-.1.25-.1.25-.08.72-.24 1-.25 1-.15.9-.08.82-.05h2.01zm-570.8 299.49h.53l.42.07.41.06.42.1.42.12.4.13.4.15.38.19h.07l.4.22.38.21.37.25.36.29.34.28.33.3.32.33.05.05.28.34.27.35.25.35.23.36.2.39.18.38v.08l.19.44.15.45.13.45.12.45v.11l.07.4.07.4v2.15l-.08 1.1-.15 1.09-.2 1.06-.23 1-.3 1-.34 1-.35.95-.4.93-.43.9-.45.89-.48.85-.5.83-.52.82-.12.16.07.22.1.37.1.38v.07l.06.41.07.4v2.12l-.05.37v.25l-.1.45-.12.46-.16.6-.34.87-.33.77-.35.73-.38.73-.42.74-.47.8-1 1.63-1.24 1.9-1.06 1.57.08.13.1.13.23.4.24.4.18.4.08.15.15.4.15.4.12.4.07.22.38-.25.77-.42.86-.4.6-.21.4-.14.4-.11.29-.07.45-.12.48-.06h3.04l.42.08.42.09.4.1.26.08.4.13.4.15.39.17.25.13.36.19.37.2.35.21.25.17.3.22.3.23.28.23.24.22.28.25.27.27.25.28.23.28.1.12.23.33.24.34.2.33.2.37.16.35.07.15.17.4.15.4.13.41.1.44v.15l.09.38v2.71l.08.5-.08.45v.22l-.1.36-.1.35-.17.5v.09l.25.28.29.4.28.4.25.42.22.45.2.45.16.45.15.46.12.49.08.48.05.48v1.47l-.07.48-.08.49-.12.48-.13.47-.17.46-.2.45-.21.44-.25.43v.08l-.24.34-.23.33-.25.3-.27.32-.35.36-.56.54-.57.48-1.13 1-1.39 1.08-1.6 1.24-1.78 1.33-1.92 1.4-2 1.45-2.07 1.45-2.18 1.4-2 1.35-2 1.25-.95.6-.92.55-.9.52-.86.5-.89.45-.91.42-1 .43-.75.22-.42.11-.43.1h-.17l-.43.08h-2.17l-.4.22-2.63 1.43-2.48 1.29-2.28 1.13-1.1.52-1 .46-1 .42-1 .38-1 .37-1 .3-.51.12-.37.06-.38.05h-1.93l-.47-.05-.43-.08-.45-.1-.43-.14h-.09l-.45-.15-.43-.18-.42-.2-.4-.24-.4-.25-.38-.26-.37-.3-.33-.3-.33-.34v-.05l-.32-.36-.3-.37-.27-.4-.25-.4-.23-.43-.2-.44-.17-.43-.16-.45-.12-.47-.07-.33h-2.05l-.4-.07-.4-.06h-.16l-.44-.1-.43-.11-.43-.15-.42-.19-.12-.05-.38-.18-.38-.2-.39-.23-.35-.25-.35-.27-.33-.28-.07-.07-.33-.32-.32-.33-.3-.35-.28-.37-.25-.38-.23-.4-.22-.4v-.08l-.18-.4-.15-.42-.14-.42-.11-.41-.1-.44-.07-.43v-2.3l.06-.43v-.12l.06-.38.1-.39.12-.36.13-.37.05-.13.12-.32.15-.3.15-.3.25-.47.48-.76.69-.89.66-.73.64-.67 1.08-1 1-.93.39-.37.26-.27.1-.11.07-.09 1.35-1.75 1.39-1.94 1.49-1.82 1.51-1.78 1.54-1.84.85-1-.12-.15-.25-.4v-.1l-.47-.09-.48-.11-.47-.14-.45-.15-.44-.19-.43-.21-.42-.24-.4-.26-.46-.29-.37-.3-.35-.33-.31-.34-.32-.36-.3-.37-.27-.4-.23-.4-.23-.42-.19-.43-.18-.45-.13-.45-.14-.47-.08-.45-.07-.48v-1.93l.08-.49.08-.46.12-.45.13-.41.15-.4.18-.4.2-.4.22-.39.23-.36.25-.35.29-.35v-.05l.26-.3.3-.3.32-.29.38-.33.64-.5 1.15-.8 1.46-1 1.75-1.17 2-1.3 1.3-.83.85-.79.93-.81.92-.79 1.73-1.48.72-.63.6-.57.2-.18.15-.17.08-.08v-.07l1.49-1.92 1.13-1.51.87-1.2.76-1.12.82-1.2 1-1.43 1.27-1.8 1.65-2.27 1.25-1.68 1.28-1.72 1.35-1.7.72-.9.68-.8 1.18-1.42.8-.93.49-.55.51-.53.59-.59.7-.63.83-.63.43-.29.34-.2.31-.18.14-.05.31-.17.32-.13.33-.13h.1l.37-.11.35-.12.37-.08.38-.07h.08l.45-.06h1.34z" fill="#fff"/><path d="m161.32 358.78.75.05.75.09.75.1.71.13.74.15.7.17.7.18.7.22.66.23.72.25 1.27.52 1.3.6 1.25.63 1.25.7 1.21.73 1.2.79 1.17.8 1.17.86 1.15.87 1.13.92 1.13 1 1.1 1 1.1 1 1.09 1 1.06 1 1.07 1 1 1.09 1 1.08 1 1.1 1 1.12 1 1.11 1 1.12 1 1.13.91 1.14.92 1.11.88 1.14.87 1.11.83 1.12.82 1.12.82 1.11 1.5 2.14 1.4 2.08 1.26 2 .62 1 .57.95.53.94.52.9.46.88.45.85.42.83.38.84.35.81.32.85.3.87.27 1 .13.69.08.46.05.47v1.92l-.06.58-.12.55-.07.33-.11.44-.12.43-.23.68-.42 1-.45.85-.45.78-.48.74-.5.7-.52.68-.53.67-.55.66-.6.69-1.19 1.3-1.3 1.33-1.38 1.35-1.45 1.38-1.52 1.4-1.56 1.4-1.64 1.44-1.65 1.43-1.71 1.34-1.72 1.43-3.4 2.8-3.33 2.77-3.18 2.55-2.94 2.33-2.56 2.07-2.14 1.71-.83.69-.67.56-.43.39-.27.23-2.73 2.69-2.8 2.78-2.83 2.78-2.85 2.75-2.85 2.75-2.85 2.72-5.72 5.44-5.75 5.41-5.75 5.39-11.5 10.76-11.48 10.69-5.72 5.31-5.68 5.37-5.65 5.38-2.82 2.7-2.8 2.7-2.8 2.72-2.78 2.71-2.77 2.74-2.73 2.73-.54.55-.5.52-1 1.13-1 1.17-1 1.2-1 1.23-1 1.25-2 2.62-2 2.61-1 1.34-1 1.31-1.08 1.32-1.12 1.3-1.15 1.25-.62.65-.63.62-.63.61-.65.6-.69.59-.7.58-.71.57-.75.55-.77.53-.8.5-.83.5-.85.45-.89.43-.91.4-.94.35-1 .34-1 .28-1 .23-1 .19-1 .13-1.06.1h-2.35l-1.08-.05-1.09-.12-1.1-.17-1.1-.21-1.1-.27-1.08-.3-1.1-.37-1.05-.36-1.1-.45-1.1-.48-1.1-.54-.72-.36-.7-.4-.68-.4-.69-.44-.65-.41-.66-.49-1.22-.88-1.18-1-1.15-1-1.12-1-1.07-1-1-1-1-1-.95-1-.94-1-1.7-1.89-1.55-1.78-1.31-1.52-1.25-1.5-1.2-1.46-1.16-1.38-1.07-1.42-1-1.38-1-1.37-.83-1.35-.82-1.3-.76-1.34-.7-1.31-.62-1.35-.59-1.3-.53-1.3-.47-1.3-.4-1.3-.36-1.3-.27-1.3-.2-1.32-.13-1.31v-1.32l-.05-1.25.11-1.28.19-1.32.25-1.25.32-1.22.38-1.18.45-1.13.5-1.1.53-1.07.59-1 .61-1 .65-.95.67-.92.7-.86.72-.85.75-.84.75-.81.76-.79.79-.76.8-.77.83-.77 1.65-1.46 1.7-1.47 1.71-1.48 1.75-1.49 1.77-1.51 1.78-1.57 1.82-1.63.88-.8.9-.85.9-.87.9-.88.9-.9.9-.92.89-.95.91-1 7.19-8 3.63-4 3.65-4 3.67-4 3.71-3.95 3.74-3.93 3.76-3.9 1.94-1.85 1.92-1.94 1.93-1.93 2-1.92 2-1.9 2-1.9 2-1.88 2-1.88 2-1.85 2-1.85 2-1.85 1.95-1.82 2.08-1.82 2.1-1.8 2.12-1.76 2.1-1.74 2.13-1.78 2.09-1.78 2-1.8 2-1.82 2-1.85 2-1.85 2-1.88 2-1.9 4-3.84 4.09-3.86 2.08-1.95 2.1-1.95 2.13-1.94 2.2-2 1.55-1.33 2.32-1.94 2.8-2.3 3-2.45 5.27-4.28 1.71-1.37.7-.53.34-.23.68-.42.72-.35.75-.28.51-.14-.06-.79v-.8l.08-.78.15-.78.22-.77.3-.73.35-.7.43-.67.49-.63.55-.57.48-.47.63-.55.67-.53.67-.5.71-.45.74-.43.73-.39.77-.35.76-.31.79-.27.78-.23.8-.2.8-.15.78-.12.8-.08h2.34zm-.95 16.65h-.22l-.06.05-.07.06-.2.2-.6.52-.65.47-.68.4-.72.31-.75.27-.35.08.08.7v.8l-.06.8-.14.79-.21.76-.29.74-.36.71-.42.69-.48.63-.55.58-.59.52-.53.38.07-.07-.19.15-1.56 1.25-5.2 4.22-2.94 2.4-2.73 2.27-2.22 1.83-1.31 1.13-2 1.8-2 1.85-2 1.89-2 1.88-4.05 3.83-4.39 4.01-2 1.94-2.08 1.93-2.1 1.95-2.13 1.93-2.17 1.92-2.2 1.91-2.25 1.92-2.25 1.87-2 1.7-2 1.68-2 1.7-2 1.73-2 1.74-2 1.75-1.95 1.76-1.87 1.81-1.92 1.8-1.9 1.8-1.88 1.83-1.88 1.83-1.89 1.85-1.85 1.87-1.86 1.87-1.82 1.88-3.68 3.8-3.65 3.83-3.67 3.89-3.62 3.9-3.6 3.91-3.58 3.95-7.2 8-1 1.11-1 1.12-1 1.1-1.17 1.09-1 1-1 1-1 1-1 .95-2 1.76-1.91 1.69-1.92 1.5-1.75 1.5-1.67 1.42-1.58 1.33-1.44 1.28-.56.57-.62.59-.58.56-.53.55-.5.54-.45.51-.42.49-.37.46-.33.45-.28.42-.25.4-.22.37-.17.35-.15.31-.11.3-.1.3-.07.29-.07.26v1.65l.06.42.1.48.14.52.18.58.23.64.27.68.33.73.4.8.45.85.52.9.58 1 .65 1 .74 1 .78 1.1.87 1.15.95 1.2 1 1.25 1.09 1.32 1.18 1.37 1.43 1.63 1.55 1.72.72.86.78.82.8.81.8.79.8.73.79.72.76.65.75.6.77.56.32.22.33.22.33.21.32.19.3.16.28.15.64.3.6.27.58.23.53.2.5.15.47.14.42.1.4.08.36.05h1.75l.24-.05h.25l.23-.07.25-.08.25-.1.25-.1.27-.13.28-.15.28-.17.32-.2.3-.22.33-.25.35-.25.34-.3.36-.31.37-.34.38-.36.39-.39.38-.4.83-.91.85-1 .89-1 .9-1.13.91-1.2 2-2.57 2.08-2.7 1.1-1.41 1.14-1.56 1.2-1.43 1.25-1.45 1.3-1.42.7-.73.7-.7 2.82-2.82 2.81-2.78 2.84-2.77 2.83-2.75 2.85-2.75 2.85-2.73 5.72-5.43 5.73-5.4 5.73-5.39 11.5-10.7 11.5-10.7 5.7-5.35 5.7-5.36 5.67-5.34 2.82-2.7 2.8-2.71 2.8-2.72 2.8-2.73 2.76-2.74 2.87-2.85.63-.6.79-.68.85-.73 1-.8 2.22-1.8 2.61-2.09 2.92-2.33 3.13-2.52 3.27-2.63 3.28-2.72 1.62-1.35 1.6-1.35 1.55-1.33 1.5-1.32 1.42-1.28 1.35-1.25 1.25-1.18 1.13-1.12 1-1 .88-1 .23-.27-.08-.15-.33-.61-.39-.69-.41-.71-.47-.77-.47-.78-1.1-1.72-1.21-1.8-1.34-1.9-.68-.95-.72-1-.75-1-.76-1-.77-1-.8-1-.82-1-.83-1-.83-1-.85-1-.87-1-.87-.95-.88-.92-.87-.9-.88-.88-.88-.87-.89-.82-.88-.8-.87-.76-.86-.72-.85-.68-.84-.65-.81-.6-.82-.55-.77-.5-.75-.47-.71-.4-.69-.33-.63-.3-.63-.25-.24-.09-.25-.1-.25-.06-.21-.07-.22-.05h-.98z"/><path d="m336.5 188.15 1.07.1 1 .13 1 .19 1 .2.95.21.94.24.9.25.9.26 1.65.54 1.58.55 1.52.53 1.38.48 1 .19 2.13.43 1 .17 1.27.21 2.93.47 1.34.23.66.14.82.18.53.17.69.25.63.3.62.36.6.42.56.48.52.52.47.56.41.6.1.19h.12l.2.05.68.19.67.23.2.08.53.25.52.27.2.12.42.26.4.29.2.13.3.25.3.27.43.38.58.62.5.6.42.56.4.59.27.43.25.17 4.2 2.81 1.63 1.12.77.57.45.36.58.52.52.57.1.13.43.57.38.6.34.63.28.67.22.66.15.71.07.4.52.29 1.25.71.68.42.68.42.7.46.7.5.74.55.75.64.75.73.51.58.49.6.46.62.42.67.37.68.18.42.18.43.15.43.05.12.15.52.1.53.09.53v.09l.05.76v.75l-.09.77-.15.73v.07l-.2.65-.24.63-.3.62-.35.58-.4.55-.43.54-.47.48h-.05l-.35.3.2.64.24.9.2.9.18.88.15.88.12.87.1.85.1.88.11 1.6v1.19l.27 1 .35 1.43.18 1.12.29 1.78.35 2.37.36 2.65.17 1.38.15 1.35.13 1.32.1 1.25.05 1.18v1.45l-.05.53-.07.47-.08.45-.05.18-.17.67-.23.65-.27.62-.07.11.05.07.3.5.24.41.4.84.3.73.26.75.24.75.2.75.18.73.13.74.12.73.08.73.07.72v2.87l-.08 1.33-.14 1.37-.2 1.35-.23 1.35-.27 1.31-.31 1.3-.35 1.3-.39 1.27-.4 1.27-.41 1.25-.45 1.21-.47 1.2-.23.55v2.94l-.05.76-.1.77-.19.75-.25.72-.31.7-.37.68-.43.63-.5.59-.55.53-.59.5-.65.43-.66.37-.57.25-.1.17-.83 1.36-.39.65-.65 1.14-.85 1.48-.5.85-.55.87-.58.9-.63.9-.7.93-.17.2-.85 1.6-1 1.68-.83 1.42-.8 1.25-.77 1.13-.82 1.19-1 1.41-.32.45-.28 1.1-.37 1.1-.4 1-.45 1-.47 1-.51 1-.54 1-.36.68-.17.53v.12l-.22.6-.27.57-.08.15-.23.41-.25.4-.42.64-.65.83-.63.73v.05l-.35.55-.66 1-.67 1-.67.95-.65.91-.66.89-.67.83-.68.8-.72.78-.82.8-.9.77-.73.52-.45.26-.42.24-.41.2-.14.06-.61.25h-.05l-1.59 1.59-3.25 3.13-.13.13-.27.54-.41.63-.47.6-.52.55-.83.83-.95.9-1.18 1.12-1.32 1.23-1.4 1.27-1.4 1.2-.73.62-.65.51-2.55 2-1.5 1.15-1.5 1.39-1.73 1.28-1.84 1.35-1.9 1.3-1 .66-1 .65-1 .65-1 .64-1 .61-1.05.6-1.05.59-1.08.55-1.07.53-1.1.5-1.11.48-1.14.44-1.15.4-1.18.35-1.22.3-1.2.21-.71.1-.69.07h-1.95l-.76-.08-.74-.15-.73-.23-.37-.15-.26.11-1.97.87-2 .81-2 .79-1.07.38-1.05.37-1 .33-1.05.33-1.05.29-1.06.26-1.07.24-1.1.2-1.13.15-1.19.1h-1.33l-.78-.05-.74-.09-.76-.15-.84-.2-.51-.18-.72-.27-.2-.1-.35-.21-.23.07-.45.07-1 .11-1 .05-1.15.05h-1.94l-.78-.08-.93-.13-1-.24-1.31-.43-1.12-.4-1.08-.43-1-.44-.23-.11h-4.35l-.76-.1-.74-.18-.73-.23-.7-.32-.67-.37-.63-.43-.6-.48-.53-.54-.5-.6-.44-.61-.25-.45-.53-.17-2.53-.85-1.55-.5-.92-.28-.12.06-1 .54-1 .43-1 .33-1 .27-1 .17-1 .1h-1.88l-.88-.09-.87-.13-.83-.17-.8-.2-.77-.23-.75-.25-.73-.27-.7-.3-.69-.31-.68-.34-.65-.33-.65-.37-.67-.38-1.18-.75-1.18-.82-1.17-.83-1.12-.87-1.08-.9-1.07-.9-1-.91-1-.92-.8-.78-.14-.07-.43-.28-.27-.19-.36-.25-.35-.28-.52-.45-.68-.67-.6-.65-.55-.63-.54-.65-.53-.7-1-1.35-1-1.45-.89-1.28-1.88-2.59-1.25-1.73-1.23-1.72-1.07-1.55-.5-.75-.29-.59-.37-.66-.13-.27-.3-.68-.24-.72-.16-.73v-.07l-.1-.7v-1.4l.07-.68.13-.7.2-.67.25-.65.1-.21-.36-.7-1-1.9-.93-1.9-.45-1-.45-1-.42-1-.42-1-.4-1-.38-1-.37-1.05-.35-1.06-.36-1.22-.34-1.22-.3-1.2-.28-1.2-.27-1.16-.23-1.19-.43-2.26-.75-4.32-.39-2.05-.18-1-.2-.91-.3-1.37-.42-1.83-.18-1-.1-.63-.05-.44v-1.21l.05-.74.11-.73.19-.7.13-.38-.27-.4-.4-.75-.33-.74-.27-.73-.21-.7-.15-.68-.14-.67-.1-.72-.08-1.1v-1.15l.05-1.08.1-1.05.15-1 .18-1 .2-1 .24-.95.25-.92.26-.91.29-.9.3-.89.3-.88.61-1.63.62-1.57.62-1.43.56-1.32.54-1.15.8-1.65.36-.7.3-.55v-.07l.07-.51v-.15l.17-.77v-.17l.12-.4.15-.38.27-.7.45-1 .41-.75.39-.65.36-.58.54-.82.13-.48.22-.74.23-.73.27-.73.51-1.32.57-1.3.57-1.23.58-1.19.58-1.13.57-1.08.43-.82.57-1.27.78-1.66.25-.55.15-.47.44-1.27.48-1.25.53-1.21.55-1.19.59-1.16.6-1.15.63-1.14.63-1.11.65-1.09.67-1.06.67-1.05.68-1 .27-.4v-.08l.2-.38.12-.72.13-.7.17-.68.18-.67.2-.65.23-.63.25-.67.5-1.13.57-1.15.6-1.1.65-1 .67-1 .68-1 .73-1 .74-1 .75-.92.76-.9.77-.88.78-.85.79-.87 1.53-1.56 1.52-1.52 1.46-1.4 2.57-2.45 1.07-1 1.1-1.08 1.63-1.42 3-2.58 3.11-2.64 1.24-1 .91-.73.72-.48.63-.4 1.22-.72 1.3-.7.75-.38.73-.34.79-.33.58-.23.35-.25.72-.54.71-.48.72-.48.75-.47.75-.45.77-.43.78-.42.8-.38.83-.39.87-.33.88-.32.94-.28 1-.22 1-.18 1.08-.12h1.12l1.16.07.82.1.38.06.39.09.45.1.4.11.38.12.43.15.4.15.39.17.41.18.34.17 1-.17 1.07-.52v-.15l.1-.7.15-.68.2-.67.24-.58.28-.58.33-.54.37-.53.43-.5.45-.49.5-.43.52-.38.56-.35h.07l.58-.32.62-.25.62-.22.63-.16h.13l.69-.12.7-.06h1.6l.75.1 1 .18 1 .22.92.25 1.68.48 1.62.47.68.2.55.13.34.09h.16l.77.1.95.09 1.07.06 1.15.09 2.51.13 1.35.08 1.4.12 1.45.13 1.49.17 1.48.22.8.15.77.15.8.16.78.2.8.22.8.25.82.27.81.31.82.35.67.3.68.37.17.1.5.32.46.35.45.38v.05l.53.53.48.59.1.15h.6l.3-.27.62-.46.65-.4.7-.35.72-.29.75-.2.75-.15.78-.06h1.7zm-35.93 17-2.14.33-2.13.3-2 .29-1.89.25-1.68.2-1.43.15-1.19.11-.81.05-1.54.78-3.11 1.6-1.65.79h-.08l-.07.05-.73.41-.75.44-1.4.73-1.42.7-1.35.63-1.26.55-1.15.49-1 .4-1 .35-.62.18-.38.1-.38.08-.54.1-.73.12-1.32.17h-.25l-.6.12-.91.15h-.27l-1.38 1-1.49 1-1.4 1-1 .65-.65.58-1 .87-1 .83-.64.48-.4.69-.76 1.16-.77 1.15-.78 1.12-.79 1.08-.8 1.07-.8 1-.8 1-1.55 1.92-1.43 1.73-.28.35-.34.43-.76 1.07-.17.4-.32.77-.35.76-.66 1.44-.7 1.38-.7 1.35-.7 1.28-1.29 2.34-.55 1-.48.93-.38.79-.3.65-.2.51-.29.79-.73 2.11-.82 2.42-.45 1.27-.46 1.26-.49 1.25-.51 1.19-.35.7-.37.68-.45.75-.37.5-.28.37-.3.36-.17.19-.53.53-.58.5-.17.12-.48.35-.5.3-.54.26h-.06l-.4.16v.17l.12.57.16 1.33.1 1.18v3.4l.12.33.2.73.13.77.05.77v1.26l-.07.55-.1.55-.13.55v.09l-.2.63-.26.62-.3.58-.37.57-.2.26-.2 1-.45 1.88-.9 3.54-.42 1.68-.38 1.6-.33 1.57-.1.53.53.47.53.56.47.6.42.65.36.67.3.72.22.73.15.75.1.77v1.45l-.08.9-.14 1-.15.63-.08.38-.12.39-.1.26-.16.45-.19.45-.1.22-.28.55-.32.52-.11.18-.45.6-.49.57-.13.13-.43.42-.45.38-.49.35-.13.1-.58.35h-.07l.43 1.45.3.92.3.88.3.84.35.91.27.74.33.9.62 1.9.62 2 .28 1 .28 1 .24 1 .21 1 .2 1 .09.71v1.55l-.05.54v.13l-.1.62-.14.6-.05.16.77 1.44.9 1.63.93 1.63 1 1.67 2 3.38 1 1.7 1 1.74 1 1.76.87 1.59.05.08.13.2.25.32.7.86.44.59.5.7.16.23.57-.08h2.35l1.1.09 1.06.13 1 .15 1 .2 1 .23 1 .27 1 .28 1 .3 1 .32.95.33.95.35.94.39.93.38 1.78.77 1.75.8 1.69.81 1.63.8 1.55.79 2.83 1.43 1.25.63 2.07 1 .93.47 1.59.82.78.2.92.21.93.22.72.15h.18l1.82-.35 1.91-.37 1.94-.35 1.71-.28 1.19-.19 1.23-.15.8-.06h2l.5.07.27.05.68.13.67.2h.08l.72.29.66.33h.07l.52.3.23.17 2.5-.34 1.5-.2 1.53-.16 1.57-.17 1.62-.12 1.65-.06h1.46l2.6-1.2 1.9-.86.12-.05.39-.22.5-.31.65-.4 1.53-1 .87-.55.93-.57.95-.55.62-.3.6-.3.68-.28.78-.27.55-.15.39-.1.38-.08.25-.05.48.17.51-.05h.92l.7.05h.2l.6.08.6.15.57.17.18.06.52.2.65-.46 1.55-1.2 1.5-1.13 1.42-1.09 2.45-1.88.43-.35.45-.37 1.12-1 1.18-1.07.87-.82.25-.45.38-.6.45-.55.27-.31 1.88-1.87 1.64-1.6 3.21-3.12 1.55-1.51 1.14-1.15.35-.69.35-.65.38-.6.4-.61.73-1.05.8-1 .84-1 .85-1 .85-.94.86-.88.85-.83.35-.34v-.26l.1-.69.13-.75.17-.83.23-.9.27-1 .38-1.09.45-1.06.37-.7.38-.67.48-.72.37-.45.5-.56.17-.19.31-.31.35-.3.17-.15.42-.34.45-.3.18-.11.53-.3.1-.05.69-.81.76-1.12.34-.46-.07-.32-.07-.48v-1.57l.05-.5v-.32l.06-.48.1-.47.17-.71.32-1 .35-.85.35-.78.36-.72.39-.68.4-.7.75-1.22.8-1.18.8-1.12.73-1 .7-.9 1.05-1.32.42-.52.5-.56.55-.52.61-.47.64-.4.68-.35.7-.28.22-.07.41-.86.17-.35v-8.3l.05-.9.09-.92.05-.5.05-4.3v-13.1l-.05-.17-.24-.7-.35-1.28-.33-1.35-.28-1.38-.25-1.4-.24-1.42-.2-1.45-.18-1.47-.17-1.46-.15-1.47-.11-1.45-.12-1.45-.2-2.75-.13-2.57v-.11l-.37-.79-1-1.93-1-1.92-1.07-2-1.1-2-2.25-4-1.13-2-.37-.67-.51-.32-1.64-.91-1.65-.89-1.68-.86-1.73-.89-1.77-.86-3.63-1.8-1.87-.94-1.88-1-1.9-1-1.93-.94-1-.57-1-.56-1-.6-1-.62-.94-.63-.88-.64-.8-.61-.68-.59-.44-.38h-4.6l-2.48.05h-11.6l-1.57-.07-1.58-.08-1.6-.12-1.62-.15-1.61-.17-1.62-.21-1.63-.25-1.64-.3-1.61-.34-1.59-.38z" fill="#fff"/><path d="m318.07 198.68h2.53l1.27.05 1.26.07 1.27.08 1.25.1 1.27.12 1.25.15 1.25.15 1.23.17 1.25.18 1.23.22 1.24.21 1.21.25 1.22.25 1.2.32 1.2.3 1.2.33 1.2.33 1.18.37 1.18.37 1.17.4 1.17.43 1.15.43 1.13.47 1.13.48 1.12.52 1.17.57 1.1.55 1.08.59 1.08.6 1.07.61 1.05.65 1 .67 1 .7 1 .72 1 .75 1 .76 1 .8.94.82.91.83.9.87.89.9.86.92.84.95.81 1 .8 1 .77 1 .75 1 .72 1.07.7 1.08.68 1.12.63 1.15.64 1.16.58 1.19.57 1.21.53 1.24.52 1.25.46 1.28.45 1.3.44 1.32.38 1.35.37 1.36.31 1.39.3 1.41.32 1.65.27 1.69.25 1.68.2 1.7.16 1.7.12 1.7.1 1.72.07 1.71v5.2l-.07 1.74-.1 1.73-.13 1.75-.17 1.73-.25 1.73-.22 1.75-.25 1.74-.28 1.75-.3 1.73-.32 1.75-.36 1.73-.37 1.74-.42 1.73-.41 1.73-.47 1.74-.47 1.71-.51 1.72-.52 1.7-.55 1.7-.57 1.7-.6 1.68-.6 1.69-.63 1.66-.67 1.65-.66 1.65-.7 1.64-.7 1.63-.74 1.62-.75 1.6-.78 1.6-.78 1.56-.8 1.57-.84 1.55-.83 1.53-.8 1.55-.88 1.5-.89 1.47-.9 1.46-.91 1.45-.94 1.44-.95 1.4-1 1.4-1 1.36-1 1.34-1 1.33-1 1.3-1 1.28-1 1.25-1.07 1.24-1.06 1.2-1.09 1.18-1.1 1.15-1.21 1.15-1.08 1-1.17 1-1.2 1-1.25 1-1.3 1-1.32.9-1.35.87-1.38.83-1.4.8-1.44.77-1.46.75-1.49.71-1.5.7-1.5.65-1.53.65-1.53.6-1.55.57-1.57.55-1.55.52-1.57.48-1.56.45-1.55.42-1.55.38-1.55.35-1.55.32-1.52.28-1.52.23-1.51.2-1.49.17-1.48.12-1.45.06h-3.78l-2.4-.06-2.45-.12-2.49-.18-2.53-.22-2.57-.28-2.56-.34-1.35-.23-1.3-.2-1.31-.23-1.32-.24-1.33-.25-1.32-.25-1.33-.28-1.34-.3-1.31-.32-1.34-.33-1.33-.33-1.33-.37-1.32-.38-1.32-.4-1.33-.42-1.32-.43-1.3-.47-1.31-.47-1.3-.5-1.29-.51-1.28-.54-1.28-.55-1.27-.58-1.27-.6-1.25-.62-1.23-.65-1.23-.66-1.22-.69-1.2-.71-1.18-.74-1.17-.76-1.17-.79-1.13-.81-1.12-.84-1.1-.86-1.08-.9-1.07-.92-1-.95-1-1-1-1-1-1-.95-1.06-.9-1.1-.9-1.12-.85-1.15-.82-1.2-.78-1.2-.75-1.25-.72-1.27-.7-1.35-.57-1.18-.5-1.25-.46-1.28-.4-1.29-.35-1.3-.3-1.31-.27-1.34-.23-1.33-.19-1.37-.15-1.36-.11-1.39-.09-1.4-.06-1.41v-5.77l.08-1.47.09-1.48.11-1.48.14-1.49.15-1.5.18-1.5.18-1.51.22-1.52.22-1.52.25-1.5.25-1.51.26-1.52.29-1.53.6-3 .65-3 .68-2.95.73-2.91.75-2.87.77-2.8.78-2.72.82-2.65.8-2.55.82-2.43.8-2.33.8-2.22.8-2.08.76-1.95.77-1.82.75-1.65.65-1.38.28-.6.25-.57.25-.68.29-.77.28-.83.3-.9.62-2 .63-2.15.68-2.22.35-1.15.39-1.15.38-1.15.42-1.15.45-1.17.46-1.15.52-1.15.58-1.15.62-1.08.38-.63.4-.57.42-.58.45-.59.5-.58.55-.57.62-.56.66-.55.74-.54.83-.5.88-.45.62-.25.4-.14.35-.12.3-.08.38-.12.39-.08h.28l.4-.08.4-.05h2.88l.37.07.68.11.27.07.27-.17 1-.63 1-.62 1-.6 1-.58 1-.58 1-.57 1-.57 1-.53 1.07-.55 1.07-.52 1.08-.51 1.1-.5 1.1-.5 1.12-.49 1.13-.46 1.13-.45 1.14-.45 1.15-.44 1.16-.43 1.17-.42 1.18-.4 1.19-.38 1.24-.37 1.22-.37 2.4-.68 2.41-.65 1.25-.3 1.24-.3 1.23-.29 1.25-.26 1.23-.25 1.25-.24 1.27-.23 1.25-.22 1.27-.2 1.26-.18 1.25-.17 1.29-.16 1.26-.15 1.27-.12 1.27-.12 1.28-.1 1.27-.1 1.28-.06 1.27-.07h5.1zm-2.3 16.67h-2.15l-1.07.05-1.08.05-1.09.08-1.08.08-1.08.1-1.09.12-1.08.12-1.1.13-1.08.15-1.09.17-1.08.16-1.07.19-1.08.2-1.08.2-1.07.21-1.07.24-1.06.23-1.07.27-1 .25-2.12.56-2.08.6-1 .3-1 .34-1 .33-1 .33-1 .35-1 .37-1 .37-1 .38-1 .38-.95.4-.93.4-.93.42-.9.42-.92.43-.88.43-.89.45-.85.45-.85.45-.85.47-.81.47-.8.46-.8.49-.79.5-.75.48-.75.5-.71.5-.64.62-.7.5-.67.51-.66.52-.64.52-.61.53-.6.52-.59.53-.56.53-.6.59-.5.46-.55.42-.59.37-.61.31-.64.29-.65.21-.48.12-.58 1.93-.65 2.19-.69 2.18-.36 1.13-.37 1.1-.4 1.1-.43 1.1-.47 1.1-.45 1-.58 1.22-.57 1.28-.63 1.5-.67 1.67-.7 1.83-.72 2-.73 2.12-.75 2.23-.73 2.35-.75 2.44-.74 2.53-.71 2.58-.69 2.65-.66 2.69-.64 2.71-.6 2.74-.55 2.76-.25 1.35-.28 1.29-.21 1.37-.22 1.35-.2 1.35-.18 1.33-.17 1.33-.17 1.3-.13 1.3-.1 1.29-.1 1.25-.08 1.23v1.22l-.05 1.18v4.47l.06 1 .09 1 .11.95.12.9.15.87.15.82.18.75.19.7.21.65.2.6.22.51.25.52.4.8.47.8.48.8.5.78.53.77.55.75.59.73.6.74.63.7.65.7.68.7.7.66.72.67.75.65.78.63.79.62.81.62.84.6.86.58.89.57.88.56.92.54 1 .53 1 .52 1 .5 1 .5 1 .46 1 .47 1 .45 1 .43 1.05.42 1.06.4 1.09.4 1.08.38 1.1.37 1.1.35 1.12.33 1.11.32 1.14.32 1.13.28 1.13.28 1.14.27 1.13.27 1.15.23 1.15.23 1.13.22 1.15.2 1.14.18 1.13.19 1.12.15 2.28.3 2.23.25 2.2.18 2.17.15 2.12.12 2.06.05h3.85l1-.08 1.05-.12 1.09-.15 1.13-.16 1.17-.22 1.18-.25 1.22-.27 1.23-.3 1.25-.35 1.25-.35 1.27-.4 1.26-.41 1.27-.44 1.27-.46 1.25-.5 1.23-.52 1.22-.52 1.18-.56 1.17-.57 1.15-.58 1.1-.6 1.06-.6 1-.62 1-.63.93-.64.87-.61.82-.64.76-.63.69-.6.66-.63.87-.89.9-.95.9-1 .88-1 .89-1 .88-1.05.87-1.09.86-1.11.87-1.12.85-1.17.83-1.16.84-1.2.83-1.22.8-1.25.8-1.25.8-1.28.77-1.3.76-1.32.75-1.32.74-1.35.73-1.36.7-1.37.7-1.4.68-1.4.65-1.42.65-1.41.64-1.44.61-1.45.59-1.45.58-1.46.57-1.47.53-1.48.52-1.49.5-1.48.48-1.5.47-1.5.43-1.5.42-1.5.4-1.5.36-1.5.35-1.5.34-1.5.3-1.5.28-1.5.27-1.5.23-1.48.2-1.49.18-1.48.17-1.48.13-1.45.12-1.47.08-1.45.05-1.43v-5.66l-.08-1.37-.1-1.37-.14-1.35-.15-1.33-.18-1.32-.22-1.3-.23-1.28-.22-1-.25-1-.25-1-.26-1-.3-.92-.32-.9-.32-.88-.35-.87-.36-.83-.39-.82-.38-.78-.42-.79-.43-.75-.45-.73-.45-.73-.48-.7-.49-.69-.51-.66-.52-.65-.53-.64-.55-.63-.57-.6-.58-.6-.6-.57-.62-.56-.63-.55-.64-.54-.66-.51-.67-.52-.68-.48-.72-.49-.72-.46-.73-.45-.75-.44-.75-.43-.78-.4-.79-.4-.81-.38-.82-.39-.83-.35-.84-.35-.86-.33-.87-.32-.88-.3-.9-.28-.9-.28-.94-.25-.91-.25-.95-.24-.95-.23-.95-.2-1-.2-1-.17-1-.16-1-.15-1-.15-1-.12-1-.12-1-.08-1-.08-1-.09h-1.05l-1.05-.05h-4.4z"/><path d="m296.1 170.57 2 .05 2 .08 2 .13 2 .15 2 .19 1.95.2 1.95.23 1.92.25 1.91.27 1.92.26 3.75.59 7.4 1.21 3.67.59 1.78.26 1.9.29 1.53.25 1.22.21 1.38.27 1.55.32 1.69.36 1.78.42 1.82.45 1.81.48.94.29.9.28.9.28.9.32.88.35.88.37.9.4.9.46 1 .59.92.65.61.51h.17l1.25.12 1.25.13 1.23.15 1.22.19 1.22.21 1.18.24 1.18.25 1.17.26 1.15.3 1.13.34 1.14.33 1.1.38 1.1.39 1.08.41 1.07.44 1.05.45 1 .46 1 .5 1 .52 1 .53 1 .55 1 .59.93.58.94.62.9.63.9.63.86.67.87.68.85.7.82.7.81.74.8.73.79.77.75.76.75.79.73.8.72.8.7.83.68.83.67.85.65.85.63.87.62.88.6.89.6.9.56.91.57.92.55.93.52.94.51.93.5 1 .5.95.47 1 .47 1 .43 1 .43 1 .42 1 .42 1 .38 1 .38 1 .37 1 .35 1.05.67 2 .61 2.09.57 2.11.52 2.12.48 2.13.42 2.15.38 2.15.33 2.17.3 2.18.24 2.17.21 2.18.17 2.19.12 2.2.06 2.18.05 2.18v2.17l-.05 2.18-.08 2.17-.12 2.15-.15 2.15-.2 2.13-.23 2.12-.27 2.1-.3 2.08-.35 2.07-.36 2.05-.42 2-.45 2-.48 2-.52 2-.55 1.9-.53 1.68-.54 1.68-.55 1.67-.58 1.65-.6 1.67-.62 1.65-.65 1.63-.65 1.65-.68 1.63-.7 1.62-.73 1.62-.74 1.61-.88 1.62-.79 1.58-.8 1.6-.81 1.59-.84 1.56-.85 1.57-.86 1.57-.9 1.55-.92 1.53-.92 1.53-.95 1.52-1 1.5-1 1.5-1 1.5-1 1.48-1 1.47-1 1.45-1.05 1.45-1.08 1.43-1.1 1.42-1.13 1.4-1.12 1.4-1.15 1.38-1.15 1.37-1.16 1.35-1.2 1.33-1.2 1.33-1.22 1.34-1.23 1.3-1.24 1.28-1.26 1.27-1.27 1.27-1.3 1.23-1.3 1.23-1.3 1.2-1.33 1.2-1.35 1.17-1.35 1.15-1.37 1.15-1.37 1.12-1.4 1.11-1.4 1.09-1.41 1.06-1.44 1.05-1.43 1-1.45 1-1.47 1-1.48 1-1.48.95-1.5.94-1.5.91-1.52.89-1.53.86-1.54.85-1.55.82-1.56.8-1.57.78-1.58.75-1.59.74-1.6.71-1.61.69-1.62.66-1.63.64-1.64.6-1.63.58-1.65.57-1.67.53-1.66.5-1.69.48-1.68.45-1.65.42-1.7.38-1.7.38-1.72.34-1.72.31-1.71.29-1.74.25-1.73.21-1.75.2-1.75.15-1.75.14-1.75.1-1.77.06h-5.3l-1.78-.07-1.77-.1-1.78-.13-1.78-.17-1.79-.2-1.81-.14-1.8-.27-1.78-.3-1.79-.33-1.8-.38-1.78-.4-1.8-.45-1.78-.49-1.79-.51-1.78-.55-1.8-.6-1.78-.64-1.77-.66-1.78-.7-1.79-.75-1.76-.79-1.77-.81-1.77-.87-1.76-.88-1.75-.95-1.77-1-1.75-1-1.73-1.05-1.74-1.1-1.75-1.13-1.7-1.17-1.66-1.2-1.62-1.23-1.58-1.25-1.54-1.3-1.5-1.32-1.45-1.35-1.41-1.38-1.39-1.4-1.31-1.43-1.3-1.45-1.25-1.49-1.2-1.51-1.17-1.52-1.13-1.57-1.09-1.56-1-1.6-1-1.62-.95-1.63-.93-1.65-.88-1.69-.85-1.68-.8-1.72-.77-1.71-.73-1.74-.69-1.75-.65-1.78-.61-1.77-.59-1.8-.53-1.8-.5-1.81-.47-1.84-.43-1.83-.4-1.85-.37-1.85-.33-1.87-.28-1.88-.27-1.88-.23-1.89-.19-1.88-.16-1.9-.14-1.92-.08-1.9-.07-1.91v-5.77l.06-1.93.09-1.92.11-1.93.14-1.94.18-1.93.2-1.93.23-1.94.27-1.93.28-1.93.32-1.92.33-1.93.39-1.94.38-1.91.43-1.92.45-1.92.47-1.9.5-1.9.52-1.9.55-1.9.58-1.88.6-1.88.62-1.89.65-1.86.66-1.85.7-1.85.72-1.85.73-1.82.77-1.83.78-1.8.82-1.82.82-1.78.86-1.79.87-1.76.9-1.75.92-1.74.93-1.73 1-1.72 1-1.7 1-1.68 1-1.67 1-1.65 1.07-1.63 1.07-1.62 1.1-1.6 1.11-1.58 1.14-1.58 1.16-1.54 1.09-1.57 1.18-1.52 1.22-1.48 1.22-1.47 1.25-1.45 1.26-1.41 1.29-1.4 1.3-1.39 1.31-1.36 1.34-1.34 1.35-1.3 1.35-1.28 1.38-1.27 1.4-1.23 1.42-1.2 1.43-1.18 1.45-1.15 1.47-1.12 1.48-1.1 1.48-1.07 1.52-1 1.53-1 1.54-1 1.56-.94 1.57-.91 1.58-.89 1.6-.83 1.62-.82 1.63-.76 1.64-.74 1.65-.7 1.68-.66 1.68-.64 1.67-.58 1.08-.35 1.07-.32 1.07-.31 1.05-.29 1.06-.26 1.07-.25 1.05-.24 1.05-.21 1.07-.2 1.05-.19 1.05-.16 1-.14 1-.15 1.05-.11 1-.1 1.07-.09 2-.15 2-.08h2.05zm-3.55 16.7-1.65.06-1.67.12-.8.07-.81.08-.82.08-.8.1-.82.12-.8.13-.81.14-.8.16-.8.15-.82.19-.8.18-.8.22-.8.21-.8.22-.8.25-.8.27-1.35.46-1.32.49-1.33.53-1.32.55-1.31.6-1.32.62-1.3.65-1.3.68-1.3.72-1.28.75-1.29.78-1.26.8-1.27.83-1.27.87-1.25.88-1.23.92-1.23.95-1.24 1-1.2 1-1.21 1-1.19 1.05-1.18 1.08-1.18 1.1-1.17 1.14-1.15 1.15-1.13 1.16-1.14 1.2-1.1 1.22-1.11 1.25-1.09 1.27-1.06 1.28-1.07 1.3-1 1.33-1 1.35-1 1.37-1 1.38-1 1.4-1 1.42-.95 1.43-.93 1.47-.93 1.47-.9 1.48-.9 1.5-.87 1.52-.85 1.51-.83 1.55-.82 1.55-.8 1.57-.78 1.58-.77 1.59-.73 1.6-.74 1.61-.7 1.62-.68 1.63-.67 1.64-.63 1.65-.62 1.65-.6 1.66-.58 1.67-.55 1.67-.53 1.68-.52 1.68-.48 1.69-.47 1.68-.45 1.7-.42 1.7-.5 1.7-.38 1.7-.35 1.7-.32 1.7-.3 1.7-.28 1.7-.25 1.7-.23 1.68-.2 1.7-.19 1.69-.15 1.7-.13 1.68-.1 1.67-.07 1.68-.05 1.67v4.96l.07 1.64.08 1.63.1 1.62.15 1.61.15 1.62.2 1.58.22 1.59.25 1.56.27 1.57.3 1.55.33 1.53.37 1.52.38 1.52.42 1.48.43 1.48.48 1.47.5 1.45.54 1.43.55 1.44.58 1.4.62 1.38.65 1.37.68 1.35.7 1.35.73 1.31.77 1.3.8 1.29.82 1.26.86 1.24.89 1.23.93 1.2 1 1.2 1 1.17 1 1.15 1 1.13 1.08 1.1 1.14 1.1 1.15 1.07 1.18 1.05 1.22 1 1.26 1 1.3 1 1.34 1 1.38.93 1.48 1 1.49.95 1.48.88 1.5.87 1.48.83 1.49.8 1.48.75 1.5.74 1.48.68 1.49.65 1.48.63 1.5.59 1.48.56 1.49.52 1.48.5 1.48.45 1.49.43 1.48.4 1.47.37 1.48.35 1.48.3 1.47.28 1.48.25 1.47.22 1.48.2 1.47.15 1.47.15 1.46.1 1.47.08 1.47.05h4.38l1.47-.05 1.45-.09 1.45-.1 1.45-.13 1.45-.17 1.45-.18 1.45-.22 1.43-.23 1.43-.25 1.45-.3 1.44-.3 1.41-.33 1.44-.37 1.41-.38 1.42-.4 1.42-.44 1.41-.45 1.4-.46 1.4-.5 1.4-.54 1.39-.53 1.38-.57 1.38-.58 1.39-.62 1.36-.63 1.37-.65 1.43-.76 1.35-.7 1.35-.71 1.33-.74 1.34-.75 1.33-.78 1.32-.8 1.3-.8 1.3-.83 1.3-.87 1.28-.87 1.28-.88 1.27-.92 1.25-.91 1.25-1 1.25-.95 1.23-1 1.22-1 1.22-1 1.2-1 1.18-1.05 1.18-1.05 1.17-1.08 1.17-1.09 1.15-1.1 1.13-1.13 1.12-1.13 1.11-1.15 1.1-1.15 1.09-1.19 1.08-1.18 1.07-1.2 1.05-1.22 1-1.23 1-1.23 1-1.25 1-1.27 1-1.27 1-1.28 1-1.3.94-1.32.91-1.3.92-1.33.88-1.33.89-1.35.86-1.35.85-1.37.82-1.37.82-1.36.8-1.4.78-1.39.77-1.4.75-1.4.73-1.41.7-1.42.7-1.43.68-1.44.65-1.43.65-1.43.62-1.45.62-1.45.58-1.45.57-1.47.55-1.47.53-1.45.5-1.46.5-1.49.47-1.46.45-1.45.46-1.62.44-1.62.4-1.66.38-1.69.35-1.71.32-1.74.3-1.76.25-1.79.23-1.8.2-1.81.17-1.84.13-1.85.1-1.85.08-1.86v-5.62l-.06-1.88-.1-1.87-.15-1.87-.17-1.86-.22-1.85-.25-1.84-.32-1.72-.32-1.82-.35-1.8-.4-1.77-.41-1.75-.52-1.76-.5-1.7-.55-1.7-.28-.8-.29-.82-.31-.8-.3-.81-.32-.79-.33-.78-.35-.78-.34-.77-.36-.75-.37-.75-.37-.75-.38-.72-.4-.71-.4-.72-.4-.7-.42-.68-.43-.69-.43-.66-.45-.65-.45-.64-.47-.63-.47-.63-.48-.6-.48-.6-.5-.59-.52-.56-.52-.57-.51-.55-.54-.53-.53-.54-.55-.51-.57-.5-.56-.49-.59-.48-.58-.45-.6-.45-.6-.45-.62-.42-.61-.41-.65-.4-.64-.39-.66-.38-.67-.35-.68-.35-.69-.33-.7-.34-.71-.3-.72-.3-.75-.28-.75-.27-.75-.25-.78-.23-.79-.23-.81-.2-.82-.2-.83-.19-.85-.15-.85-.15-.89-.13-.9-.12-.9-.1-.93-.08-.93-.07h-3.83l-.8-.12-.8-.21-.77-.29-.73-.35-.7-.43-.65-.48-.6-.55-.55-.62-.48-.67-.35-.61-.58-.2-.65-.19-.65-.2-1.49-.4-1.51-.38-1.48-.48-1.48-.32-1.37-.28-1.22-.23-1-.17-1.25-.22-1.8-.26-1.9-.29-3.73-.6-7.37-1.2-3.61-.56-1.79-.25-1.76-.25-1.77-.24-1.75-.2-1.75-.18-1.72-.17-1.71-.13-1.72-.1-1.68-.07-1.69-.05h-1.66zm393.75-86.22 1.53.08 1.54.14 1.55.16 1.55.24.75.15.75.15.73.18.75.2.72.22.71.23.72.25.7.27.68.28.69.3.68.32.7.35 1.28.68 1.27.77 1.23.81 1.22.85 1.18.92 1.14 1 1.11 1 1.09 1 1 1.05 1 1.1 1 1.13 1 1.17.94 1.18.9 1.23.86 1.24.85 1.28.82 1.28.78 1.32.75 1.35.72 1.35.68 1.38.67 1.39.62 1.41.6 1.44.56 1.43.52 1.45.5 1.47.45 1.46.42 1.49.38 1.5.35 1.5.3 1.5.27 1.5.23 1.51.18 1.52.14 1.52.1 1.51.05 1.52v1.52l-.05 1.5-.1 1.51-.15 1.5-.22 1.5-.27 1.49-.31 1.43-.2.78-.22.74-.22.73-.23.72-.25.71-.28.72-.29.72-.31.7-.32.7-.35.7-.37.68-.38.68-.4.67-.42.67-.45.65-.45.63-.48.63-.5.62-.52.6-.53.6-.57.58-.56.57-.6.55-.62.53-.63.52-.65.52-.92.65-.92.63-.93.58-.95.57-1 .53-1 .5-1 .45-1 .45-1 .4-1 .37-1 .35-1 .33-1 .29-1 .28-1 .23-1 .24-1 .2-1 .16-1 .17-1 .13-1 .12-1 .1-1 .08-1 .09-1.93.08-2 .05h-1.66l-1.92-.05-1.91-.08-1.89-.1-1.88-.14-1.85-.15-3.62-.33-3.51-.35-3.4-.32-1.64-.15-1.6-.13-1.55-.1-1.5-.08h-3.45l-.48-.05-.5-.08-.48-.1-.47-.13-.47-.17-.45-.18-.45-.22-.43-.25-.42-.27-.4-.3-.36-.31-.37-.34-.33-.36-.22-.24-.17.07-.46.15-.49.13-.48.1-.48.07h-1.97l-.48-.08-.49-.1-.48-.13-.47-.17-.45-.18-.45-.22-.43-.25-.42-.27-.43-.28-.62-.5-.56-.52-.54-.53-.46-.53-.49-.6-.66-1-.59-1.05-.5-1-.4-1-.35-1-.28-1-.23-1-.22-1-.17-1-.15-1-.13-.95-.1-.93-.08-1-.14-1.8-.08-1.8v-10.7l.06-1.3.12-1.3.15-1.3.17-1.28.2-1.28.23-1.29.27-1.28.28-1.28.32-1.27.35-1.27.38-1.25.4-1.25.43-1.25.47-1.23.48-1.22.52-1.21.53-1.22.59-1.18.6-1.19.61-1.16.65-1.15.69-1.15.7-1.12.73-1.12.75-1.1.78-1.06.82-1.07.83-1 .87-1 .88-1 .92-1 1-1 1-.94 1-.9 1-.88 1-.87 1.07-.81 1.1-.8 1.12-.77 1.15-.73 1.18-.7 1.2-.69 1.22-.63 1.25-.6 1.26-.57 1.3-.51 1.32-.49 1.33-.45 1.37-.4 1.38-.35 1.4-.31 1.42-.27 1.43-.22 1.45-.18 1.49-.12 1.48-.08h1.5zm-2.43 16.67h-.94l-.9.06-.9.12-.86.13-.87.17-.87.18-.83.22-.83.25-.82.27-.82.3-.8.31-.78.35-.78.39-.77.4-.75.41-.75.45-.73.47-.72.5-.72.52-.7.53-.68.57-.68.58-.67.6-.65.63-.63.64-.62.66-.62.69-.6.71-.58.72-.57.73-.53.75-.53.79-.52.78-.5.8-.48.8-.47.83-.45.84-.43.85-.4.85-.4.86-.37.89-.35.88-.33.88-.32.9-.28.9-.29.9-.25.92-.21.9-.22.92-.18.91-.17.9-.13.92-.14.9-.1.9-.06.9-.07.9v9.35l.06 1.4.09 1.4.06.62.07.63.08.59.09.55.08.51.1.45.1.4.1.32v.07l.23.21.33.35.24.29.2-.09.46-.15.49-.13.48-.1.5-.07h2.65l1.78.05 1.79.1 1.78.11 1.77.14 1.78.16 3.5.34 3.48.35 3.46.3 1.69.14 1.66.11 1.65.1 1.64.07h4.68l1.53-.07h.7l.72-.06.72-.09.7-.08.7-.08.66-.12.67-.12.65-.13.65-.15.63-.15.62-.17.6-.18.6-.18.58-.22.59-.22.55-.23.55-.23.55-.27.51-.27.54-.28.5-.32.51-.31.49-.34.5-.36.26-.2.25-.2.25-.22.24-.22.21-.23.24-.22.2-.23.21-.25.2-.25.2-.25.19-.27.21-.25.18-.27.17-.28.17-.3.16-.3.15-.32.15-.31.15-.34.14-.33.13-.35.12-.35.11-.37.12-.38.12-.37.08-.35.18-.85.15-.85.14-.86.08-.9.07-.92v-3l-.07-1-.08-1-.14-1.05-.16-1.07-.19-1.07-.21-1.08-.25-1.08-.29-1.1-.31-1.09-.34-1.1-.36-1.08-.39-1.08-.43-1.09-.43-1.06-.52-1.05-.5-1.05-.52-1-.53-1-.55-1-.58-1-.6-.94-.6-.93-.64-.88-.63-.87-.65-.83-.67-.82-.68-.77-.67-.73-.7-.68-.68-.67-.68-.62-.7-.56-.69-.54-.7-.48-.68-.45-.67-.4-.7-.38-.28-.14-.33-.16-.32-.14-.32-.13-.31-.12-.3-.11-.32-.1-.3-.09-.3-.08-.3-.07-.28-.06h-.29l-1-.15-1-.12-1-.08h-2zm-30.65 50.76h-.05z"/></g></svg>
assets/img/no-products.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg viewBox="0 0 923.65 1082.82" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="m296.42 899.72h6.81l3.44.07 3.45.1h.2l.18-.1 1.48-.68 1.49-.63 1.53-.48 1.5-.5 1.5-.5 1.5-.43 1.52-.37 1.51-.35 1.52-.31 1.53-.27 1.54-.25 1.55-.23 1.53-.19 1.57-.18 1.55-.15 1.56-.12 1.57-.11 1.55-.04 1.59-.08h7.93l3.18.05 3.19.09 3.11-.06 3.15.17 3.12.18 3.07.2 3.05.22 5.83.47 5.57.46 5.15.42 2.38.18 2.23.15 2.09.14 1.88.1h11.98l8.87-.07 8.87-.12 8.86-.15 8.9-.18 8.89-.2 17.85-.45 16.88-.42 1-.08 2-.13 2.58-.15 3.05-.15 3.39-.14h11.56l2 .08h3.55l.15-.15 1.22-1 1.06-.73.95-.57 1-.53 1.24-.55 1.23-.45 1.12-.35 1.05-.27 1-.22 1-.18.93-.15 1-.15 1.75-.2 1.86-.15 1.9-.12 2-.08h12.53l4.3.13 4.27.17 4.11.2 3.85.2 3.52.21 5.53.34 1.77.1h1l3 .08 3.15.13 3.13.14 3.12.16 6.15.35 6.08.39 6 .38 6 .37 3 .15h.18l1.45-.05 6.08-.2 6.09-.2 6.1-.16 6.11-.15 6.14-.14 6.13-.1 6.15-.05h6.62l3-.2 2-.12 2.25-.08 2.41-.07h5.4l1.4.05 1.44.08 1.45.1 1.46.13 1.49.19 1.5.21 1.53.27 1.57.33 1.5.39.9.26.83.29.87.3.86.33.89.4.91.43.94.5 1 .57 1 .65 1.2.9.57.52.93-.2 1.92-.39 1.91-.35 2-.35 2-.31 2.05-.27 2-.23 1.1-.1 1.08-.07 1.08-.07h4.47l1.15.05 1.17.08 1.16.12 1.19.13 1.2.19 1.2.21 1.21.27 1.22.3 1.23.35 1.24.4 1.23.45 1.23.52 1.24.55 1.21.61 1.2.67 1.19.73 1.16.79 1.14.83 1.11.9 1.07.95 1.1 1.05.8.83.85 1.05.87 1.24.85 1.5.76 1.75.6 2 .35 2.28v2.43l-.37 2.45-.7 2.29-1 2-1.1 1.72-1.15 1.4-1.13 1.13-1.08.9-1.19.85-1.6.94-1.58.73-1.38.53-1.27.4-1.17.34-1.1.25-1.06.21-1 .19-1 .16-1 .15-1.85.24-1.82.18-1.72.17-3 .25-1.14.11-.91.1-3.54.45-3.53.42-3.42.38-3.33.35-3.27.32-3.2.3-3.18.25-3.17.23-3.16.2-3.19.19-3.23.16-3.3.14-3.37.13-3.48.1-3.6.1-3.68.08h-2.15l-2.44.14-2.6.15-2.81.2-3 .25-3.15.26-6.75.6-7.19.64-3.75.31-3.81.32-3.89.28-3.91.29-4 .25-4 .2-4 .16-2 .09-2 .05h-12l-2-.07-2-.08-1.95-.1-1.93-.14-1.93-.15-1.92-.18-1.92-.22-1.88-.23-1.88-.27-1.87-.3-1.85-.33-1.4-.28h-4.05l-2.72.12-2.71.1-5.29.17-10.11.3-4.79.16-2.28.1-2.27.12-8.5.43-8.56.42-8.59.4-3.13.13.4.05 1.27.24 1.41.33 1.5.48 1.17.49 1.2.58 1.4.87 1.62 1.26 1.8 1.9.81 1.29.82 1.5.63 1.6v.1l.48 1.83.23 1.88v1.95l-.25 1.84-.35 1.66-1.21 2.74-1.34 2-1.26 1.4-1.12 1-1 .77-.88.61-.77.45-.88.5-.87.45-1.56.79-1.64.71-1.63.67-1.64.83-1.64.52-1.6.47-1.61.41-1.59.37-1.58.32-1.55.26-1.55.24-1.52.21-1.5.17-1.48.15-1.47.13-1.43.1-1.45.09-2.75.15-2.68.1-2.59.1-2.48.1-2.42.11-1.1.07-1.11.08-1.07.09-1.13.11-4.15.44-4.24.41-4.23.4-4.22.37-4.23.37-4.22.31-4.23.32-4.22.28-4.21.29-4.22.23-4.22.23-4.21.2-4.24.19-4.21.16-4.22.15-4.22.12-4.21.18-4.22.08-4.22.07h-21.11l-4.22-.05-4.23-.1-4.24-.1-4-.1-.76.16-4.19 1-4.2.9-4.18.85-4.2.84-4.2.78-4.2.75-4.22.72-4.2.68-4.21.65-4.22.6-4.22.58-4.21.55-4.22.54-4.22.48-4.21.47-4.22.45-4.22.4-4.23.38-4.22.37-4.21.33-4.22.32-4.22.3-4.21.26-4.22.25-4.22.24-4.2.2-4.21.2-4.2.18-2.3.08-2.54.44-2.56.41-2.57.4-2.58.4-2.59.37-2.58.37-2.58.33-2.59.33-2.54.32-2.67.32-3 .4-3.25.43-3.45.45-3.61.44-1.9.21-1.9.19-2 .18-2 .17h-.47l-.63.19-1.07.26-1.08.24-1.08.2-1.09.16-1.08.14-1.08.1-1.1.06h-3.3l-1.12-.06-1.13-.1-1.14-.15-1.13-.2-1.17-.24-1.16-.3-1.17-.35-.52-.16-1-.13-1-.15h-.07l-2.38.18-2.4.15-2.42.1h-6.1l-1.21-.05h-1.24l-1.23-.08-1.23-.1-1.24-.12-1.23-.13-1.23-.17-1.24-.18-1.23-.22-1.23-.23-1.24-.27-1.23-.28-1.23-.34-1.24-.35-1.23-.4-1.22-.43-1.23-.47-1.22-.5-1.2-.56-1.21-.59-1.19-.65-1.18-.7-1.37-.86-1.48-1.12-2-2-.94-1.47-.78-1.43-.6-1.5-.45-1.3-.45-2.91.17-2.9.7-2.71 1.1-2.3 1.48-2.14 2-2 2-1.33 1.55-.77 1.25-.5 1-.33 1-.27 1.45-.32 1.43-.23 1.33-.18 1.27-.14 1.22-.11 1.16-.09 2-.13 1.5-.1 3.81-.25 3.84-.28 2.86-.22.92-.92 1.95-1.36 2.15-1 2.3-.63 2.37-.24h2.68l.63-.47.94-.67 1-.63 1-.6 1-.58 1-.55 1-.54 1-.5 1-.5 1-.46 1.05-.45 1.07-.44 1.07-.41 1.08-.4 1.1-.37 1.12-.37 1.11-.33 1.12-.32 1.13-.3 1.15-.28 1.15-.25 1.17-.23 1.18-.2 1.17-.2 1.2-.15 1.2-.14.55-.05-.37-.08-1.16-.28-1.15-.32-1.17-.32-1.15-.35-1.15-.36-1.15-.4-1.15-.42-1.23-.47-.95-.41-1.54-.79-.91-.66-1.87-1.55-1.57-1.85-1.11-1.9-.87-2-.55-2.1-.21-2.17-9.42 3.27-3.75 1.3-2.12.7-4.6 1.38-4.61 1.37-4.79 1.37-2.5.7-2.5.68-2.55.68-2.58.67-2.63.65-2.64.63-2.68.62-2.7.6-2.72.57-2.73.55-2.77.51-2.76.49-2.79.43-2.8.4-2.81.37-2.8.31-2.79.25h-.16l-1.29.08-1.41.07-1.42.07-1.42.05h-7.06l-1.4-.07-1.42-.06-1.4-.1-1.4-.17-1.4-.13-1.4-.15-1.4-.19-1.4-.2-2.08-.33-1.83-.5-1.49-.6-1-.46-1-.47-1.69-.88-1.73-1-1.73-1-1.34-.84-1.41-.16-1.2-.12h-4.95l-1.77-.08-1.77-.09-1.76-.13-1.75-.13-1.75-.17-1.74-.2-1.76-.27-1.73-.25-1.72-.29-1.72-.31-1.7-.37-1.68-.38-1.68-.44-1.67-.46-1.67-.5-1.63-.57-1.63-.6-1.64-.65-1.6-.7-1.58-.8-1.57-.81-1.75-1-1.45-1-2.06-1.87-1-1.4-1.17-2.08-.85-2.27v-.08l-.42-2-.13-2 .17-2v-.17l.4-1.86.65-1.79.89-1.68.05-.08 1.18-1.65 1.38-1.47 1.07-1 2-1.25 1.48-.68 1.32-.48 1.51-.42 1.34-.27 1.15-.16 1-.12 1-.1h.94l1-.05h3.35l3.08.22 2.69.2 2.38.22 2.15.23 1.95.23 1.78.24 1.65.23 1.52.23 2.88.45 1.45.22 1.57.23 1.72.22 2 .23 2.25.25h.6l.13-.56.58-1.32.85-1.65 1.05-1.52.1-.11 1.14-1.38 1.47-1.23 1.2-.89 2.18-1.06 1.7-.59 1.35-.33 1.12-.18 1.06-.15 1.49-.1h3.96l2.12.1 1.75.1h30.46l1.85.05 1.89.09 1.93.11 2 .15 2 .19 2.1.23 2.15.28 2 .3.86.14 1 .11 3 .29 4.48-.09 6-.15 6-.16 6-.22 6-.23h.95l-.28-.63-.6-2-.3-2.08v-2.58l.48-2.53.9-2.42 1.32-2.22 1.66-2 2-1.65 1.85-1.08 2-.82 2.07-.52 2.13-.21 1.47-.05 2 .3 1.05.23 1.21.32 1.24.36 2.56.79 2.87.86 1.42.42 1.35.4 1.21.33 1 .25.77.17h.16l1.69.22 1.76.18 1.8.17 1.82.15 1.85.12 1.87.1 1.9.08 1.68.07h51.2l.83-.08 1.09-.05h4.66l1.54.05 1.23.07 1.07.06 2.51.4 2.42.8 2.23 1.2 2 1.59 1.7 1.88 1.37 2.15.13.33h10.04zm-87.32 57.86h.17-.34z" fill="#808080"/><path d="m419.77 413.53 1.43.19 1.37.26 1.3.35 1.4.44 1.45.58 1.53.77 1.45.93 1.35 1 1.22 1.14 1.08 1.21.93 1.24.79 1.25.65 1.23.53 1.22.43 1.18.34 1.13.25 1.1.2 1.07.13 1 .08 1v1.98l-.09 1.6-.2 1.67-.26 1.58-.37 1.52-.42 1.48-.48 1.44-.55 1.41-.5 1.17-.1.22-.68 1.36-.75 1.34-.82 1.31-.9 1.32-1 1.28-1 1.19-.67.71-.63.64-.69.61-.71.62-.79.6-.81.6-.89.57-.95.55-1 .51-1.09.47-1.15.43-1.23.37-1.3.28-1.35.2-1.42.1h-1.43l-1.45-.13-1.38-.23-1.22-.3-1.15-.37-1.13-.45-1.12-.47-1.07-.6-1-.69-.93-.71-.9-.8-.82-.83-.75-.87-.67-.88-.6-.9-.51-.92-.55-1.07-.64-1.61-.51-1.74-.32-1.7-.17-1.61v-1.57l.09-1.52.16-1.46.09-.39.21-1 .4-1.38.5-1.35.25-.59v-1.81l.05-1 .12-1 .15-1 .2-1 .26-1 .32-1.07.27-.77.11-.31.49-1.1.56-1.1.67-1.12.75-1.1.87-1.12 1-1.06 1.08-1 1.22-1 1.32-.9 1.41-.8 1.49-.68 1.53-.55 1.57-.42 1.58-.28 1.57-.14h1.51zm3.38 29.8-.28.15 1.18-.61v-.22.22l.05-.64v-.48l.05.52-.09-1.07.09.5-.19-1.15.12.47-.27-1-6.35 4.41h1.14-.35l1.18-.08-.35.05 1.23-.17-.31.07 1.25-.29-.32.1 1.27-.4-.3.12zm.65-.3.25-.15zm.05-3.08.1.3zm-6.33-15.72h-.75l.48.15.9.3.58.26 1.52 2.19 5.55.13-.37-.33.19.16-1.05-.8.2.17-1.2-.75.21.13-1.31-.65.21.1-1.45-.55.24.1-1.54-.41.25.06-1.58-.26.25.05-1.6-.1z" fill="#fff"/><path d="m463.47 357.9 1.9.33 1.83.57 1.73.83h.09l1.45.93 1.33 1.1 1.2 1.34 1 1.23 1.22 2.27.55 1.45.37 1.2.28 1 .25 1 .25 1.06.45 2.12.43 2.35.44 2.55.43 2.75.42 2.93.25 1.94.43.71.73 1.45.64 1.5.48 1.4.4 1.34.33 1.31.3 1.3.25 1.3.22 1.3.2 1.34.17 1.36.15 1.39.15 1.41.11 1.44.1 1.46.1 1.5.07 1.54.07 1.55.05 1.58v6.53l-.05 3.39-.1 3.41-.15 3.44-.2 3.41-.13 1.75-.13 1.72-.14 1.72-.16 1.7-.17 1.68-.2 1.67-.2 1.66-.22 1.64-.21 1.61-.07.35-.08 1.12-.17 1.6-.18 1.58-.22 1.55-.12.79.42.8.45 1.05.42 1.1.35 1.16.26 1.2.2 1.24.14 1.25v2.51l-.12 1.24-.18 1.21-.07.3-.23.85-.39 1.12-.51 1.23-.87 1.72-.98 1.67-1.13 1.49-1.15 1.26-1.15 1.12-1.16 1-1.14.87-1.13.78-1.12.69-1.11.63-1.1.57-1.1.53-1.09.48-1.1.45-1.08.42-1.1.38-1.1.37-1.1.33-1.12.32-1.11.3-1.12.28-1.12.27-1.13.23-1.12.24-1.15.2-1.13.18-1.13.18-1.15.17-1.14.13-1.15.14-1.13.11-1.15.09-1.15.08-1.13.07-1.14.05h-5.65l-1.13-.07-1.12-.08-1.13-.12-1.12-.14-1.13-.17-1.13-.18-1.15-.24-1.15-.26-1.19-.32-1.2-.37-1.25-.46-1.27-.52-1.53-.71-1.58-.94-1.7-1.31-1.52-1.52-4.93 1.55-2.69.83-2.71.85-2.77.82-2.8.82-2.82.8-2.83.75-2.83.7-1.45.35-1.44.33-1.43.3-1.43.3-1.44.27-1.45.26-1.43.24-1.43.21-1.45.2-1.44.17-1.45.15-1.45.12-1.45.08h-4.38l-1.48-.06-1.49-.12-1.5-.17h-.28l-1.23-.17-1.52-.28-1.55-.35-1.53-.43-1.57-.5-1.45-.59-.88-.38-1.3-.62-2.1-1.31-1.19-1.12-1.11-1.25-1-1.35-.93-1.45-1.07-3-.4-2.71v-2.27l.28-1.82.43-1.7.72-1.85.8-1.55.15-.21-.32-.32-1.41-2.07-1.05-2.2-.64-2.18-.28-2-.05-1.8.13-1.58.24-1.37.3-1.18.33-1.05.35-.93.37-.84.4-.86.48-.89v-.06l-.72-1-.66-1.08-.59-1.17-.5-1.2-.4-1.23-.3-1.25-.21-1.24-.12-1.21v-1.19l.06-1.35.24-1.86.46-1.89.59-1.65.65-1.46.7-1.3.71-1.19.74-1.06.73-1 .77-.91.75-.87.76-.83.79-.79.8-.76.78-.75.82-.72.81-.7.84-.7.88-.7 1.67-1.3 1.73-1.28 1.78-1.27 1.79-1.23 1.8-1.2 1.8-1.15 1.78-1.14 1.77-1.08 1.71-1.05 1.7-1 3.12-1.81 2.8-1.6 2.32-1.3 1.68-.94.92-.53 1.65-1 .23-.14 2.55-1.48 1.45-.82 1.5-.81 1.55-.8 1.58-.79 1.59-.73.95-.38.56-.22 2.44-2 2.66-2.07 2.42-1.85 2.1-1.36 2.32-1 1.8-.42 1.36-.83 1.39-.82 1.4-.78 1.4-.77 1.4-.73 1.41-.7 1.42-.7 1.42-.67 1.41-.63 1.42-.63 1.42-.6 1.4-.59 1.41-.58 2.72-1.05 2.7-1 2.62-.92 2.51-.85 2.4-.76 2.29-.7 2.11-.64.43-1.07.65-1.33 1.18-1.85.94-1 1.6-1.48 1.8-1.24h.08l2.12-1 2.26-.65 2.35-.25h.07z" fill="#808080"/><path d="m69 892.63 12.82.17 6.5.07h19.62l3.25-.06 3.25-.09 3.23-.11 3.22-.14 3.2-.16 3.16-.19 3.15-.23 3.14-.27 3.1-.28 3.05-.33 3-.39 3-.41 1.47-.22 1.46-.23 1.47-.24 1.45-.26 1.46-.26 1.42-.28 1.4-.29 1.4-.3 1.95-.45 2-.45 2-.48 1.95-.5 4-1 4-1.06 4-1.07 4.08-1 2.07-.52 2.07-.5 2.1-.5 2.1-.48 2.11-.45 2.12-.43 2.15-.42 2.15-.38 2.17-.35 2.18-.32 2.2-.28 2.22-.24 2.23-.2 2.25-.15 2.23-.1h5.77l1.15.05 1.17.06 1.15.07 1.18.1 1.13.1 4 .4 4 .37 4 .35 4 .35 4 .31 4 .3 4 .3 4 .27 4 .27 4 .23 3.95.23 4 .2 4 .2 3.95.19 4 .16 3.95.15 3.95.14 3.95.13 3.95.12 4 .08 3.95.08 3.93.09h3.95l3.95.05h23.7l7.9-.1 7.92-.14 7.92-.18 7.93-.22 7.93-.26 7.95-.3 7.95-.34 8-.38 8-.4 8-.43 8-.47 8.05-.5 8.05-.53 8.08-.55 8.1-.57 8.13-.6 8.19-.62 1.63-.11 1.68-.09h8.35l1.67.08 1.65.08 1.67.12 1.65.13 1.63.15 1.65.17 1.63.18 1.64.2 1.65.2 3.23.47 3.23.5 3.22.53 3.2.55 3.17.57 3.16.58 5.81 1.13 3.1.55 3.08.53 3 .52 3 .47 3 .43 1.47.18 1.5.19 1.46.16 1.49.15 1.46.14 1.45.11 1.45.1 1.45.09 1.44.06h7.05l1.38-.06 1.37-.09 1.36-.11 1.37-.15 1.35-.17 1.35-.2 1.33-.22 1.4-.26 2.14-.42 2.23-.4 2.23-.4 2.25-.37 2.27-.35 2.27-.35 2.3-.31 2.28-.3 2.32-.27 2.3-.27 2.33-.25 2.33-.23 2.34-.22 2.35-.2 2.36-.18 2.37-.17 2.37-.16 2.36-.14 2.39-.13 2.4-.12 2.38-.1 2.42-.08 4.78-.13 4.83-.09 4.82-.05h9.67l4.83.08 4.83.1 4.82.15 4.82.17 4.78.2 4.77.21 4.75.25 4.71.27 4.7.28 4.65.3 4.62.32 4.57.32 9 .66 8.76.67 2.92.2 2.88.2 2.89.17 2.88.13 2.88.13 2.89.1 2.9.09 2.88.08 2.9.05h14.47l2.9-.05 2.9-.07 2.9-.06 2.9-.09 5.81-.2 5.82-.25 5.83-.3 5.82-.31 5.83-.35 5.85-.37 5.84-.4 11.71-.83 11.74-.85 11.75-.82 5.9-.4 5.9-.38 5.9-.34 5.9-.33 5.91-.28 5.94-.24 5.91-.2 3-.08 3-.07 3-.05h8.95l1.62.17 1.56.46 1.45.77 1.27 1 1 1.27.79 1.43.46 1.57.17 1.62-.15 1.63-.48 1.54-.76 1.43-1 1.27-1.26 1-1.44.78-1.54.52-1.62.15h-5.8l-2.9.05h-2.88l-2.9.07-2.89.06-5.8.2-5.8.24-5.81.28-5.82.32-5.82.35-5.83.36-5.83.39-11.72.83-11.72.85-11.76.82-5.89.4-5.91.38-5.9.35-5.92.33-5.93.3-5.94.25-5.93.22-3 .08-3 .07-3 .07h-18l-3-.07-3-.07-3-.08-3-.12-3-.13-3-.15-3-.17-3-.2-3-.21-8.77-.67-8.95-.67-4.53-.31-4.57-.3-4.58-.3-4.63-.29-4.65-.25-4.67-.25-4.68-.21-4.7-.2-4.7-.17-4.72-.13-4.72-.12-4.7-.07h-14.08l-4.65.1-4.65.14-2.3.08-2.3.08-2.28.12-2.29.12-2.28.13-2.27.15-2.25.17-2.25.18-2.23.18-2.23.2-2.22.24-2.2.23-2.18.25-2.17.27-2.17.26-2.15.3-2.13.32-2.12.33-2.1.35-2.08.37-2.07.38-2.11.4-1.62.32-1.68.28-1.7.24-1.67.21-1.68.17-1.69.15-1.68.12-1.67.06-1.68.07h-5l-1.65-.05-1.67-.06-1.65-.1-1.65-.1-1.65-.14-1.63-.16-1.65-.17-1.63-.18-1.64-.2-1.46-.09-3.23-.47-3.22-.5-3.22-.53-3.2-.55-3.16-.59-6.3-1.15-3.14-.58-3.1-.55-3.08-.55-3-.5-3-.47-3-.43-1.48-.18-1.48-.19-1.49-.16-1.48-.15-1.47-.14-1.45-.11-1.45-.1-1.45-.09-1.43-.05h-7.08l-1.39.07-1.41.1-8.15.62-8.17.6-8.15.58-8.12.55-8.11.53-8.1.5-8.07.47-8.07.45-8.06.4-8 .38-8 .34-8 .3-8 .26-8 .24-8 .18-8 .13-8 .1h-24l-4-.05-4-.06-4-.07-4-.08-4-.1-4-.1-4-.14-4-.13-4-.17-4-.16-4-.19-4-.2-4-.21-4-.24-4-.23-4-.27-4-.28-4-.3-4-.3-4-.33-4.05-.35-4-.35-4-.39-4-.4-1-.08-.94-.07-.93-.06h-7.22l-1.9.09-1.89.13-1.88.17-1.9.2-1.9.25-1.9.26-1.92.32-1.91.33-1.92.39-1.93.38-1.95.43-1.94.44-2 .46-2 .49-2 .48-4 1-4 1.05-4.05 1.07-4.07 1.05-2.06.53-2.07.5-2.08.49-2.1.48-1.55.33-1.59.34-1.58.3-1.58.3-1.59.28-1.6.27-1.61.25-1.64.25-3.21.45-3.27.4-3.3.36-3.3.32-3.32.27-3.33.23-3.35.22-3.35.16-3.37.15-3.36.12-3.37.08-3.37.07h-13.31l-6.61-.05-6.57-.06-12.82-.17-6.2-.07h-40.4l-.28.06-.28.07-.89.25-1 .32-1.1.35-1.2.4-1.25.36-.72.2-.73.19-.77.16-.82.15-.86.14-1 .06h-1.07l-.75-.07-.9-.11-.35-.07-1.06-.27-.32-.11-.88-.32-.48-.21-.45-.27-.63-.4-.14-.08-.6-.47-.13-.1-.57-.47-.1-.1-.54-.58-.1-.14-.46-.63-.09-.13-.4-.64-.25-.46-.36-.82-.27-.78-.2-.77-.1-.5-.13-1.68.17-1.64.48-1.55.78-1.43 1.05-1.27 1.27-1 1.45-.77 1.57-.47 1.61-.15 1.64.17 1.55.48 1.11.6.82-.26 1.17-.37 1.25-.4 1.33-.38.77-.2.76-.17.82-.17.87-.11 1-.1h41.28zm-52.51 7.62v-.08l-.1-.39-.13-.4z"/><path d="m365.47 647.05.85.15.85.23.8.32.76.42.74.48.66.55.62.63.53.69.47.73.38.78.3.82.22.85.12.87v1.73l-.05 1-.07 1-.08 1-.1 1-.13 1-.15.94-.19 1-.18.93-.2.93-.23.92-.24.93-.26.92-.27.93-.57 1.79-.63 1.81-.68 1.79-.72 1.76-.75 1.75-.78 1.75-.82 1.72-.83 1.72-.84 1.41-.87 1.68-.88 1.65-.88 1.64-.9 1.61-1.77 3.12-1.7 3.1-1.73 2.9-1.59 2.82-.73 1.33-.7 1.3-.67 1.27-.58 1.28-1.45 2.95-1.44 3-1.4 3-1.39 3.05-1.32 3.05-1.34 3.12-1.3 3.13-1.3 3.15-1.26 3.18-1.27 3.19-1.28 3.18-1.25 3.27-2.47 6.51-2.43 6.55-2.45 6.59-2.45 6.6-2.5 6.6-1.27 3.31-1.27 3.3-1.3 3.29-1.31 3.3-1.34 3.26-1.36 3.29-1.39 3.25-1.41 3.25-1.45 3.23-1.45 3.15-.79 1.73-.73 1.67-.72 1.7-.7 1.72-.66 1.71-.65 1.72-.63 1.75-.62 1.76-.6 1.77-.6 1.78-.57 1.8-.56 1.79-1.1 3.65-1.09 3.7-1.05 3.7-1 3.75-2.15 7.55-1.08 3.82-1.13 3.82-.59 1.91-.6 1.92-.61 1.93-.6 1.84-.07.18v.08l-.1.44-.08.45-.07.56-.06.65-.05.72v10.78l-.07 1.12-.12 1.17-.15 1.18-.21 1.22-.34 1.21-.2.72-.22.63-.25.68-.28.67-.32.68-.38.69-.43.7-.49.7-.53.68-.62.65-.68.63-.73.6-.79.54-.83.48-.87.43-.9.35-.91.27-.92.22-.9.15-.67.05h-1.73l-.87-.15-.83-.23-.82-.32-.76-.42-.74-.48-.66-.55-.6-.63-.55-.69-.47-.73-.38-.78-.3-.82-.22-.85-.15-.87v-.88l.07-.87.13-.85.24-.85.33-.8.4-.78.48-.72.57-.68.62-.6.68-.55.73-.47.79-.38.05-.57.05-.7v-9.7l.05-1.13.07-1.17.12-1.18.16-1.22.22-1.23.27-1.22.2-.7.18-.56.62-1.89.56-1.8.57-1.8.55-1.81 1.08-3.67 1.07-3.7 2.14-7.52 1.07-3.79 1.07-3.8 1.11-3.81 1.15-3.8.62-1.94.62-1.91.63-1.92.65-1.93.68-1.92.7-1.92.72-1.91.75-1.92.78-1.92.8-1.91.84-1.9.85-1.87 1.43-3.1 1.37-3.07 1.36-3.11 1.32-3.12 1.32-3.15 1.3-3.18 1.26-3.19 1.27-3.21 1.25-3.24 1.25-3.23 2.45-6.53 2.45-6.55 2.43-6.6 2.47-6.6 2.48-6.59 1.27-3.3 1.28-3.28 1.3-3.28 1.3-3.29 1.35-3.25 1.35-3.26 1.39-3.24 1.41-3.21 1.44-3.22 1.48-3.18 1.52-3.17 1.55-3.15.71-1.42.75-1.43.79-1.45.8-1.47 1.65-2.91 1.71-3 1.72-3 1.72-3.05.83-1.52.83-1.52.8-1.51.8-1.52.75-1.52.74-1.5.71-1.48.65-1.48.64-1.45.58-1.44.53-1.41.49-1.39.45-1.4.18-.63.18-.65.17-.65.17-.63.13-.64.12-.61.11-.6.1-.6.1-.65v-.56l.05-.55.05-.55v-1.14l.07-.87.15-.85.23-.85.32-.8.42-.78.48-.72.57-.66.61-.62.69-.53.73-.47.78-.38.84-.3.83-.22.87-.13h.86zm27.53 6.95.83.1.82.18.8.27.77.35.73.42.68.5.64.55.56.63.52.67.43.73.35.77.29.8.2.81.1.84v1.93l-.06 1.23-.1 1.22-.15 1.22-.19 1.2-.21 1.2-.25 1.18-.29 1.17-.31 1.16-.34 1.15-.36 1.15-.4 1.14-.42 1.13-.43 1.12-.45 1.1-.49 1.1-.48 1.1-.52 1.08-.51 1.08-.55 1.09-.55 1.06-.59 1.07-1.15 2.08-1.2 2.09-1.23 2.06-1.27 2-1.26 2-1.29 2-1.28 2-2.53 3.88-1.24 1.9-1.2 1.89-1.16 1.85-1.14 1.81-1.06 1.79-1 1.75-.95 1.71-.43.82-.42.83-.42.82-.38.8-.35.78-.35.77-.32.75-.28.75-.27.72-.26.76-1.22 3.64-1.25 3.68-2.53 7.32-2.55 7.3-2.57 7.25-5.15 14.48-2.56 7.22-2.52 7.21-2.48 7.22-1.23 3.6-1.2 3.62-1.2 3.61-1.17 3.64-1.16 3.62-1.14 3.63-1.13 3.65-1.1 3.63-1.07 3.65-1.05 3.67-1 3.67-1 3.68-1 3.68-1 3.84-.32 1.13-.41 1.3-.49 1.37-.53 1.43-.58 1.52-.65 1.61-1.37 3.42-1.55 3.68-1.67 3.92-1.66 3.95-1.65 4-1.59 3.88-.73 1.88-.72 1.82-.65 1.75-.6 1.67-.53 1.56-.48 1.45-.39 1.3-.31 1.17-.12.47-.08.43-.09.37v.11l.13.49.12.83v.85l-.05.85-.13.83-.23.8-.3.8-.39.75-.45.7-.53.67-.58.6-.65.55-.7.47-.75.4-.79.31-.8.25-.83.15-.83.09h-.85l-.84-.1-.83-.18-.8-.27-.77-.33-.73-.44-.68-.48-.64-.57-.58-.61-.5-.67-.43-.73-.14-.24-.28-.6-.25-.63-.1-.35-.15-.5-.13-.54-.07-.31-.12-.8-.06-.69v-1.91l.06-.85.12-.84.13-.81.15-.82.19-.82.2-.83.43-1.63.52-1.7.56-1.77.64-1.83.68-1.87.72-1.93.75-1.95.8-2 1.63-4 1.7-4.07 1.68-4 1.64-3.83 1.51-3.62 1.34-3.27.58-1.45.52-1.35.45-1.18.35-1 .25-.78.18-.65.95-3.72 1-3.82 1-3.8 1.07-3.78 1.08-3.78 1.1-3.75 1.14-3.74 1.15-3.73 1.16-3.72 1.19-3.7 1.21-3.7 1.22-3.68 1.23-3.67 1.24-3.68 2.51-7.28 2.55-7.29 2.57-7.25 5.15-14.48 2.55-7.22 2.53-7.23 2.5-7.25 1.22-3.62 1.23-3.68.35-1 .4-1.05.42-1 .43-1 .47-1.05.47-1 .5-1 .5-1 .53-1 .55-1 1.1-2 1.15-2 1.2-2 1.23-2 1.24-2 1.26-2 1.27-2 2.53-3.88 1.25-1.92 1.22-1.92 1.2-1.88 1.15-1.88 1.12-1.85 1.06-1.85 1-1.84.47-.86.46-.9.44-.87.43-.88.4-.87.38-.85.37-.85.35-.83.32-.82.3-.82.26-.8.27-.78.22-.78.2-.75.18-.75.17-.74.11-.71.12-.7.08-.69v-2.11l.07-.85.13-.84.24-.81.3-.79.38-.75.47-.7.53-.66.58-.6.65-.54.7-.46.75-.4.79-.32.81-.25.82-.15.85-.07zm-78.3 232.38-.05-.18-.2-.35z"/><path d="m395.53 658.87h.22l.63.09.64.13.23.07.53.15.52.2.25.08.4.18.4.2.25.14.65.38.55.35.73.58.5.42.6.6.55.63.49.7.4.74.33.78.25.8.17.83.08.84v.85l-.08.83-.18.83-.25.8-.34.79-.41.73-.49.68-.55.64-.61.58-.69.52-.13.08v.67l.05 1.11.06 1.17.17 2.52.22 2.58.23 2.63.22 2.59.18 2.48.08 1.23.07 1.17v5.5l-.05 1.62-.07 1.61-.08 1.6-.1 1.6-.22 3.15-.28 3.14-.3 3.11-.32 3.09-.33 3.05-.32 3-.31 3-.29 3-.25 3-.21 3-.1 1.45-.07 1.47-.07 1.45v13.27l-.08 4.45-.09 4.45-.11 4.43-.15 4.45-.17 4.43-.17 4.44-.2 4.43-.2 4.43-.45 8.85-.46 8.84-.5 8.85-.49 8.81-.46 8.84-.45 8.81-.2 4.4-.19 4.42-.18 4.4-.15 4.4-.15 4.42-.12 4.4-.08 4.4-.08 4.4v9.68l-.14.83-.2.82-.3.78-.38.77-.45.72-.52.66-.58.6-.63.55-.7.49-.74.4-.78.33-.8.25-.83.17-.84.08h-1.06l-.83-.08-.83-.19-.8-.25-.79-.33-.73-.42-.68-.48-.65-.55-.59-.62-.5-.66-.45-.72-.36-.77-.3-.78-.2-.82-.14-.83v-5.33l.05-4.52.06-4.5.1-4.48.12-4.49.13-4.48.17-4.48.17-4.47.2-4.45.2-4.47.45-8.88.48-8.87.48-8.85.49-8.81.48-8.8.43-8.79.2-4.38.2-4.38.17-4.37.17-4.37.13-4.36.12-4.37.1-4.35.06-4.35v-12l.05-1.65.07-1.63.08-1.62.1-1.63.24-3.17.26-3.17.3-3.13.32-3.1.33-3 .32-3 .32-3 .28-3 .27-2.93.21-2.93.09-1.44.06-1.43.07-1.43.05-1.44v-4.45l-.05-1-.07-1-.18-2.3-.22-2.52-.21-2.65-.24-2.73-.18-2.72-.08-1.37-.05-1.35v-5.2l.1-1.28.16-1.23.12-.72.15-.68.18-.74.24-.75.31-.81.42-.87.32-.53.25-.4.26-.39.14-.18.35-.43.38-.42.15-.17.47-.43.5-.4.16-.12.64-.43.65-.35.18-.1.72-.3.73-.25.2-.05.77-.18.8-.1h.93zm28.79-8.37.83.08.83.17.8.27.77.33.75.42.68.48.64.55.58.62.52.66.45.72.36.77.29.78.21.82.12.83v6.07l-.05 5.26-.1 5.25-.14 5.25-.15 5.25-.2 5.25-.2 5.25-.25 5.25-.25 5.24-.26 5.25-.3 5.25-.3 5.25-.64 10.46-.65 10.49-.66 10.48-.63 10.47-.3 5.23-.28 5.23-.27 5.25-.27 5.22-.23 5.23-.2 5.24-.18 5.23-.17 5.23-.12 5.24-.1 5.21-.06 5.24v6.78l-.07 2.35-.28 6.88-.35 9-.37 9.94-.15 5-.13 4.77-.1 4.42-.07 3.93v6.14l.17.83.1.83v.86l-.08.84-.15.83-.25.8-.34.78-.4.74-.48.7-.53.65-.62.58-.67.52-.7.45-.76.38-.79.3-.81.22-.84.13-.85.05h-.83l-.83-.12-.82-.22-.8-.28-.77-.37-.71-.43-.53-.4-.52-.45-.46-.49-.44-.51-.4-.55-.34-.6-.3-.62-.05-.13-.23-.6-.18-.64-.12-.5-.15-.86-.13-1.2-.07-1.27-.05-1.38v-5.09l.07-4.08.1-4.53.13-4.85.17-5 .37-10 .35-9 .26-6.85.09-2.2v-6.45l.05-5.33.1-5.33.13-5.34.15-5.33.18-5.32.22-5.3.23-5.3.27-5.3.27-5.28.3-5.28.3-5.27.63-10.52.65-10.5.65-10.46.63-10.44.3-5.21.29-5.2.26-5.19.27-5.18.23-5.18.2-5.17.19-5.17.16-5.16.12-5.15.1-5.14.05-5.13v-5.17l.05-.83.13-.85.22-.82.3-.78.36-.75.53-.92.52-.66.58-.62.65-.55.7-.47.74-.41.81-.29.8-.25.83-.16.84-.07zm-1.55 227.65.35.62-.19-.4-.45-.62z"/><path d="m436 653.85.83.12.82.21.78.3.77.37.71.45.67.52.6.58.55.63.48.7.42.74.33.78.25.8.17.83.08.84v.85l-.08.83-.18.83-.17.55.12.47.15.57.18.58.42 1.33.46 1.39.5 1.38.5 1.35.5 1.27.87 2.16.55 1.35.8 2 .82 1.9.83 1.9.88 1.92.9 1.9.92 1.9.95 1.92 1 1.91 2 3.87 2 3.9 2.05 3.93 2 4 1 2 1 2 1 2.05 1 2.09.95 2.1.93 2.11.92 2.14.86 2.18.85 2.18.82 2.24.77 2.25.71 2.26.35 1.19.34 1.15.33 1.16.3 1.19.3 1.18.28 1.2.27 1.2.23 1.18.59 2.82.6 2.92.63 3 .67 3.13.71 3.22.75 3.32.79 3.38.81 3.47.85 3.51.89 3.55.91 3.6.95 3.64 1 3.66 1 3.65 1.05 3.67 1.16 3.73 1.1 3.63 1.13 3.62 1.15 3.56 1.2 3.54 1.2 3.48 1.25 3.42.62 1.65.65 1.66.63 1.64.65 1.6.65 1.58.65 1.57.67 1.53.67 1.5.66 1.48.67 1.45.68 1.4.69 1.39.68 1.35.68 1.3.7 1.28.69 1.22.7 1.2.68 1.15.7 1.1.75 1.15.3.46.35.6.57 1 .53 1.1.48 1.1.47 1.12.43 1.13.42 1.14.4 1.16.8 2.32.78 2.32.79 2.3.38 1.08.4 1.07.4 1 .4 1 .38.9.4.85.39.75.38.7.15.26.17.27.15.23.15.2.11.17.55.1.8.25.79.32.73.4.7.48.65.53.58.62.54.65.45.72.38.75.3.8.22.81.13.84.07.83v.85l-.13.83-.2.82-.28.8-.37.75-.43.73-.52.67-.57.62-.63.56-.68.49-.74.41-.78.34-.8.26-.82.19-.85.1h-1.56l-1-.11-1-.22-1-.28-1-.34-.89-.41-.83-.45-.78-.49-.72-.51-.68-.55-.64-.55-.58-.57-.53-.6-.52-.58-.48-.6-.45-.6-.42-.6-.42-.62-.38-.62-.38-.65-.67-1.2-.62-1.26-.6-1.27-.55-1.27-.51-1.28-.5-1.27-.56-1.3-.45-1.29-.85-2.43-.78-2.35-.75-2.2-.35-1-.35-.94-.32-.85-.32-.75-.26-.63-.25-.5-.22-.4v-.07l-.12-.16-.78-1.22-.85-1.35-.84-1.38-.83-1.42-.82-1.45-.8-1.47-.78-1.5-.78-1.53-.77-1.57-.75-1.56-.75-1.62-.75-1.63-.73-1.65-.72-1.67-.72-1.7-.7-1.72-.7-1.73-.68-1.75-.67-1.77-.68-1.8-1.32-3.6-1.26-3.65-1.28-3.69-1.22-3.74-1.18-3.76-1.12-3.77-1.1-3.8-1.09-3.78-1-3.78-1-3.77-1-3.75-.95-3.7-.9-3.67-.88-3.6-.84-3.53-.8-3.48-.76-3.39-.74-3.3-.74-3.18-.65-3.1-.62-3-.56-2.83-.22-1-.22-1-.23-1-.25-1-.25-1-.27-1-.28-1-.28-.95-.64-2-.65-1.93-.7-1.94-.75-1.91-.76-1.92-.82-1.92-.85-1.9-.87-1.91-.9-1.92-.91-1.92-.95-1.91-1-1.92-2-3.87-2-3.9-2.05-3.93-2-4-1-2-1-2-1-2.05-1-2.07-1-2.08-.94-2.1-.91-2.13-.85-2.09-.59-1.41-.91-2.3-.55-1.44-.59-1.55-.58-1.61-.57-1.69-.53-1.66-.25-.89-.25-.85-.22-.86-.2-.89-.16-.86-.15-.92-.12-1-.07-1v-1.63l.05-.38.07-.45.1-.45v-.17l.2-.73.05-.15.15-.42.18-.42.07-.13.23-.48.29-.49.06-.11.37-.54.42-.5.08-.1.5-.53.55-.48.1-.09.63-.45.67-.4.12-.06.7-.34.73-.26h.12l.81-.21.85-.14h.84zm2.41 15.95-.8.28.64-.2.35-.18zm17.67-36.8.49.07.86.13.35.09.52.13.52.15.35.13.45.17.41.2.37.18.7.39.68.41.89.65.8.69.7.7.66.7.6.71.55.72.54.75.51.75.49.77.46.78.45.8.45.8.45.87.82 1.66.82 1.77.78 1.82.77 1.86.75 1.92.73 1.93.7 1.95.68 2 .67 2 .65 2 .62 1.95 1.16 3.73 1.07 3.52 1.75 5.93.65 2.2.48 1.53.7 2.07.74 2.13.75 2.14.76 2.13.79 2.13.81 2.15.82 2.15.82 2.14 1.71 4.33 1.75 4.33 1.8 4.35 1.84 4.37 1.88 4.37 1.9 4.4 1.93 4.41 2 4.42 3.93 8.92 4 9 2 4.5 2 4.51 1.95 4.54 1.92 4.53 1.77 4.47 1.87 4.58 1.81 4.58 1.79 4.6.86 2.34.87 2.3.85 2.31.83 2.34.82 2.31.8 2.34.78 2.33.77 2.35.75 2.33.73 2.35.7 2.35.7 2.37.67 2.35.65 2.37.63 2.38.59 2.32.3 1.1.28 1.05.33 1.08.35 1.1.37 1.12.4 1.11.42 1.15.43 1.14.47 1.16.48 1.15.5 1.19.53 1.16.54 1.17.55 1.17.58 1.18.58 1.17.6 1.16.62 1.17.63 1.15.64 1.15.65 1.13.66 1.14.67 1.11.67 1.1.68 1.09.68 1.08.7 1.05.7 1 .7 1 .7 1 .7 1 .79 1 .35.5.38.61.35.62.35.65.5 1.1.43 1.13.37 1.12.3 1.08.25 1.07.22 1 .2 1 .16 1 .29 1.86.23 1.77.25 1.76.6.3.73.48.67.55.62.62.55.66.48.74.38.78.32.82.22.83.15.87v1.75l-.13.85-.22.85-.32.81-.4.77-.46.73-.55.69-.64.61-.66.55-.74.47-.78.4-.55.25-.87.3-.56.17-.74.16h-.25l-.81.11h-2.5l-.54-.12-.48-.12-.2-.05-.47-.15-.46-.17-.19-.06-.45-.2-.41-.22-.19-.08-.76-.47-.19-.13-.66-.5-.17-.15-.58-.54-.39-.4-.56-.66-.47-.67-.4-.63-.35-.64-.32-.66-.43-1.05-.35-1.07-.28-1-.24-1-.2-1-.16-1-.15-.94-.27-1.78-.22-1.66-.25-1.63-.12-.73-.13-.69-.14-.61-.13-.55-.12-.49-.13-.36-.08-.25-.07-.15-.72-.95-.81-1.14-.82-1.15-.8-1.16-.8-1.19-.78-1.2-.79-1.23-.78-1.23-.77-1.25-.75-1.27-.75-1.27-.73-1.3-.73-1.3-.7-1.31-.7-1.32-.69-1.32-.68-1.35-.65-1.33-.63-1.35-.62-1.35-.62-1.37-.58-1.35-.57-1.35-.53-1.36-.53-1.37-.5-1.37-.49-1.35-.45-1.36-.43-1.35-.4-1.37-.38-1.35-.34-1.28-.58-2.29-.58-2.21-.62-2.22-.63-2.22-.65-2.23-.67-2.22-.7-2.23-.72-2.22-.71-2.21-.75-2.24-.77-2.21-.78-2.24-.8-2.23-.82-2.22-.82-2.23-.83-2.22-1.73-4.46-1.77-4.45-1.82-4.45-1.85-4.47-1.88-4.45-1.92-4.47-1.91-4.47-1.95-4.48-3.95-8.93-4-8.9-2-4.47-1.95-4.45-1.93-4.46-1.92-4.45-1.88-4.47-1.83-4.45-1.74-4.42-1.75-4.45-.87-2.25-.85-2.21-.83-2.24-.83-2.23-.8-2.25-.79-2.23-.76-2.24-.79-2.28-.56-1.83-.7-2.34-1.75-5.9-1-3.4-1.12-3.6-.58-1.81-.6-1.82-.62-1.83-.63-1.8-.65-1.79-.65-1.71-.65-1.69-.65-1.58-.65-1.5-.63-1.4-.65-1.28-.29-.57-.3-.53-.28-.5-.27-.45-.25-.4-.23-.34-.22-.3-.2-.06-.8-.34-.76-.43-.72-.5-.65-.57-.6-.65-.52-.68-.45-.75-.36-.8-.29-.82-.2-.85-.1-.86v-.94l.08-.86.17-.85.25-.84.35-.8.41-.76.52-.72.57-.65.63-.6.7-.52.75-.45.8-.36.82-.29.85-.2.86-.1h1.35zm-1.21 16.64h.13-.43zm-77.97-37.57h1l.33.05.34.07.31.08.32.1.33.1.3.12.32.13.3.15.3.15.28.17.29.18.28.2.27.2.25.22.25.21.25.24.23.25.22.25.21.26.2.27.19.27.18.28.17.3.15.3.15.3.11.3.14.32.1.31.08.34.08.31.07.34.05.33.05.33v2.25l-.07.7-.1.74-.23 1.23-.32 1.27-.37 1.26-.4 1.24-.51 1.31-.48 1.25-.52 1.25-.55 1.25-.58 1.27-.6 1.26-.62 1.27-.66 1.3-1.32 2.52-1.37 2.53-1.4 2.5-1.36 2.42-1.34 2.31-2.43 4.25-1 1.84-.92 1.66-.17.3-.16.29-.2.26-.2.29-.2.25-.24.25-.21.25-.25.23-.25.22-.27.21-.27.2-.26.2-.29.19-.28.16-.3.15-.3.15-.32.14-.31.11-.32.1-.32.1-.33.09-.32.06h-3l-.32-.07-.33-.08-.32-.08-.32-.12-.31-.12-.32-.13-.3-.13-.3-.15-.28-.17-.29-.18-.28-.19-.27-.21-.26-.2-.25-.24-.25-.21-.24-.25-.21-.25-.22-.25-.2-.27-.18-.28-.19-.29-.16-.28-.17-.3-.15-.3-.13-.32-.12-.31-.1-.32-.1-.32-.08-.33-.07-.32-.05-.33-.05-.33v-2.01l.05-.33.07-.32.08-.33.1-.32.1-.32.12-.31.13-.32.14-.3.16-.3 1-1.77 1.12-2 2.46-4.3 1.3-2.28 1.34-2.34 1.3-2.35 1.27-2.35 1.22-2.31.57-1.1.53-1.1.5-1 .47-1 .43-1 .4-.93.33-.87.29-.8.23-.72.18-.63.14-.5.08-.45v-1.37l.05-.33.08-.32.07-.33.1-.32.12-.31.11-.32.14-.3.13-.32.17-.28.16-.3.19-.28.18-.27.22-.27.2-.26.23-.25.23-.24.24-.23.25-.23.26-.2.27-.2.28-.2.29-.17.28-.17.3-.16.3-.14.32-.13.31-.12.32-.1.32-.1.33-.08.33-.07h1.34z"/><path d="m444.32 609.3 1.1.07 1.11.11 1.12.15 1.12.22 1.15.27 1.13.35 1.13.41 1.14.5 1.11.57 1 .63.6.4.52.39.51.41.5.42.49.45.46.47.45.46.44.5.41.52.4.53.39.54.36.55.35.56.37.64.58 1.13.54 1.22.48 1.26.42 1.3.36 1.32.32 1.38.27 1.4.23 1.45.17 1.5.13 1.54.1 1.6.07 1.63v2.6l-.06.48-.1.49-.14.48-.15.47-.18.46-.2.45-.23.44-.27.41-.28.4-.3.4-.34.37-.35.35-.36.32-.39.3-.41.28-.42.27-.43.21-.45.22-.47.17-.47.15-.48.11-.48.1-.49.07h-2l-.48-.09-.49-.11-.46-.14-.47-.16-.45-.2-.45-.22-.42-.25-.41-.27-.4-.3-.39-.31-.35-.34-.33-.36-.32-.39-.3-.4-.26-.41-.25-.42-.22-.45-.18-.45-.17-.47-.13-.48-.1-.48-.09-.49v-2.38l-.05-1.23-.07-1.15-.1-1-.1-1-.15-.88-.15-.8-.15-.7-.18-.63-.17-.54-.18-.45-.17-.38-.18-.37-.05-.08-.07-.12-.06-.1-.07-.08-.05-.07-.05-.06-.07-.07h-.1l-.17-.1-.11-.06-.15-.07-.19-.07-.23-.06-.28-.07-.34-.07-.38-.05h-3.56l-.72.05-.75.08-.78.1-.8.1-1.78.28-1.87.32-2 .37-4.25.81-2.25.44-2.35.4-2.4.4-1.25.18-1.25.17-1.28.16-1.28.14-1.32.13-1.32.12-1.33.08-1.37.07h-3.65l-.68.09-.82.13-.9.15-1 .22-1.05.21-1.1.27-2.35.58-2.41.62-2.45.65-2.4.62-2.32.56-1.15.25-1.12.24-1.11.18-1.14.17-1.11.1h-1.4l-.77-.05-.88-.11-.55-.12-.47-.12-.45-.13-.18-.07-.39-.15-.38-.15-.38-.18-.15-.08-.35-.2-.34-.2-.33-.24-.33-.23-.12-.1-.37-.32-.36-.33-.34-.37-.31-.38-.09-.1-.26-.37-.24-.35-.21-.38-.22-.38-.17-.4-.06-.14-.15-.4-.14-.4-.11-.4-.09-.41-.08-.42v-.13l-.05-.47v-1.57l.05-.48.07-.48.12-.47.05-.18.1-.37.11-.37.13-.56.08-.2.17-.38.18-.38.28-.54.49-.75.48-.65.37-.45.31-.38.35-.35.37-.33.38-.32.4-.28.42-.27.43-.23.44-.22.46-.18.47-.17.47-.13.48-.1.5-.07h1.97l.48.07.48.1.49.13.46.15.45.18.45.22.44.23.41.27.1.08.74-.18 2.25-.58 2.43-.64 2.53-.65 2.55-.65 1.32-.3 1.3-.28 1.28-.27 1.27-.23 1.28-.18 1.29-.17 1.23-.1h4.48l1.07-.09 1.07-.08 1.05-.1 1.06-.12 1.09-.13 1.06-.15 1.05-.15 2.17-.35 2.13-.38 2.15-.4 4.25-.82 2.12-.4 2.12-.37 2.08-.31 1.07-.15 1.06-.14 1.07-.1 1.05-.1 1.07-.06h2.16z"/><path d="m417.2 620.8h1.13l.39.08.36.08.35.12.37.12.35.15.35.15.33.18.34.18.31.2.32.22.3.23.28.25.29.25.26.27.25.28.25.3.22.3.22.32.2.32.18.33.17.33.15.35.15.35.11.37.1.37.09.36.08.37v1.92l.15 1.71.22 2.4.3 2.94.37 3.35.41 3.65.47 3.81.47 3.87.5 3.82.5 3.63.5 3.33.46 2.94.2 1.21.2 1.09.19.86.05.24.11.2.15.35.15.35.14.35.11.36.1.37.07.37.07.38.05.37v1.51l-.05.39-.05.36-.06.39-.1.36-.1.37-.14.35-.13.35-.17.35-.16.33-.19.34-.2.31-.21.32-.24.3-.25.3-.25.27-.26.26-.29.27-.28.23-.32.24-.3.21-.33.2-.33.19-.34.16-.35.15-.35.15-.36.12-.35.1-.39.1-.35.07-.37.05h-2.18l-.37-.07-.36-.07-.33-.09-.33-.1-.34-.11-.31-.12-.32-.15-.32-.15-.3-.17-.3-.18-.3-.18-.28-.2-.27-.22-.06-.07-.29-.23-.26-.25-.25-.25-.25-.27-.22-.28-.23-.3-.2-.3-.07-.1-.17-.25-.13-.25-.13-.25-.14-.25-.23-.48-.27-.72-.21-.67-.29-1.05-.25-1.11-.25-1.22-.25-1.32-.25-1.43-.5-3.15-.51-3.5-.52-3.77-.5-3.91-.5-4-.47-3.9-.43-3.73-.37-3.44-.31-3.06-.25-2.59-.15-2-.05-.88v-1.73l.05-.37.07-.38.08-.37.1-.37.12-.36.13-.35.15-.35.17-.34.18-.33.2-.33.2-.32.24-.3.23-.3.25-.28.27-.27.26-.27.3-.25.3-.23.3-.22.32-.2.33-.2.34-.16.35-.17.35-.15.35-.13.36-.1.37-.1.37-.09.38-.06h1.13z"/><path d="m401.65 620.8h.4l.42.07.4.07.4.1.38.11.4.12.37.17.38.16.37.19.35.2.33.23.33.23.32.25.32.29.28.28.28.3.27.3.25.33.23.34.22.35.2.35.17.36.16.39.15.38.12.38.1.4.1.4v.4l.05.42v2.97l-.07 2.33-.12 2.4-.16 2.47-.2 2.53-.25 2.55-.29 2.58-.33 2.6-.37 2.59-.41 2.58-.47 2.53-.48 2.49-.29 1.26-.28 1.22-.28 1.2-.3 1.18-.32 1.17-.33 1.15-.34 1.13-.31.95v.25l-.05.25-.05.29-.13.93-.12 1.07-.1 1.2-.08 1.26-.15 2.59-.15 2.33-.09 1.13-.13 1.12-.1.52-.07.28-.06.27-.07.26-.05.17-.12.33-.11.32-.14.33-.15.32-.16.3-.17.3-.05.1-.22.32-.21.31-.24.3-.25.3-.26.29-.27.26-.3.25-.3.25-.3.24-.33.2-.32.2-.35.18-.36.16-.37.17-.37.13-.36.12-.39.1-.38.08-.38.07-.4.05h-1.57l-.4-.05-.38-.07-.36-.08-.39-.1-.36-.12-.37-.13-.35-.15-.35-.17-.33-.18-.34-.2-.33-.2-.3-.23-.3-.25-.29-.25-.26-.25-.25-.27-.25-.28-.24-.28-.21-.3-.21-.35-.22-.35-.18-.37-.17-.37-.08-.16-.12-.29-.1-.28-.1-.3-.15-.5-.15-.6-.08-.4-.07-.4-.05-.42v-2.03l.08-.4.08-.4.12-.4.13-.38.15-.39.12-.26v-.37l.16-2.68.1-1.49.14-1.51.15-1.54.21-1.48.15-.82.15-.78.22-.82.2-.71.32-1 .26-.87.27-.9.25-.93.25-1 .23-1 .24-1 .23-1 .43-2.19.4-2.23.37-2.3.33-2.32.3-2.31.27-2.34.22-2.3.18-2.26.13-2.2.1-2.12.07-2v-2.81l.05-.4.08-.4.08-.4.12-.4.13-.39.15-.38.17-.37.2-.36.2-.35.22-.35.25-.34.25-.31.26-.3.29-.3.3-.29.31-.25.34-.25.33-.23.35-.22.35-.2.37-.18.38-.17.38-.13.39-.13.4-.1.4-.09.4-.06h1.23z"/><path d="m489.6 554.8h2l1 .07 1 .08 1 .1 1 .14 1 .15 1 .18 1 .22 1 .25 1 .26 1 .32 1 .37.95.4.95.45.95.5.94.56.9.64.9.68.86.77.82.81.77.9.71 1 .67 1 .53 1 .5 1 .42.95.4.93.37.95.35 1 .31 1 .3 1 .27 1 .23 1 .22.95.18 1 .17 1 .13 1 .1 1 .09 1 .06.95v4.81l-.1.94-.1.91-.13.92-.17.92-.17.9-.2.9-.21.9-.24.88-.26.87-.27.86-.3.87-.32.85-.33.85-.35.83-.37.84-.38.81-.4.8-.42.8-.43.8-.43.79-.47.76-.48.77-.49.75-.5.75-.51.73-.54.74-.55.71-.55.7-.56.7-.59.69-.58.68-.62.67-.6.65-.63.65-.65.66-1.75.76-1.35 1.2-1.37 1.15-1.42 1.12-1.45 1.08-1.48 1-1.52 1-1.53.93-1.58.89-1.59.85-1.63.78-1.63.73-1.67.7-1.68.64-1.67.56-.9.29-.85.25-.88.23-.87.23-.87.2-.88.2-.88.19-.89.16-.88.15-.88.14-.9.11-.89.1-.9.09-.9.06h-5.4l-.9-.05-.91-.08-.9-.1-.9-.14-.9-.13-.9-.17-.89-.16-.9-.22-.88-.22-.9-.25-.88-.26-.87-.29-.88-.31-.87-.34-.87-.36-.85-.39-.85-.4-.85-.43-.83-.45-.82-.47-.81-.5-.72-.46-.65-.47-.6-.52-.53-.58-.5-.62-.42-.66-.37-.72-.28-.73-.23-.77-.14-.77-.08-.8v-.78l.08-.8.15-.77.24-.76.3-.74.36-.7.44-.66.48-.62.55-.58.6-.52.65-.45.68-.4.74-.33.75-.25.76-.19.79-.11h1.58l.78.12.77.18.75.27.73.33.69.4.51.34.45.28.45.25.45.25.47.23.45.22.47.22.48.18.48.2.49.17.48.16.5.15.5.14.52.13.51.12.52.1.52.1.53.08.53.07.55.06h.54l.55.05h3.4l.58-.05h.58l.59-.07.58-.08.6-.08.58-.1.6-.12.59-.12.6-.13.6-.13.6-.17.6-.17.58-.16.57-.19 1.23-.41 1.18-.45 1.19-.49 1.16-.53 1.17-.55 1.13-.62 1.14-.63 1.11-.67 1.09-.7 1.06-.75 1-.76 1-.79 1-.83.95-.85.95-.9.42-.42.43-.45.42-.45.41-.46.4-.45.4-.49.39-.46.38-.47.37-.48.35-.5.33-.49.33-.48.34-.5.3-.48.3-.5.28-.5.27-.5.26-.5.25-.52.24-.5.23-.52.2-.5.22-.51.18-.5.17-.52.16-.52.15-.5.21-.48.13-.52.12-.52.1-.5.08-.51.07-.5.06-.52.05-.52v-3.1l-.05-.51-.07-.52-.06-.53-.09-.52-.1-.52-.11-.53-.14-.53-.15-.54-.16-.55-.19-.53-.2-.55-.21-.55-.24-.55-.25-.55-.23-.47-.05-.11v-.05h-.05l-.09-.06-.11-.09-.17-.08-.18-.12-.24-.1-.28-.11-.32-.14-.36-.11-.4-.12-.44-.1-.48-.1-.5-.1-.55-.08-.57-.09-.6-.06h-.63l-.65-.05h-5.13l-1.59.08-1.61.13-1.65.15-1.67.17-1.67.2-1.66.22-1.64.21-3.25.45-3.06.44-1.49.21-1.45.17-1.38.17-1.35.11-1.33.09h-24.45l-4.59.06-4.75.12-4.86.15-5 .18-2.52.12-2.53.13-2.57.15-2.58.15-2.59.19-2.58.2-2.6.2-2.6.23-2.6.25-2.6.27-2.58.28-2.59.32-2.56.33-2.55.35-2.54.38-2.51.4-2.49.42-2.46.45-2.44.48-2.4.5-2.35.52-2.33.57-2.27.56-2.27.55-2.18.63-2.14.67-2.1.7-1 .35-1 .35-1 .38-1 .37-.95.38-.93.4-.93.39-.9.41-.89.4-.86.42-.84.42-.83.43-.82.43-.78.45-.77.44-.75.45-.73.46-.7.47-.68.47-.67.46-.63.49-.64.46-.6.5-.56.49-.55.48-.54.5-.51.5-.49.5-.46.52-.45.5-.42.51-.4.52-.22.28.05.09.15.26.19.32.21.33.27.37.3.38.33.4.37.44.4.45.43.45.47.46.48.47.54.48.53.49.57.48.58.48.62.5.61.49.62.46 1.35 1 1.35 1 1.4.91 1.4.9 1.42.85 1.38.82 1.38.75 1.32.72 1.28.65 1.2.56 1.14.52 1 .43.88.35.7.25.57.17h5.58l2.6-.07 2.84-.1 5.91-.2 3-.08h7.95l1.16.07 1.17.11 1.1.17.7.13.7.17.82.27.5.2.46.21.45.24.15.08.6.37.59.43.11.08.54.49.5.51.45.57.06.1.42.63.35.65.3.69.23.71v.1l.15.64.1.65.05.63v.65l-.05.65v.12l-.1.66-.16.67-.22.63-.27.64v.11l-.38.7-.43.65-.5.62-.55.57-.62.51-.65.45-.7.39-.72.31-.75.25-.78.19-.78.1h-.8l-.79-.05-.78-.11-.77-.2-.75-.29-.71-.33-.27-.17h-6.68l-2.78.07-5.85.2-2.88.1-2.74.08h-6.9l-1.07-.08-1.05-.17-.78-.17-.73-.2-1.24-.36-1.31-.49-1.37-.53-1.42-.6-1.46-.67-1.52-.73-1.57-.8-1.61-.85-1.65-.92-1.67-1-1.68-1-1.69-1.08-1.7-1.12-1.66-1.17-1.64-1.2-.83-.63-.82-.63-.8-.64-.78-.66-.78-.67-.75-.68-.75-.69-.74-.7-.71-.71-.7-.74-.69-.75-.66-.76-.64-.79-.61-.8-.6-.83-.57-.87-.53-.88-.52-.92-.47-1-.43-1-.38-1-.32-1.1-.27-1.13-.28-1.16-.08-1.23v-1.27l.11-1.18.12-.74.13-.65.17-.63.18-.63.24-.64.25-.61.28-.6.3-.6.33-.57.34-.53.66-1 .67-.92.7-.9.72-.87.73-.85.77-.83.78-.8.82-.8.81-.77.85-.75.87-.73.88-.72.9-.7.92-.68.95-.67.95-.65 1-.63 1-.62 1-.6 1-.58 1-.58 1-.55 1.06-.55 1.07-.54 1.07-.51 1.1-.52 1.1-.48 1.11-.49 1.14-.46 1.13-.47 1.15-.45 1.17-.43 1.18-.42 1.2-.43 2.37-.79 2.43-.76 2.48-.72 2.5-.68 2.54-.64 2.55-.58 2.59-.59 2.61-.55 2.64-.5 2.66-.5 2.67-.45 2.68-.43 2.7-.4 2.72-.37 2.72-.35 2.73-.33 2.72-.3 2.73-.28 2.72-.27 2.71-.23 2.72-.22 2.7-.2 2.68-.18 2.67-.17 2.67-.15 2.63-.15 2.62-.12 5.11-.2 5-.15 4.87-.11 4.68-.07h24.7l.95-.09 1.12-.13 1.25-.15 1.36-.18 3-.44 3.32-.46 1.75-.24 1.8-.23 1.83-.22 1.88-.18 1.9-.18 1.92-.15 1.93-.1 1.95-.07h1.92z"/><path d="m389.85 479.05h.5l.52.07.5.1.48.13.48.15.47.2.47.22.45.25.43.27.4.3.4.31.37.35.36.37.32.38.32.44.26.4.24.41.21.42.2.45.15.43.15.47.1.47.1.46v2.09l-.06.51-.1.52-.14.5-.15.5-.2.48-.21.49-.25.45-.15.4-.35 1-.4 1.18-.43 1.35-.47 1.45-.45 1.52-.37 1.56-.4 1.52-.35 1.45-.3 1.35-.1.55-.08.51-.07.47v3.45l-.07 2.77-.13 2.85-.18 2.86-.24 2.9-.26 2.92-.3 2.93-.35 2.94-.39 2.93-.41 2.92-.45 2.88-.47 2.87-.5 2.81-.53 2.77-.55 2.72-.54 2.48-.06.32v.3l-.27.43v5.28l.07 1.85.11 3.72.05 1.8v2.65l-.05.9-.11 1-.12.7-.1.42-.1.4-.1.35-.15.47-.18.46v.15l-.2.42-.22.42-.07.11-.21.37-.24.35-.25.35-.08.1-.27.32-.28.31-.3.3-.32.27-.06.08-.35.27-.35.27-.39.23-.38.22-.38.2h-.09l-.45.2-.46.17-.47.13-.47.12-.48.08h-.1l-.47.06h-2l-.48-.09-.48-.11-.47-.14-.55-.16-.11-.05-.45-.19-.44-.23-.43-.23-.12-.09-.31-.2-.3-.21-.29-.22-.13-.12-.3-.25-.3-.28-.35-.37-.58-.66-.5-.7-.3-.44-.27-.45-.23-.46-.22-.47-.17-.5-.15-.5-.11-.52-.09-.51-.05-.52v-1l.05-.52.09-.51.11-.52.14-.5.18-.5.2-.47.25-.46.27-.45.28-.44.17-.23-.12-3.45-.07-2v-6l.07-1 .1-1 .15-1 .18-.92.55-2.6.52-2.52.48-2.56.47-2.64.45-2.66.41-2.7.39-2.72.36-2.73.32-2.74.28-2.71.25-2.69.2-2.66.17-2.62.12-2.55.08-2.52v-3.35l.09-.93.1-.92.11-.9.15-.88.19-.93.38-1.77.43-1.83.49-1.82.51-1.8.52-1.75.53-1.65.5-1.55.49-1.4.43-1.23.42-1.09.4-1 .35-.71.25-.44.23-.36.25-.34.25-.33.28-.33.31-.35.35-.32.37-.3.38-.26.39-.27.41-.23.42-.2.43-.19.44-.16.5-.15.49-.12.51-.08.5-.05h.5zm24.42-1.7h.48l.47.07.48.08.45.13.47.14.45.18.43.2.42.22.41.25.4.26.39.3.35.32.35.33.35.39.28.35.27.38.26.38.22.4.22.42.18.42.15.43v.07l.13.45.12.45.08.45.08.56.07.92v2.32l-.06.48-.09.48-.13.49-.15.46-.17.47-.2.42-.06.71-.32 3.37-.27 3.43-.11 1.54-.07 1.35-.05 1v3.58l-.05 1.47-.06 1.43-.09 1.43-.1 1.44-.23 2.76-.28 2.72-.3 2.68-.32 2.65-.33 2.59-.32 2.55-.32 2.53-.28 2.48-.25 2.49-.22 2.46-.08 1.2-.07 1.22-.06 1.22-.05 1.21v4.04l-.06.78-.09.83-.18 1.57-.22 1.65-.26 1.65-.27 1.63-.5 3-.13.82.05.25.06.48.05.5v.98l-.05.49-.07.5-.1.48-.13.47-.15.46-.18.47-.25.58-.24.47-.2.37-.2.35-.11.18-.25.38-.29.37-.3.37-.05.05-.28.3-.3.3-.32.26-.33.27-.35.25-.42.26-.43.24-.44.21-.46.19-.47.15-.47.13-.48.1-.48.07h-1.99l-.49-.08-.48-.1-.47-.12-.46-.16-.47-.19-.43-.2-.44-.25-.41-.25-.4-.3-.39-.3-.35-.34-.33-.33-.32-.37-.3-.38-.28-.38-.24-.42-.23-.42-.2-.45-.18-.45-.14-.45v-.1l-.13-.48-.1-.48-.07-.49v-1.98l.13-1.15.17-1.23.43-2.65.52-3 .25-1.5.21-1.47.19-1.36.15-1.22.05-.48v-3.75l.05-1.43.06-1.42.09-1.42.1-1.4.23-2.73.28-2.7.3-2.67.32-2.61.33-2.59.32-2.56.32-2.54.28-2.5.25-2.5.22-2.5.08-1.23.08-1.23v-1.25l.05-1.24v-3.63l.07-1.37.1-1.53.12-1.7.28-3.62.33-3.58.17-1.67.17-1.48.18-1.32.2-1.18.1-.5.12-.43.15-.45.05-.15.16-.42.19-.42.2-.41.23-.39.23-.38.27-.39.3-.35.32-.35.33-.31.35-.3.37-.29.4-.26.38-.24.42-.21.41-.2.44-.17.45-.15.45-.12.47-.09.48-.08h.95zm26.58 3.52.5.05.48.08.49.12.46.15.47.16.45.2.43.22.44.25.41.28.39.3.38.32.35.35.33.35.32.38.28.4.27.42.25.43.2.45.2.45.15.47.13.48.1.49.09.48.05.5v6l.05 2.78.08 2.82.1 2.83.12 2.87.15 2.87.18 2.9.22 2.9.25 2.91.26 2.92.32 2.92.35 2.9.38 2.91.42 2.9.45 2.89.65 3.71.38 2.25.42 2.45.4 2.57.37 2.6.18 1.33.15 1.32.15 1.3.12 1.3.1 1.28.06 1.25v2.49l-.05 1.25-.1 1.18-.1.72-.12.68-.17.7-.2.77-.28.8-.23.53-.15.33-.19.35-.11.2-.22.4-.27.39-.11.18-.22.3-.23.28-.25.29-.14.15-.3.31-.31.29-.34.28-.15.12-.38.3-.42.26-.41.25-.17.09-.35.18-.37.17-.36.15-.39.13h-.16l-.39.12-.38.08-.38.07-.39.06h-2.31l-.42-.07-.43-.08h-.22l-.35-.1-.35-.1-.35-.12-.23-.08-.44-.17-.41-.18-.25-.14-.23-.14-.33-.19-.52-.33-.75-.53-.5-.4-.36-.32-.37-.35-.33-.37-.3-.38-.3-.4-.25-.42-.25-.43-.2-.45-.19-.45-.16-.48-.14-.47-.1-.48-.06-.5v-1.99l.08-.48.1-.49.13-.48.15-.47.19-.45.21-.45.25-.43.27-.42.28-.4.32-.38.33-.37.35-.33.37-.33.18-.14v-.28l-.08-1-.12-1.09-.13-1.11-.15-1.15-.35-2.39-.37-2.38-.4-2.32-.37-2.21-.66-3.82-.5-3.12-.45-3.11-.42-3.12-.37-3.12-.33-3.11-.28-3.1-.27-3.1-.22-3.07-.2-3.07-.16-3-.14-3-.1-3-.08-2.95v-9.12l.05-.48.06-.5.1-.49.14-.46.15-.47.18-.47.22-.45.15-.38.27-.42.28-.4.32-.38.33-.37.35-.35.37-.31.4-.3.4-.29.43-.25.43-.23.45-.2.47-.17.47-.15.48-.11.48-.09.49-.06h1zm20.5-5.27h.65l.48.07.48.08.47.12h.13l.4.12.42.15.4.15.12.07.35.16.33.17.32.18.13.09.4.26.38.29.14.1.3.26.3.27.38.37.53.6.52.65.63 1 .54 1 .45 1 .4 1 .35 1 .31 1 .32 1 .28 1 .29 1.1.28 1.14.27 1.18.26 1.25.5 2.53.5 2.7.49 2.85.46 3 .45 3 .45 3.14.44 3.18.41 3.23.42 3.24.38 3.25.75 6.35.69 6.06.61 5.6.55 4.94.49 4.11.2 1.64.18 1.35.15 1 .13.72.07.48.05.49v1.45l-.07.48-.1.48-.12.47-.15.45-.18.45-.2.45-.23.43-.25.4-.27.4-.3.39-.32.36-.35.35-.35.32-.38.3-.4.28-.42.27-.41.23-.44.2-.45.19-.46.15-.47.13-.47.1-.48.07h-1.96l-.5-.09-.48-.1-.47-.12-.45-.15-.45-.18-.45-.2-.43-.24-.4-.25-.4-.26-.38-.3-.37-.32-.35-.35-.32-.35-.3-.38-.28-.4-.27-.42-.23-.42-.2-.43-.18-.45-.15-.47-.14-.46-.1-.47-.18-1-.2-1.35-.2-1.55-.23-1.8-.49-4.2-.56-5-.62-5.6-.68-6-.74-6.29-.38-3.16-.4-3.17-.4-3.15-.42-3.1-.43-3-.43-2.91-.45-2.79-.45-2.65-.45-2.46-.45-2.29-.24-1-.21-1-.22-.91-.22-.84-.2-.73-.2-.67-.18-.53-.35-.33-.33-.35-.32-.39-.28-.38-.27-.4-.23-.43-.22-.44-.2-.43-.17-.47-.13-.46-.12-.47-.08-.48-.05-.47v-1.47l.07-.46.08-.49.1-.46.15-.47.17-.47.18-.43.22-.43.25-.42.26-.42.29-.38.31-.37.34-.35.35-.33.38-.32.38-.28.4-.27.44-.25.43-.21.43-.19.47-.16.45-.14.48-.11.47-.09.48-.05h.49zm-1.58 16.58.6.05-.49-.06-.38-.07z"/><path d="m459.68 356.52 1.74.05 1.71.08 1.72.13 1.68.15 1.67.2 1.65.25 1.63.29 1.6.33 1.6.38 1.54.44.81.25.77.26.77.27.75.28.76.3.75.32.74.35.63.3.35.18.35.2.15.09.52.35.5.38.13.12.38.33.35.37.14.13.28.32.25.31.33.44.45.7.39.66.3.64.28.65.38 1.05.34 1.1.26 1.06.25 1.1.2 1.1.19 1.12.16 1.13.17 1.17.13 1.17.14 1.21.2 2.37.23 2.4.13 2.31.12 2.19.08 2 .05 1.8v5.73l.06.87.17 2 .23 2.22.3 2.42.34 2.6.38 2.78.42 2.9.88 6.22.95 6.55.47 3.4.45 3.41.43 3.47.4 3.48.37 3.47.33 3.45.13 1.75.14 1.7.11 1.72.1 1.7.07 1.68.07 1.67.05 1.65v4.85l-.05 1.58-.07 1.57-.1 1.53-.13 1.52-.17 1.5-.2 1.48-.25 1.45-.26 1.43-.34 1.42-.36 1.38-.44 1.39-.46 1.28-.3.72-.29.66-.31.65-.32.65-.35.65-.38.64-.4.63-.44.62-.45.61-.48.6-.5.59-.53.55-.55.51-.55.5-.57.47-.57.45-.58.42-.58.4-.62.38-.6.37-.62.33-.66.37-1.22.58-1.28.55-1.32.52-1.33.46-1.37.42-1.38.38-1.42.35-1.43.32-1.47.3-1.48.27-1.5.23-1.54.22-1.55.18-1.56.17-1.59.15-1.6.13-1.61.12-1.65.1-1.65.08-1.65.07-1.69.05h-10.18l-3.42-.06-3.38-.12-3.37-.13-3.31-.15-3.27-.19-3.2-.18-6.08-.38-5.62-.37-5-.3-2.22-.13-2-.09-1.76-.05h-13.6l-1.62.07-1.62.08-1.6.1-1.56.13-1.59.15-1.55.2-1.56.22-1.55.25-1.62.3-9.68 1.9-.7.12-.7.05h-.72l-.7-.08-.68-.12-.6-.16-.66-.25-.64-.3-.61-.35-.59-.42-.53-.45-.27-.25-.21.35-.42.57-.47.53-.51.49-.55.45-.59.4-.61.33-.65.3-.67.23-.68.19-.69.11-.71.05h-1.34l-.6-.09-.37-.05-.36-.08-.59-.13-.91-.29-.87-.35-.8-.41-.75-.47-.68-.48-.62-.52-.55-.53-.5-.58-.45-.53-.42-.53-.43-.62-.58-1-.55-1.05-.47-1-.38-1-.34-1-.3-1-.25-1-.23-1-.18-1-.17-1-.15-1-.12-1-.1-1-.06-1-.07-.95v-5.3l.06-.81.09-.8.1-.8.11-.65.22-1.2.17-1.07.15-1.12.13-1.13.1-1.18.07-1.2.06-1.24v-6.52l-.07-1.37-.08-1.4-.1-1.43-.1-1.42-.27-2.95-.31-3-.35-3-.39-3.09-.81-6.3-.82-6.36-.4-3.22-.38-3.22-.34-3.21-.28-3.2-.12-1.64-.11-1.6-.09-1.6-.08-1.6v-6.33l.05-1.58.06-1.57.09-1.57.13-1.55.17-1.55.18-1.53.23-1.53.29-1.52.3-1.52.36-1.5.4-1.5.45-1.48.5-1.45.57-1.45.6-1.43.73-1.55.3-.52.22-.37.25-.35.17-.25.23-.3.25-.3.43-.5.7-.68.7-.6.7-.52.69-.45.7-.4.68-.36.67-.32.66-.28.67-.27.67-.25.71-.23 1.3-.39 1.37-.33 1.37-.3 1.4-.27 1.41-.23 1.44-.2 1.43-.17 1.45-.16 1.45-.14 1.45-.11 1.45-.1 1.42-.09 1.43-.06 2.72-.1 2.56-.07h8.59l1.11-.05 1.17-.05 1.22-.08 1.26-.1 1.3-.12 1.37-.15 1.4-.17 1.43-.18 1.45-.18 3.07-.45 3.18-.52 3.29-.55 3.38-.6 3.47-.62 7.16-1.31 3.65-.67 3.7-.67 3.74-.65 3.73-.63 3.77-.58 3.73-.55 1.88-.27 1.87-.25 1.87-.22 1.86-.21 1.85-.2 1.85-.17 1.84-.17 1.81-.13 1.82-.12 1.8-.08 1.8-.07h3.53zm-3.3 16.65h-1.51l-1.55.05-1.59.08-1.61.1-1.64.12-1.65.15-1.68.15-1.7.18-1.72.2-1.73.22-1.75.22-1.75.25-3.57.51-3.6.57-3.61.62-3.64.63-3.63.65-3.62.65-7.16 1.32-3.54.65-3.48.6-3.42.58-3.35.53-3.26.49-1.62.21-1.6.2-1.57.19-1.53.16-1.52.14-1.5.13-1.48.08-1.45.09h-10.05l-2.37.05-2.5.1-1.25.06-1.28.07-1.27.08-1.25.12-1.23.1-1.2.13-1.15.15-1.12.15-1 .17-1 .18-.89.2-.76.19-.72.21h-.17l-.08.22-.35.88-.3.92-.3.95-.27 1-.23 1-.22 1.05-.2 1.08-.16 1.12-.15 1.15-.12 1.17-.1 1.21-.08 1.24-.05 1.26v6.69l.07 1.41.08 1.42.1 1.43.12 1.45.26 3 .32 3 .35 3.06.38 3.09.82 6.31.82 6.35.4 3.2.36 3.2.34 3.2.28 3.19.13 1.6.1 1.58.1 1.58.07 1.59.05 1.58v4.68l-.05 1.55-.06 1.55-.1 1.54-.14 1.53-.16 1.52-.2 1.51-.24 1.5-.25 1.35v5.17l.05.65.07.65.08.65.09.62.1.6.11.58.12.53.12.49.1.33h.06l.62.35.58.4.55.45.37.33.3-.47.42-.55.48-.53.52-.48.56-.44.59-.38.63-.33.65-.29.67-.21.68-.17 9.7-1.71 1.88-.35 1.94-.31 1.91-.27 1.89-.23 1.88-.19 1.87-.15 1.85-.11 1.83-.1 1.83-.07 1.82-.05h12.68l2 .06 2.2.1 2.35.12 5.1.32 5.61.36 6 .39 3.1.18 3.18.17 3.2.15 3.25.13 3.23.1 3.24.07h9.56l1.53-.05 1.5-.05 1.48-.08 1.45-.09 1.44-.1 1.4-.11 1.36-.12 1.34-.15 1.28-.17 1.25-.16 1.22-.2 1.15-.2 1.1-.22 1.06-.23 1-.25.93-.27.88-.27.8-.28.73-.32.67-.28.61-.32.22-.1.23-.13.27-.17.18-.14.18-.11.15-.12.14-.1.11-.1.1-.08.07-.07.05-.05.05-.07.07-.06.06-.1.09-.12.08-.13.1-.15.1-.19.1-.2.1-.23.12-.25.08-.22.23-.66.22-.69.22-.76.18-.85.18-.9.17-1 .13-1.05.12-1.1.12-1.16.06-1.22.07-1.25v-6.92l-.07-1.48-.07-1.52-.08-1.53-.12-1.57-.11-1.58-.14-1.58-.3-3.27-.35-3.28-.38-3.32-.42-3.33-.43-3.34-.47-3.3-.91-6.5-.9-6.21-.44-3-.38-2.87-.37-2.75-.31-2.61-.25-2.49-.2-2.31-.09-1.14-.05-1.1v-5.07l-.05-1.67-.07-1.86-.1-2-.13-2.12-.15-2.11-.2-2.12-.1-1-.12-.95-.12-.92-.13-.85-.12-.78-.06-.3-.44-.12-.45-.15-1-.28-1.05-.25-1.1-.24-1.15-.2-1.18-.16-1.25-.15-1.3-.14-1.33-.08-1.39-.08h-4.35zm-108.21 111.18h-.24z"/><path d="m422.05 401.57 1.3.05 1.22.11.71.09.67.11.68.14.74.18.76.25.84.32.51.26.39.2.38.22.18.12.3.18.29.2.26.22.17.13.25.22.25.21.25.25.22.25.13.14.25.3.25.31.23.34.2.33.1.15.19.32.16.33.07.17.88.26 1.14.39 1.08.43 1.08.45 1 .48 1 .52 1 .55.95.6.91.62.89.65.85.7.81.71.79.75.73.79.68.8.67.85.6.85.57.88.53.9.47.92.43 1 .4.93.33 1 .3 1 .25 1 .22 1 .18 1 .14 1 .08 1 .07 1v1.93l-.05 1-.09 1-.11.95-.15 1-.17.95-.2.93-.23.93-.25.94-.29.9-.3.91-.33.9-.35.9-.38.89-.4.88-.42.87-.43.85-.47.85-.48.85-.5.83-.54.82-.53.81-.57.8-.58.8-.6.79-.62.76-.63.77-.65.73-.67.74-.7.73-.7.7-.71.7-.75.68-.75.67-.77.65-.78.65-.8.62-.82.6-.83.58-.85.58-.87.55-.88.54-.89.51-.91.49-.92.48-.95.45-.95.42-.95.41-1 .39-1 .35-1 .33-1 .3-1 .28-1 .25-1.05.22-1.06.18-1.07.17-1.08.13-1.1.09-1.09.06h-3.35l-1.11-.08-1.14-.12-1.13-.15-1.13-.2-1.14-.23-1.13-.27-1.13-.32-1.14-.36-1.11-.39-1.12-.45-1.12-.46-1.11-.54-1.1-.55-1.1-.6-1.09-.65-1.06-.68-1.07-.72-1.07-.76-1-.8-1-.85-1-.89-1-.93-1-1-.7-.73-.68-.83-.62-.85-.57-.89-.51-.9-.44-.91-.4-.92-.33-.93-.28-.94-.25-.91-.2-.94-.15-.93-.12-.92-.08-.91-.05-.9v-2.69l.05-.88.08-.87.12-.88.12-.87.15-.85.15-.86.18-.85.18-.84.22-.83.23-.88.47-1.62.53-1.62.57-1.6.62-1.56.65-1.55.66-1.5.7-1.47.7-1.42.74-1.38.75-1.33.75-1.27.75-1.22.76-1.16.77-1.12.78-1.05.79-1 .81-.93.85-.9.64-.62.66-.55.65-.5.67-.47.67-.41.66-.4.69-.37.68-.35.68-.32.72-.33 1.35-.53 1.42-.52 1.43-.45 1.45-.43 1.45-.37 1.47-.35 1.48-.3 1.47-.27 1.45-.21 1.45-.2 1.41-.15 1.4-.14 1.37-.08h1.33zm-10.18 17.91-1 .27-1 .28-.9.3-.85.3-.78.32-.29.13-.28.14-.27.13-.21.12-.19.11-.13.09-.1.06-.21.24-.34.38-.4.52-.46.63-.52.73-.52.8-.55.89-.56.95-.55 1-.57 1.05-.55 1.1-.53 1.11-.5 1.15-.49 1.17-.46 1.17-.42 1.16-.38 1.15-.34 1.19-.15.51-.13.55-.12.55-.11.54-.1.51-.09.5-.06.49-.05.48-.05.45v2.23l.05.29v.26l.05.22.05.18.05.17v.13l.05.12.07.15.08.12.08.08.62.6.67.6.65.58.65.54.66.5.64.46.65.44.63.41.63.37.62.35.63.32.6.28.62.27.62.23.6.2.58.2.6.17.6.13.58.13.59.1.58.09.58.05.59.05h2.31l.59-.05.58-.07.58-.1.57-.1.58-.11.59-.14.56-.16.59-.17.56-.18.59-.22.56-.22.57-.25.57-.25.56-.26.55-.29.55-.3.55-.31.55-.34.54-.35.53-.35.53-.36.52-.4.52-.39.5-.41.48-.42.5-.43.47-.44.46-.45.45-.45.45-.46.44-.47.41-.48.4-.5.4-.49.39-.5.36-.5.35-.5.34-.51.33-.5.3-.52.3-.52.28-.5.25-.51.25-.5.24-.52.21-.5.19-.5.18-.48.17-.49.15-.48.13-.47.1-.46.1-.45.08-.45.07-.42.05-.42v-2.25l-.05-.31-.05-.32-.07-.3-.06-.28-.1-.29-.09-.26-.11-.25-.1-.25-.14-.24-.13-.23-.15-.23-.17-.24-.09-.2-.18-.23-.22-.22-.25-.23-.25-.24-.28-.23-.32-.23-.35-.24-.37-.23-.41-.23-.45-.22-.47-.23-.53-.22-.55-.22-.6-.2-.64-.2-.68-.18-.73-.18-.77-.15-.8-.15-.85-.14-.9-.11-1-.09-1-.08-1-.05h-3.15l-.41-.07-.42-.08-.42-.1-.41-.12-.4-.15-.4-.16-.39-.19-.38-.21-.37-.22-.35-.25-.33-.25-.33-.28-.32-.3-.28-.3-.29-.34zm233.56-183.11 1 .18 1 .3.95.43.88.55.82.65.73.77.62.83.51.92.4 1 .29 1 .13 1v1.05l-.12 1-.25 1-.37 1-.48.94-.62.85-.7.76-.8.69-.86.56-1 .47-1 .33-1 .22-1 .07h-.56l-.7.07-.74.08-.78.14-.87.16-.91.22-1 .27-1 .3-1.06.35-1.12.38-1.15.43-1.18.49-1.24.51-1.25.55-1.28.59-1.32.61-1.33.67-1.35.7-1.38.72-1.4.75-1.42.78-1.43.82-1.45.83-1.47.85-1.47.88-1.46.9-3 1.87-3 1.92-3 2-3 2-3 2.07-3 2.08-2.95 2.09-2.91 2.1-2.85 2.08-2.8 2.05-2.72 2-5.2 3.9-4.81 3.7-4.3 3.27-3.78 2.88-2.62 1.95-2.62 2-2.63 1.92-2.65 1.91-2.65 1.92-2.67 1.9-2.68 1.88-2.68 1.89-2.7 1.86-2.7 1.85-2.72 1.85-2.73 1.85-2.74 1.84-2.75 1.81-5.51 3.57-5.55 3.58-5.57 3.55-5.62 3.5-5.63 3.49-5.67 3.43-5.7 3.42-5.7 3.38-5.73 3.33-5.7 3.32-5.77 3.28-5.78 3.27-5.8 3.22-5.8 3.2-5.85 3.11-5.81 3.14-5.84 3.11-5.83 3.09-5.83 3.05-5.84 3-5.83 3-5.82 3-5.83 3-5.8 2.93-5.77 2.89-.56.28-.59.32-1.45.8-1.68 1-1.92 1.15-2.11 1.28-2.29 1.4-5.05 3.17-11.4 7.18-6.06 3.8-3.1 1.92-3.09 1.92-3.08 1.88-3 1.83-3 1.8-2.95 1.72-2.9 1.65-2.8 1.57-2.7 1.46-1.33.7-1.3.65-1.27.64-1.23.6-1.22.56-1.18.54-1.15.5-1.13.46-1.12.44-1.1.38-1.08.35-1.12.3-1.13.25-1.19.2-1.18.1h-1.52l-.82-.09-.87-.15-.53-.13-.75-.23-.18-.07-1-.42-.9-.53-.83-.63-.74-.74-.65-.83-.53-.9-.42-1-.3-1-.16-1v-1l.1-1.05.22-1 .37-1 .46-.94.59-.86.7-.8.78-.69.85-.6.93-.46 1-.37 1-.23 1-.1h1.05l.5.08.43-.11.54-.19.65-.21.71-.29.82-.33.88-.38.94-.42 1-.47 1.05-.51 1.11-.55 1.15-.59 1.17-.61 2.52-1.37 2.63-1.47 2.73-1.56 2.85-1.65 2.9-1.74 3-1.78 3-1.85 3-1.87 3-1.88 6-3.78 11.41-7.19 5.12-3.2 2.37-1.46 2.21-1.35 2.07-1.24 1.9-1.1 1.72-.95.83-.45.75-.38 5.8-2.92 5.78-2.9 5.77-2.95 5.78-2.95 5.79-3 5.78-3 5.78-3 5.79-3.07 5.76-3.07 5.77-3.11 5.75-3.14 5.73-3.15 5.74-3.18 5.7-3.22 5.7-3.23 5.66-3.28 5.65-3.29 5.64-3.33 5.6-3.37 5.56-3.38 5.55-3.42 5.52-3.45 5.48-3.48 5.45-3.52 5.42-3.56 2.7-1.77 2.67-1.8 2.68-1.8 2.67-1.82 2.65-1.81 2.63-1.84 2.63-1.83 2.62-1.85 2.6-1.87 2.6-1.86 2.58-1.87 2.57-1.88 2.57-1.89 2.55-1.9 3.68-2.78 4.28-3.27 4.84-3.66 5.38-3.95 2.78-2.07 2.87-2.1 2.93-2.13 3-2.15 3-2.17 3.1-2.17 3.14-2.13 3.15-2.12 3.16-2.08 3.19-2 3.15-2 1.6-1 1.58-1 1.58-.94 1.59-.9 1.56-.88 1.57-.87 1.55-.83 1.55-.82 1.53-.78 1.54-.75 1.51-.73 1.52-.69 1.5-.66 1.48-.64 1.49-.58 1.48-.55 1.45-.52 1.45-.48 1.45-.43 1.45-.39 1.43-.33 1.44-.28 1.41-.24 1.44-.18 1.38-.1h1.38zm-339.21 199.33-.19-.07-.36-.08z"/><path d="m580.5 154 .88.14.82.18.77.23.7.25.66.29.62.3.58.31.6.35 1 .62.95.7.9.73.85.74.82.75.78.78.77.78.73.8.72.8.71.82.7.82 1.3 1.56 1.22 1.54 1.13 1.43 1 1.27.85 1.05.69.8.16.2.2.21 1 1 1.2 1.27 1.35 1.46 1.47 1.62 1.61 1.8 1.74 2 1.83 2.08 1.92 2.24 2 2.33 2.07 2.43 2.13 2.54 2.17 2.61 2.2 2.67 2.22 2.72 2.21 2.75 2.2 2.76 2.19 2.79 2.15 2.78 2.03 2.7 2 2.72 1.95 2.68 1.89 2.63 1.75 2.55.85 1.25.81 1.24.79 1.21.76 1.19.72 1.16.68 1.15.65 1.14.62 1.1.58 1.08.54 1.07.51 1.06.45 1.05.44 1.05.38 1.07.33 1.12.29 1.18.18 1.18.07.77v1.57l-.18 1.08-.32 1-.45 1-.56.92-.7.85-.8.73-.89.64-1 .51-1 .39-1.07.25-1.08.1h-1.08l-1.09-.18-1-.32-1-.45-.92-.58-.85-.68-.73-.8-.63-.89-.52-1-.38-1-.25-1.07-.09-.83v-.07l-.08-.23-.13-.37-.19-.48-.25-.57-.31-.66-.37-.72-.43-.8-.47-.85-.53-.9-.57-.95-.6-1-.67-1-.68-1.07-.73-1.1-.77-1.13-1.63-2.37-1.75-2.45-1.85-2.53-1.94-2.64-2-2.64-2.06-2.68-2.14-2.68-2.13-2.69-2.15-2.68-2.15-2.63-2.15-2.6-2.12-2.55-2.1-2.45-2-2.4-2-2.27-1.87-2.17-1.76-2-1.67-1.87-1.48-1.69-1.4-1.53-1.24-1.32-1.05-1.15-.93-1-.45-.49-.53-.6-1-1.13-1-1.25-1-1.32-1.1-1.38-1.12-1.38-1.15-1.39-.55-.65-.55-.63-.55-.62-.53-.56-.5-.54-.49-.46-.18-.17-3.85 1.93-6.8 3.49-6.78 3.51-6.77 3.64-6.7 3.6-6.75 3.65-6.73 3.68-6.72 3.72-6.8 3.77-6.7 3.78-6.65 3.8-6.7 3.85-6.68 3.89-6.67 3.91-6.67 3.95-6.66 4-6.67 4-6.65 4-6.67 4.05-6.65 4-6.63 4.12-6.65 4.1-13.35 8.21-13.31 8.29-13.32 8.31-26.72 16.7-1.45.9-1.5.9-1.5.9-1.53.89-1.55.88-1.57.88-3.15 1.72-3.21 1.72-3.19 1.68-3.3 1.67-3.34 1.66-3.36 1.67-3.39 1.65-6.8 3.28-6.8 3.3-3.38 1.67-3.37 1.67-3.35 1.66-3.3 1.7-3.28 1.72-3.22 1.72-3.21 1.78-1.55.88-1.55.88-1.52.9-1.51.9-1.49.9-1.48.9-1.45.92-1.43.93-1.4.94-1.39.93-1.36.93-1.34.95-1.31 1-1.29 1-1.25 1-1.23 1-1.2 1-1.17 1-1.13 1-1.1 1-1.08 1-.14.13v1.37l.06.7.12.78.13.87.19.93.2 1 .25 1 .28 1.1.3 1.15.35 1.18.37 1.24.4 1.26.41 1.3.45 1.34.49 1.35.48 1.38.52 1.4 1.08 2.87 1.15 2.93 1.22 3 1.23 3 1.27 3 1.3 3 1.32 2.76 2.57 5.74 2.45 5.4 2.23 4.95 1 2.28.93 2.12.85 2 .75 1.8.63 1.64.3.8.2.58.19.5.21.48.29.64.38.71.43.82.5.87.54.93.58.95 1.28 2 1.34 2.07 2.7 4.07 1.25 1.91 1.13 1.79.53.86.49.85.46.87.47 1 .28.71.25.72.05.18.19.75v.15l.1.64v1.7l-.13.95v.1l-.25.95-.35.91-.45.87v.07l-.53.78-.62.72-.7.63-.75.55-.06.05-1 .55-1.05.4-1.1.27h-.09l-1.13.12-1.13-.05h-.12l-.7-.1-.7-.16h-.15l-.88-.3-.47-.2-.72-.35-.65-.38-.78-.5-.87-.65-.78-.77-.67-.86-.56-.94-.42-1-.3-1-.15-1.08v-1.13l-.83-1.29-2.72-4.11-1.45-2.22-1.4-2.23-.71-1.17-.67-1.13-.63-1.14-.62-1.13-.58-1.13-.55-1.15-.5-1.17-.39-1-.2-.57-.16-.5-.52-1.3-.65-1.55-.78-1.81-.89-2-1-2.2-2.22-5.13-2.45-5.43-2.6-5.82-1.34-3-1.31-3.07-1.32-3.1-1.3-3.1-1.27-3.12-1.21-3.1-1.12-3.09-.57-1.54-.53-1.51-.53-1.5-.5-1.49-.49-1.46-.45-1.45-.43-1.44-.4-1.41-.38-1.4-.35-1.39-.32-1.36-.28-1.34-.25-1.33-.22-1.3-.17-1.3-.13-1.3-.08-1.28v-2.52l.05-.72.09-.66.08-.69.12-.66.16-.69.19-.7.21-.71.27-.72.32-.72.36-.73.44-.72.5-.71.55-.7.53-.59 1.37-1.33 1.3-1.22 1.31-1.21 1.35-1.19 1.39-1.16 1.4-1.15 1.41-1.14 1.45-1.11 1.47-1.12 1.48-1.08 1.5-1.07 1.54-1.05 1.53-1.05 1.57-1 1.56-1 1.59-1 1.6-1 1.61-1 1.64-1 1.65-.95 1.65-.95 1.66-.95 3.35-1.84 3.39-1.81 3.4-1.79 3.43-1.75 3.43-1.73 3.45-1.72 3.45-1.68 6.84-3.32 6.78-3.28 3.33-1.62 3.3-1.63 3.24-1.62 3.18-1.61 3.13-1.62 3-1.62 3-1.63 1.43-.82 1.43-.81 1.42-.82 1.38-.82 1.37-.81 1.35-.84 26.67-16.68 13.35-8.33 13.33-8.3 13.33-8.24 6.69-4.11 6.68-4.09 6.68-4.08 6.69-4.05 6.7-4 6.7-4 6.7-4 6.71-4 6.74-4 6.73-3.91 6.75-3.89 6.75-3.86 6.77-3.84 6.78-3.78 6.78-3.77 6.82-3.71 6.82-3.7 6.83-3.65 6.85-3.6 6.87-3.57 6.88-3.53 7.08-3.57.42-.18.83-.32.24-.07.81-.21.25-.05.82-.12h1.65z"/><path d="m596.1 112.83h1.17l1.15.06 1.16.1 1.15.12 1.14.15 1.13.18 1.13.2 1.12.22 1.12.25 1.11.28 1.1.29 1.1.31 1.09.35 1.06.37 1.09.38 1.05.4 1.03.51 1 .45 1 .46 1 .49 1 .5 1 .51 1 .55 1 .55 1 .59 1 .58 1 .6 1 .63 1 .64 1 .65.93.66.94.69.91.7.92.71.92.72.9.73.88.75.88.77.89.78.86.79.89.81 1.66 1.6 1.67 1.69 1.63 1.7 1.6 1.75 1.59 1.8 1.53 1.81 1.52 1.85 1.46 1.89 1.45 1.9 1.42 1.93 1.38 2 1.35 2 1.32 2 1.28 2 1.25 2 1.22 2.05 1.18 2.05 1.15 2 1.12 2.06 1.08 2.09 1.05 2.06 1 2.09 1 2.06.93 2.07.9 2.07.87 2.05.83 2 .8 2 .75 2 .72 2 .66 2 .64 2 .6 2 .55 1.93.51 1.92.47 1.88.43 1.87.35 1.68v.15l.17.57.27.78.36 1 .45 1.17.54 1.33 1.23 3.07 1.38 3.43 1.47 3.74.77 2 .75 2 .75 2 .71 2.05.7 2.06.67 2.07.62 2.07.56 2 .27 1 .25 1 .23 1 .22 1 .18 1 .19 1 .15 1 .11 1 .1 1 .07 1v2l-.05 1-.06 1.35-.17 1.08-.25 1.1-.33 1.14-.32.8-.13.35-.17.35-.36.73-.4.67-.39.56-.43.59-.47.55-.51.51-.54.52-.6.48-.61.44-.65.4-.62.33-.82.38-.78.34-.78.3-.8.26-.79.22-.78.18-.8.17-.78.12-.77.1-.77.06-.76.05h-2.22l-.73-.05-.75-.06-1.35-.17-1.35-.22-1.32-.28-1.28-.3-1.25-.33-1.22-.37-1.18-.38-1.17-.39-2.18-.78-2.09-.77-2-.73-.9-.32-.87-.3-.83-.26-.77-.22-.71-.2-.64-.15-.58-.12-.55-.06h-1.45l-.65-.1-.65-.13-.62-.18-.61-.25-.59-.29-.56-.31-.54-.39-.51-.41-.47-.45-.43-.49-.4-.51-.35-.55-.32-.59-.27-.6-.21-.61-.17-.64-.12-.63-.06-.65v-.67l.05-.65.08-.65.14-.63.18-.63.25-.6.28-.6.32-.57.38-.53.42-.5.45-.49.48-.43.52-.4.55-.35.58-.3.6-.27.62-.21.63-.17.64-.12.66-.06h1.9l.69.05.71.08 1.24.19 1.25.23 1.21.28 1.19.32 1.16.35 1.12.37 1.12.36 1.08.39 2.1.67 2 .75 2 .7.9.3.88.29.87.26.83.22.78.18.74.15.68.12.68.08h1.02v-.48l-.07-.57-.1-.61-.12-.67-.13-.68-.15-.74-.17-.76-.2-.77-.2-.8-.46-1.7-.54-1.75-.58-1.8-.62-1.83-.65-1.87-.68-1.87-.7-1.86-.72-1.84-1.43-3.61-1.37-3.4-1.25-3.12-.56-1.45-.54-1.35-.46-1.27-.42-1.21-.35-1.12-.17-.68-.13-.54-.35-1.65-.35-1.55-.4-1.6-.51-1.6-.49-1.67-.51-1.7-.55-1.73-.6-1.75-.64-1.78-.66-1.79-.72-1.81-.73-1.84-.79-1.85-.8-1.85-.85-1.85-.88-1.86-.9-1.87-.95-1.88-1-1.85-1-1.87-1-1.85-1.06-1.85-1.09-1.83-1.11-1.82-1.15-1.8-1.19-1.78-1.2-1.75-1.21-1.74-1.25-1.71-1.29-1.67-1.28-1.65-1.32-1.62-1.33-1.58-1.37-1.55-1.36-1.5-1.4-1.45-1.4-1.42-1.45-1.38-.7-.65-.72-.65-.72-.65-.73-.62-.73-.61-.74-.6-.73-.59-.73-.58-.75-.55-.74-.55-.75-.53-.75-.5-.75-.5-.75-.49-.75-.48-.75-.45-.75-.43-.75-.42-.76-.42-.75-.38-.77-.37-.75-.36-.75-.34-.77-.33-.75-.3-.76-.28-.75-.29-.77-.25-.75-.23-.77-.23-.75-.2-.76-.19-.75-.16-.77-.15-.77-.14-.75-.11-.76-.1-.77-.09-.75-.06h-4.62l-.76.06-.79.1-.78.1-.78.12-.8.15-.79.17-.78.2-.32.06-.26.09-.25.08-.25.1-.2.08-.2.09-.19.08-.16.08-.15.1-.14.09-.13.08-.12.08-.1.09-.1.08-.1.08-.08.09-.08.08-.09.1-.06.1-.09.08-.06.12-.09.12-.06.11-.09.14-.06.13-.07.15-.07.15-.05.12-.15.43-.13.42-.1.46-.1.5-.08.57-.07.6v3.55l.07.8.08.83.1.85.13.87.14.87.16.9.19.9.18.91.2.89.47 1.86.48 1.85.5 1.82.53 1.8.52 1.75 1 3.35.46 1.58.44 1.54.36 1.45.17.78.15.75.13.78.1.85v2.84l-.08.58-.13.6-.07.25-.18.58-.24.57v.12l-.22.43-.23.43v.1l-.32.5-.35.49-.06.06-.44.5-.45.47-.08.07-.5.41-.52.39-.56.35-.59.28-.6.25-.61.22-.65.15-.64.1-.66.05h-.65l-.65-.05-.65-.12-.64-.15-.69-.2-.6-.25-.59-.3-.56-.33-.54-.4-.48-.42-.47-.47-.43-.5-.38-.51-.34-.57-.3-.58-.31-.67-.2-.64-.15-.63-.1-.65-.05-.65v-.65l.05-.65.1-.65v-.1l-.27-1-.33-1.22-.42-1.41-1-3.3-.55-1.84-.57-1.95-.56-2-.57-2.12-.52-2.16-.26-1.14-.24-1.13-.21-1.13-.22-1.15-.18-1.17-.19-1.18-.15-1.19-.11-1.2-.1-1.2-.07-1.2v-3.68l.08-1.25.14-1.23.18-1.27.25-1.25.3-1.27.38-1.26.42-1.2.28-.67.29-.63.28-.62.32-.62.35-.6.36-.6.39-.6.41-.58.44-.58.46-.55.49-.55.5-.54.53-.51.55-.5.57-.49.58-.46.62-.45.63-.42.63-.4.67-.37.68-.36.69-.34.71-.31.72-.29.73-.26.74-.25.75-.22.76-.2 1.2-.28 1.19-.27 1.2-.22 1.18-.18 1.18-.17 1.19-.13 1.18-.1 1.18-.07h3.52zm-21.3 51.55-.22.29.17-.2.45-.45z"/><path d="m674.83 51.18.54.07.53.08.52.14.51.16.5.19.49.21.46.27.45.28.44.3.41.35.39.37.36.38.35.42.3.43.3.45.25.47.22.48.2.5.17.5.11.52.1.53.07.54v1.63l-.05.37-.06.53-.2.87-.25.8-.3.75-.2.43-.2.35-.2.37-.22.33-.23.38-.27.37-.27.35-.23.28-.25.29-.52.56-.78.72-.75.62-.75.56-.75.5-.73.45-.72.44-.73.4-.75.38-1.37.68-1.38.62-1.32.57-2.32 1-.93.4-.7.3-.38.2-1.69 1.05-1.83 1.18-3.63 2.33-3.69 2.3-3.7 2.25-3.68 2.25-3.7 2.22-7.37 4.42-3.63 2.21-3.62 2.22-3.55 2.25-1.77 1.12-1.76 1.13-1.74 1.14-1.73 1.15-1.72 1.15-1.7 1.16-1.68 1.15-1.65 1.18-1.65 1.19-1.6 1.2-1.37 1.05-2.33 1.83-1.38 1.1-1.52 1.22-1.5 1.25-1.5 1.28-1.41 1.25-1.32 1.22-.55.53-.52.5-.43.47-.14.5-.18.5-.22.5-.25.47-.28.47-.3.43-.33.42-.35.4-.39.36-.41.35-.42.32-.45.3-.47.25-.48.23-.5.2-.5.19-.52.13-.51.1-.54.07h-1.6l-.53-.07-.53-.1-.52-.13-.5-.17-.5-.2-.48-.23-.47-.25-.4-.31-.44-.32-.41-.35-.39-.37-.35-.4-.08-.08-.33-.42-.3-.43-.29-.45-.25-.47v-.11l-.2-.45-.18-.49-.15-.48-.12-.48v-.12l-.07-.42-.05-.4v-1.86l.05-.44v-.15l.1-.51.12-.5.05-.15.12-.39.13-.38.18-.47.39-.8.58-1 .67-.94.63-.81.67-.79.68-.73.72-.73.73-.74.78-.75 1.57-1.45 1.65-1.45 1.67-1.43 1.66-1.4 1.6-1.3 1.5-1.22 2.36-1.94 1.55-1.18 1.78-1.32 1.78-1.28 1.79-1.28 1.8-1.25 1.81-1.25 1.82-1.22 1.83-1.22 1.84-1.18 1.83-1.18 1.87-1.19 3.68-2.3 3.72-2.28 3.71-2.25 7.39-4.43 3.66-2.2 3.64-2.2 3.6-2.22 3.55-2.22 3.5-2.23 1.71-1.12 1.85-1.21.55-.35.67-.37 1.07-.5 1.1-.5 1.1-.46 2.25-.94 1.09-.46 1-.47 1-.48.38-.2.37-.2.26-.15v-.1l.23-.49.28-.45.29-.45.33-.41.35-.4.38-.39.4-.35.42-.33.45-.3.45-.27.48-.25.49-.2.51-.18.5-.13.54-.12.51-.08h1.6zm-81.3 67.14v-.17zm-1.15-2.14.3.44.2.33-.21-.47-.62-.71zm199.62 76.5.57.07.57.12.55.15.53.2.52.21.5.27.5.28.46.34.44.36.41.39.4.41.35.44.34.46.3.49.26.5.22.51.2.55.15.54.12.56.08.57v1.7l-.07.57-.11.55-.15.55-.14.53-.23.53-.25.5-.3.49-.33.46-.35.45-.39.42-.41.38-.45.37-.45.33-.5.3-.5.25-.52.24-.53.2-.55.15-.55.11-.57.09h-1.27l-.33.06-.43.12-.5.15-.59.2-.63.23-.7.29-.75.31-.78.35-.84.39-.86.43-.9.47-.94.48-1 .53-1 .55-1 .57-2.12 1.25-2.18 1.33-2.25 1.42-2.3 1.48-2.35 1.55-2.37 1.6-2.38 1.64-2.4 1.66-2.4 1.69-2.37 1.7-2.35 1.68-4.6 3.35-4.38 3.2-4.09 3-3.71 2.72-1.7 1.33-1.6 1.15-1.48 1-1.35.93-2.85 1.92-2.89 1.83-2.91 1.82-2.92 1.78-2.92 1.77-2.9 1.73-5.73 3.44-.57.31-.68.37-1.48.78-1.67.89-1.68.9-1.52.83-.52.3-.1.1-.41.4-.45.35-.47.33-.48.29-.52.26-.52.22-.53.2-.5.1-.55.12-.57.06h-1.71l-.55-.08-.62-.1-.55-.15-.53-.2-.52-.23-.5-.25-.48-.3-.47-.33-.45-.37-.4-.38-.4-.42-.35-.45-.3-.43-.26-.43-.25-.45-.22-.47-.18-.48-.15-.5-.14-.5-.1-.55-.06-.53v-1.1l.05-.54.08-.55.12-.53.15-.52v-.08l.2-.53.21-.5.27-.5.28-.47.32-.47.07-.08.26-.33.3-.38.3-.3.11-.11.35-.32.37-.28.58-.47.9-.6.85-.52.87-.5 1.78-1 1.84-1 1.68-.88 1.37-.72.41-.25.29-.15 5.61-3.35 2.87-1.71 2.85-1.72 2.82-1.73 2.78-1.74 2.72-1.73 2.65-1.73 1.15-.79 1.33-.93 1.5-1.07 1.63-1.16 3.65-2.67 4.09-3 4.41-3.22 4.65-3.4 2.42-1.71 2.45-1.75 2.45-1.74 2.48-1.73 2.5-1.7 2.49-1.68 2.48-1.64 2.45-1.58 2.43-1.53 2.4-1.47 2.34-1.37 1.16-.68 1.15-.63 1.15-.62 1.12-.58 1.12-.54 1.1-.55 1.08-.52 1.08-.48 1.07-.45 1.07-.42 1.06-.4 1.05-.35 1.07-.33 1.08-.27 1.09-.25 1.13-.18 1.17-.12h1.45z"/><path d="m714 0 1.83.07 1.82.12 1.8.16 1.8.2 1.78.25 1.77.29 1.76.31 1.74.37 1.73.4 1.72.45 1.71.47 1.69.51 1.68.55 1.67.59 1.65.63 1.63.65 1.63.68 1.6.72 1.6.75 1.59.78 1.56.82 1.55.85 1.54.87 1.53.9 1.5.93 1.5 1 1.48 1 1.47 1 1.45 1 1.45 1.06 1.43 1.07 1.4 1.12 1.42 1.11 1.38 1.15 1.39 1.17 1.37 1.2 1.38 1.2 1.33 1.23 1.33 1.25 1.3 1.29 1.3 1.28 1.3 1.3 1.27 1.33 1.27 1.34 1.25 1.35 1.23 1.38 1.22 1.38 1.21 1.4 1.2 1.42 1.2 1.43 1.17 1.44 1.17 1.46 1.16 1.47 1.09 1.47 1.13 1.5 1.13 1.5 1.1 1.51 1.1 1.52 1.09 1.53 1.08 1.54 1.07 1.55 1 1.55 1.05 1.58 2 3.13 2 3.17 2 3.2 1.92 3.2 1.88 3.22 1.83 3.23 1.8 3.22 1.87 3.23 1.7 3.23 1.68 3.22 1.64 3.22 1.58 3.2 1.55 3.13 1.5 3.15 1.47 3.14 1.43 3.1 1.38 3 1.35 3 1.3 3 1.27 2.93 1.22 2.88 1.2 2.84 1.13 2.76 1.1 2.72 1.07 2.63 2.6 6.45 1.41 3.6.74 1.9.73 1.94.73 2 .74 2 .73 2.06.7 2.09.7 2.13.68 2.15.65 2.18.62 2.2.58 2.22.54 2.25.5 2.25.45 2.23.2 1.15.2 1.14.16 1.15.17 1.13.15 1.13.12 1.15.11 1.14.09 1.15.06 1.13v5.72l.02 1.21-.1 1.13-.12 1.14-.15 1.13-.18 1.13-.2 1.12-.25 1.13-.28 1.1-.3 1.12-.37 1.15-.4 1.08-.47 1.09-.53 1.06-.6 1-.67 1-.73.93-.8.89-.85.8-.92.75-.95.67-1 .6-1 .52-1 .43-1 .37-1 .3-1 .21-1 .17-1 .12-1 .05h-2.95l-.92-.1-.91-.13-.9-.17-.89-.18-.88-.2-.87-.24-.85-.23-.85-.27-.81-.28-.84-.3-.8-.32-.83-.33-1.53-.67-1.54-.71-1.48-.77-1.43-.77-1.4-.8-1.32-.8-1.28-.8-1.2-.8-1.07-.73-.47.4-.66.47-.72.4-.75.31-.78.25-.8.19-.82.08h-.82l-.81-.07-.8-.15-.79-.23-.76-.3-.72-.37-.68-.45-.65-.5-.59-.58-.53-.62-.47-.67-.38-.71-.33-.75-.25-.79-.17-.8-.1-.81v-.82l.07-.82.15-.8.21-.78.3-.77.39-.71v-.19l-.07-.4-.08-.47-.1-.52-.13-.56-.17-.62-.18-.67-.22-.7-.23-.71-.25-.77-.29-.78-.3-.79-.66-1.71-.75-1.75-.8-1.82-.85-1.85-.9-1.87-1-1.86-1-1.89-1-1.85-1-1.81-1-1.79-1-1.73-1-1.65-.95-1.57-.93-1.46-.87-1.35-.83-1.24-.75-1.08-.67-.92-.55-.71-.43-.52-.08-.1-.14-.13-.66-.69-.75-.8-.72-.8-.7-.81-.68-.82-.67-.83-.65-.85-.63-.85-.64-.85-.6-.87-.58-.87-.58-.88-1.1-1.73-1.01-1.7-1-1.78-1-1.79-1-1.8-.92-1.78-.9-1.78-.86-1.79-1.7-3.5-1.67-3.45-.82-1.68-.83-1.65-.82-1.62-.83-1.56-.83-1.54-.85-1.5-.87-1.43-.88-1.42-.44-.65-.43-.66-.45-.65-.47-.64-.45-.61-.46-.6-.47-.59-.47-.56-.48-.55-.48-.54-.49-.51-.5-.52-1.71-1.68-1.75-1.69-1.8-1.65-1.85-1.65-1.87-1.61-1.92-1.62-2-1.6-2-1.58-2-1.57-2-1.55-2.06-1.53-2.1-1.52-2.12-1.48-2.13-1.49-2.17-1.46-2.18-1.44-2.2-1.43-2.22-1.4-2.22-1.38-2.25-1.39-2.25-1.33-2.25-1.33-2.26-1.32-2.27-1.28-2.27-1.29-2.28-1.25-2.2-1.28-2.26-1.2-2.27-1.2-2.27-1.17-2.25-1.15-2.35-1.18-1-.52-1-.65-1-.68-1-.72-.92-.78-.85-.8-.82-.85-.76-.87-.74-.9-.66-.91-.65-.95-.6-1-.55-1-.54-1-.48-1-.45-1-.42-1-.38-1-.35-1.07-.33-1.06-.29-1.09-.26-1.08-.24-1.1-.2-1.1-.16-1.1-.15-1.12-.12-1.1-.08-1.11-.07-1.14v-3.35l.05-1.11.08-1.12.1-1.12.13-1.11.15-1.1.19-1.12.21-1.1.25-1.08.27-1.09.3-1.06.33-1.09.37-1.05.4-1.05.43-1 .47-1 .52-1 .53-1 .58-1 .62-1 .65-.93.7-.9.75-.9.78-.85.84-.84.88-.78.89-.8 1-.72 1-.66 1.07-.6 1.1-.55 1.15-.5 1.1-.42 2-.65 1.95-.57 1.94-.53 1.93-.48 1.92-.44 1.91-.38 1.92-.33 1.9-.3 1.9-.24 1.88-.2 1.93-.15 1.88-.1 1.85-.08h1.85zm-3.35 16.65-1.45.05-1.49.09-1.46.11-1.5.15-1.5.2-1.52.24-1.52.26-1.55.3-1.55.35-1.56.4-1.57.42-1.6.48-1.53.49-.35.13-.27.12-.27.13-.26.15-.27.17-.25.2-.28.21-.27.24-.27.26-.26.3-.27.32-.27.35-.26.38-.27.4-.27.45-.25.45-.23.5-.25.5-.22.55-.21.55-.2.59-.19.6-.18.61-.15.64-.15.66-.13.67-.12.67-.1.68-.07.7-.06.7v4.35l.07.71.07.7.1.69.1.68.13.67.13.66.15.65.17.62.18.62.2.58.22.58.22.55.23.52.23.5.25.48.25.44.27.43.27.38.26.37.27.33.28.32.27.28.27.25.26.22.27.22.27.18.26.15.39.2 2.2 1.12 2.33 1.2 2.35 1.21 2.37 1.24 2.36 1.26 2.37 1.29 2.37 1.3 2.36 1.28 2.39 1.35 2.34 1.35 2.37 1.4 2.37 1.41 2.36 1.44 2.35 1.46 2.34 1.49 2.33 1.51 2.32 1.54 2.3 1.55 2.28 1.58 2.25 1.62 2.23 1.62 2.23 1.65 2.2 1.66 2.19 1.69 2.15 1.71 2.11 1.75 2.09 1.75 2.06 1.8 2 1.8 2 1.84 2 1.86 1.91 1.9.74.75.73.79.72.78.68.8.68.82.65.81.64.84.63.83.6.85.6.85.57.85.58.88 1.07 1.72 1 1.75 1 1.77 1 1.76.94 1.79.91 1.76.89 1.79.86 1.76 1.69 3.49 1.66 3.45.84 1.68.83 1.65.83 1.62.84 1.6.85 1.55.86 1.5.94 1.48.92 1.45.43.65.45.68.47.65.46.65.47.63.48.62.49.6.48.58.5.57.5.55.5.55.62.62.38.41.48.54.84 1 .88 1.15.9 1.23.93 1.35 1 1.45 1 1.57 1 1.65 1.07 1.73 1.06 1.82 1.1 1.9 1.1 1.93 1.09 2 1.08 2 1.08 2.07 1 2.08 1 2.09 1 2.1.93 2.08.87 2.08.8 2 .38 1 .37 1 .33 1 .34 1 .3 1v.1h.07l.77.25.75.33.71.4.67.49.62.53.36.33.37.34.5.41.62.49.71.53.79.58.86.59.94.61 1 .62 1 .62 1.05.6 1.08.58 1.05.57 1.06.52 1.12.48.5.2.52.2.5.19.5.16.48.15.48.15.45.12.44.1.41.08.39.07.36.05h1.62l.05-.08.07-.14.08-.2.12-.3.16-.53.17-.62.17-.63.13-.65.13-.65.1-.7.1-.7.07-.73.07-.74v-4.81l-.05-.85-.06-.87-.09-.87-.1-.9-.1-.88-.13-.92-.13-.91-.17-.92-.17-.92-.36-1.91-.44-1.9-.46-1.92-.5-1.93-.55-1.95-.59-2-.6-1.94-.63-1.93-.65-1.92-.68-1.91-.69-1.89-.6-1.75-.7-1.83-.68-1.8-1.39-3.5-2.58-6.4-1-2.6-1.15-2.65-1.11-2.7-1.15-2.75-1.19-2.8-1.23-2.85-1.27-2.9-1.3-2.92-1.35-3-1.36-3-1.42-3-1.45-3-1.5-3.06-1.53-3.07-1.57-3.08-1.57-3.09-1.63-3.08-1.69-3.1-1.68-3.1-1.75-3.07-1.79-3.05-1.83-3-1.85-3-1.9-3-1.93-3-1-1.46-1-1.45-1-1.45-1-1.44-1-1.43-1-1.42-1-1.4-1-1.4-1.05-1.36-1.07-1.37-1.05-1.35-1.18-1.37-1.08-1.32-1.09-1.31-1.1-1.29-1.1-1.28-1.11-1.25-1.12-1.25-1.13-1.22-1.14-1.21-1.15-1.19-1.15-1.16-1.15-1.15-1.16-1.14-1.19-1.1-1.18-1.1-1.18-1.06-1.2-1-1.2-1-1.2-1-1.22-1-1.23-1-1.22-.92-1.23-.92-1.25-.83-1.25-.87-1.25-.82-1.25-.81-1.27-.77-1.28-.73-1.27-.73-1.28-.7-1.3-.67-1.29-.63-1.3-.62-1.31-.65-1.32-.55-1.32-.54-1.31-.5-1.34-.41-1.33-.44-1.35-.41-1.35-.37-1.35-.35-1.37-.32-1.36-.28-1.37-.3-1.38-.21-1.38-.19-1.44-.13-1.4-.12-1.42-.1-1.43-.05h-1.43zm91.55 180.67-.13.16.21-.23zm-542.03 178.3.71.06.65.12.7.13 1.07.29 1.05.35 1 .4.9.4.85.43.82.43.8.45 1.4.84 1.28.81h.6l.55.05.53.07.53.12.54.13.51.18.5.2.49.25.48.27.45.32.43.33.4.35.39.4.36.4.32.43.3.47.28.47.24.48.21.52.17.51.13.52.1.4.09.43.06.44v2.35l-.06.46-.09.47-.11.45v.1l-.13.43-.17.42-.18.42-.2.4-.05.08-.22.38-.25.37-.25.35-.28.35-.3.32-.05.06-.32.32-.33.3-.35.27-.37.26-.38.24-.07.05-.45.25-.45.21-.46.19-.49.16h-.08l-.4.1-.42.1-.4.06-.41.05h-1.9l-.45-.06-.44-.09-.25-.05-.36-.1-.37-.1-.35-.11-.63-.24-.87-.4-.73-.38-.65-.37-.62-.38-1.12-.7-1.11-.72-1.07-.68-1-.62-.44-.25-.26-.13-.29.15-.75.43-1.58.92-1.58 1-1.6 1-1.64 1.08-1.63 1.15-1.63 1.18-1.67 1.22-1.67 1.27-1.68 1.31-1.7 1.34-1.7 1.36-1.7 1.39-3.47 2.86-3.48 2.9-3.5 3-3.55 2.95-3.55 2.92-1.8 1.45-1.8 1.43-1.82 1.42-1.93 1.39-1.84 1.37-1.83 1.33-1.85 1.3-1.88 1.29-.64.4-.68.41-1.37.8-1.5.84-1.6.88-1.65.92-1.68.95-1.67 1-1.65 1-.75.48-.75.47-.7.48-.65.45-.6.43-.53.42-.47.38-.38.35-.22.2-.13.49-.18.51-.22.5-.25.49-.28.46-.3.45-.35.44-.37.4-.38.38-.42.35-.43.32-.47.3-.47.26-.5.24-.5.2-.51.16-.54.14-.53.1-.55.06h-1.63l-.54-.09-.53-.11-.53-.15-.52-.19-.5-.21-.48-.25-.47-.29-.45-.3-.42-.33-.41-.37-.37-.4-.37-.41-.31-.44-.3-.45-.27-.48-.23-.5-.2-.5-.17-.52-.13-.53-.1-.53-.07-.55v-2.09l.08-.61.2-.9.27-.85.3-.79.33-.71.37-.67.36-.63.4-.57.44-.6.76-.93.84-.9.86-.82.87-.78.9-.74.9-.7.93-.68.94-.67 1-.63.95-.62 1-.61 1.9-1.14 1.9-1.1 1.82-1 1.71-.95 1.55-.87 1.34-.75 1.08-.63.37-.22.3-.18 1.6-1.1 1.65-1.15 1.65-1.2 1.66-1.24 1.67-1.28 1.68-1.32 1.7-1.35 1.7-1.36 3.45-2.84 3.47-2.88 3.5-2.93 3.53-3 3.55-2.92 1.79-1.46 1.8-1.44 1.8-1.43 1.81-1.4 1.82-1.38 1.83-1.35 1.85-1.34 1.85-1.28 1.87-1.25 1.87-1.22 1.9-1.16 1.88-1.1 1-.55.95-.52 1-.52 1.11-.56.42-.19.35-.15.37-.13.21-.07.31-.17.35-.1.55-.12.87-.15.85-.07h.78zm25.7 44.06h.86l.42.07.43.08.42.1.4.13h.1l.43.16.44.19.43.21.4.24.4.26.38.29.35.3.35.31.07.07.32.35.31.35.29.38.26.39.24.41.21.42.2.43.17.44v.1l.15.48.12.48.1.5.05.5v1.5l-.07.5-.08.5-.12.49-.15.48-.18.48-.2.45-.24.45-.26.44-.29.41-.3.4-.33.37-.35.37-.38.33-.4.3-.42.3-.42.25-.45.25-.46.2-.47.18-.48.15-.49.12h-.06l-.52.36-.72.54-.8.6-1.83 1.41-2 1.62-2.1 1.73-2.15 1.79-2.1 1.78-3.92 3.33-3.1 2.62-1.17 1-.56.45-.55.38-1.55 1.15-1.57 1-1.61 1-1.67 1-1.7 1-1.73 1-1.77 1-1.8 1-3.65 1.73-3.7 1.94-3.7 1.95-3.68 1.93-3.64 1.95-1.75 1-1.73 1-1.68 1-1.65 1-1.6.95-1.54 1-1.46.94-1.4.95-1.34.91-1.23.92-1.18.9-.52.43-.52.42-.48.43-.47.42-.43.4-.47.47-.36.33-.4.33-.4.29-.44.26-.43.25-.47.22-.46.18-.47.17-.5.12-.48.1-.5.08h-1.5l-.52-.05-.48-.09-.5-.1-.49-.15-.46-.16-.47-.2-.45-.22-.43-.25-.42-.28-.4-.3-.38-.34-.37-.35-.35-.36-.32-.4-.28-.4-.28-.44-.24-.43-.21-.45-.19-.47-.16-.48-.14-.48-.1-.5-.06-.5v-1.5l.05-.5.07-.5.11-.5.15-.49.17-.46.2-.47.22-.45.25-.43.28-.42.3-.4.33-.38.35-.37.59-.58.68-.64.7-.63.72-.62.73-.61.75-.62 1.5-1.17 1.58-1.15 1.62-1.13 1.67-1.12 1.71-1.1 1.75-1.08 1.8-1.25 1.8-1.06 1.83-1.05 1.85-1 1.88-1 3.75-2 3.77-2 3.73-2 3.65-1.92 3.55-1.86 1.7-.94 1.67-.9 1.62-.9 1.53-.88 1.48-.87 1.42-.85 1.33-.83 1.14-.75.16-.12.9-.75 3-2.51 3.91-3.34 2.17-1.83 2.16-1.84 2.21-1.82 2.17-1.75 2-1.58 1-.75.95-.7.91-.65.92-.6.92-.58.95-.52.68-.32.75-.3.5-.15.33-.1.34-.08.35-.07h.15l.4-.07h1.18z"/><path d="m148.25 408.62.6.08.6.12.6.16.17.07h1.71l.62.06.62.1.6.17.6.2.56.25.55.28.54.34.5.36.48.4.43.44.42.48.37.5.33.52.3.55.25.56.22.59v.1l1.75 1.25 3.44 2.5 3.16 2.3 2.54 1.83 1.63 1.18 1.67 1.25 1.7 1.32 1.69 1.42 1.7 1.42 1.68 1.45 1.67 1.5 1.63 1.53.82.82.82.8.8.81.78.84.78.83.77.85.75.87.73.88.74.88.71.9.7.92.67.93.67.94.65.95.61 1 .6 1 .67 1.11.65 1.15.65 1.19.65 1.21.65 1.27.65 1.3.65 1.33.63 1.37.64 1.4.63 1.42.62 1.46.61 1.49.6 1.5.59 1.53.58 1.57.57 1.58.55 1.6.51 1.62.52 1.65.5 1.65.47 1.66.45 1.7.43 1.7.4 1.7.37 1.74.35 1.71.33 1.74.28 1.75.25 1.75.24 1.75.18 1.76.15 1.75.1 1.77.08 1.75v3.52l-.06 1.75-.12 1.73-.2 1.65-.21 1.68-.15.9-.15.87-.15.85-.19.87-.2.83-.2.85-.23.85-.25.85-.27.82-.28.83-.3.83-.32.82-.33.82-.35.8-.38.8-.39.8-.41.8-.45.76-.45.77-.49.77-.5.75-.51.73-.55.73-.57.72-.58.7-.62.68-.62.67-.66.67-.67.63-.7.63-.72.62-.73.58-.75.59-.78.55-.8.53-.82.52-.83.5-.87.48-.87.45-.9.43-.9.42-.93.4-.95.38-1 .35-1 .34-1 .3-1 .3-1.09.28-.85.2-.91.15-.92.13-.92.1-.91.07-.94.05h-2.95l-1-.06-1-.1-1-.14-1-.16-1-.2-1-.22-1-.27-1-.3-1-.35-1-.38-1-.43-1-.49-1-.53-1-.6-.95-.67-.93-.73-.92-.8-.86-.9-.77-.92-.45-.58-.37-.55-.35-.57-.35-.6-.3-.6-.3-.63-.26-.63-.22-.64-.23-.73-.24-.75-.35-1.37-.3-1.38-.23-1.37-.2-1.35-.13-1.31-.12-1.3-.08-1.29v-13.23l-.07-.91-.1-.89-.1-.85-.13-.83-.15-.8-.18-.75-.22-.8-.1-.32-.12-.35-.13-.35-.13-.35-.15-.33-.15-.35-.17-.33-.17-.34-.18-.33-.2-.33-.67-1.1-.73-1.15-.8-1.2-.87-1.25-.9-1.29-.95-1.33-1-1.35-1-1.38-2.16-2.89-2.27-2.95-4.7-6.15-2.4-3.16-2.37-3.19-1.16-1.63-1.17-1.62-1.13-1.63-.89-1.72-1-1.64-1.07-1.63-1-1.63-1-1.65-1-1.65-.93-1.67-.87-1.65-.83-1.67-.75-1.63-.38-.87-.35-.83-.34-.85-.31-.84-.29-.85-.28-.85-.27-.85-.25-.86-.21-.89-.2-.86-.17-.87-.15-.9-.13-.9-.09-.9-.06-.9v-2.77l.08-.93.12-.93.16-.95.2-.94.25-.93.3-.93.35-.92.4-.92.45-.9.5-.86.55-.85.59-.82.63-.8.67-.77.71-.71.75-.7.79-.67.81-.63.85-.59.87-.56.9-.54.93-.5 1-.46 1-.44 1-.41 1-.39 1-.36 1.09-.34 1.1-.3 1.13-.3 1.17-.26 1.18-.24 1.22-.23 1.18-.18 1.28-.18 1.32-.17 1.33-.13 1.38-.14 1.42-.1h.5l.4-.15.57-.18.58-.15.58-.1.6-.07h.61zm-3.4 17.3-1.15.08-1.12.1-1.06.12-1 .11-1 .15-.91.15-.89.15-.83.17-.78.18-.74.2-.68.19-.65.2-.6.2-.55.21-.5.2-.47.22-.41.2-.39.22-.33.18-.3.2-.27.18-.23.19-.2.16-.17.15-.13.15-.13.14-.1.13-.09.13-.08.12-.07.12-.06.11-.05.14v.13l-.05.13v.17l-.05.17v2.18l.05.37.06.4.09.43.1.43.13.47.13.48.15.5.17.52.18.53.22.55.22.57.23.57.25.56.58 1.25.64 1.27.68 1.32.75 1.33.8 1.37.85 1.41.9 1.42.95 1.45 1 1.47 1 1.48 1.05 1.5 1.01 1.5 1.1 1.52 2.27 3.06 2.32 3.05 4.68 6.12 2.3 3 2.23 3 1.1 1.47 1.07 1.46 1 1.45 1 1.44 1 1.43.93 1.4.9 1.4.85 1.4.42.7.38.72.38.71.34.72.33.73.3.72.28.72.27.71.25.74.23.76.39 1.37.33 1.42.27 1.4.21 1.36.17 1.35.13 1.34.1 1.3.07 1.28v12.18l.05.92.08.88.1.85.1.8.15.78.15.75.2.75.1.3v.2l.13.12.12.1.18.12.22.13.25.15.3.13.35.15.37.15.4.14.41.13.45.12.47.1.47.1.5.08.48.07.48.05h3l.3-.05h.25l.25-.07.62-.15.63-.18.62-.2.58-.2.59-.22.55-.22.53-.21.5-.24.5-.25.48-.25.45-.25.45-.26.42-.27.42-.28.4-.29.38-.28.37-.3.35-.3.35-.32.33-.31.32-.34.31-.33.3-.33.3-.35.29-.37.26-.35.27-.38.25-.39.25-.4.25-.4.23-.41.22-.42.22-.43.2-.44.2-.45.2-.46.18-.49.17-.48.16-.48.17-.52.15-.52.13-.51.15-.54.12-.55.12-.55.1-.56.1-.59.1-.55.15-1.21.11-1.24.09-1.25.05-1.28v-2.73l-.05-1.35-.09-1.38-.13-1.4-.15-1.42-.17-1.42-.21-1.43-.25-1.45-.27-1.45-.28-1.47-.32-1.45-.35-1.46-.37-1.45-.38-1.45-.42-1.45-.41-1.44-.45-1.43-.47-1.42-.48-1.4-.3-1.38-.51-1.37-.5-1.35-.54-1.31-.53-1.3-.55-1.29-.53-1.23-.57-1.22-.55-1.18-.55-1.13-.55-1.12-.55-1.07-.55-1-.55-1-.53-.94-.52-.88-.42-.67-.43-.66-.45-.69-.47-.66-.5-.69-.51-.66-.54-.69-.56-.68-.57-.67-.58-.68-.6-.67-.64-.66-.63-.67-.63-.67-.67-.66-.65-.64-1.4-1.3-1.4-1.26-1.43-1.25-1.45-1.2-1.47-1.19-1.48-1.13-1.47-1.1-1.5-1.1-2.53-1.82-3.19-2.31-3.43-2.5-3.32-2.38-2.12-1.5z"/><path d="m381.28 343.38.6.1.6.15.59.19.56.23.55.28.52.32.52.35.46.38.45.44.42.45.37.48.35.52.3.53.26.55.22.58.18.59.14.6.08.6.05.61v.67l-.05.62-.08.6-.14.6-.18.6-.22.56-.26.55-.3.54-.35.51-.37.49-.42.45-.45.43-.75.65.1.33.05.3 1.42-.8 4.83-2.81 4.5-2.62 5.09-2.95 5-2.88 2.27-1.27.3-.22.88-.53.65-.33.47-.22h.1l1.61-.87 1.5-.78.77-.37.52-.22.4-.16.41-.14.22-.06.58-.17.59-.1.58-.08h1.27l.61.07.6.1.6.15.59.18.58.25.55.27.52.31 2.01-1.98 1-1 1-.91 1-.89 1-.86 1-.84 1-.78 1-.77 1-.68.65-.38.62-.34.67-.33.73-.32.83-.28.57-.17.37-.08.36-.07.25-.05.45-.06.45-.05h1.97l.43.07.42.06.2.05.47.12.45.15.45.17.2.06.46.22.45.23.44.27.16.1.44.3.4.3.38.35.15.15.33.33.34.35.28.39.13.18.25.33.24.35.2.37.11.22.24.48.21.5.09.25.15.43.13.44.07.3.1.36.06.37.1.62.09.93v1.82l-.1.85-.15.78-.2.74-.23.66-.29.7-.5 1-.58 1-.63.91-.64.85-.68.8-.7.79-.73.76-.75.74-.8.75-.82.73-.85.73-.88.75-.9.74-.95.73-1 .77-2 1.48-2.12 1.52-2.14 1.59-2.28 1.52-2.32 1.52-2.4 1.51-2.4 1.5-2.42 1.49-2.43 1.46-2.42 1.44-2.41 1.43-2.35 1.35-2.3 1.28-2.22 1.24-2.13 1.13-2.05 1.08-1.92 1-1.8.93-1.67.83-1.51.75-1.37.67-1.23.55-1 .42-1.36.56-1.4.64-1.54.7-1.61.78-1.69.82-1.66.85-3.32 1.68-3 1.57-2.41 1.3-2.24 1.21-.55.29-.56.23-.6.18-.6.15-.62.1h-.4l-.72.45-1 .6-1 .55-1 .53-1.09.58-1 .48-1 .47-1 .43-.43.17-1.18.78-1.37.9-1.38.87-1.4.83-1.4.82-1.42.8-.32.16h-.06l-1.4 1.05-1.42 1-1.47 1-1.48 1-1.79 1.24-.86.46-.9.44-1.84.83-1 .43-.34.37-2.21 2.42-1.1 1.18-.59.62-.6.58-.61.6-.69.6-.78.63-.62.4-.38.25-.4.24-.32.16-.46.22-.47.2h-.15l-.42.15-.43.13h-.13l-.55.11-.59.1h-.04l-.49.05h-1.06l-.55-.05-.57-.08-.55-.13h-.1l-.47-.13-.45-.17-.43-.18-.42-.22-.1-.05-.53-.3-.52-.35-.48-.38-.08-.07-.44-.4-.4-.42-.36-.45-.09-.1-.26-.38-.25-.4-.24-.4-.06-.12-.25-.51-.22-.54-.05-.15-.15-.45-.13-.46-.12-.52-.18-.76-.06-.76v-1.84l.06-.48v-.15l.08-.42.12-.41v-.15l.12-.39.15-.36.18-.49.37-.73.25-.43.2-.32.2-.3.23-.32.25-.33.27-.33.5-.55.73-.74.73-.63.49-.37-.24-.16-.33-.25-.1-.09-.38-.33-.35-.35-.09-.1-.38-.42-.35-.45-.07-.1-.33-.5-.3-.51-.05-.1-.2-.4-.17-.4-.15-.4v-.1l-.13-.42-.1-.43-.09-.42v-.12l-.07-.41v-1.54l.05-.56v-.12l.08-.53.12-.54v-.11l.13-.44.14-.41.05-.12.21-.52.24-.48.13-.25.28-.5.34-.47.18-.26.25-.32.27-.33.54-.54.68-.65.58-.5-.08-.81v-2.04l.12-.59.13-.58.2-.55v-.15l.15-.4.19-.4.2-.37.1-.16.23-.4.25-.39.32-.43.51-.62.55-.58.85-.8.92-.75.92-.7 1-.7 1-.68 1.06-.7 1.1-.72 1.17-.72 1.22-.73 2.46-1.45 2.57-1.48.2-.1.12-.3.18-.4.22-.4.13-.24.27-.41.26-.4.32-.39.17-.2.38-.43.43-.4.1-.08.3-.27.34-.25.23-.18 4.75-3.19 5.23-3.55 5.5-3.76 5.35-3.69 8.79-6.05 3.61-2.5.52-.33.55-.28.55-.25.58-.22.59-.17.61-.11.6-.09h1.24zm20.54 83.62.66-1.07.8-1 .89-.95 1.81-1.3 1.07-.48 3.35 1.08 1.28-1.72 1.64-1.55 1.88-1.23 2.07-.9 2.18-.52 2.25-.13 2.23.27 2.15.63 2 1 1.8 1.33 1.53 1.63 1.25 1.89.89 2.06.51 2.19.15.91.09 1.47.16 1.3-.56.55-.25 1.15-.42 1.7-.27 1.05-.05.19-.18.93-.27 1.18-.3 1.25-.36 1.3-.44 1.37-.5 1.42-.56 1.38-.39.82-.36.75-.42.78-.45.78-.48.79-.55.8-.6.81-.67.82-.75.82-.82.8h-.05l-.85.75-1 .75-1.1.72-1.17.66-1.26.59-1.35.48-1.4.38-1.45.27-1.47.13h-1.47l-1.43-.1-1.42-.2-1.36-.32-1.49-.45-1.38-.55-1.38-.78-1.19-.85-1.2-1.07-1.31-1.55-1-1.63-.7-1.48-.48-1.32-.33-1.23-.25-1.14-.15-1.08-.12-1.05-.05-1v-2l.05-.85v-.15l.15-1 .18-1 .24-1 .28-1.05.37-1.08.45-1.13.55-1.17.7-1.23.71-1.07.42-1.25.55-1.18zm7.33 19.7-.22-.07.34.12-.69-.3-.16-.05zm-3.42-2.49.47.42-.57-.57-.08-.08zm11.09-2.86-.22.16.8-.5-.37-.36zm13.11-4.95 2.37.5 1.6-4.4zm4-4 .14-.38v-.35z" fill="#fff"/><path d="m579.92 998.37h1.11l1.59.05 1.58.1 1.62.15 1.63.2 1.58.27.92.18.88.18.89.24.91.26.94.3 1 .37 1 .43 1 .52 1.1.62 1.13.73 1.18.88 1.19 1.07 1.16 1.28 1 1.34.75 1.21.62 1.19.57 1.3.46 1.43.37 1.52.22 1.61v1.67l-.12 1.67-.28 1.65-.44 1.55-.55 1.45-.66 1.31-.7 1.19-.77 1-.77.93-.76.8-.75.72-.87.73-1.28 1-1.37.85-1.28.68-1.24.59-1.18.5-1.15.43-1.12.38-1.1.34-1.06.31-1.07.29-1.07.26-2 .44-1.73.46-1.8.33-1.62.3-2.68.47-2.88.53-3.25.57-3.5.57-3.67.55-1.82.26v.14h.35l2.5.72 2.34 1.11 2.1 1.54 1.81 1.85 1.45 2.15 1.07 2.36.65 2.5.2 2.6-.23 2.59-.7 2.5-1.1 2.33-1.5 2.13-1.85 1.82-2.14 1.48-2.35 1.1-2.5.67h-.31l-.05.13-.62 1.54-1.5 2.16-1.13 1.25-.9.85-.82.7-.85.64-.83.58-.85.53-.95.52-1.37.65-1.32.5-1 .33-.9.27-.27.08.5-.18.5-.22.37-.2.43-.25.47-.31.48-.35.45-.4.44-.42.36-.42.34-.4.26-.36.2-.34.09-.15-6 1.84h1.09-.5l-1.14.16h-.21l-12.35 3.8-1-3.14-14.78.12-11.19.08h-8.71l-2.52-.23-2.47-.65-2.3-1.07-2.08-1.45-1.8-1.8-.85-1.22-.67-.21-.88-.34-.92-.4-.95-.48-1-.55-1.05-.68-1.06-.82-1.09-1-1.08-1.15-1-1.32-.95-1.51-.15-.3h-30.47l-2.21.15-1.34.09-1.46.08h-4.25l-1-.07-1-.1-1.13-.15-1.23-.25-1.39-.35-1.55-.51-1.73-.79-1.68-1-1.22-.91-1-.92-1-1.07-1-1.25-.88-1.38-.74-1.52-.58-1.6-.4-1.63-.22-1.6-.05-1.55.09-1.45.18-1.35.28-1.23.37-1.24.58-1.51.77-1.55.88-1.45 1-1.34 1.07-1.2 1.12-1.06 1.13-.92 1.12-.78 1.1-.69 1.06-.56 1-.49 1-.4.93-.33.89-.3.85-.23.88-.24 1.4-.31 1.35-.25 1.2-.19 1-.15.56-.1.35-1.73.42-1.62 1.35-2.6 1.42-1.86 1.51-1.54 1.84-1.36 1.53-.85 1-.5.82-.35.82-.34.88-.33 1.5-.5 1.57-.47 1.55-.38 1.55-.35 1.55-.3 1.55-.27 1.55-.23 1.56-.22 1.57-.2 1.57-.16 1.56-.15 1.59-.15 2.11-.17 1-.07 3.05-.2 2.95-.16 5.48-.3 2.42-.15 2.15-.17.88-.07.82-.08.68-.08.6-.09 3.94-.61 4-.65 4-.69 4.05-.71 4.06-.74 4.09-.75 8.21-1.51 4.15-.77 4.17-.75 4.18-.73 4.2-.72 4.24-.68 4.25-.67 4.26-.62 4.2-.56 1.84-.25 1.66-.22 2-.23 2.37-.27 2.62-.23 2.76-.22 1.49-.1 1.5-.07 1.51-.06h3.54z" fill="#808080"/></g></svg>
{images → assets/img}/payment-methods/alipay.svg RENAMED
File without changes
{images → assets/img}/payment-methods/amex.svg RENAMED
File without changes
{images → assets/img}/payment-methods/bancontact.svg RENAMED
File without changes
{images → assets/img}/payment-methods/diners.svg RENAMED
File without changes
{images → assets/img}/payment-methods/discover.svg RENAMED
File without changes
{images → assets/img}/payment-methods/eps.svg RENAMED
File without changes
{images → assets/img}/payment-methods/giropay.svg RENAMED
File without changes
{images → assets/img}/payment-methods/ideal.svg RENAMED
File without changes
{images → assets/img}/payment-methods/jcb.svg RENAMED
File without changes
{images → assets/img}/payment-methods/laser.svg RENAMED
File without changes
{images → assets/img}/payment-methods/maestro.svg RENAMED
File without changes
{images → assets/img}/payment-methods/mastercard.svg RENAMED
File without changes
{images → assets/img}/payment-methods/multibanco.svg RENAMED
File without changes
{images → assets/img}/payment-methods/p24.svg RENAMED
File without changes
{images → assets/img}/payment-methods/sepa.svg RENAMED
File without changes
{images → assets/img}/payment-methods/sofort.svg RENAMED
File without changes
{images → assets/img}/payment-methods/unionpay.svg RENAMED
File without changes
{images → assets/img}/payment-methods/visa.svg RENAMED
File without changes
{images → assets/img}/payment-methods/wechat.svg RENAMED
File without changes
{images/previews → assets/img}/pennant.jpg RENAMED
File without changes
assets/img/single-product-preview.svg ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 230 100">
2
+ <g fill="#E1E3E6" fill-rule="nonzero">
3
+ <path d="M76 0h11v6H76zM76 11h88v11H76zM76 27h28v6H76zM76 44h154v28H76zM76 83h22v17H76zM104 83h44v17h-44zM0 0h66v66H0z"/>
4
+ </g>
5
+ </svg>
assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/attribute-select-control.js CHANGED
@@ -4,12 +4,10 @@
4
  import { __ } from '@wordpress/i18n';
5
  import { decodeEntities } from '@wordpress/html-entities';
6
  import { SelectControl } from '@wordpress/components';
 
7
  import { useEffect } from 'react';
8
  import classnames from 'classnames';
9
- import {
10
- ValidationInputError,
11
- useValidationContext,
12
- } from '@woocommerce/base-context';
13
 
14
  // Default option for select boxes.
15
  const selectAnOption = {
4
  import { __ } from '@wordpress/i18n';
5
  import { decodeEntities } from '@wordpress/html-entities';
6
  import { SelectControl } from '@wordpress/components';
7
+ import { useValidationContext } from '@woocommerce/base-context';
8
  import { useEffect } from 'react';
9
  import classnames from 'classnames';
10
+ import { ValidationInputError } from '@woocommerce/base-components/validation';
 
 
 
11
 
12
  // Default option for select boxes.
13
  const selectAnOption = {
assets/js/atomic/blocks/product-elements/add-to-cart/shared/add-to-cart-button.js CHANGED
@@ -6,11 +6,7 @@ import Button from '@woocommerce/base-components/button';
6
  import { Icon, done as doneIcon } from '@woocommerce/icons';
7
  import { useState, useEffect } from '@wordpress/element';
8
  import { useAddToCartFormContext } from '@woocommerce/base-context';
9
- import {
10
- useStoreEvents,
11
- useStoreAddToCart,
12
- } from '@woocommerce/base-context/hooks';
13
- import { useInnerBlockLayoutContext } from '@woocommerce/shared-context';
14
 
15
  /**
16
  * Add to Cart Form Button Component.
@@ -28,8 +24,6 @@ const AddToCartButton = () => {
28
  hasError,
29
  dispatchActions,
30
  } = useAddToCartFormContext();
31
- const { parentName } = useInnerBlockLayoutContext();
32
- const { dispatchStoreEvent } = useStoreEvents();
33
  const { cartQuantity } = useStoreAddToCart( product.id || 0 );
34
  const [ addedToCart, setAddedToCart ] = useState( false );
35
  const addToCartButtonData = product.add_to_cart || {
@@ -75,13 +69,7 @@ const AddToCartButton = () => {
75
  isDisabled={ isDisabled }
76
  isProcessing={ isProcessing }
77
  isDone={ addedToCart }
78
- onClick={ () => {
79
- dispatchActions.submitForm();
80
- dispatchStoreEvent( 'cart-add-item', {
81
- product,
82
- listName: parentName,
83
- } );
84
- } }
85
  />
86
  ) : (
87
  <LinkComponent
@@ -91,12 +79,6 @@ const AddToCartButton = () => {
91
  addToCartButtonData.text ||
92
  __( 'View Product', 'woo-gutenberg-products-block' )
93
  }
94
- onClick={ () => {
95
- dispatchStoreEvent( 'product-view-link', {
96
- product,
97
- listName: parentName,
98
- } );
99
- } }
100
  />
101
  );
102
  };
@@ -108,16 +90,10 @@ const AddToCartButton = () => {
108
  * @param {string} props.className Css classnames.
109
  * @param {string} props.href Link for button.
110
  * @param {string} props.text Text content for button.
111
- * @param {function():any} props.onClick Callback to execute when button is clicked.
112
  */
113
- const LinkComponent = ( { className, href, text, onClick } ) => {
114
  return (
115
- <Button
116
- className={ className }
117
- href={ href }
118
- onClick={ onClick }
119
- rel="nofollow"
120
- >
121
  { text }
122
  </Button>
123
  );
@@ -151,7 +127,7 @@ const ButtonComponent = ( {
151
  >
152
  { isDone && quantityInCart > 0
153
  ? sprintf(
154
- /* translators: %s number of products in cart. */
155
  _n(
156
  '%d in cart',
157
  '%d in cart',
6
  import { Icon, done as doneIcon } from '@woocommerce/icons';
7
  import { useState, useEffect } from '@wordpress/element';
8
  import { useAddToCartFormContext } from '@woocommerce/base-context';
9
+ import { useStoreAddToCart } from '@woocommerce/base-hooks';
 
 
 
 
10
 
11
  /**
12
  * Add to Cart Form Button Component.
24
  hasError,
25
  dispatchActions,
26
  } = useAddToCartFormContext();
 
 
27
  const { cartQuantity } = useStoreAddToCart( product.id || 0 );
28
  const [ addedToCart, setAddedToCart ] = useState( false );
29
  const addToCartButtonData = product.add_to_cart || {
69
  isDisabled={ isDisabled }
70
  isProcessing={ isProcessing }
71
  isDone={ addedToCart }
72
+ onClick={ () => dispatchActions.submitForm() }
 
 
 
 
 
 
73
  />
74
  ) : (
75
  <LinkComponent
79
  addToCartButtonData.text ||
80
  __( 'View Product', 'woo-gutenberg-products-block' )
81
  }
 
 
 
 
 
 
82
  />
83
  );
84
  };
90
  * @param {string} props.className Css classnames.
91
  * @param {string} props.href Link for button.
92
  * @param {string} props.text Text content for button.
 
93
  */
94
+ const LinkComponent = ( { className, href, text } ) => {
95
  return (
96
+ <Button className={ className } href={ href } rel="nofollow">
 
 
 
 
 
97
  { text }
98
  </Button>
99
  );
127
  >
128
  { isDone && quantityInCart > 0
129
  ? sprintf(
130
+ // translators: %s number of products in cart.
131
  _n(
132
  '%d in cart',
133
  '%d in cart',
assets/js/atomic/blocks/product-elements/button/block.js CHANGED
@@ -4,11 +4,10 @@
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import { __, _n, sprintf } from '@wordpress/i18n';
7
- import {
8
- useStoreEvents,
9
- useStoreAddToCart,
10
- } from '@woocommerce/base-context/hooks';
11
  import { decodeEntities } from '@wordpress/html-entities';
 
12
  import {
13
  useInnerBlockLayoutContext,
14
  useProductDataContext,
@@ -52,6 +51,8 @@ const Block = ( { className } ) => {
52
  };
53
 
54
  const AddToCartButton = ( { product } ) => {
 
 
55
  const {
56
  id,
57
  permalink,
@@ -60,9 +61,18 @@ const AddToCartButton = ( { product } ) => {
60
  is_purchasable: isPurchasable,
61
  is_in_stock: isInStock,
62
  } = product;
63
- const { dispatchStoreEvent } = useStoreEvents();
64
  const { cartQuantity, addingToCart, addToCart } = useStoreAddToCart( id );
65
 
 
 
 
 
 
 
 
 
 
66
  const addedToCart = Number.isFinite( cartQuantity ) && cartQuantity > 0;
67
  const allowAddToCart = ! hasOptions && isPurchasable && isInStock;
68
  const buttonAriaLabel = decodeEntities(
@@ -70,7 +80,7 @@ const AddToCartButton = ( { product } ) => {
70
  );
71
  const buttonText = addedToCart
72
  ? sprintf(
73
- /* translators: %s number of products in cart. */
74
  _n(
75
  '%d in cart',
76
  '%d in cart',
@@ -90,17 +100,9 @@ const AddToCartButton = ( { product } ) => {
90
  if ( ! allowAddToCart ) {
91
  buttonProps.href = permalink;
92
  buttonProps.rel = 'nofollow';
93
- buttonProps.onClick = () => {
94
- dispatchStoreEvent( 'product-view-link', {
95
- product,
96
- } );
97
- };
98
  } else {
99
  buttonProps.onClick = () => {
100
  addToCart();
101
- dispatchStoreEvent( 'cart-add-item', {
102
- product,
103
- } );
104
  };
105
  }
106
 
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import { __, _n, sprintf } from '@wordpress/i18n';
7
+ import { useEffect, useRef } from '@wordpress/element';
8
+ import { useStoreAddToCart } from '@woocommerce/base-hooks';
 
 
9
  import { decodeEntities } from '@wordpress/html-entities';
10
+ import { triggerFragmentRefresh } from '@woocommerce/base-utils';
11
  import {
12
  useInnerBlockLayoutContext,
13
  useProductDataContext,
51
  };
52
 
53
  const AddToCartButton = ( { product } ) => {
54
+ const firstMount = useRef( true );
55
+
56
  const {
57
  id,
58
  permalink,
61
  is_purchasable: isPurchasable,
62
  is_in_stock: isInStock,
63
  } = product;
64
+
65
  const { cartQuantity, addingToCart, addToCart } = useStoreAddToCart( id );
66
 
67
+ useEffect( () => {
68
+ // Avoid running on first mount when cart quantity is first set.
69
+ if ( firstMount.current ) {
70
+ firstMount.current = false;
71
+ return;
72
+ }
73
+ triggerFragmentRefresh();
74
+ }, [ cartQuantity ] );
75
+
76
  const addedToCart = Number.isFinite( cartQuantity ) && cartQuantity > 0;
77
  const allowAddToCart = ! hasOptions && isPurchasable && isInStock;
78
  const buttonAriaLabel = decodeEntities(
80
  );
81
  const buttonText = addedToCart
82
  ? sprintf(
83
+ // translators: %s number of products in cart.
84
  _n(
85
  '%d in cart',
86
  '%d in cart',
100
  if ( ! allowAddToCart ) {
101
  buttonProps.href = permalink;
102
  buttonProps.rel = 'nofollow';
 
 
 
 
 
103
  } else {
104
  buttonProps.onClick = () => {
105
  addToCart();
 
 
 
106
  };
107
  }
108
 
assets/js/atomic/blocks/product-elements/image/block.js CHANGED
@@ -2,16 +2,15 @@
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
- import { useState, Fragment } from '@wordpress/element';
6
- import { __, sprintf } from '@wordpress/i18n';
7
  import classnames from 'classnames';
8
- import { PLACEHOLDER_IMG_SRC } from '@woocommerce/settings';
9
  import {
10
  useInnerBlockLayoutContext,
11
  useProductDataContext,
12
  } from '@woocommerce/shared-context';
13
  import { withProductDataContext } from '@woocommerce/shared-hocs';
14
- import { useStoreEvents } from '@woocommerce/base-context/hooks';
15
 
16
  /**
17
  * Internal dependencies
@@ -30,17 +29,16 @@ import './style.scss';
30
  * @param {string} [props.saleBadgeAlign] How should the sale badge be aligned if displayed.
31
  * @return {*} The component.
32
  */
33
- export const Block = ( {
34
  className,
35
  imageSizing = 'full-size',
36
- productLink: showProductLink = true,
37
  showSaleBadge,
38
  saleBadgeAlign = 'right',
39
  } ) => {
40
  const { parentClassName } = useInnerBlockLayoutContext();
41
  const { product } = useProductDataContext();
42
  const [ imageLoaded, setImageLoaded ] = useState( false );
43
- const { dispatchStoreEvent } = useStoreEvents();
44
 
45
  if ( ! product.id ) {
46
  return (
@@ -58,24 +56,8 @@ export const Block = ( {
58
  </div>
59
  );
60
  }
61
- const hasProductImages = !! product.images.length;
62
- const image = hasProductImages ? product.images[ 0 ] : null;
63
- const ParentComponent = showProductLink ? 'a' : Fragment;
64
- const anchorLabel = sprintf(
65
- /* translators: %s is referring to the product name */
66
- __( 'Link to %s', 'woo-gutenberg-products-block' ),
67
- product.name
68
- );
69
- const anchorProps = {
70
- href: product.permalink,
71
- rel: 'nofollow',
72
- ...( ! hasProductImages && { 'aria-label': anchorLabel } ),
73
- onClick: () => {
74
- dispatchStoreEvent( 'product-view-link', {
75
- product,
76
- } );
77
- },
78
- };
79
 
80
  return (
81
  <div
@@ -87,21 +69,37 @@ export const Block = ( {
87
  }
88
  ) }
89
  >
90
- <ParentComponent { ...( showProductLink && anchorProps ) }>
91
- { !! showSaleBadge && (
92
- <ProductSaleBadge
93
- align={ saleBadgeAlign }
94
- product={ product }
 
 
 
 
 
 
 
 
95
  />
96
- ) }
97
- <Image
98
- fallbackAlt={ product.name }
99
- image={ image }
100
- onLoad={ () => setImageLoaded( true ) }
101
- loaded={ imageLoaded }
102
- showFullSize={ imageSizing !== 'cropped' }
103
- />
104
- </ParentComponent>
 
 
 
 
 
 
 
 
105
  </div>
106
  );
107
  };
@@ -112,22 +110,28 @@ const ImagePlaceholder = () => {
112
  );
113
  };
114
 
115
- const Image = ( { image, onLoad, loaded, showFullSize, fallbackAlt } ) => {
116
  const { thumbnail, src, srcset, sizes, alt } = image || {};
117
- const imageProps = {
118
- alt: alt || fallbackAlt,
 
119
  onLoad,
120
  hidden: ! loaded,
121
  src: thumbnail,
122
- ...( showFullSize && { src, srcSet: srcset, sizes } ),
123
  };
 
 
 
 
 
 
 
 
124
 
125
  return (
126
  <>
127
- { imageProps.src && (
128
- /* eslint-disable-next-line jsx-a11y/alt-text */
129
- <img data-testid="product-image" { ...imageProps } />
130
- ) }
131
  { ! loaded && <ImagePlaceholder /> }
132
  </>
133
  );
@@ -135,7 +139,6 @@ const Image = ( { image, onLoad, loaded, showFullSize, fallbackAlt } ) => {
135
 
136
  Block.propTypes = {
137
  className: PropTypes.string,
138
- fallbackAlt: PropTypes.string,
139
  productLink: PropTypes.bool,
140
  showSaleBadge: PropTypes.bool,
141
  saleBadgeAlign: PropTypes.string,
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
+ import { useState } from '@wordpress/element';
 
6
  import classnames from 'classnames';
7
+ import { PLACEHOLDER_IMG_SRC } from '@woocommerce/block-settings';
8
  import {
9
  useInnerBlockLayoutContext,
10
  useProductDataContext,
11
  } from '@woocommerce/shared-context';
12
  import { withProductDataContext } from '@woocommerce/shared-hocs';
13
+ import { isEmpty } from 'lodash';
14
 
15
  /**
16
  * Internal dependencies
29
  * @param {string} [props.saleBadgeAlign] How should the sale badge be aligned if displayed.
30
  * @return {*} The component.
31
  */
32
+ const Block = ( {
33
  className,
34
  imageSizing = 'full-size',
35
+ productLink = true,
36
  showSaleBadge,
37
  saleBadgeAlign = 'right',
38
  } ) => {
39
  const { parentClassName } = useInnerBlockLayoutContext();
40
  const { product } = useProductDataContext();
41
  const [ imageLoaded, setImageLoaded ] = useState( false );
 
42
 
43
  if ( ! product.id ) {
44
  return (
56
  </div>
57
  );
58
  }
59
+
60
+ const image = ! isEmpty( product.images ) ? product.images[ 0 ] : null;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
 
62
  return (
63
  <div
69
  }
70
  ) }
71
  >
72
+ { productLink ? (
73
+ <a href={ product.permalink } rel="nofollow">
74
+ { !! showSaleBadge && (
75
+ <ProductSaleBadge
76
+ align={ saleBadgeAlign }
77
+ product={ product }
78
+ />
79
+ ) }
80
+ <Image
81
+ image={ image }
82
+ onLoad={ () => setImageLoaded( true ) }
83
+ loaded={ imageLoaded }
84
+ showFullSize={ imageSizing !== 'cropped' }
85
  />
86
+ </a>
87
+ ) : (
88
+ <>
89
+ { !! showSaleBadge && (
90
+ <ProductSaleBadge
91
+ align={ saleBadgeAlign }
92
+ product={ product }
93
+ />
94
+ ) }
95
+ <Image
96
+ image={ image }
97
+ onLoad={ () => setImageLoaded( true ) }
98
+ loaded={ imageLoaded }
99
+ showFullSize={ imageSizing !== 'cropped' }
100
+ />
101
+ </>
102
+ ) }
103
  </div>
104
  );
105
  };
110
  );
111
  };
112
 
113
+ const Image = ( { image, onLoad, loaded, showFullSize } ) => {
114
  const { thumbnail, src, srcset, sizes, alt } = image || {};
115
+
116
+ let imageProps = {
117
+ alt,
118
  onLoad,
119
  hidden: ! loaded,
120
  src: thumbnail,
 
121
  };
122
+ if ( showFullSize ) {
123
+ imageProps = {
124
+ ...imageProps,
125
+ src,
126
+ srcSet: srcset,
127
+ sizes,
128
+ };
129
+ }
130
 
131
  return (
132
  <>
133
+ { /* eslint-disable-next-line jsx-a11y/alt-text */ }
134
+ <img { ...imageProps } />
 
 
135
  { ! loaded && <ImagePlaceholder /> }
136
  </>
137
  );
139
 
140
  Block.propTypes = {
141
  className: PropTypes.string,
 
142
  productLink: PropTypes.bool,
143
  showSaleBadge: PropTypes.bool,
144
  saleBadgeAlign: PropTypes.string,
assets/js/atomic/blocks/product-elements/image/test/block.test.js DELETED
@@ -1,139 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { render, fireEvent } from '@testing-library/react';
5
- import { ProductDataContextProvider } from '@woocommerce/shared-context';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import { Block } from '../block';
11
-
12
- jest.mock( '@woocommerce/block-settings', () => ( {
13
- __esModule: true,
14
- PLACEHOLDER_IMG_SRC: 'placeholder.jpg',
15
- } ) );
16
-
17
- const productWithoutImages = {
18
- name: 'Test product',
19
- id: 1,
20
- fallbackAlt: 'Test product',
21
- permalink: 'http://test.com/product/test-product/',
22
- images: [],
23
- };
24
-
25
- const productWithImages = {
26
- name: 'Test product',
27
- id: 1,
28
- fallbackAlt: 'Test product',
29
- permalink: 'http://test.com/product/test-product/',
30
- images: [
31
- {
32
- id: 56,
33
- src: 'logo-1.jpg',
34
- thumbnail: 'logo-1-324x324.jpg',
35
- srcset:
36
- 'logo-1.jpg 800w, logo-1-300x300.jpg 300w, logo-1-150x150.jpg 150w, logo-1-768x767.jpg 768w, logo-1-324x324.jpg 324w, logo-1-416x415.jpg 416w, logo-1-100x100.jpg 100w',
37
- sizes: '(max-width: 800px) 100vw, 800px',
38
- name: 'logo-1.jpg',
39
- alt: '',
40
- },
41
- {
42
- id: 55,
43
- src: 'beanie-with-logo-1.jpg',
44
- thumbnail: 'beanie-with-logo-1-324x324.jpg',
45
- srcset:
46
- 'beanie-with-logo-1.jpg 800w, beanie-with-logo-1-300x300.jpg 300w, beanie-with-logo-1-150x150.jpg 150w, beanie-with-logo-1-768x768.jpg 768w, beanie-with-logo-1-324x324.jpg 324w, beanie-with-logo-1-416x416.jpg 416w, beanie-with-logo-1-100x100.jpg 100w',
47
- sizes: '(max-width: 800px) 100vw, 800px',
48
- name: 'beanie-with-logo-1.jpg',
49
- alt: '',
50
- },
51
- ],
52
- };
53
-
54
- describe( 'Product Image Block', () => {
55
- describe( 'with product link', () => {
56
- test( 'should render an anchor with the product image', () => {
57
- const component = render(
58
- <ProductDataContextProvider product={ productWithImages }>
59
- <Block productLink />
60
- </ProductDataContextProvider>
61
- );
62
-
63
- // use testId as alt is added after image is loaded
64
- const image = component.getByTestId( 'product-image' );
65
- fireEvent.load( image );
66
-
67
- const productImage = component.getByAltText(
68
- productWithImages.name
69
- );
70
- expect( productImage.getAttribute( 'src' ) ).toBe(
71
- productWithImages.images[ 0 ].src
72
- );
73
-
74
- const anchor = productImage.closest( 'a' );
75
- expect( anchor.getAttribute( 'href' ) ).toBe(
76
- productWithImages.permalink
77
- );
78
- } );
79
-
80
- test( 'should render an anchor with the placeholder image', () => {
81
- const component = render(
82
- <ProductDataContextProvider product={ productWithoutImages }>
83
- <Block productLink />
84
- </ProductDataContextProvider>
85
- );
86
-
87
- const placeholderImage = component.getByAltText( '' );
88
- expect( placeholderImage.getAttribute( 'src' ) ).toBe(
89
- 'placeholder.jpg'
90
- );
91
-
92
- const anchor = placeholderImage.closest( 'a' );
93
- expect( anchor.getAttribute( 'href' ) ).toBe(
94
- productWithoutImages.permalink
95
- );
96
- expect( anchor.getAttribute( 'aria-label' ) ).toBe(
97
- `Link to ${ productWithoutImages.name }`
98
- );
99
- } );
100
- } );
101
-
102
- describe( 'without product link', () => {
103
- test( 'should render the product image without an anchor wrapper', () => {
104
- const component = render(
105
- <ProductDataContextProvider product={ productWithImages }>
106
- <Block productLink={ false } />
107
- </ProductDataContextProvider>
108
- );
109
- const image = component.getByTestId( 'product-image' );
110
- fireEvent.load( image );
111
-
112
- const productImage = component.getByAltText(
113
- productWithImages.name
114
- );
115
- expect( productImage.getAttribute( 'src' ) ).toBe(
116
- productWithImages.images[ 0 ].src
117
- );
118
-
119
- const anchor = productImage.closest( 'a' );
120
- expect( anchor ).toBe( null );
121
- } );
122
-
123
- test( 'should render the placeholder image without an anchor wrapper', () => {
124
- const component = render(
125
- <ProductDataContextProvider product={ productWithoutImages }>
126
- <Block productLink={ false } />
127
- </ProductDataContextProvider>
128
- );
129
-
130
- const placeholderImage = component.getByAltText( '' );
131
- expect( placeholderImage.getAttribute( 'src' ) ).toBe(
132
- 'placeholder.jpg'
133
- );
134
-
135
- const anchor = placeholderImage.closest( 'a' );
136
- expect( anchor ).toBe( null );
137
- } );
138
- } );
139
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/atomic/blocks/product-elements/price/block.js CHANGED
@@ -4,7 +4,7 @@
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import ProductPrice from '@woocommerce/base-components/product-price';
7
- import { getCurrencyFromPriceResponse } from '@woocommerce/price-format';
8
  import {
9
  useInnerBlockLayoutContext,
10
  useProductDataContext,
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import ProductPrice from '@woocommerce/base-components/product-price';
7
+ import { getCurrencyFromPriceResponse } from '@woocommerce/base-utils';
8
  import {
9
  useInnerBlockLayoutContext,
10
  useProductDataContext,
assets/js/atomic/blocks/product-elements/rating/block.js CHANGED
@@ -36,7 +36,7 @@ const Block = ( { className } ) => {
36
  };
37
 
38
  const ratingText = sprintf(
39
- /* translators: %f is referring to the average rating value */
40
  __( 'Rated %f out of 5', 'woo-gutenberg-products-block' ),
41
  rating
42
  );
@@ -45,6 +45,7 @@ const Block = ( { className } ) => {
45
  <div
46
  className={ classnames(
47
  className,
 
48
  'wc-block-components-product-rating',
49
  {
50
  [ `${ parentClassName }__product-rating` ]: parentClassName,
36
  };
37
 
38
  const ratingText = sprintf(
39
+ /* Translators: %f is referring to the average rating value */
40
  __( 'Rated %f out of 5', 'woo-gutenberg-products-block' ),
41
  rating
42
  );
45
  <div
46
  className={ classnames(
47
  className,
48
+ 'star-rating',
49
  'wc-block-components-product-rating',
50
  {
51
  [ `${ parentClassName }__product-rating` ]: parentClassName,
assets/js/atomic/blocks/product-elements/shared/with-product-selector.js CHANGED
@@ -4,7 +4,7 @@
4
  import { __ } from '@wordpress/i18n';
5
  import { useState } from '@wordpress/element';
6
  import ProductControl from '@woocommerce/editor-components/product-control';
7
- import { Placeholder, Button, ToolbarGroup } from '@wordpress/components';
8
  import { BlockControls } from '@wordpress/block-editor';
9
  import TextToolbarButton from '@woocommerce/editor-components/text-toolbar-button';
10
  import { useProductDataContext } from '@woocommerce/shared-context';
@@ -55,7 +55,7 @@ const withProductSelector = ( selectorArgs ) => ( OriginalComponent ) => {
55
  } }
56
  />
57
  <Button
58
- isSecondary
59
  disabled={ ! productId }
60
  onClick={ () => {
61
  setIsEditing( false );
@@ -68,7 +68,7 @@ const withProductSelector = ( selectorArgs ) => ( OriginalComponent ) => {
68
  ) : (
69
  <>
70
  <BlockControls>
71
- <ToolbarGroup>
72
  <TextToolbarButton
73
  onClick={ () => setIsEditing( true ) }
74
  >
@@ -77,7 +77,7 @@ const withProductSelector = ( selectorArgs ) => ( OriginalComponent ) => {
77
  'woo-gutenberg-products-block'
78
  ) }
79
  </TextToolbarButton>
80
- </ToolbarGroup>
81
  </BlockControls>
82
  <OriginalComponent { ...props } />
83
  </>
4
  import { __ } from '@wordpress/i18n';
5
  import { useState } from '@wordpress/element';
6
  import ProductControl from '@woocommerce/editor-components/product-control';
7
+ import { Placeholder, Button, Toolbar } from '@wordpress/components';
8
  import { BlockControls } from '@wordpress/block-editor';
9
  import TextToolbarButton from '@woocommerce/editor-components/text-toolbar-button';
10
  import { useProductDataContext } from '@woocommerce/shared-context';
55
  } }
56
  />
57
  <Button
58
+ isDefault
59
  disabled={ ! productId }
60
  onClick={ () => {
61
  setIsEditing( false );
68
  ) : (
69
  <>
70
  <BlockControls>
71
+ <Toolbar>
72
  <TextToolbarButton
73
  onClick={ () => setIsEditing( true ) }
74
  >
77
  'woo-gutenberg-products-block'
78
  ) }
79
  </TextToolbarButton>
80
+ </Toolbar>
81
  </BlockControls>
82
  <OriginalComponent { ...props } />
83
  </>
assets/js/atomic/blocks/product-elements/summary/block.js CHANGED
@@ -4,7 +4,7 @@
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import Summary from '@woocommerce/base-components/summary';
7
- import { blocksConfig } from '@woocommerce/block-settings';
8
  import {
9
  useInnerBlockLayoutContext,
10
  useProductDataContext,
@@ -49,6 +49,8 @@ const Block = ( { className } ) => {
49
  return null;
50
  }
51
 
 
 
52
  return (
53
  <Summary
54
  className={ classnames(
@@ -60,7 +62,7 @@ const Block = ( { className } ) => {
60
  ) }
61
  source={ source }
62
  maxLength={ 150 }
63
- countType={ blocksConfig.wordCountType || 'words' }
64
  />
65
  );
66
  };
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import Summary from '@woocommerce/base-components/summary';
7
+ import { getSetting } from '@woocommerce/settings';
8
  import {
9
  useInnerBlockLayoutContext,
10
  useProductDataContext,
49
  return null;
50
  }
51
 
52
+ const countType = getSetting( 'wordCountType', 'words' );
53
+
54
  return (
55
  <Summary
56
  className={ classnames(
62
  ) }
63
  source={ source }
64
  maxLength={ 150 }
65
+ countType={ countType }
66
  />
67
  );
68
  };
assets/js/atomic/blocks/product-elements/title/block.js CHANGED
@@ -3,6 +3,7 @@
3
  */
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
 
6
  import {
7
  useInnerBlockLayoutContext,
8
  useProductDataContext,
@@ -11,8 +12,6 @@ import { getColorClassName, getFontSizeClass } from '@wordpress/block-editor';
11
  import { isFeaturePluginBuild } from '@woocommerce/block-settings';
12
  import { gatedStyledText } from '@woocommerce/atomic-utils';
13
  import { withProductDataContext } from '@woocommerce/shared-hocs';
14
- import ProductName from '@woocommerce/base-components/product-name';
15
- import { useStoreEvents } from '@woocommerce/base-context/hooks';
16
 
17
  /**
18
  * Internal dependencies
@@ -46,7 +45,6 @@ export const Block = ( {
46
  } ) => {
47
  const { parentClassName } = useInnerBlockLayoutContext();
48
  const { product } = useProductDataContext();
49
- const { dispatchStoreEvent } = useStoreEvents();
50
  const TagName = `h${ headingLevel }`;
51
 
52
  const colorClass = getColorClassName( 'color', color );
@@ -81,6 +79,8 @@ export const Block = ( {
81
  );
82
  }
83
 
 
 
84
  return (
85
  // @ts-ignore
86
  <TagName
@@ -94,24 +94,33 @@ export const Block = ( {
94
  }
95
  ) }
96
  >
97
- <ProductName
98
- className={ classnames( {
99
- [ titleClasses ]: isFeaturePluginBuild(),
100
- } ) }
101
- disabled={ ! productLink }
102
- name={ product.name }
103
- permalink={ product.permalink }
104
- rel={ productLink ? 'nofollow' : null }
105
- style={ gatedStyledText( {
106
- color: customColor,
107
- fontSize: customFontSize,
108
- } ) }
109
- onClick={ () => {
110
- dispatchStoreEvent( 'product-view-link', {
111
- product,
112
- } );
113
- } }
114
- />
 
 
 
 
 
 
 
 
 
115
  </TagName>
116
  );
117
  };
3
  */
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
+ import { decodeEntities } from '@wordpress/html-entities';
7
  import {
8
  useInnerBlockLayoutContext,
9
  useProductDataContext,
12
  import { isFeaturePluginBuild } from '@woocommerce/block-settings';
13
  import { gatedStyledText } from '@woocommerce/atomic-utils';
14
  import { withProductDataContext } from '@woocommerce/shared-hocs';
 
 
15
 
16
  /**
17
  * Internal dependencies
45
  } ) => {
46
  const { parentClassName } = useInnerBlockLayoutContext();
47
  const { product } = useProductDataContext();
 
48
  const TagName = `h${ headingLevel }`;
49
 
50
  const colorClass = getColorClassName( 'color', color );
79
  );
80
  }
81
 
82
+ const productName = decodeEntities( product.name );
83
+
84
  return (
85
  // @ts-ignore
86
  <TagName
94
  }
95
  ) }
96
  >
97
+ { productLink ? (
98
+ <a
99
+ href={ product.permalink }
100
+ rel="nofollow"
101
+ className={ classnames( {
102
+ [ titleClasses ]: isFeaturePluginBuild(),
103
+ } ) }
104
+ style={ gatedStyledText( {
105
+ color: customColor,
106
+ fontSize: customFontSize,
107
+ } ) }
108
+ >
109
+ { productName }
110
+ </a>
111
+ ) : (
112
+ <span
113
+ className={ classnames( {
114
+ [ titleClasses ]: isFeaturePluginBuild(),
115
+ } ) }
116
+ style={ gatedStyledText( {
117
+ color: customColor,
118
+ fontSize: customFontSize,
119
+ } ) }
120
+ >
121
+ { productName }
122
+ </span>
123
+ ) }
124
  </TagName>
125
  );
126
  };
assets/js/atomic/utils/index.js CHANGED
@@ -1,5 +1,6 @@
1
- export * from './get-block-map';
2
- export * from './create-blocks-from-template';
3
- export * from './render-parent-block';
 
4
  export * from './block-styling.js';
5
- export * from './render-standalone-blocks';
1
+ export * from './get-block-map.js';
2
+ export * from './create-blocks-from-template.js';
3
+ export * from './render-parent-block.js';
4
+ export * from './render-inner-blocks.js';
5
  export * from './block-styling.js';
6
+ export * from './render-standalone-blocks.js';
assets/js/atomic/utils/render-inner-blocks.js ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { Suspense, cloneElement, isValidElement } from '@wordpress/element';
5
+ import parse from 'html-react-parser';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import { getBlockMap } from './get-block-map';
11
+
12
+ /**
13
+ * Replaces saved block HTML markup with Inner Block Components.
14
+ *
15
+ * @param {Object} props Render props.
16
+ * @param {Array} props.children Children/inner blocks to render.
17
+ * @param {string} props.blockName Parent Block Name used to get the block map and for keys.
18
+ * @param {number} [props.depth] Depth of inner blocks being rendered.
19
+ */
20
+ export const renderInnerBlocks = ( {
21
+ children,
22
+ blockName: parentBlockName,
23
+ depth = 1,
24
+ } ) => {
25
+ const blockMap = getBlockMap( parentBlockName );
26
+
27
+ return Array.from( children ).map( ( el, index ) => {
28
+ const componentProps = {
29
+ ...el.dataset,
30
+ key: `${ parentBlockName }_${ depth }_${ index }`,
31
+ };
32
+
33
+ const componentChildren =
34
+ el.children && el.children.length
35
+ ? renderInnerBlocks( {
36
+ children: el.children,
37
+ blockName: parentBlockName,
38
+ depth: depth + 1,
39
+ } )
40
+ : null;
41
+
42
+ const LayoutComponent =
43
+ componentProps.blockName && blockMap[ componentProps.blockName ]
44
+ ? blockMap[ componentProps.blockName ]
45
+ : null;
46
+
47
+ if ( ! LayoutComponent ) {
48
+ const element = parse( el.outerHTML );
49
+
50
+ if ( isValidElement( element ) ) {
51
+ return componentChildren
52
+ ? cloneElement( element, componentProps, componentChildren )
53
+ : cloneElement( element, componentProps );
54
+ }
55
+ return null;
56
+ }
57
+
58
+ return (
59
+ <Suspense
60
+ key={ `${ parentBlockName }_${ depth }_${ index }_suspense` }
61
+ fallback={ <div className="wc-block-placeholder" /> }
62
+ >
63
+ <LayoutComponent { ...componentProps }>
64
+ { componentChildren }
65
+ </LayoutComponent>
66
+ </Suspense>
67
+ );
68
+ } );
69
+ };
assets/js/atomic/utils/render-parent-block.js ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { renderFrontend } from '@woocommerce/base-utils';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { renderInnerBlocks } from './render-inner-blocks';
10
+
11
+ /**
12
+ * Renders a block component in the place of a specified set of selectors.
13
+ *
14
+ * @param {Object} props Render props.
15
+ * @param {Function} props.Block React component to use as a replacement.
16
+ * @param {string} props.selector CSS selector to match the elements to replace.
17
+ * @param {string} [props.blockName] Optional Block Name. Used for inner block component mapping.
18
+ * @param {Function} [props.getProps] Function to generate the props object for the block.
19
+ */
20
+ export const renderParentBlock = ( {
21
+ Block,
22
+ selector,
23
+ blockName = '',
24
+ getProps = () => {},
25
+ } ) => {
26
+ const getPropsWithChildren = ( el, i ) => {
27
+ const children =
28
+ el.children && el.children.length
29
+ ? renderInnerBlocks( {
30
+ blockName,
31
+ children: el.children,
32
+ } )
33
+ : null;
34
+ return { ...getProps( el, i ), children };
35
+ };
36
+ renderFrontend( {
37
+ Block,
38
+ selector,
39
+ getProps: getPropsWithChildren,
40
+ } );
41
+ };
assets/js/atomic/utils/render-parent-block.tsx DELETED
@@ -1,126 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { renderFrontend } from '@woocommerce/base-utils';
5
- import {
6
- Fragment,
7
- Suspense,
8
- cloneElement,
9
- isValidElement,
10
- } from '@wordpress/element';
11
- import parse from 'html-react-parser';
12
-
13
- interface renderBlockProps {
14
- // Parent Block Name. Used for inner block component mapping.
15
- blockName: string;
16
- // Map of block names to block components for children.
17
- blockMap: Record< string, React.ReactNode >;
18
- // Wrapper for inner components.
19
- blockWrapper?: React.ReactNode;
20
- }
21
-
22
- interface renderParentBlockProps extends renderBlockProps {
23
- // React component to use as a replacement.
24
- Block: React.FunctionComponent;
25
- // CSS selector to match the elements to replace.
26
- selector: string;
27
- // Function to generate the props object for the block.
28
- getProps: ( el: Element, i: number ) => Record< string, unknown >;
29
- }
30
-
31
- interface renderInnerBlockProps extends renderBlockProps {
32
- children: HTMLCollection;
33
- depth?: number;
34
- }
35
-
36
- /**
37
- * Replaces saved block HTML markup with Inner Block Components.
38
- */
39
- const renderInnerBlocks = ( {
40
- blockName: parentBlockName,
41
- blockMap,
42
- blockWrapper,
43
- depth = 1,
44
- children,
45
- }: renderInnerBlockProps ): ( JSX.Element | null )[] | null => {
46
- return Array.from( children ).map( ( el: Element, index: number ) => {
47
- const { blockName = '', ...componentProps } = {
48
- key: `${ parentBlockName }_${ depth }_${ index }`,
49
- ...( el instanceof HTMLElement ? el.dataset : {} ),
50
- };
51
-
52
- const componentChildren =
53
- el.children && el.children.length
54
- ? renderInnerBlocks( {
55
- children: el.children,
56
- blockName: parentBlockName,
57
- blockMap,
58
- depth: depth + 1,
59
- blockWrapper,
60
- } )
61
- : null;
62
-
63
- const LayoutComponent =
64
- blockName && blockMap[ blockName ]
65
- ? ( blockMap[ blockName ] as React.ElementType )
66
- : null;
67
-
68
- if ( ! LayoutComponent ) {
69
- const element = parse( el.outerHTML );
70
-
71
- if ( isValidElement( element ) ) {
72
- return componentChildren
73
- ? cloneElement( element, componentProps, componentChildren )
74
- : cloneElement( element, componentProps );
75
- }
76
- return null;
77
- }
78
-
79
- const LayoutComponentWrapper = ( blockWrapper
80
- ? blockWrapper
81
- : Fragment ) as React.ElementType;
82
-
83
- return (
84
- <Suspense
85
- key={ `${ parentBlockName }_${ depth }_${ index }_suspense` }
86
- fallback={ <div className="wc-block-placeholder" /> }
87
- >
88
- <LayoutComponentWrapper>
89
- <LayoutComponent { ...componentProps }>
90
- { componentChildren }
91
- </LayoutComponent>
92
- </LayoutComponentWrapper>
93
- </Suspense>
94
- );
95
- } );
96
- };
97
-
98
- /**
99
- * Renders a block component in the place of a specified set of selectors.
100
- */
101
- export const renderParentBlock = ( {
102
- Block,
103
- selector,
104
- blockName,
105
- getProps = () => ( {} ),
106
- blockMap,
107
- blockWrapper,
108
- }: renderParentBlockProps ): void => {
109
- const getPropsWithChildren = ( el: Element, i: number ) => {
110
- const children =
111
- el.children && el.children.length
112
- ? renderInnerBlocks( {
113
- blockName,
114
- blockMap,
115
- children: el.children,
116
- blockWrapper,
117
- } )
118
- : null;
119
- return { ...getProps( el, i ), children };
120
- };
121
- renderFrontend( {
122
- Block,
123
- selector,
124
- getProps: getPropsWithChildren,
125
- } );
126
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/block-error-boundary/block-error.js CHANGED
@@ -2,11 +2,11 @@
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
 
5
  import PropTypes from 'prop-types';
6
- import { WC_BLOCKS_IMAGE_URL } from '@woocommerce/block-settings';
7
 
8
  const BlockError = ( {
9
- imageUrl = `${ WC_BLOCKS_IMAGE_URL }/block-error.svg`,
10
  header = __( 'Oops!', 'woo-gutenberg-products-block' ),
11
  text = __(
12
  'There was an error loading the content.',
@@ -14,7 +14,6 @@ const BlockError = ( {
14
  ),
15
  errorMessage,
16
  errorMessagePrefix = __( 'Error:', 'woo-gutenberg-products-block' ),
17
- button,
18
  } ) => {
19
  return (
20
  <div className="wc-block-error wc-block-components-error">
@@ -42,11 +41,6 @@ const BlockError = ( {
42
  { errorMessage }
43
  </p>
44
  ) }
45
- { button && (
46
- <p className="wc-block-error__button wc-block-components-error__button">
47
- { button }
48
- </p>
49
- ) }
50
  </div>
51
  </div>
52
  );
@@ -79,10 +73,6 @@ BlockError.propTypes = {
79
  * Text preceeding the error message.
80
  */
81
  errorMessagePrefix: PropTypes.string,
82
- /**
83
- * Button cta.
84
- */
85
- button: PropTypes.node,
86
  };
87
 
88
  export default BlockError;
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
+ import { WC_BLOCKS_ASSET_URL } from '@woocommerce/block-settings';
6
  import PropTypes from 'prop-types';
 
7
 
8
  const BlockError = ( {
9
+ imageUrl = `${ WC_BLOCKS_ASSET_URL }img/block-error.svg`,
10
  header = __( 'Oops!', 'woo-gutenberg-products-block' ),
11
  text = __(
12
  'There was an error loading the content.',
14
  ),
15
  errorMessage,
16
  errorMessagePrefix = __( 'Error:', 'woo-gutenberg-products-block' ),
 
17
  } ) => {
18
  return (
19
  <div className="wc-block-error wc-block-components-error">
41
  { errorMessage }
42
  </p>
43
  ) }
 
 
 
 
 
44
  </div>
45
  </div>
46
  );
73
  * Text preceeding the error message.
74
  */
75
  errorMessagePrefix: PropTypes.string,
 
 
 
 
76
  };
77
 
78
  export default BlockError;
assets/js/base/components/block-error-boundary/index.js CHANGED
@@ -2,7 +2,7 @@
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
- import { Component } from 'react';
6
 
7
  /**
8
  * Internal dependencies
@@ -20,10 +20,10 @@ class BlockErrorBoundary extends Component {
20
  ) {
21
  return {
22
  errorMessage: (
23
- <>
24
  <strong>{ error.status }</strong>:&nbsp;
25
  { error.statusText }
26
- </>
27
  ),
28
  hasError: true,
29
  };
@@ -40,7 +40,6 @@ class BlockErrorBoundary extends Component {
40
  text,
41
  errorMessagePrefix,
42
  renderError,
43
- button,
44
  } = this.props;
45
  const { errorMessage, hasError } = this.state;
46
 
@@ -55,7 +54,6 @@ class BlockErrorBoundary extends Component {
55
  imageUrl={ imageUrl }
56
  text={ text }
57
  errorMessagePrefix={ errorMessagePrefix }
58
- button={ button }
59
  />
60
  );
61
  }
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
+ import { Component, Fragment } from 'react';
6
 
7
  /**
8
  * Internal dependencies
20
  ) {
21
  return {
22
  errorMessage: (
23
+ <Fragment>
24
  <strong>{ error.status }</strong>:&nbsp;
25
  { error.statusText }
26
+ </Fragment>
27
  ),
28
  hasError: true,
29
  };
40
  text,
41
  errorMessagePrefix,
42
  renderError,
 
43
  } = this.props;
44
  const { errorMessage, hasError } = this.state;
45
 
54
  imageUrl={ imageUrl }
55
  text={ text }
56
  errorMessagePrefix={ errorMessagePrefix }
 
57
  />
58
  );
59
  }
assets/js/base/components/block-error-boundary/style.scss CHANGED
@@ -1,34 +1,36 @@
1
  .wc-block-components-error {
2
  display: flex;
3
- padding: $gap-largest 0;
4
- margin: $gap-largest 0;
 
5
  align-items: center;
6
  justify-content: center;
7
  flex-direction: column;
8
- color: $gray-700;
9
- text-align: center;
10
  }
 
11
  .wc-block-components-error__header {
12
  @include font-size(larger);
 
13
  margin: 0;
14
- color: $studio-gray-50;
15
  }
 
16
  .wc-block-components-error__image {
17
- width: 25%;
18
- margin: 0 0 $gap-large 0;
19
  }
20
  .wc-block-components-error__text {
21
- margin: 1em 0 0;
22
- color: $studio-gray-30;
23
- @include font-size(large);
24
- max-width: 60ch;
25
  }
26
  .wc-block-components-error__message {
27
- margin: 1em 0 0;
28
  font-style: italic;
29
- color: $studio-gray-30;
30
- max-width: 60ch;
31
  }
32
- .wc-block-error__button {
33
- margin: $gap-largest 0 0 0;
 
 
 
 
 
 
 
34
  }
1
  .wc-block-components-error {
2
  display: flex;
3
+ background-color: #f3f3f4;
4
+ border-left: 4px solid #6d6d6d;
5
+ padding: $gap-larger $gap;
6
  align-items: center;
7
  justify-content: center;
8
  flex-direction: column;
 
 
9
  }
10
+
11
  .wc-block-components-error__header {
12
  @include font-size(larger);
13
+ font-weight: bold;
14
  margin: 0;
 
15
  }
16
+
17
  .wc-block-components-error__image {
18
+ max-width: 25%;
 
19
  }
20
  .wc-block-components-error__text {
21
+ margin: 0;
 
 
 
22
  }
23
  .wc-block-components-error__message {
24
+ margin: 1em 0 0 0;
25
  font-style: italic;
 
 
26
  }
27
+
28
+ @include breakpoint( ">480px" ) {
29
+ .wc-block-components-error {
30
+ flex-direction: row;
31
+ }
32
+
33
+ .wc-block-components-error__image + .wc-block-components-error__content {
34
+ margin-left: $gap-large;
35
+ }
36
  }
assets/js/base/components/button/index.js ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { Button as WPButton } from 'wordpress-components';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import './style.scss';
12
+
13
+ /** @typedef {import('react')} React */
14
+
15
+ /**
16
+ * Component that visually renders a button but semantically might be `<button>` or `<a>` depending
17
+ * on the props.
18
+ *
19
+ * @param {Object} props Incoming props for the component.
20
+ * @param {string} props.className CSS classname used.
21
+ * @param {boolean} props.showSpinner Whether to show spinner or not.
22
+ * @param {React.ReactChildren} props.children Child components passed in.
23
+ * @param {Object} props.props Rest of incoming props.
24
+ */
25
+ const Button = ( { className, showSpinner = false, children, ...props } ) => {
26
+ const buttonClassName = classNames(
27
+ 'wc-block-components-button',
28
+ className,
29
+ {
30
+ 'wc-block-components-button--loading': showSpinner,
31
+ }
32
+ );
33
+
34
+ return (
35
+ <WPButton className={ buttonClassName } { ...props }>
36
+ { showSpinner && (
37
+ <span
38
+ className="wc-block-components-button__spinner"
39
+ aria-hidden="true"
40
+ />
41
+ ) }
42
+ <span className="wc-block-components-button__text">
43
+ { children }
44
+ </span>
45
+ </WPButton>
46
+ );
47
+ };
48
+
49
+ Button.propTypes = {
50
+ className: PropTypes.string,
51
+ showSpinner: PropTypes.bool,
52
+ children: PropTypes.node,
53
+ };
54
+
55
+ export default Button;
assets/js/base/components/button/index.tsx DELETED
@@ -1,48 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { Button as WPButton } from 'wordpress-components';
5
- import type { ReactNode } from 'react';
6
- import classNames from 'classnames';
7
- import Spinner from '@woocommerce/base-components/spinner';
8
-
9
- /**
10
- * Internal dependencies
11
- */
12
- import './style.scss';
13
-
14
- interface ButtonProps extends WPButton.ButtonProps {
15
- className?: string;
16
- showSpinner?: boolean;
17
- children?: ReactNode;
18
- }
19
-
20
- /**
21
- * Component that visually renders a button but semantically might be `<button>` or `<a>` depending
22
- * on the props.
23
- */
24
- const Button = ( {
25
- className,
26
- showSpinner = false,
27
- children,
28
- ...props
29
- }: ButtonProps ): JSX.Element => {
30
- const buttonClassName = classNames(
31
- 'wc-block-components-button',
32
- className,
33
- {
34
- 'wc-block-components-button--loading': showSpinner,
35
- }
36
- );
37
-
38
- return (
39
- <WPButton className={ buttonClassName } { ...props }>
40
- { showSpinner && <Spinner /> }
41
- <span className="wc-block-components-button__text">
42
- { children }
43
- </span>
44
- </WPButton>
45
- );
46
- };
47
-
48
- export default Button;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/button/style.scss CHANGED
@@ -29,7 +29,45 @@
29
  fill: currentColor;
30
  }
31
  }
32
- .wc-block-components-spinner + .wc-block-components-button__text {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  visibility: hidden;
34
  }
35
  }
 
 
 
 
 
 
 
 
 
 
29
  fill: currentColor;
30
  }
31
  }
32
+ .wc-block-components-button__spinner {
33
+ width: 1em;
34
+ height: 1em;
35
+ position: absolute;
36
+ top: 50%;
37
+ left: 0;
38
+ width: 100%;
39
+ height: 100%;
40
+ margin-top: -0.5em;
41
+ color: inherit;
42
+ box-sizing: content-box;
43
+
44
+ &::after {
45
+ content: " ";
46
+ display: inline-block;
47
+ margin: 0 auto;
48
+ width: 1em;
49
+ height: 1em;
50
+ box-sizing: border-box;
51
+ transform-origin: 50% 50%;
52
+ transform: translateZ(0) scale(0.5);
53
+ backface-visibility: hidden;
54
+ border-radius: 50%;
55
+ border: 0.2em solid currentColor;
56
+ border-left-color: transparent;
57
+ animation: wc-block-components-button__spinner__animation 1s infinite linear;
58
+ }
59
+ }
60
+ .wc-block-components-button__spinner + .wc-block-components-button__text {
61
  visibility: hidden;
62
  }
63
  }
64
+
65
+ @keyframes wc-block-components-button__spinner__animation {
66
+ 0% {
67
+ animation-timing-function: cubic-bezier(0.5856, 0.0703, 0.4143, 0.9297);
68
+ transform: rotate(0deg);
69
+ }
70
+ 100% {
71
+ transform: rotate(360deg);
72
+ }
73
+ }
assets/js/base/components/cart-checkout/address-form/country-address-fields.js ADDED
@@ -0,0 +1,546 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /** @typedef { import('@woocommerce/type-defs/address-fields').CountryAddressFields } CountryAddressFields */
2
+ /** @typedef { import('@woocommerce/type-defs/address-fields').AddressFieldKey } AddressFieldKey */
3
+ /** @typedef { import('@woocommerce/type-defs/address-fields').AddressField } AddressField */
4
+
5
+ /**
6
+ * External dependencies
7
+ */
8
+ import { __ } from '@wordpress/i18n';
9
+
10
+ /**
11
+ * Used to render postcode before the city field.
12
+ *
13
+ * @type {Object <AddressFieldKey, AddressField>}
14
+ */
15
+ const postcodeBeforeCity = {
16
+ city: {
17
+ index: 9,
18
+ },
19
+ postcode: {
20
+ index: 7,
21
+ },
22
+ };
23
+
24
+ /**
25
+ * Used to make the state field optional.
26
+ *
27
+ * @type {Object <AddressFieldKey, AddressField>}
28
+ */
29
+ const optionalState = {
30
+ state: {
31
+ required: false,
32
+ },
33
+ };
34
+
35
+ /**
36
+ * Used to hide the state field.
37
+ *
38
+ * @type {Object <AddressFieldKey, AddressField>}
39
+ */
40
+ const hiddenState = {
41
+ state: {
42
+ required: false,
43
+ hidden: true,
44
+ },
45
+ };
46
+
47
+ /**
48
+ * Used to hide the postcode field.
49
+ *
50
+ * @type {Object <AddressFieldKey, AddressField>}
51
+ */
52
+ const hiddenPostcode = {
53
+ postcode: {
54
+ required: false,
55
+ hidden: true,
56
+ },
57
+ };
58
+
59
+ /**
60
+ * Country specific address field properties.
61
+ *
62
+ * @type {CountryAddressFields}
63
+ */
64
+ const countryAddressFields = {
65
+ AE: {
66
+ ...hiddenPostcode,
67
+ ...optionalState,
68
+ },
69
+ AF: hiddenState,
70
+ AO: {
71
+ ...hiddenPostcode,
72
+ state: {
73
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
74
+ optionalLabel: __(
75
+ 'Province (optional)',
76
+ 'woo-gutenberg-products-block'
77
+ ),
78
+ },
79
+ },
80
+ AT: {
81
+ ...postcodeBeforeCity,
82
+ ...hiddenState,
83
+ },
84
+ AU: {
85
+ city: {
86
+ label: __( 'Suburb', 'woo-gutenberg-products-block' ),
87
+ optionalLabel: __(
88
+ 'Suburb (optional)',
89
+ 'woo-gutenberg-products-block'
90
+ ),
91
+ },
92
+ postcode: {
93
+ label: __( 'Postcode', 'woo-gutenberg-products-block' ),
94
+ optionalLabel: __(
95
+ 'Postcode (optional)',
96
+ 'woo-gutenberg-products-block'
97
+ ),
98
+ },
99
+ state: {
100
+ label: __( 'State', 'woo-gutenberg-products-block' ),
101
+ optionalLabel: __(
102
+ 'State (optional)',
103
+ 'woo-gutenberg-products-block'
104
+ ),
105
+ },
106
+ },
107
+ AX: {
108
+ ...postcodeBeforeCity,
109
+ ...hiddenState,
110
+ },
111
+ BD: {
112
+ postcode: {
113
+ required: false,
114
+ },
115
+ state: {
116
+ label: __( 'District', 'woo-gutenberg-products-block' ),
117
+ optionalLabel: __(
118
+ 'District (optional)',
119
+ 'woo-gutenberg-products-block'
120
+ ),
121
+ },
122
+ },
123
+ BE: {
124
+ ...postcodeBeforeCity,
125
+ ...hiddenState,
126
+ },
127
+ BH: {
128
+ postcode: {
129
+ required: false,
130
+ },
131
+ ...hiddenState,
132
+ },
133
+ BI: hiddenState,
134
+ BO: hiddenPostcode,
135
+ BS: hiddenPostcode,
136
+ CA: {
137
+ state: {
138
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
139
+ optionalLabel: __(
140
+ 'Province (optional)',
141
+ 'woo-gutenberg-products-block'
142
+ ),
143
+ },
144
+ },
145
+ CH: {
146
+ ...postcodeBeforeCity,
147
+ state: {
148
+ label: __( 'Canton', 'woo-gutenberg-products-block' ),
149
+ optionalLabel: __(
150
+ 'Canton (optional)',
151
+ 'woo-gutenberg-products-block'
152
+ ),
153
+ required: false,
154
+ },
155
+ },
156
+ CL: {
157
+ city: {
158
+ require: true,
159
+ },
160
+ postcode: {
161
+ required: false,
162
+ },
163
+ state: {
164
+ label: __( 'Region', 'woo-gutenberg-products-block' ),
165
+ optionalLabel: __(
166
+ 'Region (optional)',
167
+ 'woo-gutenberg-products-block'
168
+ ),
169
+ },
170
+ },
171
+ CN: {
172
+ state: {
173
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
174
+ optionalLabel: __(
175
+ 'Province (optional)',
176
+ 'woo-gutenberg-products-block'
177
+ ),
178
+ },
179
+ },
180
+ CO: {
181
+ postcode: {
182
+ required: false,
183
+ },
184
+ },
185
+ CZ: hiddenState,
186
+ DE: {
187
+ ...postcodeBeforeCity,
188
+ ...hiddenState,
189
+ },
190
+ DK: {
191
+ ...postcodeBeforeCity,
192
+ ...hiddenState,
193
+ },
194
+ EE: {
195
+ ...postcodeBeforeCity,
196
+ ...hiddenState,
197
+ },
198
+ ES: {
199
+ ...postcodeBeforeCity,
200
+ state: {
201
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
202
+ optionalLabel: __(
203
+ 'Province (optional)',
204
+ 'woo-gutenberg-products-block'
205
+ ),
206
+ },
207
+ },
208
+ FI: {
209
+ ...postcodeBeforeCity,
210
+ ...hiddenState,
211
+ },
212
+ FR: {
213
+ ...postcodeBeforeCity,
214
+ ...hiddenState,
215
+ },
216
+ GB: {
217
+ postcode: {
218
+ label: __( 'Postcode', 'woo-gutenberg-products-block' ),
219
+ optionalLabel: __(
220
+ 'Postcode (optional)',
221
+ 'woo-gutenberg-products-block'
222
+ ),
223
+ },
224
+ state: {
225
+ label: __( 'County', 'woo-gutenberg-products-block' ),
226
+ optionalLabel: __(
227
+ 'County (optional)',
228
+ 'woo-gutenberg-products-block'
229
+ ),
230
+ },
231
+ },
232
+ GP: hiddenState,
233
+ GF: hiddenState,
234
+ GR: optionalState,
235
+ HK: {
236
+ postcode: {
237
+ required: false,
238
+ },
239
+ city: {
240
+ label: __( 'Town/District', 'woo-gutenberg-products-block' ),
241
+ optionalLabel: __(
242
+ 'Town/District (optional)',
243
+ 'woo-gutenberg-products-block'
244
+ ),
245
+ },
246
+ state: {
247
+ label: __( 'Region', 'woo-gutenberg-products-block' ),
248
+ optionalLabel: __(
249
+ 'Region (optional)',
250
+ 'woo-gutenberg-products-block'
251
+ ),
252
+ },
253
+ },
254
+ HU: {
255
+ state: {
256
+ label: __( 'County', 'woo-gutenberg-products-block' ),
257
+ optionalLabel: __(
258
+ 'County (optional)',
259
+ 'woo-gutenberg-products-block'
260
+ ),
261
+ },
262
+ },
263
+ ID: {
264
+ state: {
265
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
266
+ optionalLabel: __(
267
+ 'Province (optional)',
268
+ 'woo-gutenberg-products-block'
269
+ ),
270
+ },
271
+ },
272
+ IE: {
273
+ postcode: {
274
+ label: __( 'Eircode', 'woo-gutenberg-products-block' ),
275
+ optionalLabel: __(
276
+ 'Eircode (optional)',
277
+ 'woo-gutenberg-products-block'
278
+ ),
279
+ required: false,
280
+ },
281
+ state: {
282
+ label: __( 'County', 'woo-gutenberg-products-block' ),
283
+ optionalLabel: __(
284
+ 'County (optional)',
285
+ 'woo-gutenberg-products-block'
286
+ ),
287
+ },
288
+ },
289
+ IS: {
290
+ ...postcodeBeforeCity,
291
+ ...hiddenState,
292
+ },
293
+ IL: {
294
+ ...postcodeBeforeCity,
295
+ ...hiddenState,
296
+ },
297
+ IM: hiddenState,
298
+ IT: {
299
+ ...postcodeBeforeCity,
300
+ state: {
301
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
302
+ optionalLabel: __(
303
+ 'Province (optional)',
304
+ 'woo-gutenberg-products-block'
305
+ ),
306
+ },
307
+ },
308
+ JP: {
309
+ first_name: {
310
+ index: 2,
311
+ },
312
+ last_name: {
313
+ index: 1,
314
+ },
315
+ address_1: {
316
+ index: 7,
317
+ },
318
+ address_2: {
319
+ index: 8,
320
+ },
321
+ postcode: {
322
+ index: 4,
323
+ },
324
+ city: {
325
+ index: 6,
326
+ },
327
+ state: {
328
+ label: __( 'Prefecture', 'woo-gutenberg-products-block' ),
329
+ optionalLabel: __(
330
+ 'Prefecture (optional)',
331
+ 'woo-gutenberg-products-block'
332
+ ),
333
+ index: 5,
334
+ },
335
+ },
336
+ KR: hiddenState,
337
+ KW: hiddenState,
338
+ LB: hiddenState,
339
+ LI: {
340
+ ...postcodeBeforeCity,
341
+ state: {
342
+ label: __( 'Municipality', 'woo-gutenberg-products-block' ),
343
+ optionalLabel: __(
344
+ 'Municipality (optional)',
345
+ 'woo-gutenberg-products-block'
346
+ ),
347
+ required: false,
348
+ },
349
+ },
350
+ LK: hiddenState,
351
+ LU: hiddenState,
352
+ LV: {
353
+ state: {
354
+ label: __( 'Municipality', 'woo-gutenberg-products-block' ),
355
+ optionalLabel: __(
356
+ 'Municipality (optional)',
357
+ 'woo-gutenberg-products-block'
358
+ ),
359
+ required: false,
360
+ },
361
+ },
362
+ MQ: hiddenState,
363
+ MT: hiddenState,
364
+ MZ: {
365
+ ...hiddenPostcode,
366
+ state: {
367
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
368
+ optionalLabel: __(
369
+ 'Province (optional)',
370
+ 'woo-gutenberg-products-block'
371
+ ),
372
+ },
373
+ },
374
+ NL: {
375
+ ...postcodeBeforeCity,
376
+ ...hiddenState,
377
+ },
378
+ NG: {
379
+ ...hiddenPostcode,
380
+ state: {
381
+ label: __( 'State', 'woo-gutenberg-products-block' ),
382
+ optionalLabel: __(
383
+ 'State (optional)',
384
+ 'woo-gutenberg-products-block'
385
+ ),
386
+ },
387
+ },
388
+ NO: {
389
+ ...postcodeBeforeCity,
390
+ ...hiddenState,
391
+ },
392
+ NP: {
393
+ postcode: {
394
+ required: false,
395
+ },
396
+ state: {
397
+ label: __( 'State', 'woo-gutenberg-products-block' ),
398
+ optionalLabel: __(
399
+ 'State (optional)',
400
+ 'woo-gutenberg-products-block'
401
+ ),
402
+ },
403
+ },
404
+ NZ: {
405
+ postcode: {
406
+ label: __( 'Postcode', 'woo-gutenberg-products-block' ),
407
+ optionalLabel: __(
408
+ 'Postcode (optional)',
409
+ 'woo-gutenberg-products-block'
410
+ ),
411
+ },
412
+ state: {
413
+ label: __( 'Region', 'woo-gutenberg-products-block' ),
414
+ optionalLabel: __(
415
+ 'Region (optional)',
416
+ 'woo-gutenberg-products-block'
417
+ ),
418
+ },
419
+ },
420
+ PL: {
421
+ ...postcodeBeforeCity,
422
+ ...hiddenState,
423
+ },
424
+ PT: hiddenState,
425
+ RE: hiddenState,
426
+ RO: {
427
+ state: {
428
+ label: __( 'County', 'woo-gutenberg-products-block' ),
429
+ optionalLabel: __(
430
+ 'County (optional)',
431
+ 'woo-gutenberg-products-block'
432
+ ),
433
+ },
434
+ },
435
+ RS: hiddenState,
436
+ SE: {
437
+ ...postcodeBeforeCity,
438
+ ...hiddenState,
439
+ },
440
+ SG: {
441
+ city: {
442
+ required: false,
443
+ },
444
+ ...hiddenState,
445
+ },
446
+ SK: {
447
+ ...postcodeBeforeCity,
448
+ ...hiddenState,
449
+ },
450
+ SI: {
451
+ ...postcodeBeforeCity,
452
+ ...hiddenState,
453
+ },
454
+ SR: {
455
+ ...hiddenPostcode,
456
+ },
457
+ ST: {
458
+ ...hiddenPostcode,
459
+ state: {
460
+ label: __( 'District', 'woo-gutenberg-products-block' ),
461
+ optionalLabel: __(
462
+ 'District (optional)',
463
+ 'woo-gutenberg-products-block'
464
+ ),
465
+ },
466
+ },
467
+ MD: {
468
+ state: {
469
+ label: __(
470
+ 'Municipality/District',
471
+ 'woo-gutenberg-products-block'
472
+ ),
473
+ optionalLabel: __(
474
+ 'Municipality/District (optional)',
475
+ 'woo-gutenberg-products-block'
476
+ ),
477
+ },
478
+ },
479
+ TR: {
480
+ ...postcodeBeforeCity,
481
+ state: {
482
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
483
+ optionalLabel: __(
484
+ 'Province (optional)',
485
+ 'woo-gutenberg-products-block'
486
+ ),
487
+ },
488
+ },
489
+ UG: {
490
+ ...hiddenPostcode,
491
+ city: {
492
+ label: __( 'Town/Village', 'woo-gutenberg-products-block' ),
493
+ optionalLabel: __(
494
+ 'Town/Village (optional)',
495
+ 'woo-gutenberg-products-block'
496
+ ),
497
+ },
498
+ state: {
499
+ label: __( 'District', 'woo-gutenberg-products-block' ),
500
+ optionalLabel: __(
501
+ 'District (optional)',
502
+ 'woo-gutenberg-products-block'
503
+ ),
504
+ },
505
+ },
506
+ US: {
507
+ postcode: {
508
+ label: __( 'ZIP', 'woo-gutenberg-products-block' ),
509
+ optionalLabel: __(
510
+ 'ZIP (optional)',
511
+ 'woo-gutenberg-products-block'
512
+ ),
513
+ },
514
+ state: {
515
+ label: __( 'State', 'woo-gutenberg-products-block' ),
516
+ optionalLabel: __(
517
+ 'State (optional)',
518
+ 'woo-gutenberg-products-block'
519
+ ),
520
+ },
521
+ },
522
+ VN: {
523
+ city: {
524
+ index: 8,
525
+ },
526
+ postcode: {
527
+ index: 7,
528
+ required: false,
529
+ },
530
+ ...hiddenState,
531
+ },
532
+ WS: hiddenPostcode,
533
+ YT: hiddenState,
534
+ ZA: {
535
+ state: {
536
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
537
+ optionalLabel: __(
538
+ 'Province (optional)',
539
+ 'woo-gutenberg-products-block'
540
+ ),
541
+ },
542
+ },
543
+ ZW: hiddenPostcode,
544
+ };
545
+
546
+ export default countryAddressFields;
assets/js/{settings/shared/default-address-fields.ts → base/components/cart-checkout/address-form/default-address-fields.js} RENAMED
@@ -1,74 +1,24 @@
 
 
1
  /**
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
 
6
- export interface AddressField {
7
- // The label for the field.
8
- label: string;
9
- // The label for the field if made optional.
10
- optionalLabel: string;
11
- // The HTML autocomplete attribute value. See https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete
12
- autocomplete: string;
13
- // How this field value is capitalized.
14
- autocapitalize?: string;
15
- // Set to true if the field is required.
16
- required: boolean;
17
- // Set to true if the field should not be rendered.
18
- hidden: boolean;
19
- // Fields will be sorted and render in this order, lowest to highest.
20
- index: number;
21
- }
22
-
23
- export interface LocaleSpecificAddressField extends AddressField {
24
- priority: number;
25
- }
26
-
27
- export interface AddressFields {
28
- // eslint-disable-next-line camelcase
29
- first_name: AddressField;
30
- // eslint-disable-next-line camelcase
31
- last_name: AddressField;
32
- company: AddressField;
33
- // eslint-disable-next-line camelcase
34
- address_1: AddressField;
35
- // eslint-disable-next-line camelcase
36
- address_2: AddressField;
37
- country: AddressField;
38
- city: AddressField;
39
- state: AddressField;
40
- postcode: AddressField;
41
- }
42
-
43
- export type AddressType = 'billing' | 'shipping';
44
- export interface EnteredAddress {
45
- // eslint-disable-next-line camelcase
46
- first_name: string;
47
- // eslint-disable-next-line camelcase
48
- last_name: string;
49
- company: string;
50
- // eslint-disable-next-line camelcase
51
- address_1: string;
52
- // eslint-disable-next-line camelcase
53
- address_2: string;
54
- country: string;
55
- city: string;
56
- state: string;
57
- postcode: string;
58
- }
59
-
60
- export type KeyedAddressField = AddressField & {
61
- key: keyof AddressFields;
62
- errorMessage?: string;
63
- };
64
- export type ShippingAddress = EnteredAddress;
65
- export type BillingAddress = EnteredAddress;
66
- export type CountryAddressFields = Record< string, AddressFields >;
67
-
68
  /**
69
  * Default address field properties.
 
 
 
 
 
 
 
 
 
 
70
  */
71
- export const defaultAddressFields: AddressFields = {
72
  first_name: {
73
  label: __( 'First name', 'woo-gutenberg-products-block' ),
74
  optionalLabel: __(
@@ -79,7 +29,7 @@ export const defaultAddressFields: AddressFields = {
79
  autocapitalize: 'sentences',
80
  required: true,
81
  hidden: false,
82
- index: 10,
83
  },
84
  last_name: {
85
  label: __( 'Last name', 'woo-gutenberg-products-block' ),
@@ -91,7 +41,7 @@ export const defaultAddressFields: AddressFields = {
91
  autocapitalize: 'sentences',
92
  required: true,
93
  hidden: false,
94
- index: 20,
95
  },
96
  company: {
97
  label: __( 'Company', 'woo-gutenberg-products-block' ),
@@ -103,7 +53,7 @@ export const defaultAddressFields: AddressFields = {
103
  autocapitalize: 'sentences',
104
  required: false,
105
  hidden: false,
106
- index: 30,
107
  },
108
  address_1: {
109
  label: __( 'Address', 'woo-gutenberg-products-block' ),
@@ -115,7 +65,7 @@ export const defaultAddressFields: AddressFields = {
115
  autocapitalize: 'sentences',
116
  required: true,
117
  hidden: false,
118
- index: 40,
119
  },
120
  address_2: {
121
  label: __( 'Apartment, suite, etc.', 'woo-gutenberg-products-block' ),
@@ -127,7 +77,7 @@ export const defaultAddressFields: AddressFields = {
127
  autocapitalize: 'sentences',
128
  required: false,
129
  hidden: false,
130
- index: 50,
131
  },
132
  country: {
133
  label: __( 'Country/Region', 'woo-gutenberg-products-block' ),
@@ -138,7 +88,7 @@ export const defaultAddressFields: AddressFields = {
138
  autocomplete: 'country',
139
  required: true,
140
  hidden: false,
141
- index: 60,
142
  },
143
  city: {
144
  label: __( 'City', 'woo-gutenberg-products-block' ),
@@ -147,7 +97,7 @@ export const defaultAddressFields: AddressFields = {
147
  autocapitalize: 'sentences',
148
  required: true,
149
  hidden: false,
150
- index: 70,
151
  },
152
  state: {
153
  label: __( 'State/County', 'woo-gutenberg-products-block' ),
@@ -159,7 +109,7 @@ export const defaultAddressFields: AddressFields = {
159
  autocapitalize: 'sentences',
160
  required: true,
161
  hidden: false,
162
- index: 80,
163
  },
164
  postcode: {
165
  label: __( 'Postal code', 'woo-gutenberg-products-block' ),
@@ -171,8 +121,8 @@ export const defaultAddressFields: AddressFields = {
171
  autocapitalize: 'characters',
172
  required: true,
173
  hidden: false,
174
- index: 90,
175
  },
176
  };
177
 
178
- export default defaultAddressFields;
1
+ /** @typedef { import('@woocommerce/type-defs/address-fields').AddressField } AddressField */
2
+
3
  /**
4
  * External dependencies
5
  */
6
  import { __ } from '@wordpress/i18n';
7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  /**
9
  * Default address field properties.
10
+ *
11
+ * @property {AddressField} first_name Customer first name.
12
+ * @property {AddressField} last_name Customer last name.
13
+ * @property {AddressField} company Company name.
14
+ * @property {AddressField} address_1 Street address.
15
+ * @property {AddressField} address_2 Second line of address.
16
+ * @property {AddressField} country Country code.
17
+ * @property {AddressField} city City name.
18
+ * @property {AddressField} state State name or code.
19
+ * @property {AddressField} postcode Postal code.
20
  */
21
+ const AddressFields = {
22
  first_name: {
23
  label: __( 'First name', 'woo-gutenberg-products-block' ),
24
  optionalLabel: __(
29
  autocapitalize: 'sentences',
30
  required: true,
31
  hidden: false,
32
+ index: 1,
33
  },
34
  last_name: {
35
  label: __( 'Last name', 'woo-gutenberg-products-block' ),
41
  autocapitalize: 'sentences',
42
  required: true,
43
  hidden: false,
44
+ index: 2,
45
  },
46
  company: {
47
  label: __( 'Company', 'woo-gutenberg-products-block' ),
53
  autocapitalize: 'sentences',
54
  required: false,
55
  hidden: false,
56
+ index: 3,
57
  },
58
  address_1: {
59
  label: __( 'Address', 'woo-gutenberg-products-block' ),
65
  autocapitalize: 'sentences',
66
  required: true,
67
  hidden: false,
68
+ index: 4,
69
  },
70
  address_2: {
71
  label: __( 'Apartment, suite, etc.', 'woo-gutenberg-products-block' ),
77
  autocapitalize: 'sentences',
78
  required: false,
79
  hidden: false,
80
+ index: 5,
81
  },
82
  country: {
83
  label: __( 'Country/Region', 'woo-gutenberg-products-block' ),
88
  autocomplete: 'country',
89
  required: true,
90
  hidden: false,
91
+ index: 6,
92
  },
93
  city: {
94
  label: __( 'City', 'woo-gutenberg-products-block' ),
97
  autocapitalize: 'sentences',
98
  required: true,
99
  hidden: false,
100
+ index: 7,
101
  },
102
  state: {
103
  label: __( 'State/County', 'woo-gutenberg-products-block' ),
109
  autocapitalize: 'sentences',
110
  required: true,
111
  hidden: false,
112
+ index: 8,
113
  },
114
  postcode: {
115
  label: __( 'Postal code', 'woo-gutenberg-products-block' ),
121
  autocapitalize: 'characters',
122
  required: true,
123
  hidden: false,
124
+ index: 9,
125
  },
126
  };
127
 
128
+ export default AddressFields;
assets/js/base/components/cart-checkout/address-form/{address-form.tsx → index.js} RENAMED
@@ -2,7 +2,7 @@
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
- import { ValidatedTextInput } from '@woocommerce/base-components/text-input';
6
  import {
7
  BillingCountryInput,
8
  ShippingCountryInput,
@@ -12,31 +12,24 @@ import {
12
  ShippingStateInput,
13
  } from '@woocommerce/base-components/state-input';
14
  import { useValidationContext } from '@woocommerce/base-context';
15
- import { useEffect, useMemo } from '@wordpress/element';
16
  import { __ } from '@wordpress/i18n';
17
  import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
18
- import { useShallowEqual } from '@woocommerce/base-hooks';
19
- import {
20
- AddressField,
21
- AddressFields,
22
- AddressType,
23
- defaultAddressFields,
24
- EnteredAddress,
25
- } from '@woocommerce/settings';
26
 
27
  /**
28
  * Internal dependencies
29
  */
30
- import prepareAddressFields from './prepare-address-fields';
 
31
 
32
  // If it's the shipping address form and the user starts entering address
33
  // values without having set the country first, show an error.
34
  const validateShippingCountry = (
35
- values: EnteredAddress,
36
- setValidationErrors: ( errors: Record< string, unknown > ) => void,
37
- clearValidationError: ( error: string ) => void,
38
- hasValidationError: boolean
39
- ): void => {
40
  if (
41
  ! hasValidationError &&
42
  ! values.country &&
@@ -57,15 +50,6 @@ const validateShippingCountry = (
57
  }
58
  };
59
 
60
- interface AddressFormProps {
61
- id: string;
62
- instanceId: string;
63
- fields: ( keyof AddressFields )[];
64
- fieldConfig: Record< keyof AddressFields, Partial< AddressField > >;
65
- onChange: ( newValue: EnteredAddress ) => void;
66
- type: AddressType;
67
- values: EnteredAddress;
68
- }
69
  /**
70
  * Checkout address form.
71
  *
@@ -80,45 +64,37 @@ interface AddressFormProps {
80
  */
81
  const AddressForm = ( {
82
  id,
83
- fields = ( Object.keys(
84
- defaultAddressFields
85
- ) as unknown ) as ( keyof AddressFields )[],
86
- fieldConfig = {} as Record< keyof AddressFields, Partial< AddressField > >,
87
  instanceId,
88
  onChange,
89
  type = 'shipping',
90
  values,
91
- }: AddressFormProps ): JSX.Element => {
92
  const {
93
  getValidationError,
94
  setValidationErrors,
95
  clearValidationError,
96
  } = useValidationContext();
97
-
98
- const currentFields = useShallowEqual( fields );
99
-
100
- const countryValidationError = ( getValidationError(
101
- 'shipping-missing-country'
102
- ) || {} ) as {
103
- message: string;
104
- hidden: boolean;
105
- };
106
-
107
- const addressFormFields = useMemo( () => {
108
- return prepareAddressFields(
109
- currentFields,
110
- fieldConfig,
111
- values.country
112
- );
113
- }, [ currentFields, fieldConfig, values.country ] );
114
-
115
  useEffect( () => {
116
  if ( type === 'shipping' ) {
117
  validateShippingCountry(
118
  values,
119
  setValidationErrors,
120
  clearValidationError,
121
- !! countryValidationError.message &&
122
  ! countryValidationError.hidden
123
  );
124
  }
@@ -135,7 +111,7 @@ const AddressForm = ( {
135
 
136
  return (
137
  <div id={ id } className="wc-block-components-address-form">
138
- { addressFormFields.map( ( field ) => {
139
  if ( field.hidden ) {
140
  return null;
141
  }
@@ -206,7 +182,7 @@ const AddressForm = ( {
206
  }
207
 
208
  return (
209
- <ValidatedTextInput
210
  key={ field.key }
211
  id={ `${ id }-${ field.key }` }
212
  className={ `wc-block-components-address-form__${ field.key }` }
@@ -216,7 +192,7 @@ const AddressForm = ( {
216
  value={ values[ field.key ] }
217
  autoCapitalize={ field.autocapitalize }
218
  autoComplete={ field.autocomplete }
219
- onChange={ ( newValue: string ) =>
220
  onChange( {
221
  ...values,
222
  [ field.key ]: newValue,
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
+ import { DebouncedValidatedTextInput } from '@woocommerce/base-components/text-input';
6
  import {
7
  BillingCountryInput,
8
  ShippingCountryInput,
12
  ShippingStateInput,
13
  } from '@woocommerce/base-components/state-input';
14
  import { useValidationContext } from '@woocommerce/base-context';
15
+ import { useEffect } from '@wordpress/element';
16
  import { __ } from '@wordpress/i18n';
17
  import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
 
 
 
 
 
 
 
 
18
 
19
  /**
20
  * Internal dependencies
21
  */
22
+ import defaultAddressFields from './default-address-fields';
23
+ import countryAddressFields from './country-address-fields';
24
 
25
  // If it's the shipping address form and the user starts entering address
26
  // values without having set the country first, show an error.
27
  const validateShippingCountry = (
28
+ values,
29
+ setValidationErrors,
30
+ clearValidationError,
31
+ hasValidationError
32
+ ) => {
33
  if (
34
  ! hasValidationError &&
35
  ! values.country &&
50
  }
51
  };
52
 
 
 
 
 
 
 
 
 
 
53
  /**
54
  * Checkout address form.
55
  *
64
  */
65
  const AddressForm = ( {
66
  id,
67
+ fields = Object.keys( defaultAddressFields ),
68
+ fieldConfig = {},
 
 
69
  instanceId,
70
  onChange,
71
  type = 'shipping',
72
  values,
73
+ } ) => {
74
  const {
75
  getValidationError,
76
  setValidationErrors,
77
  clearValidationError,
78
  } = useValidationContext();
79
+ const countryLocale = countryAddressFields[ values.country ] || {};
80
+ const addressFields = fields.map( ( field ) => ( {
81
+ key: field,
82
+ ...defaultAddressFields[ field ],
83
+ ...countryLocale[ field ],
84
+ ...fieldConfig[ field ],
85
+ } ) );
86
+ const sortedAddressFields = addressFields.sort(
87
+ ( a, b ) => a.index - b.index
88
+ );
89
+ const countryValidationError =
90
+ getValidationError( 'shipping-missing-country' ) || {};
 
 
 
 
 
 
91
  useEffect( () => {
92
  if ( type === 'shipping' ) {
93
  validateShippingCountry(
94
  values,
95
  setValidationErrors,
96
  clearValidationError,
97
+ countryValidationError.message &&
98
  ! countryValidationError.hidden
99
  );
100
  }
111
 
112
  return (
113
  <div id={ id } className="wc-block-components-address-form">
114
+ { sortedAddressFields.map( ( field ) => {
115
  if ( field.hidden ) {
116
  return null;
117
  }
182
  }
183
 
184
  return (
185
+ <DebouncedValidatedTextInput
186
  key={ field.key }
187
  id={ `${ id }-${ field.key }` }
188
  className={ `wc-block-components-address-form__${ field.key }` }
192
  value={ values[ field.key ] }
193
  autoCapitalize={ field.autocapitalize }
194
  autoComplete={ field.autocomplete }
195
+ onChange={ ( newValue ) =>
196
  onChange( {
197
  ...values,
198
  [ field.key ]: newValue,
assets/js/base/components/cart-checkout/address-form/index.ts DELETED
@@ -1 +0,0 @@
1
- export { default as AddressForm } from './address-form';
 
assets/js/base/components/cart-checkout/address-form/prepare-address-fields.ts DELETED
@@ -1,131 +0,0 @@
1
- /** @typedef { import('@woocommerce/type-defs/address-fields').CountryAddressFields } CountryAddressFields */
2
-
3
- /**
4
- * External dependencies
5
- */
6
- import {
7
- AddressField,
8
- AddressFields,
9
- CountryAddressFields,
10
- defaultAddressFields,
11
- getSetting,
12
- KeyedAddressField,
13
- LocaleSpecificAddressField,
14
- } from '@woocommerce/settings';
15
- import { __, sprintf } from '@wordpress/i18n';
16
- import { isNumber, isString } from '@woocommerce/types';
17
-
18
- /**
19
- * This is locale data from WooCommerce countries class. This doesn't match the shape of the new field data blocks uses,
20
- * but we can import part of it to set which fields are required.
21
- *
22
- * This supports new properties such as optionalLabel which are not used by core (yet).
23
- */
24
- const coreLocale = getSetting< CountryAddressFields >( 'countryLocale', {} );
25
-
26
- /**
27
- * Gets props from the core locale, then maps them to the shape we require in the client.
28
- *
29
- * Ignores "class", "type", "placeholder", and "autocomplete" props from core.
30
- *
31
- * @param {Object} localeField Locale fields from WooCommerce.
32
- * @return {Object} Supported locale fields.
33
- */
34
- const getSupportedCoreLocaleProps = (
35
- localeField: LocaleSpecificAddressField
36
- ): Partial< AddressField > => {
37
- const fields: Partial< AddressField > = {};
38
-
39
- if ( localeField.label !== undefined ) {
40
- fields.label = localeField.label;
41
- }
42
-
43
- if ( localeField.required !== undefined ) {
44
- fields.required = localeField.required;
45
- }
46
-
47
- if ( localeField.hidden !== undefined ) {
48
- fields.hidden = localeField.hidden;
49
- }
50
-
51
- if ( localeField.label !== undefined && ! localeField.optionalLabel ) {
52
- fields.optionalLabel = sprintf(
53
- /* translators: %s Field label. */
54
- __( '%s (optional)', 'woo-gutenberg-products-block' ),
55
- localeField.label
56
- );
57
- }
58
-
59
- if ( localeField.priority ) {
60
- if ( isNumber( localeField.priority ) ) {
61
- fields.index = localeField.priority;
62
- }
63
- if ( isString( localeField.priority ) ) {
64
- fields.index = parseInt( localeField.priority, 10 );
65
- }
66
- }
67
-
68
- if ( localeField.hidden ) {
69
- fields.required = false;
70
- }
71
-
72
- return fields;
73
- };
74
-
75
- const countryAddressFields: CountryAddressFields = Object.entries( coreLocale )
76
- .map( ( [ country, countryLocale ] ) => [
77
- country,
78
- Object.entries( countryLocale )
79
- .map( ( [ localeFieldKey, localeField ] ) => [
80
- localeFieldKey,
81
- getSupportedCoreLocaleProps( localeField ),
82
- ] )
83
- .reduce( ( obj, [ key, val ] ) => {
84
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
85
- // @ts-ignore - Ignoring because it should be fine as long as the data from the server is correct. TS won't catch it anyway if it's not.
86
- obj[ key ] = val;
87
- return obj;
88
- }, {} ),
89
- ] )
90
- .reduce( ( obj, [ key, val ] ) => {
91
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
92
- // @ts-ignore - Ignoring because it should be fine as long as the data from the server is correct. TS won't catch it anyway if it's not.
93
- obj[ key ] = val;
94
- return obj;
95
- }, {} );
96
-
97
- /**
98
- * Combines address fields, including fields from the locale, and sorts them by index.
99
- *
100
- * @param {Array} fields List of field keys--only address fields matching these will be returned.
101
- * @param {Object} fieldConfigs Fields config contains field specific overrides at block level which may, for example, hide a field.
102
- * @param {string} addressCountry Address country code. If unknown, locale fields will not be merged.
103
- * @return {CountryAddressFields} Object containing address fields.
104
- */
105
- const prepareAddressFields = (
106
- fields: ( keyof AddressFields )[],
107
- fieldConfigs: Record< string, Partial< AddressField > >,
108
- addressCountry = ''
109
- ): KeyedAddressField[] => {
110
- const localeConfigs: AddressFields =
111
- addressCountry && countryAddressFields[ addressCountry ] !== undefined
112
- ? countryAddressFields[ addressCountry ]
113
- : ( {} as AddressFields );
114
-
115
- return fields
116
- .map( ( field ) => {
117
- const defaultConfig = defaultAddressFields[ field ] || {};
118
- const localeConfig = localeConfigs[ field ] || {};
119
- const fieldConfig = fieldConfigs[ field ] || {};
120
-
121
- return {
122
- key: field,
123
- ...defaultConfig,
124
- ...localeConfig,
125
- ...fieldConfig,
126
- };
127
- } )
128
- .sort( ( a, b ) => a.index - b.index );
129
- };
130
-
131
- export default prepareAddressFields;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/address-form/test/index.js DELETED
@@ -1,178 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { render, screen } from '@testing-library/react';
5
- import userEvent from '@testing-library/user-event';
6
- import { CheckoutProvider } from '@woocommerce/base-context';
7
- import { useCheckoutAddress } from '@woocommerce/base-context/hooks';
8
-
9
- /**
10
- * Internal dependencies
11
- */
12
- import AddressForm from '../address-form';
13
-
14
- const renderInCheckoutProvider = ( ui, options = {} ) => {
15
- const Wrapper = ( { children } ) => {
16
- return <CheckoutProvider>{ children }</CheckoutProvider>;
17
- };
18
- return render( ui, { wrapper: Wrapper, ...options } );
19
- };
20
-
21
- // Countries used in testing addresses must be in the wcSettings global.
22
- // See: tests/js/setup-globals.js
23
- const primaryAddress = {
24
- country: 'United Kingdom (UK)',
25
- countryKey: 'GB',
26
- city: 'London',
27
- state: 'Greater London',
28
- postcode: 'ABCD',
29
- };
30
- const secondaryAddress = {
31
- country: 'Austria', // We use Austria because it doesn't have states.
32
- countryKey: 'AU',
33
- city: 'Vienna',
34
- postcode: 'DCBA',
35
- };
36
- const tertiaryAddress = {
37
- country: 'Canada', // We use Canada because it has a select for the state.
38
- countryKey: 'CA',
39
- city: 'Toronto',
40
- state: 'Ontario',
41
- postcode: 'EFGH',
42
- };
43
-
44
- const countryRegExp = /country/i;
45
- const cityRegExp = /city/i;
46
- const stateRegExp = /county|province|state/i;
47
- const postalCodeRegExp = /postal code|postcode|zip/i;
48
-
49
- const inputAddress = ( {
50
- country = null,
51
- city = null,
52
- state = null,
53
- postcode = null,
54
- } ) => {
55
- if ( country ) {
56
- const countryButton = screen.getByRole( 'button', {
57
- name: countryRegExp,
58
- } );
59
- userEvent.click( countryButton );
60
- userEvent.click( screen.getByRole( 'option', { name: country } ) );
61
- }
62
- if ( city ) {
63
- const cityInput = screen.getByLabelText( cityRegExp );
64
- userEvent.type( cityInput, city );
65
- }
66
- if ( state ) {
67
- const stateButton = screen.queryByRole( 'button', {
68
- name: stateRegExp,
69
- } );
70
- // State input might be a select or a text input.
71
- if ( stateButton ) {
72
- userEvent.click( stateButton );
73
- userEvent.click( screen.getByRole( 'option', { name: state } ) );
74
- } else {
75
- const stateInput = screen.getByLabelText( stateRegExp );
76
- userEvent.type( stateInput, state );
77
- }
78
- }
79
- if ( postcode ) {
80
- const postcodeInput = screen.getByLabelText( postalCodeRegExp );
81
- userEvent.type( postcodeInput, postcode );
82
- }
83
- };
84
-
85
- describe( 'AddressForm Component', () => {
86
- const WrappedAddressForm = ( { type } ) => {
87
- const {
88
- defaultAddressFields,
89
- setShippingFields,
90
- shippingFields,
91
- } = useCheckoutAddress();
92
-
93
- return (
94
- <AddressForm
95
- type={ type }
96
- onChange={ setShippingFields }
97
- values={ shippingFields }
98
- fields={ Object.keys( defaultAddressFields ) }
99
- />
100
- );
101
- };
102
- const ShippingFields = () => {
103
- const { shippingFields } = useCheckoutAddress();
104
-
105
- return (
106
- <ul>
107
- { Object.keys( shippingFields ).map( ( key ) => (
108
- <li key={ key }>{ key + ': ' + shippingFields[ key ] }</li>
109
- ) ) }
110
- </ul>
111
- );
112
- };
113
-
114
- it( 'updates context value when interacting with form elements', () => {
115
- renderInCheckoutProvider(
116
- <>
117
- <WrappedAddressForm type="shipping" />
118
- <ShippingFields />
119
- </>
120
- );
121
-
122
- inputAddress( primaryAddress );
123
-
124
- expect( screen.getByText( /country/ ) ).toHaveTextContent(
125
- `country: ${ primaryAddress.countryKey }`
126
- );
127
- expect( screen.getByText( /city/ ) ).toHaveTextContent(
128
- `city: ${ primaryAddress.city }`
129
- );
130
- expect( screen.getByText( /state/ ) ).toHaveTextContent(
131
- `state: ${ primaryAddress.state }`
132
- );
133
- expect( screen.getByText( /postcode/ ) ).toHaveTextContent(
134
- `postcode: ${ primaryAddress.postcode }`
135
- );
136
- } );
137
-
138
- it( 'input fields update when changing the country', () => {
139
- renderInCheckoutProvider( <WrappedAddressForm type="shipping" /> );
140
-
141
- inputAddress( primaryAddress );
142
-
143
- // Verify correct labels are used.
144
- expect( screen.getByLabelText( /City/ ) ).toBeInTheDocument();
145
- expect( screen.getByLabelText( /County/ ) ).toBeInTheDocument();
146
- expect( screen.getByLabelText( /Postcode/ ) ).toBeInTheDocument();
147
-
148
- inputAddress( secondaryAddress );
149
-
150
- // Verify state input has been removed.
151
- expect( screen.queryByText( stateRegExp ) ).not.toBeInTheDocument();
152
-
153
- inputAddress( tertiaryAddress );
154
-
155
- // Verify postal code input label changed.
156
- expect( screen.getByLabelText( /Postal code/ ) ).toBeInTheDocument();
157
- } );
158
-
159
- it( 'input values are reset after changing the country', () => {
160
- renderInCheckoutProvider( <WrappedAddressForm type="shipping" /> );
161
-
162
- inputAddress( secondaryAddress );
163
- // Only update `country` to verify other values are reset.
164
- inputAddress( { country: primaryAddress.country } );
165
-
166
- expect( screen.getByLabelText( cityRegExp ).value ).toBe( '' );
167
- expect( screen.getByLabelText( stateRegExp ).value ).toBe( '' );
168
- expect( screen.getByLabelText( postalCodeRegExp ).value ).toBe( '' );
169
-
170
- // Repeat the test with an address which has a select for the state.
171
- inputAddress( tertiaryAddress );
172
- inputAddress( { country: primaryAddress.country } );
173
-
174
- expect( screen.getByLabelText( cityRegExp ).value ).toBe( '' );
175
- expect( screen.getByLabelText( stateRegExp ).value ).toBe( '' );
176
- expect( screen.getByLabelText( postalCodeRegExp ).value ).toBe( '' );
177
- } );
178
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/form-step/style.scss CHANGED
@@ -94,4 +94,8 @@
94
  left: -$gap-larger/2;
95
  top: 0;
96
  }
 
 
 
 
97
  }
94
  left: -$gap-larger/2;
95
  top: 0;
96
  }
97
+
98
+ &:last-of-type .wc-block-components-checkout-step__container::after {
99
+ content: none;
100
+ }
101
  }
assets/js/base/components/cart-checkout/index.js CHANGED
@@ -1,20 +1,20 @@
1
- export * from './address-form';
2
  export { default as FormStep } from './form-step';
3
  export { default as OrderSummary } from './order-summary';
4
  export { default as PlaceOrderButton } from './place-order-button';
5
  export { default as Policies } from './policies';
6
  export { default as ProductBackorderBadge } from './product-backorder-badge';
7
- export { default as ProductDetails } from './product-details';
8
  export { default as ProductImage } from './product-image';
9
  export { default as ProductLowStockBadge } from './product-low-stock-badge';
10
  export { default as ProductSummary } from './product-summary';
11
  export { default as ProductMetadata } from './product-metadata';
 
12
  export { default as ProductSaleBadge } from './product-sale-badge';
 
13
  export { default as ReturnToCartButton } from './return-to-cart-button';
14
  export { default as ShippingCalculator } from './shipping-calculator';
15
  export { default as ShippingLocation } from './shipping-location';
16
  export { default as ShippingRatesControl } from './shipping-rates-control';
17
- export { default as ShippingRatesControlPackage } from './shipping-rates-control-package';
18
  export { default as PaymentMethodIcons } from './payment-method-icons';
19
  export { default as PaymentMethodLabel } from './payment-method-label';
20
- export * from './totals';
1
+ export { default as AddressForm } from './address-form';
2
  export { default as FormStep } from './form-step';
3
  export { default as OrderSummary } from './order-summary';
4
  export { default as PlaceOrderButton } from './place-order-button';
5
  export { default as Policies } from './policies';
6
  export { default as ProductBackorderBadge } from './product-backorder-badge';
 
7
  export { default as ProductImage } from './product-image';
8
  export { default as ProductLowStockBadge } from './product-low-stock-badge';
9
  export { default as ProductSummary } from './product-summary';
10
  export { default as ProductMetadata } from './product-metadata';
11
+ export { default as ProductName } from './product-name';
12
  export { default as ProductSaleBadge } from './product-sale-badge';
13
+ export { default as ProductVariationData } from './product-variation-data';
14
  export { default as ReturnToCartButton } from './return-to-cart-button';
15
  export { default as ShippingCalculator } from './shipping-calculator';
16
  export { default as ShippingLocation } from './shipping-location';
17
  export { default as ShippingRatesControl } from './shipping-rates-control';
 
18
  export { default as PaymentMethodIcons } from './payment-method-icons';
19
  export { default as PaymentMethodLabel } from './payment-method-label';
20
+ export * from './totals/index.js';
assets/js/base/components/cart-checkout/order-summary/index.js CHANGED
@@ -4,7 +4,7 @@
4
  import { __ } from '@wordpress/i18n';
5
  import PropTypes from 'prop-types';
6
  import { useContainerWidthContext } from '@woocommerce/base-context';
7
- import { Panel } from '@woocommerce/blocks-checkout';
8
 
9
  /**
10
  * Internal dependencies
@@ -23,7 +23,6 @@ const OrderSummary = ( { cartItems = [] } ) => {
23
  <Panel
24
  className="wc-block-components-order-summary"
25
  initialOpen={ isLarge }
26
- hasBorder={ false }
27
  title={
28
  <span className="wc-block-components-order-summary__button-text">
29
  { __( 'Order summary', 'woo-gutenberg-products-block' ) }
4
  import { __ } from '@wordpress/i18n';
5
  import PropTypes from 'prop-types';
6
  import { useContainerWidthContext } from '@woocommerce/base-context';
7
+ import Panel from '@woocommerce/base-components/panel';
8
 
9
  /**
10
  * Internal dependencies
23
  <Panel
24
  className="wc-block-components-order-summary"
25
  initialOpen={ isLarge }
 
26
  title={
27
  <span className="wc-block-components-order-summary__button-text">
28
  { __( 'Order summary', 'woo-gutenberg-products-block' ) }
assets/js/base/components/cart-checkout/order-summary/order-summary-item.js CHANGED
@@ -2,111 +2,44 @@
2
  * External dependencies
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
 
5
  import Label from '@woocommerce/base-components/label';
6
  import ProductPrice from '@woocommerce/base-components/product-price';
7
- import ProductName from '@woocommerce/base-components/product-name';
8
- import { getCurrencyFromPriceResponse } from '@woocommerce/price-format';
9
  import {
10
- __experimentalApplyCheckoutFilter,
11
- mustContain,
12
- } from '@woocommerce/blocks-checkout';
 
 
 
13
  import PropTypes from 'prop-types';
14
  import Dinero from 'dinero.js';
15
- import { getSetting } from '@woocommerce/settings';
16
- import { useCallback, useMemo } from '@wordpress/element';
17
- import { useStoreCart } from '@woocommerce/base-context/hooks';
18
-
19
- /**
20
- * Internal dependencies
21
- */
22
- import ProductBackorderBadge from '../product-backorder-badge';
23
- import ProductImage from '../product-image';
24
- import ProductLowStockBadge from '../product-low-stock-badge';
25
- import ProductMetadata from '../product-metadata';
26
 
27
  const OrderSummaryItem = ( { cartItem } ) => {
28
  const {
29
  images,
 
30
  low_stock_remaining: lowStockRemaining = null,
31
  show_backorder_badge: showBackorderBadge = false,
32
- name: initialName,
33
  permalink,
34
  prices,
35
  quantity,
36
  short_description: shortDescription,
37
  description: fullDescription,
38
- item_data: itemData = [],
39
  variation,
40
- totals,
41
- extensions = {},
42
  } = cartItem;
43
 
44
- // Prepare props to pass to the __experimentalApplyCheckoutFilter filter.
45
- // We need to pluck out receiveCart.
46
- // eslint-disable-next-line no-unused-vars
47
- const { receiveCart, ...cart } = useStoreCart();
48
-
49
- const productPriceValidation = useCallback(
50
- ( value ) => mustContain( value, '<price/>' ),
51
- []
52
- );
53
-
54
- const arg = useMemo(
55
- () => ( {
56
- context: 'summary',
57
- cartItem,
58
- cart,
59
- } ),
60
- [ cartItem, cart ]
61
- );
62
-
63
- const priceCurrency = getCurrencyFromPriceResponse( prices );
64
-
65
- const name = __experimentalApplyCheckoutFilter( {
66
- filterName: 'itemName',
67
- defaultValue: initialName,
68
- extensions,
69
- arg,
70
- } );
71
-
72
- const regularPriceSingle = Dinero( {
73
- amount: parseInt( prices.raw_prices.regular_price, 10 ),
74
- precision: parseInt( prices.raw_prices.precision, 10 ),
75
- } )
76
- .convertPrecision( priceCurrency.minorUnit )
77
- .getAmount();
78
- const priceSingle = Dinero( {
79
  amount: parseInt( prices.raw_prices.price, 10 ),
80
  precision: parseInt( prices.raw_prices.precision, 10 ),
81
  } )
82
- .convertPrecision( priceCurrency.minorUnit )
 
83
  .getAmount();
84
- const totalsCurrency = getCurrencyFromPriceResponse( totals );
85
-
86
- let lineSubtotal = parseInt( totals.line_subtotal, 10 );
87
- if ( getSetting( 'displayCartPricesIncludingTax', false ) ) {
88
- lineSubtotal += parseInt( totals.line_subtotal_tax, 10 );
89
- }
90
- const subtotalPrice = Dinero( {
91
- amount: lineSubtotal,
92
- precision: totalsCurrency.minorUnit,
93
- } ).getAmount();
94
- const subtotalPriceFormat = __experimentalApplyCheckoutFilter( {
95
- filterName: 'subtotalPriceFormat',
96
- defaultValue: '<price/>',
97
- extensions,
98
- arg,
99
- validation: productPriceValidation,
100
- } );
101
-
102
- // Allow extensions to filter how the price is displayed. Ie: prepending or appending some values.
103
- const productPriceFormat = __experimentalApplyCheckoutFilter( {
104
- filterName: 'cartItemPrice',
105
- defaultValue: '<price/>',
106
- extensions,
107
- arg,
108
- validation: productPriceValidation,
109
- } );
110
 
111
  return (
112
  <div className="wc-block-components-order-summary-item">
@@ -124,20 +57,18 @@ const OrderSummaryItem = ( { cartItem } ) => {
124
  <ProductImage image={ images.length ? images[ 0 ] : {} } />
125
  </div>
126
  <div className="wc-block-components-order-summary-item__description">
127
- <ProductName
128
- disabled={ true }
129
- name={ name }
130
- permalink={ permalink }
131
- />
132
- <ProductPrice
133
- currency={ priceCurrency }
134
- price={ priceSingle }
135
- regularPrice={ regularPriceSingle }
136
- className="wc-block-components-order-summary-item__individual-prices"
137
- priceClassName="wc-block-components-order-summary-item__individual-price"
138
- regularPriceClassName="wc-block-components-order-summary-item__regular-individual-price"
139
- format={ subtotalPriceFormat }
140
- />
141
  { showBackorderBadge ? (
142
  <ProductBackorderBadge />
143
  ) : (
@@ -150,17 +81,9 @@ const OrderSummaryItem = ( { cartItem } ) => {
150
  <ProductMetadata
151
  shortDescription={ shortDescription }
152
  fullDescription={ fullDescription }
153
- itemData={ itemData }
154
  variation={ variation }
155
  />
156
  </div>
157
- <div className="wc-block-components-order-summary-item__total-price">
158
- <ProductPrice
159
- currency={ totalsCurrency }
160
- format={ productPriceFormat }
161
- price={ subtotalPrice }
162
- />
163
- </div>
164
  </div>
165
  );
166
  };
2
  * External dependencies
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
5
+ import { getCurrency } from '@woocommerce/base-utils';
6
  import Label from '@woocommerce/base-components/label';
7
  import ProductPrice from '@woocommerce/base-components/product-price';
 
 
8
  import {
9
+ ProductBackorderBadge,
10
+ ProductImage,
11
+ ProductLowStockBadge,
12
+ ProductMetadata,
13
+ ProductName,
14
+ } from '@woocommerce/base-components/cart-checkout';
15
  import PropTypes from 'prop-types';
16
  import Dinero from 'dinero.js';
 
 
 
 
 
 
 
 
 
 
 
17
 
18
  const OrderSummaryItem = ( { cartItem } ) => {
19
  const {
20
  images,
21
+ catalog_visibility: catalogVisibility = '',
22
  low_stock_remaining: lowStockRemaining = null,
23
  show_backorder_badge: showBackorderBadge = false,
24
+ name,
25
  permalink,
26
  prices,
27
  quantity,
28
  short_description: shortDescription,
29
  description: fullDescription,
 
30
  variation,
 
 
31
  } = cartItem;
32
 
33
+ const currency = getCurrency( prices );
34
+ const linePrice = Dinero( {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  amount: parseInt( prices.raw_prices.price, 10 ),
36
  precision: parseInt( prices.raw_prices.precision, 10 ),
37
  } )
38
+ .multiply( quantity )
39
+ .convertPrecision( currency.minorUnit )
40
  .getAmount();
41
+ const isProductHiddenFromCatalog =
42
+ catalogVisibility === 'hidden' || catalogVisibility === 'search';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
 
44
  return (
45
  <div className="wc-block-components-order-summary-item">
57
  <ProductImage image={ images.length ? images[ 0 ] : {} } />
58
  </div>
59
  <div className="wc-block-components-order-summary-item__description">
60
+ <div className="wc-block-components-order-summary-item__header">
61
+ <ProductName
62
+ disabled={ isProductHiddenFromCatalog }
63
+ permalink={ permalink }
64
+ name={ name }
65
+ />
66
+ <ProductPrice
67
+ currency={ currency }
68
+ price={ linePrice }
69
+ priceClassName="wc-block-components-order-summary-item__total-price"
70
+ />
71
+ </div>
 
 
72
  { showBackorderBadge ? (
73
  <ProductBackorderBadge />
74
  ) : (
81
  <ProductMetadata
82
  shortDescription={ shortDescription }
83
  fullDescription={ fullDescription }
 
84
  variation={ variation }
85
  />
86
  </div>
 
 
 
 
 
 
 
87
  </div>
88
  );
89
  };
assets/js/base/components/cart-checkout/order-summary/style.scss CHANGED
@@ -1,12 +1,7 @@
1
  .wc-block-components-order-summary {
2
-
3
- .wc-block-components-panel__button {
4
- padding-top: 0;
5
  margin-top: 0;
6
- }
7
-
8
- .wc-block-components-panel__content {
9
- margin-bottom: 0;
10
  }
11
  }
12
 
@@ -17,16 +12,10 @@
17
 
18
  .wc-block-components-order-summary-item {
19
  @include with-translucent-border(0 0 1px);
20
- @include font-size(small);
21
- display: flex;
22
  padding-bottom: 1px;
23
- padding-top: $gap;
24
  width: 100%;
25
 
26
- &:first-child {
27
- padding-top: 0;
28
- }
29
-
30
  &:last-child {
31
  > div {
32
  padding-bottom: 0;
@@ -36,10 +25,6 @@
36
  display: none;
37
  }
38
  }
39
-
40
- .wc-block-components-product-metadata {
41
- @include font-size(regular);
42
- }
43
  }
44
 
45
  .wc-block-components-order-summary-item__image,
@@ -50,6 +35,7 @@
50
 
51
  .wc-block-components-order-summary-item__image {
52
  width: #{$gap-large * 2};
 
53
  padding-bottom: $gap;
54
  position: relative;
55
 
@@ -60,6 +46,7 @@
60
  }
61
 
62
  .wc-block-components-order-summary-item__quantity {
 
63
  align-items: center;
64
  background: #fff;
65
  border: 2px solid;
@@ -74,7 +61,7 @@
74
  justify-content: center;
75
  min-width: 20px;
76
  right: 0;
77
- top: 0;
78
  transform: translate(50%, -50%);
79
  white-space: nowrap;
80
  z-index: 1;
@@ -82,8 +69,9 @@
82
 
83
  .wc-block-components-order-summary-item__description {
84
  padding-left: $gap-large;
85
- padding-right: $gap-small;
86
  padding-bottom: $gap;
 
87
 
88
  p,
89
  .wc-block-components-product-metadata {
@@ -92,13 +80,8 @@
92
  }
93
  }
94
 
95
- .wc-block-components-order-summary-item__total-price {
96
- font-weight: bold;
97
- margin-left: auto;
98
- text-align: right;
99
- }
100
-
101
-
102
- .wc-block-components-order-summary-item__individual-prices {
103
- display: block;
104
  }
1
  .wc-block-components-order-summary {
2
+ .wc-blocks-components-panel__button {
 
 
3
  margin-top: 0;
4
+ padding-top: 0;
 
 
 
5
  }
6
  }
7
 
12
 
13
  .wc-block-components-order-summary-item {
14
  @include with-translucent-border(0 0 1px);
15
+ display: table-row;
 
16
  padding-bottom: 1px;
 
17
  width: 100%;
18
 
 
 
 
 
19
  &:last-child {
20
  > div {
21
  padding-bottom: 0;
25
  display: none;
26
  }
27
  }
 
 
 
 
28
  }
29
 
30
  .wc-block-components-order-summary-item__image,
35
 
36
  .wc-block-components-order-summary-item__image {
37
  width: #{$gap-large * 2};
38
+ padding-top: $gap;
39
  padding-bottom: $gap;
40
  position: relative;
41
 
46
  }
47
 
48
  .wc-block-components-order-summary-item__quantity {
49
+ @include font-size(smaller);
50
  align-items: center;
51
  background: #fff;
52
  border: 2px solid;
61
  justify-content: center;
62
  min-width: 20px;
63
  right: 0;
64
+ top: $gap;
65
  transform: translate(50%, -50%);
66
  white-space: nowrap;
67
  z-index: 1;
69
 
70
  .wc-block-components-order-summary-item__description {
71
  padding-left: $gap-large;
72
+ padding-top: $gap;
73
  padding-bottom: $gap;
74
+ line-height: 1.375;
75
 
76
  p,
77
  .wc-block-components-product-metadata {
80
  }
81
  }
82
 
83
+ .wc-block-components-order-summary-item__header {
84
+ display: flex;
85
+ flex-wrap: wrap;
86
+ justify-content: space-between;
 
 
 
 
 
87
  }
assets/js/base/components/cart-checkout/order-summary/test/index.js DELETED
@@ -1,43 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { render, screen } from '@testing-library/react';
5
- import { previewCart } from '@woocommerce/resource-previews';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import OrderSummary from '../index';
11
-
12
- jest.mock( '@woocommerce/base-context', () => ( {
13
- ...jest.requireActual( '@woocommerce/base-context' ),
14
- useContainerWidthContext: () => ( {
15
- isLarge: false,
16
- hasContainerWidth: true,
17
- } ),
18
- } ) );
19
-
20
- describe( 'Order Summary', () => {
21
- it( 'renders correct cart line subtotal when currency has 0 decimals', async () => {
22
- render(
23
- <OrderSummary
24
- cartItems={ [
25
- {
26
- ...previewCart.items[ 0 ],
27
- totals: {
28
- ...previewCart.items[ 0 ].totals,
29
- // Change price format so there are no decimals.
30
- currency_minor_unit: 0,
31
- currency_prefix: '',
32
- currency_suffix: '€',
33
- line_subtotal: '16',
34
- line_total: '18',
35
- },
36
- },
37
- ] }
38
- />
39
- );
40
-
41
- expect( screen.getByText( '16€' ) ).toBeTruthy();
42
- } );
43
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/payment-method-icons/common-icons.js CHANGED
@@ -1,7 +1,7 @@
1
  /**
2
  * External dependencies
3
  */
4
- import { WC_BLOCKS_IMAGE_URL } from '@woocommerce/block-settings';
5
 
6
  /**
7
  * Array of common assets.
@@ -10,97 +10,97 @@ export const commonIcons = [
10
  {
11
  id: 'alipay',
12
  alt: 'Alipay',
13
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/alipay.svg',
14
  },
15
  {
16
  id: 'amex',
17
  alt: 'American Express',
18
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/amex.svg',
19
  },
20
  {
21
  id: 'bancontact',
22
  alt: 'Bancontact',
23
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/bancontact.svg',
24
  },
25
  {
26
  id: 'diners',
27
  alt: 'Diners Club',
28
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/diners.svg',
29
  },
30
  {
31
  id: 'discover',
32
  alt: 'Discover',
33
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/discover.svg',
34
  },
35
  {
36
  id: 'eps',
37
  alt: 'EPS',
38
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/eps.svg',
39
  },
40
  {
41
  id: 'giropay',
42
  alt: 'Giropay',
43
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/giropay.svg',
44
  },
45
  {
46
  id: 'ideal',
47
  alt: 'iDeal',
48
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/ideal.svg',
49
  },
50
  {
51
  id: 'jcb',
52
  alt: 'JCB',
53
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/jcb.svg',
54
  },
55
  {
56
  id: 'laser',
57
  alt: 'Laser',
58
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/laser.svg',
59
  },
60
  {
61
  id: 'maestro',
62
  alt: 'Maestro',
63
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/maestro.svg',
64
  },
65
  {
66
  id: 'mastercard',
67
  alt: 'Mastercard',
68
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/mastercard.svg',
69
  },
70
  {
71
  id: 'multibanco',
72
  alt: 'Multibanco',
73
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/multibanco.svg',
74
  },
75
  {
76
  id: 'p24',
77
  alt: 'Przelewy24',
78
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/p24.svg',
79
  },
80
  {
81
  id: 'sepa',
82
  alt: 'Sepa',
83
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/sepa.svg',
84
  },
85
  {
86
  id: 'sofort',
87
  alt: 'Sofort',
88
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/sofort.svg',
89
  },
90
  {
91
  id: 'unionpay',
92
  alt: 'Union Pay',
93
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/unionpay.svg',
94
  },
95
  {
96
  id: 'visa',
97
  alt: 'Visa',
98
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/visa.svg',
99
  },
100
  {
101
  id: 'wechat',
102
  alt: 'WeChat',
103
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/wechat.svg',
104
  },
105
  ];
106
 
1
  /**
2
  * External dependencies
3
  */
4
+ import { WC_BLOCKS_ASSET_URL } from '@woocommerce/block-settings';
5
 
6
  /**
7
  * Array of common assets.
10
  {
11
  id: 'alipay',
12
  alt: 'Alipay',
13
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/alipay.svg',
14
  },
15
  {
16
  id: 'amex',
17
  alt: 'American Express',
18
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/amex.svg',
19
  },
20
  {
21
  id: 'bancontact',
22
  alt: 'Bancontact',
23
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/bancontact.svg',
24
  },
25
  {
26
  id: 'diners',
27
  alt: 'Diners Club',
28
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/diners.svg',
29
  },
30
  {
31
  id: 'discover',
32
  alt: 'Discover',
33
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/discover.svg',
34
  },
35
  {
36
  id: 'eps',
37
  alt: 'EPS',
38
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/eps.svg',
39
  },
40
  {
41
  id: 'giropay',
42
  alt: 'Giropay',
43
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/giropay.svg',
44
  },
45
  {
46
  id: 'ideal',
47
  alt: 'iDeal',
48
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/ideal.svg',
49
  },
50
  {
51
  id: 'jcb',
52
  alt: 'JCB',
53
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/jcb.svg',
54
  },
55
  {
56
  id: 'laser',
57
  alt: 'Laser',
58
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/laser.svg',
59
  },
60
  {
61
  id: 'maestro',
62
  alt: 'Maestro',
63
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/maestro.svg',
64
  },
65
  {
66
  id: 'mastercard',
67
  alt: 'Mastercard',
68
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/mastercard.svg',
69
  },
70
  {
71
  id: 'multibanco',
72
  alt: 'Multibanco',
73
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/multibanco.svg',
74
  },
75
  {
76
  id: 'p24',
77
  alt: 'Przelewy24',
78
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/p24.svg',
79
  },
80
  {
81
  id: 'sepa',
82
  alt: 'Sepa',
83
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/sepa.svg',
84
  },
85
  {
86
  id: 'sofort',
87
  alt: 'Sofort',
88
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/sofort.svg',
89
  },
90
  {
91
  id: 'unionpay',
92
  alt: 'Union Pay',
93
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/unionpay.svg',
94
  },
95
  {
96
  id: 'visa',
97
  alt: 'Visa',
98
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/visa.svg',
99
  },
100
  {
101
  id: 'wechat',
102
  alt: 'WeChat',
103
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/wechat.svg',
104
  },
105
  ];
106
 
assets/js/base/components/cart-checkout/place-order-button/index.js CHANGED
@@ -2,7 +2,7 @@
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
- import { useCheckoutSubmit } from '@woocommerce/base-context/hooks';
6
  import { Icon, done } from '@woocommerce/icons';
7
  import Button from '@woocommerce/base-components/button';
8
 
@@ -11,7 +11,6 @@ const PlaceOrderButton = () => {
11
  submitButtonText,
12
  onSubmit,
13
  isCalculating,
14
- isDisabled,
15
  waitingForProcessing,
16
  waitingForRedirect,
17
  } = useCheckoutSubmit();
@@ -21,10 +20,7 @@ const PlaceOrderButton = () => {
21
  className="wc-block-components-checkout-place-order-button"
22
  onClick={ onSubmit }
23
  disabled={
24
- isCalculating ||
25
- isDisabled ||
26
- waitingForProcessing ||
27
- waitingForRedirect
28
  }
29
  showSpinner={ waitingForProcessing }
30
  >
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
+ import { useCheckoutSubmit } from '@woocommerce/base-hooks';
6
  import { Icon, done } from '@woocommerce/icons';
7
  import Button from '@woocommerce/base-components/button';
8
 
11
  submitButtonText,
12
  onSubmit,
13
  isCalculating,
 
14
  waitingForProcessing,
15
  waitingForRedirect,
16
  } = useCheckoutSubmit();
20
  className="wc-block-components-checkout-place-order-button"
21
  onClick={ onSubmit }
22
  disabled={
23
+ isCalculating || waitingForProcessing || waitingForRedirect
 
 
 
24
  }
25
  showSpinner={ waitingForProcessing }
26
  >
assets/js/base/components/cart-checkout/policies/{index.tsx → index.js} RENAMED
@@ -15,7 +15,7 @@ import { decodeEntities } from '@wordpress/html-entities';
15
  */
16
  import './style.scss';
17
 
18
- const Policies = (): JSX.Element => {
19
  return (
20
  <ul className="wc-block-components-checkout-policies">
21
  { PRIVACY_URL && (
15
  */
16
  import './style.scss';
17
 
18
+ const Policies = () => {
19
  return (
20
  <ul className="wc-block-components-checkout-policies">
21
  { PRIVACY_URL && (
assets/js/base/components/cart-checkout/product-backorder-badge/{index.tsx → index.js} RENAMED
@@ -11,7 +11,7 @@ import ProductBadge from '../product-badge';
11
  /**
12
  * Returns a backorder badge.
13
  */
14
- const ProductBackorderBadge = (): JSX.Element => {
15
  return (
16
  <ProductBadge className="wc-block-components-product-backorder-badge">
17
  { __( 'Available on backorder', 'woo-gutenberg-products-block' ) }
11
  /**
12
  * Returns a backorder badge.
13
  */
14
+ const ProductBackorderBadge = () => {
15
  return (
16
  <ProductBadge className="wc-block-components-product-backorder-badge">
17
  { __( 'Available on backorder', 'woo-gutenberg-products-block' ) }
assets/js/base/components/cart-checkout/product-badge/{index.tsx → index.js} RENAMED
@@ -2,21 +2,14 @@
2
  * External dependencies
3
  */
4
  import classNames from 'classnames';
5
- import type { ReactNode } from 'react';
6
 
7
  /**
8
  * Internal dependencies
9
  */
10
  import './style.scss';
11
 
12
- interface ProductBadgeProps {
13
- children?: ReactNode;
14
- className?: string;
15
- }
16
- const ProductBadge = ( {
17
- children,
18
- className,
19
- }: ProductBadgeProps ): JSX.Element => {
20
  return (
21
  <div
22
  className={ classNames(
@@ -29,4 +22,8 @@ const ProductBadge = ( {
29
  );
30
  };
31
 
 
 
 
 
32
  export default ProductBadge;
2
  * External dependencies
3
  */
4
  import classNames from 'classnames';
5
+ import PropTypes from 'prop-types';
6
 
7
  /**
8
  * Internal dependencies
9
  */
10
  import './style.scss';
11
 
12
+ const ProductBadge = ( { children, className } ) => {
 
 
 
 
 
 
 
13
  return (
14
  <div
15
  className={ classNames(
22
  );
23
  };
24
 
25
+ ProductBadge.propTypes = {
26
+ className: PropTypes.string,
27
+ };
28
+
29
  export default ProductBadge;
assets/js/base/components/cart-checkout/product-details/index.tsx DELETED
@@ -1,60 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { kebabCase } from 'lodash';
5
- import { decodeEntities } from '@wordpress/html-entities';
6
- import type { ProductResponseItemData } from '@woocommerce/type-defs/product-response';
7
-
8
- /**
9
- * Internal dependencies
10
- */
11
- import './style.scss';
12
-
13
- interface ProductDetailsProps {
14
- details: ProductResponseItemData[];
15
- }
16
- // Component to display cart item data and variations.
17
- const ProductDetails = ( {
18
- details = [],
19
- }: ProductDetailsProps ): JSX.Element | null => {
20
- if ( ! Array.isArray( details ) ) {
21
- return null;
22
- }
23
-
24
- details = details.filter( ( detail ) => ! detail.hidden );
25
-
26
- if ( details.length === 0 ) {
27
- return null;
28
- }
29
-
30
- return (
31
- <ul className="wc-block-components-product-details">
32
- { details.map( ( detail ) => {
33
- const className = detail.name
34
- ? `wc-block-components-product-details__${ kebabCase(
35
- detail.name
36
- ) }`
37
- : '';
38
- return (
39
- <li
40
- key={ detail.name + ( detail.display || detail.value ) }
41
- className={ className }
42
- >
43
- { detail.name && (
44
- <>
45
- <span className="wc-block-components-product-details__name">
46
- { decodeEntities( detail.name ) }:
47
- </span>{ ' ' }
48
- </>
49
- ) }
50
- <span className="wc-block-components-product-details__value">
51
- { decodeEntities( detail.display || detail.value ) }
52
- </span>
53
- </li>
54
- );
55
- } ) }
56
- </ul>
57
- );
58
- };
59
-
60
- export default ProductDetails;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/product-details/style.scss DELETED
@@ -1,25 +0,0 @@
1
- // Extra class added for specificity so styles are applied in the editor.
2
- .wc-block-components-product-details.wc-block-components-product-details {
3
- list-style: none;
4
- margin: 0.5em 0;
5
- padding: 0;
6
-
7
- &:last-of-type {
8
- margin-bottom: 0;
9
- }
10
-
11
- li {
12
- margin-left: 0;
13
- }
14
- }
15
-
16
- .wc-block-components-product-details__name,
17
- .wc-block-components-product-details__value {
18
- display: inline-block;
19
- }
20
-
21
- .is-large:not(.wc-block-checkout) {
22
- .wc-block-components-product-details__name {
23
- font-weight: bold;
24
- }
25
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/product-details/test/__snapshots__/index.js.snap DELETED
@@ -1,76 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`ProductDetails should not render hidden details 1`] = `
4
- <ul
5
- className="wc-block-components-product-details"
6
- >
7
- <li
8
- className="wc-block-components-product-details__lorem"
9
- >
10
- <span
11
- className="wc-block-components-product-details__name"
12
- >
13
- LOREM
14
- :
15
- </span>
16
-
17
- <span
18
- className="wc-block-components-product-details__value"
19
- >
20
- IPSUM
21
- </span>
22
- </li>
23
- </ul>
24
- `;
25
-
26
- exports[`ProductDetails should not rendering anything if all details are hidden 1`] = `null`;
27
-
28
- exports[`ProductDetails should not rendering anything if details is an empty array 1`] = `null`;
29
-
30
- exports[`ProductDetails should render details 1`] = `
31
- <ul
32
- className="wc-block-components-product-details"
33
- >
34
- <li
35
- className="wc-block-components-product-details__lorem"
36
- >
37
- <span
38
- className="wc-block-components-product-details__name"
39
- >
40
- Lorem
41
- :
42
- </span>
43
-
44
- <span
45
- className="wc-block-components-product-details__value"
46
- >
47
- Ipsum
48
- </span>
49
- </li>
50
- <li
51
- className="wc-block-components-product-details__lorem"
52
- >
53
- <span
54
- className="wc-block-components-product-details__name"
55
- >
56
- LOREM
57
- :
58
- </span>
59
-
60
- <span
61
- className="wc-block-components-product-details__value"
62
- >
63
- IPSUM
64
- </span>
65
- </li>
66
- <li
67
- className=""
68
- >
69
- <span
70
- className="wc-block-components-product-details__value"
71
- >
72
- Ipsum
73
- </span>
74
- </li>
75
- </ul>
76
- `;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/product-details/test/index.js DELETED
@@ -1,57 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import TestRenderer from 'react-test-renderer';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import ProductDetails from '..';
10
-
11
- describe( 'ProductDetails', () => {
12
- test( 'should render details', () => {
13
- const details = [
14
- { name: 'Lorem', value: 'Ipsum' },
15
- { name: 'LOREM', value: 'Ipsum', display: 'IPSUM' },
16
- { value: 'Ipsum' },
17
- ];
18
- const component = TestRenderer.create(
19
- <ProductDetails details={ details } />
20
- );
21
-
22
- expect( component.toJSON() ).toMatchSnapshot();
23
- } );
24
-
25
- test( 'should not render hidden details', () => {
26
- const details = [
27
- { name: 'Lorem', value: 'Ipsum', hidden: true },
28
- { name: 'LOREM', value: 'Ipsum', display: 'IPSUM' },
29
- ];
30
- const component = TestRenderer.create(
31
- <ProductDetails details={ details } />
32
- );
33
-
34
- expect( component.toJSON() ).toMatchSnapshot();
35
- } );
36
-
37
- test( 'should not rendering anything if all details are hidden', () => {
38
- const details = [
39
- { name: 'Lorem', value: 'Ipsum', hidden: true },
40
- { name: 'LOREM', value: 'Ipsum', display: 'IPSUM', hidden: true },
41
- ];
42
- const component = TestRenderer.create(
43
- <ProductDetails details={ details } />
44
- );
45
-
46
- expect( component.toJSON() ).toMatchSnapshot();
47
- } );
48
-
49
- test( 'should not rendering anything if details is an empty array', () => {
50
- const details = [];
51
- const component = TestRenderer.create(
52
- <ProductDetails details={ details } />
53
- );
54
-
55
- expect( component.toJSON() ).toMatchSnapshot();
56
- } );
57
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/product-image/{index.tsx → index.js} RENAMED
@@ -2,18 +2,16 @@
2
  * External dependencies
3
  */
4
  import { decodeEntities } from '@wordpress/html-entities';
5
- import { PLACEHOLDER_IMG_SRC } from '@woocommerce/settings';
 
6
 
7
- interface ProductImageProps {
8
- image: { alt?: string; thumbnail?: string };
9
- }
10
  /**
11
  * Formats and returns an image element.
12
  *
13
  * @param {Object} props Incoming props for the component.
14
  * @param {Object} props.image Image properties.
15
  */
16
- const ProductImage = ( { image = {} }: ProductImageProps ): JSX.Element => {
17
  const imageProps = {
18
  src: image.thumbnail || PLACEHOLDER_IMG_SRC,
19
  alt: decodeEntities( image.alt ) || '',
@@ -22,4 +20,11 @@ const ProductImage = ( { image = {} }: ProductImageProps ): JSX.Element => {
22
  return <img { ...imageProps } alt={ imageProps.alt } />;
23
  };
24
 
 
 
 
 
 
 
 
25
  export default ProductImage;
2
  * External dependencies
3
  */
4
  import { decodeEntities } from '@wordpress/html-entities';
5
+ import { PLACEHOLDER_IMG_SRC } from '@woocommerce/block-settings';
6
+ import PropTypes from 'prop-types';
7
 
 
 
 
8
  /**
9
  * Formats and returns an image element.
10
  *
11
  * @param {Object} props Incoming props for the component.
12
  * @param {Object} props.image Image properties.
13
  */
14
+ const ProductImage = ( { image = {} } ) => {
15
  const imageProps = {
16
  src: image.thumbnail || PLACEHOLDER_IMG_SRC,
17
  alt: decodeEntities( image.alt ) || '',
20
  return <img { ...imageProps } alt={ imageProps.alt } />;
21
  };
22
 
23
+ ProductImage.propTypes = {
24
+ image: PropTypes.shape( {
25
+ alt: PropTypes.string,
26
+ thumbnail: PropTypes.string,
27
+ } ),
28
+ };
29
+
30
  export default ProductImage;
assets/js/base/components/cart-checkout/product-low-stock-badge/{index.tsx → index.js} RENAMED
@@ -2,24 +2,20 @@
2
  * External dependencies
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
 
5
 
6
  /**
7
  * Internal dependencies
8
  */
9
  import ProductBadge from '../product-badge';
10
 
11
- interface ProductLowStockBadgeProps {
12
- lowStockRemaining: number | null;
13
- }
14
  /**
15
  * Returns a low stock badge.
16
  *
17
  * @param {Object} props Incoming props for the component.
18
- * @param {number} props.lowStockRemaining Whether or not there is low stock remaining.
19
  */
20
- const ProductLowStockBadge = ( {
21
- lowStockRemaining,
22
- }: ProductLowStockBadgeProps ): JSX.Element | null => {
23
  if ( ! lowStockRemaining ) {
24
  return null;
25
  }
@@ -35,4 +31,8 @@ const ProductLowStockBadge = ( {
35
  );
36
  };
37
 
 
 
 
 
38
  export default ProductLowStockBadge;
2
  * External dependencies
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
5
+ import PropTypes from 'prop-types';
6
 
7
  /**
8
  * Internal dependencies
9
  */
10
  import ProductBadge from '../product-badge';
11
 
 
 
 
12
  /**
13
  * Returns a low stock badge.
14
  *
15
  * @param {Object} props Incoming props for the component.
16
+ * @param {boolean} props.lowStockRemaining Whether or not there is low stock remaining.
17
  */
18
+ const ProductLowStockBadge = ( { lowStockRemaining } ) => {
 
 
19
  if ( ! lowStockRemaining ) {
20
  return null;
21
  }
31
  );
32
  };
33
 
34
+ ProductLowStockBadge.propTypes = {
35
+ lowStockRemaining: PropTypes.number,
36
+ };
37
+
38
  export default ProductLowStockBadge;
assets/js/base/components/cart-checkout/product-metadata/index.js ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import ProductVariationData from '../product-variation-data';
10
+ import ProductSummary from '../product-summary';
11
+ import './style.scss';
12
+
13
+ const ProductMetadata = ( {
14
+ shortDescription = '',
15
+ fullDescription = '',
16
+ variation = [],
17
+ } ) => {
18
+ return (
19
+ <div className="wc-block-components-product-metadata">
20
+ <ProductSummary
21
+ className="wc-block-components-product-metadata__description"
22
+ shortDescription={ shortDescription }
23
+ fullDescription={ fullDescription }
24
+ />
25
+ <ProductVariationData
26
+ className="wc-block-components-product-metadata__variation-data"
27
+ variation={ variation }
28
+ />
29
+ </div>
30
+ );
31
+ };
32
+
33
+ ProductMetadata.propTypes = {
34
+ shortDescription: PropTypes.string,
35
+ fullDescription: PropTypes.string,
36
+ variation: PropTypes.array,
37
+ };
38
+
39
+ export default ProductMetadata;
assets/js/base/components/cart-checkout/product-metadata/index.tsx DELETED
@@ -1,45 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { ProductResponseItemData } from '@woocommerce/type-defs/product-response';
5
- import { CartVariationItem } from '@woocommerce/type-defs/cart';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import ProductDetails from '../product-details';
11
- import ProductSummary from '../product-summary';
12
- import './style.scss';
13
-
14
- interface ProductMetadataProps {
15
- shortDescription?: string;
16
- fullDescription?: string;
17
- itemData: ProductResponseItemData[];
18
- variation?: CartVariationItem[];
19
- }
20
-
21
- const ProductMetadata = ( {
22
- shortDescription = '',
23
- fullDescription = '',
24
- itemData = [],
25
- variation = [],
26
- }: ProductMetadataProps ): JSX.Element => {
27
- return (
28
- <div className="wc-block-components-product-metadata">
29
- <ProductSummary
30
- className="wc-block-components-product-metadata__description"
31
- shortDescription={ shortDescription }
32
- fullDescription={ fullDescription }
33
- />
34
- <ProductDetails details={ itemData } />
35
- <ProductDetails
36
- details={ variation.map( ( { attribute = '', value } ) => ( {
37
- name: attribute,
38
- value,
39
- } ) ) }
40
- />
41
- </div>
42
- );
43
- };
44
-
45
- export default ProductMetadata;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/product-metadata/style.scss CHANGED
@@ -3,6 +3,6 @@
3
 
4
  .wc-block-components-product-metadata__description > p,
5
  .wc-block-components-product-metadata__variation-data {
6
- margin: 0.25em 0;
7
  }
8
  }
3
 
4
  .wc-block-components-product-metadata__description > p,
5
  .wc-block-components-product-metadata__variation-data {
6
+ margin: 0.25em 0 0 0;
7
  }
8
  }
assets/js/base/components/cart-checkout/product-name/index.js ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { decodeEntities } from '@wordpress/html-entities';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import './style.scss';
11
+
12
+ const ProductName = ( { name, permalink, disabled = false } ) => {
13
+ return disabled ? (
14
+ <span className="wc-block-components-product-name">
15
+ { decodeEntities( name ) }
16
+ </span>
17
+ ) : (
18
+ <a className="wc-block-components-product-name" href={ permalink }>
19
+ { decodeEntities( name ) }
20
+ </a>
21
+ );
22
+ };
23
+
24
+ ProductName.propTypes = {
25
+ disabled: PropTypes.bool,
26
+ name: PropTypes.string,
27
+ permalink: PropTypes.string,
28
+ };
29
+
30
+ export default ProductName;
assets/js/base/components/{product-name → cart-checkout/product-name}/stories/index.js RENAMED
File without changes
assets/js/base/components/{product-name → cart-checkout/product-name}/style.scss RENAMED
@@ -1,4 +1,6 @@
1
  .wc-block-components-product-name {
2
  @include font-size(regular);
3
  @include wrap-break-word();
 
 
4
  }
1
  .wc-block-components-product-name {
2
  @include font-size(regular);
3
  @include wrap-break-word();
4
+ display: block;
5
+ max-width: max-content;
6
  }
assets/js/base/components/cart-checkout/product-name/test/__snapshots__/index.js.snap ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`ProductName should not render a link if disabled is true 1`] = `
4
+ <span
5
+ className="wc-block-components-product-name"
6
+ >
7
+ Test product
8
+ </span>
9
+ `;
10
+
11
+ exports[`ProductName should render a link if disabled is false 1`] = `
12
+ <a
13
+ className="wc-block-components-product-name"
14
+ >
15
+ Test product
16
+ </a>
17
+ `;
18
+
19
+ exports[`ProductName should render a link if disabled is not defined 1`] = `
20
+ <a
21
+ className="wc-block-components-product-name"
22
+ >
23
+ Test product
24
+ </a>
25
+ `;
assets/js/base/components/{product-name → cart-checkout/product-name}/test/index.js RENAMED
@@ -11,7 +11,7 @@ import ProductName from '..';
11
  describe( 'ProductName', () => {
12
  test( 'should not render a link if disabled is true', () => {
13
  const component = TestRenderer.create(
14
- <ProductName disabled={ true } name="Test product" permalink="/" />
15
  );
16
 
17
  expect( component.toJSON() ).toMatchSnapshot();
@@ -19,7 +19,7 @@ describe( 'ProductName', () => {
19
 
20
  test( 'should render a link if disabled is false', () => {
21
  const component = TestRenderer.create(
22
- <ProductName disabled={ false } name="Test product" permalink="/" />
23
  );
24
 
25
  expect( component.toJSON() ).toMatchSnapshot();
@@ -27,20 +27,7 @@ describe( 'ProductName', () => {
27
 
28
  test( 'should render a link if disabled is not defined', () => {
29
  const component = TestRenderer.create(
30
- <ProductName name="Test product" permalink="/" />
31
- );
32
-
33
- expect( component.toJSON() ).toMatchSnapshot();
34
- } );
35
-
36
- test( 'should merge classes and props', () => {
37
- const component = TestRenderer.create(
38
- <ProductName
39
- className="lorem-ipsum"
40
- name="Test product"
41
- permalink="/"
42
- rel="nofollow"
43
- />
44
  );
45
 
46
  expect( component.toJSON() ).toMatchSnapshot();
11
  describe( 'ProductName', () => {
12
  test( 'should not render a link if disabled is true', () => {
13
  const component = TestRenderer.create(
14
+ <ProductName disabled={ true } name={ 'Test product' } />
15
  );
16
 
17
  expect( component.toJSON() ).toMatchSnapshot();
19
 
20
  test( 'should render a link if disabled is false', () => {
21
  const component = TestRenderer.create(
22
+ <ProductName disabled={ false } name={ 'Test product' } />
23
  );
24
 
25
  expect( component.toJSON() ).toMatchSnapshot();
27
 
28
  test( 'should render a link if disabled is not defined', () => {
29
  const component = TestRenderer.create(
30
+ <ProductName name={ 'Test product' } />
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  );
32
 
33
  expect( component.toJSON() ).toMatchSnapshot();
assets/js/base/components/cart-checkout/product-sale-badge/index.js ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { createInterpolateElement } from 'wordpress-element';
5
+ import { __ } from '@wordpress/i18n';
6
+ import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
7
+ import PropTypes from 'prop-types';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import ProductBadge from '../product-badge';
13
+
14
+ /**
15
+ * ProductSaleBadge
16
+ *
17
+ * @param {Object} props Incoming props.
18
+ * @param {Object} props.currency Currency object.
19
+ * @param {number} props.saleAmount Discounted amount.
20
+ *
21
+ * @return {*} The component.
22
+ */
23
+ const ProductSaleBadge = ( { currency, saleAmount } ) => {
24
+ if ( ! saleAmount || saleAmount <= 0 ) {
25
+ return null;
26
+ }
27
+ return (
28
+ <ProductBadge className="wc-block-components-sale-badge">
29
+ { createInterpolateElement(
30
+ /* translators: <price/> will be replaced by the discount amount */
31
+ __( 'Save <price/>', 'woo-gutenberg-products-block' ),
32
+ {
33
+ price: (
34
+ <FormattedMonetaryAmount
35
+ currency={ currency }
36
+ value={ saleAmount }
37
+ />
38
+ ),
39
+ }
40
+ ) }
41
+ </ProductBadge>
42
+ );
43
+ };
44
+
45
+ ProductSaleBadge.propTypes = {
46
+ currency: PropTypes.object,
47
+ saleAmount: PropTypes.number,
48
+ };
49
+
50
+ export default ProductSaleBadge;
assets/js/base/components/cart-checkout/product-sale-badge/index.tsx DELETED
@@ -1,62 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { createInterpolateElement } from 'wordpress-element';
5
- import { __, sprintf } from '@wordpress/i18n';
6
- import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
7
- import type { Currency } from '@woocommerce/price-format';
8
-
9
- /**
10
- * Internal dependencies
11
- */
12
- import ProductBadge from '../product-badge';
13
-
14
- interface ProductSaleBadgeProps {
15
- currency: Currency;
16
- saleAmount: number;
17
- format: string;
18
- }
19
- /**
20
- * ProductSaleBadge
21
- *
22
- * @param {Object} props Incoming props.
23
- * @param {Object} props.currency Currency object.
24
- * @param {number} props.saleAmount Discounted amount.
25
- * @param {string} [props.format] Format to change the price.
26
- * @return {*} The component.
27
- */
28
- const ProductSaleBadge = ( {
29
- currency,
30
- saleAmount,
31
- format = '<price/>',
32
- }: ProductSaleBadgeProps ): JSX.Element | null => {
33
- if ( ! saleAmount || saleAmount <= 0 ) {
34
- return null;
35
- }
36
- if ( ! format.includes( '<price/>' ) ) {
37
- format = '<price/>';
38
- // eslint-disable-next-line no-console
39
- console.error( 'Price formats need to include the `<price/>` tag.' );
40
- }
41
-
42
- const formattedMessage = sprintf(
43
- /* translators: %s will be replaced by the discount amount */
44
- __( `Save %s`, 'woo-gutenberg-products-block' ),
45
- format
46
- );
47
-
48
- return (
49
- <ProductBadge className="wc-block-components-sale-badge">
50
- { createInterpolateElement( formattedMessage, {
51
- price: (
52
- <FormattedMonetaryAmount
53
- currency={ currency }
54
- value={ saleAmount }
55
- />
56
- ),
57
- } ) }
58
- </ProductBadge>
59
- );
60
- };
61
-
62
- export default ProductSaleBadge;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/product-summary/{index.tsx → index.js} RENAMED
@@ -1,14 +1,10 @@
1
  /**
2
  * External dependencies
3
  */
 
4
  import Summary from '@woocommerce/base-components/summary';
5
- import { blocksConfig } from '@woocommerce/block-settings';
6
 
7
- interface ProductSummaryProps {
8
- className?: string;
9
- shortDescription?: string;
10
- fullDescription?: string;
11
- }
12
  /**
13
  * Returns an element containing a summary of the product.
14
  *
@@ -21,7 +17,7 @@ const ProductSummary = ( {
21
  className,
22
  shortDescription = '',
23
  fullDescription = '',
24
- }: ProductSummaryProps ): JSX.Element | null => {
25
  const source = shortDescription ? shortDescription : fullDescription;
26
 
27
  if ( ! source ) {
@@ -33,9 +29,15 @@ const ProductSummary = ( {
33
  className={ className }
34
  source={ source }
35
  maxLength={ 15 }
36
- countType={ blocksConfig.wordCountType || 'words' }
37
  />
38
  );
39
  };
40
 
 
 
 
 
 
 
41
  export default ProductSummary;
1
  /**
2
  * External dependencies
3
  */
4
+ import PropTypes from 'prop-types';
5
  import Summary from '@woocommerce/base-components/summary';
6
+ import { getSetting } from '@woocommerce/settings';
7
 
 
 
 
 
 
8
  /**
9
  * Returns an element containing a summary of the product.
10
  *
17
  className,
18
  shortDescription = '',
19
  fullDescription = '',
20
+ } ) => {
21
  const source = shortDescription ? shortDescription : fullDescription;
22
 
23
  if ( ! source ) {
29
  className={ className }
30
  source={ source }
31
  maxLength={ 15 }
32
+ countType={ getSetting( 'wordCountType', 'words' ) }
33
  />
34
  );
35
  };
36
 
37
+ ProductSummary.propTypes = {
38
+ className: PropTypes.string,
39
+ shortDescription: PropTypes.string,
40
+ fullDescription: PropTypes.string,
41
+ };
42
+
43
  export default ProductSummary;
assets/js/base/components/cart-checkout/product-variation-data/index.js ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { decodeEntities } from '@wordpress/html-entities';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ /**
9
+ * Returns a formatted element containing variation details.
10
+ *
11
+ * @param {Object} props Incoming props for the component.
12
+ * @param {string} props.className CSS class used.
13
+ * @param {Array<Object>} props.variation Variations in use.
14
+ */
15
+ const ProductVariationData = ( { className, variation = [] } ) => {
16
+ if ( ! variation || variation.length === 0 ) {
17
+ return null;
18
+ }
19
+
20
+ const variationsText = variation
21
+ .map( ( v ) => {
22
+ if ( v.attribute ) {
23
+ return `${ decodeEntities( v.attribute ) }: ${ decodeEntities(
24
+ v.value
25
+ ) }`;
26
+ }
27
+ // Support for product attributes with no name/key
28
+ return `${ decodeEntities( v.value ) }`;
29
+ } )
30
+ .join( ' / ' );
31
+
32
+ return (
33
+ <div
34
+ className={ classNames(
35
+ 'wc-block-components-product-variation-data',
36
+ className
37
+ ) }
38
+ >
39
+ { variationsText }
40
+ </div>
41
+ );
42
+ };
43
+
44
+ ProductVariationData.propTypes = {
45
+ variation: PropTypes.arrayOf(
46
+ PropTypes.shape( {
47
+ attribute: PropTypes.string,
48
+ value: PropTypes.string.isRequired,
49
+ } )
50
+ ),
51
+ };
52
+
53
+ export default ProductVariationData;
assets/js/base/components/cart-checkout/shipping-calculator/{address.tsx → address.js} RENAMED
@@ -1,29 +1,24 @@
1
  /**
2
  * External dependencies
3
  */
 
4
  import { __ } from '@wordpress/i18n';
 
5
  import Button from '@woocommerce/base-components/button';
6
  import { useState } from '@wordpress/element';
7
  import isShallowEqual from '@wordpress/is-shallow-equal';
8
  import { useValidationContext } from '@woocommerce/base-context';
9
- import type { EnteredAddress, AddressFields } from '@woocommerce/settings';
10
 
11
  /**
12
  * Internal dependencies
13
  */
14
  import './style.scss';
15
- import { AddressForm } from '../address-form';
16
 
17
- interface ShippingCalculatorAddressProps {
18
- address: EnteredAddress;
19
- onUpdate: ( address: EnteredAddress ) => void;
20
- addressFields: Partial< keyof AddressFields >[];
21
- }
22
  const ShippingCalculatorAddress = ( {
23
  address: initialAddress,
24
  onUpdate,
25
  addressFields,
26
- }: ShippingCalculatorAddressProps ): JSX.Element => {
27
  const [ address, setAddress ] = useState( initialAddress );
28
  const {
29
  hasValidationErrors,
@@ -60,4 +55,10 @@ const ShippingCalculatorAddress = ( {
60
  );
61
  };
62
 
 
 
 
 
 
 
63
  export default ShippingCalculatorAddress;
1
  /**
2
  * External dependencies
3
  */
4
+ import PropTypes from 'prop-types';
5
  import { __ } from '@wordpress/i18n';
6
+ import { AddressForm } from '@woocommerce/base-components/cart-checkout';
7
  import Button from '@woocommerce/base-components/button';
8
  import { useState } from '@wordpress/element';
9
  import isShallowEqual from '@wordpress/is-shallow-equal';
10
  import { useValidationContext } from '@woocommerce/base-context';
 
11
 
12
  /**
13
  * Internal dependencies
14
  */
15
  import './style.scss';
 
16
 
 
 
 
 
 
17
  const ShippingCalculatorAddress = ( {
18
  address: initialAddress,
19
  onUpdate,
20
  addressFields,
21
+ } ) => {
22
  const [ address, setAddress ] = useState( initialAddress );
23
  const {
24
  hasValidationErrors,
55
  );
56
  };
57
 
58
+ ShippingCalculatorAddress.propTypes = {
59
+ address: PropTypes.object.isRequired,
60
+ onUpdate: PropTypes.func.isRequired,
61
+ addressFields: PropTypes.array.isRequired,
62
+ };
63
+
64
  export default ShippingCalculatorAddress;
assets/js/base/components/cart-checkout/shipping-calculator/{index.tsx → index.js} RENAMED
@@ -1,8 +1,8 @@
1
  /**
2
  * External dependencies
3
  */
 
4
  import { useShippingDataContext } from '@woocommerce/base-context';
5
- import type { EnteredAddress } from '@woocommerce/settings';
6
 
7
  /**
8
  * Internal dependencies
@@ -10,17 +10,10 @@ import type { EnteredAddress } from '@woocommerce/settings';
10
  import ShippingCalculatorAddress from './address';
11
  import './style.scss';
12
 
13
- interface ShippingCalculatorProps {
14
- onUpdate?: ( newAddress: EnteredAddress ) => void;
15
- addressFields?: Partial< keyof EnteredAddress >[];
16
- }
17
-
18
  const ShippingCalculator = ( {
19
- onUpdate = () => {
20
- /* Do nothing */
21
- },
22
  addressFields = [ 'country', 'state', 'city', 'postcode' ],
23
- }: ShippingCalculatorProps ): JSX.Element => {
24
  const { shippingAddress, setShippingAddress } = useShippingDataContext();
25
  return (
26
  <div className="wc-block-components-shipping-calculator">
@@ -36,4 +29,9 @@ const ShippingCalculator = ( {
36
  );
37
  };
38
 
 
 
 
 
 
39
  export default ShippingCalculator;
1
  /**
2
  * External dependencies
3
  */
4
+ import PropTypes from 'prop-types';
5
  import { useShippingDataContext } from '@woocommerce/base-context';
 
6
 
7
  /**
8
  * Internal dependencies
10
  import ShippingCalculatorAddress from './address';
11
  import './style.scss';
12
 
 
 
 
 
 
13
  const ShippingCalculator = ( {
14
+ onUpdate = () => {},
 
 
15
  addressFields = [ 'country', 'state', 'city', 'postcode' ],
16
+ } ) => {
17
  const { shippingAddress, setShippingAddress } = useShippingDataContext();
18
  return (
19
  <div className="wc-block-components-shipping-calculator">
29
  );
30
  };
31
 
32
+ ShippingCalculator.propTypes = {
33
+ onUpdate: PropTypes.func,
34
+ addressFields: PropTypes.array,
35
+ };
36
+
37
  export default ShippingCalculator;
assets/js/base/components/cart-checkout/shipping-location/index.js ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { __, sprintf } from '@wordpress/i18n';
6
+ import {
7
+ SHIPPING_COUNTRIES,
8
+ SHIPPING_STATES,
9
+ } from '@woocommerce/block-settings';
10
+ import { decodeEntities } from '@wordpress/html-entities';
11
+
12
+ /**
13
+ * Shows a formatted shipping location.
14
+ *
15
+ * @param {Object} props Incoming props for the component.
16
+ * @param {Object} props.address Incoming address information.
17
+ */
18
+ const ShippingLocation = ( { address } ) => {
19
+ // we bail early if we don't have an address.
20
+ if ( Object.values( address ).length === 0 ) {
21
+ return null;
22
+ }
23
+ const formattedCountry =
24
+ typeof SHIPPING_COUNTRIES[ address.country ] === 'string'
25
+ ? decodeEntities( SHIPPING_COUNTRIES[ address.country ] )
26
+ : '';
27
+
28
+ const formattedState =
29
+ typeof SHIPPING_STATES[ address.country ] === 'object' &&
30
+ typeof SHIPPING_STATES[ address.country ][ address.state ] === 'string'
31
+ ? decodeEntities(
32
+ SHIPPING_STATES[ address.country ][ address.state ]
33
+ )
34
+ : address.state;
35
+
36
+ const addressParts = [];
37
+
38
+ addressParts.push( address.postcode.toUpperCase() );
39
+ addressParts.push( address.city );
40
+ addressParts.push( formattedState );
41
+ addressParts.push( formattedCountry );
42
+
43
+ const formattedLocation = addressParts.filter( Boolean ).join( ', ' );
44
+
45
+ return (
46
+ formattedLocation && (
47
+ <span className="wc-block-components-shipping-address">
48
+ { sprintf(
49
+ /* Translators: %s location. */
50
+ __( 'Shipping to %s', 'woo-gutenberg-products-block' ),
51
+ formattedLocation
52
+ ) + ' ' }
53
+ </span>
54
+ )
55
+ );
56
+ };
57
+
58
+ ShippingLocation.propTypes = {
59
+ address: PropTypes.shape( {
60
+ city: PropTypes.string,
61
+ state: PropTypes.string,
62
+ postcode: PropTypes.string,
63
+ country: PropTypes.string,
64
+ } ),
65
+ };
66
+
67
+ export default ShippingLocation;
assets/js/base/components/cart-checkout/shipping-location/index.tsx DELETED
@@ -1,70 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __, sprintf } from '@wordpress/i18n';
5
- import { EnteredAddress, getSetting } from '@woocommerce/settings';
6
- import { decodeEntities } from '@wordpress/html-entities';
7
-
8
- interface ShippingLocationProps {
9
- address: EnteredAddress;
10
- }
11
-
12
- /**
13
- * Shows a formatted shipping location.
14
- *
15
- * @param {Object} props Incoming props for the component.
16
- * @param {Object} props.address Incoming address information.
17
- */
18
- const ShippingLocation = ( {
19
- address,
20
- }: ShippingLocationProps ): JSX.Element | null => {
21
- // we bail early if we don't have an address.
22
- if ( Object.values( address ).length === 0 ) {
23
- return null;
24
- }
25
- const shippingCountries = getSetting( 'shippingCountries', {} ) as Record<
26
- string,
27
- string
28
- >;
29
- const shippingStates = getSetting( 'shippingStates', {} ) as Record<
30
- string,
31
- Record< string, string >
32
- >;
33
- const formattedCountry =
34
- typeof shippingCountries[ address.country ] === 'string'
35
- ? decodeEntities( shippingCountries[ address.country ] )
36
- : '';
37
-
38
- const formattedState =
39
- typeof shippingStates[ address.country ] === 'object' &&
40
- typeof shippingStates[ address.country ][ address.state ] === 'string'
41
- ? decodeEntities(
42
- shippingStates[ address.country ][ address.state ]
43
- )
44
- : address.state;
45
-
46
- const addressParts = [];
47
-
48
- addressParts.push( address.postcode.toUpperCase() );
49
- addressParts.push( address.city );
50
- addressParts.push( formattedState );
51
- addressParts.push( formattedCountry );
52
-
53
- const formattedLocation = addressParts.filter( Boolean ).join( ', ' );
54
-
55
- if ( ! formattedLocation ) {
56
- return null;
57
- }
58
-
59
- return (
60
- <span className="wc-block-components-shipping-address">
61
- { sprintf(
62
- /* translators: %s location. */
63
- __( 'Shipping to %s', 'woo-gutenberg-products-block' ),
64
- formattedLocation
65
- ) + ' ' }
66
- </span>
67
- );
68
- };
69
-
70
- export default ShippingLocation;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/shipping-rates-control-package/index.tsx DELETED
@@ -1,152 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import classNames from 'classnames';
5
- import { _n, sprintf } from '@wordpress/i18n';
6
- import { decodeEntities } from '@wordpress/html-entities';
7
- import type { ReactElement } from 'react';
8
- import type { PackageRateOption } from '@woocommerce/type-defs/shipping';
9
- import { Panel } from '@woocommerce/blocks-checkout';
10
- import Label from '@woocommerce/base-components/label';
11
- import { useSelectShippingRate } from '@woocommerce/base-context/hooks';
12
- import type { CartShippingPackageShippingRate } from '@woocommerce/type-defs/cart';
13
-
14
- /**
15
- * Internal dependencies
16
- */
17
- import PackageRates from './package-rates';
18
- import './style.scss';
19
-
20
- interface PackageItem {
21
- name: string;
22
- key: string;
23
- quantity: number;
24
- }
25
-
26
- interface Destination {
27
- // eslint-disable-next-line camelcase
28
- address_1: string;
29
- // eslint-disable-next-line camelcase
30
- address_2: string;
31
- city: string;
32
- state: string;
33
- postcode: string;
34
- country: string;
35
- }
36
-
37
- export interface PackageData {
38
- destination: Destination;
39
- name: string;
40
- // eslint-disable-next-line camelcase
41
- shipping_rates: CartShippingPackageShippingRate[];
42
- items: PackageItem[];
43
- }
44
-
45
- export type PackageRateRenderOption = (
46
- option: CartShippingPackageShippingRate
47
- ) => PackageRateOption;
48
-
49
- interface PackageProps {
50
- /* PackageId can be a string, WooCommerce Subscriptions uses strings for example, but WooCommerce core uses numbers */
51
- packageId: string | number;
52
- renderOption: PackageRateRenderOption;
53
- collapse?: boolean;
54
- packageData: PackageData;
55
- className?: string;
56
- collapsible?: boolean;
57
- noResultsMessage: ReactElement;
58
- showItems?: boolean;
59
- }
60
-
61
- export const ShippingRatesControlPackage = ( {
62
- packageId,
63
- className,
64
- noResultsMessage,
65
- renderOption,
66
- packageData,
67
- collapsible = false,
68
- collapse = false,
69
- showItems = false,
70
- }: PackageProps ): ReactElement => {
71
- const { selectShippingRate, selectedShippingRate } = useSelectShippingRate(
72
- packageId,
73
- packageData.shipping_rates
74
- );
75
-
76
- const header = (
77
- <>
78
- { ( showItems || collapsible ) && (
79
- <div className="wc-block-components-shipping-rates-control__package-title">
80
- { packageData.name }
81
- </div>
82
- ) }
83
- { showItems && (
84
- <ul className="wc-block-components-shipping-rates-control__package-items">
85
- { Object.values( packageData.items ).map( ( v ) => {
86
- const name = decodeEntities( v.name );
87
- const quantity = v.quantity;
88
- return (
89
- <li
90
- key={ v.key }
91
- className="wc-block-components-shipping-rates-control__package-item"
92
- >
93
- <Label
94
- label={
95
- quantity > 1
96
- ? `${ name } × ${ quantity }`
97
- : `${ name }`
98
- }
99
- screenReaderLabel={ sprintf(
100
- /* translators: %1$s name of the product (ie: Sunglasses), %2$d number of units in the current cart package */
101
- _n(
102
- '%1$s (%2$d unit)',
103
- '%1$s (%2$d units)',
104
- quantity,
105
- 'woo-gutenberg-products-block'
106
- ),
107
- name,
108
- quantity
109
- ) }
110
- />
111
- </li>
112
- );
113
- } ) }
114
- </ul>
115
- ) }
116
- </>
117
- );
118
- const body = (
119
- <PackageRates
120
- className={ className }
121
- noResultsMessage={ noResultsMessage }
122
- rates={ packageData.shipping_rates }
123
- onSelectRate={ selectShippingRate }
124
- selected={ selectedShippingRate }
125
- renderOption={ renderOption }
126
- />
127
- );
128
- if ( collapsible ) {
129
- return (
130
- <Panel
131
- className="wc-block-components-shipping-rates-control__package"
132
- initialOpen={ ! collapse }
133
- title={ header }
134
- >
135
- { body }
136
- </Panel>
137
- );
138
- }
139
- return (
140
- <div
141
- className={ classNames(
142
- 'wc-block-components-shipping-rates-control__package',
143
- className
144
- ) }
145
- >
146
- { header }
147
- { body }
148
- </div>
149
- );
150
- };
151
-
152
- export default ShippingRatesControlPackage;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/shipping-rates-control-package/package-rates.tsx DELETED
@@ -1,69 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import RadioControl, {
5
- RadioControlOptionLayout,
6
- } from '@woocommerce/base-components/radio-control';
7
- import type { PackageRateOption } from '@woocommerce/type-defs/shipping';
8
- import type { ReactElement } from 'react';
9
- import type { CartShippingPackageShippingRate } from '@woocommerce/type-defs/cart';
10
-
11
- /**
12
- * Internal dependencies
13
- */
14
- import { renderPackageRateOption } from './render-package-rate-option';
15
-
16
- interface PackageRates {
17
- onSelectRate: ( selectedRateId: string ) => void;
18
- rates: CartShippingPackageShippingRate[];
19
- renderOption?: (
20
- option: CartShippingPackageShippingRate
21
- ) => PackageRateOption;
22
- className?: string;
23
- noResultsMessage: ReactElement;
24
- selected?: string;
25
- }
26
-
27
- const PackageRates = ( {
28
- className,
29
- noResultsMessage,
30
- onSelectRate,
31
- rates,
32
- renderOption = renderPackageRateOption,
33
- selected,
34
- }: PackageRates ): ReactElement => {
35
- if ( rates.length === 0 ) {
36
- return noResultsMessage;
37
- }
38
-
39
- if ( rates.length > 1 ) {
40
- return (
41
- <RadioControl
42
- className={ className }
43
- onChange={ ( selectedRateId: string ) => {
44
- onSelectRate( selectedRateId );
45
- } }
46
- selected={ selected }
47
- options={ rates.map( renderOption ) }
48
- />
49
- );
50
- }
51
-
52
- const {
53
- label,
54
- secondaryLabel,
55
- description,
56
- secondaryDescription,
57
- } = renderOption( rates[ 0 ] );
58
-
59
- return (
60
- <RadioControlOptionLayout
61
- label={ label }
62
- secondaryLabel={ secondaryLabel }
63
- description={ description }
64
- secondaryDescription={ secondaryDescription }
65
- />
66
- );
67
- };
68
-
69
- export default PackageRates;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/shipping-rates-control-package/render-package-rate-option.tsx DELETED
@@ -1,46 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { decodeEntities } from '@wordpress/html-entities';
5
- import { getCurrencyFromPriceResponse } from '@woocommerce/price-format';
6
- import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
7
- import type { PackageRateOption } from '@woocommerce/type-defs/shipping';
8
- import { getSetting } from '@woocommerce/settings';
9
- import { CartShippingPackageShippingRate } from '@woocommerce/type-defs/cart';
10
-
11
- /**
12
- * Default render function for package rate options.
13
- *
14
- * @param {Object} rate Rate data.
15
- */
16
- export const renderPackageRateOption = (
17
- rate: CartShippingPackageShippingRate
18
- ): PackageRateOption => {
19
- const priceWithTaxes: number = getSetting(
20
- 'displayCartPricesIncludingTax',
21
- false
22
- )
23
- ? parseInt( rate.price, 10 ) + parseInt( rate.taxes, 10 )
24
- : parseInt( rate.price, 10 );
25
-
26
- return {
27
- label: decodeEntities( rate.name ),
28
- value: rate.rate_id,
29
- description: (
30
- <>
31
- { Number.isFinite( priceWithTaxes ) && (
32
- <FormattedMonetaryAmount
33
- currency={ getCurrencyFromPriceResponse( rate ) }
34
- value={ priceWithTaxes }
35
- />
36
- ) }
37
- { Number.isFinite( priceWithTaxes ) && rate.delivery_time
38
- ? ' — '
39
- : null }
40
- { decodeEntities( rate.delivery_time ) }
41
- </>
42
- ),
43
- };
44
- };
45
-
46
- export default renderPackageRateOption;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/shipping-rates-control-package/style.scss DELETED
@@ -1,43 +0,0 @@
1
- .wc-block-components-shipping-rates-control__package {
2
- .wc-block-components-panel__button {
3
- margin-bottom: 0;
4
- margin-top: 0;
5
- padding-bottom: em($gap-small);
6
- padding-top: em($gap-small);
7
- }
8
-
9
- // Remove panel padding because we are adding bottom padding to `.wc-block-components-radio-control`
10
- // and `.wc-block-components-radio-control__option-layout` in the next ruleset.
11
- .wc-block-components-panel__content {
12
- padding-bottom: 0;
13
- }
14
-
15
- .wc-block-components-radio-control,
16
- .wc-block-components-radio-control__option-layout {
17
- padding-bottom: 0;
18
- }
19
-
20
- .wc-block-components-radio-control .wc-block-components-radio-control__option-layout {
21
- padding-bottom: 0;
22
- }
23
- }
24
-
25
- .wc-block-components-shipping-rates-control__package-items {
26
- @include font-size(small);
27
- display: block;
28
- list-style: none;
29
- margin: 0;
30
- padding: 0;
31
- }
32
-
33
- .wc-block-components-shipping-rates-control__package-item {
34
- @include wrap-break-word();
35
- display: inline-block;
36
- margin: 0;
37
- padding: 0;
38
- }
39
-
40
- .wc-block-components-shipping-rates-control__package-item:not(:last-child)::after {
41
- content: ", ";
42
- white-space: pre;
43
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/shipping-rates-control/index.js ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __, _n, sprintf } from '@wordpress/i18n';
5
+ import { useEffect } from 'react';
6
+ import PropTypes from 'prop-types';
7
+ import { speak } from '@wordpress/a11y';
8
+ import LoadingMask from '@woocommerce/base-components/loading-mask';
9
+ import {
10
+ getShippingRatesPackageCount,
11
+ getShippingRatesRateCount,
12
+ } from '@woocommerce/base-utils';
13
+
14
+ /**
15
+ * Internal dependencies
16
+ */
17
+ import Packages from './packages';
18
+ import './style.scss';
19
+
20
+ const ShippingRatesControl = ( {
21
+ shippingRates,
22
+ shippingRatesLoading,
23
+ className,
24
+ collapsibleWhenMultiple = false,
25
+ noResultsMessage,
26
+ renderOption,
27
+ } ) => {
28
+ useEffect( () => {
29
+ if ( shippingRatesLoading ) {
30
+ return;
31
+ }
32
+ const packages = getShippingRatesPackageCount( shippingRates );
33
+ const shippingOptions = getShippingRatesRateCount( shippingRates );
34
+ if ( shippingOptions === 0 ) {
35
+ speak(
36
+ __(
37
+ 'No shipping options were found.',
38
+ 'woo-gutenberg-products-block'
39
+ )
40
+ );
41
+ } else if ( packages === 1 ) {
42
+ speak(
43
+ sprintf(
44
+ // translators: %d number of shipping options found.
45
+ _n(
46
+ '%d shipping option was found.',
47
+ '%d shipping options were found.',
48
+ shippingOptions,
49
+ 'woo-gutenberg-products-block'
50
+ ),
51
+ shippingOptions
52
+ )
53
+ );
54
+ } else {
55
+ speak(
56
+ sprintf(
57
+ // translators: %d number of shipping packages packages.
58
+ _n(
59
+ 'Shipping option searched for %d package.',
60
+ 'Shipping options searched for %d packages.',
61
+ packages,
62
+ 'woo-gutenberg-products-block'
63
+ ),
64
+ packages
65
+ ) +
66
+ ' ' +
67
+ sprintf(
68
+ // translators: %d number of shipping options available.
69
+ _n(
70
+ '%d shipping option was found',
71
+ '%d shipping options were found',
72
+ shippingOptions,
73
+ 'woo-gutenberg-products-block'
74
+ ),
75
+ shippingOptions
76
+ )
77
+ );
78
+ }
79
+ }, [ shippingRatesLoading, shippingRates ] );
80
+
81
+ return (
82
+ <LoadingMask
83
+ isLoading={ shippingRatesLoading }
84
+ screenReaderLabel={ __(
85
+ 'Loading shipping rates…',
86
+ 'woo-gutenberg-products-block'
87
+ ) }
88
+ showSpinner={ true }
89
+ >
90
+ <Packages
91
+ className={ className }
92
+ collapsible={
93
+ shippingRates.length > 1 && collapsibleWhenMultiple
94
+ }
95
+ noResultsMessage={ noResultsMessage }
96
+ renderOption={ renderOption }
97
+ shippingRates={ shippingRates }
98
+ />
99
+ </LoadingMask>
100
+ );
101
+ };
102
+
103
+ ShippingRatesControl.propTypes = {
104
+ noResultsMessage: PropTypes.node.isRequired,
105
+ renderOption: PropTypes.func.isRequired,
106
+ className: PropTypes.string,
107
+ collapsibleWhenMultiple: PropTypes.bool,
108
+ shippingRates: PropTypes.array,
109
+ shippingRatesLoading: PropTypes.bool,
110
+ };
111
+
112
+ export default ShippingRatesControl;
113
+ export { Packages };
assets/js/base/components/cart-checkout/shipping-rates-control/index.tsx DELETED
@@ -1,187 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __, _n, sprintf } from '@wordpress/i18n';
5
- import { useEffect } from '@wordpress/element';
6
- import { speak } from '@wordpress/a11y';
7
- import LoadingMask from '@woocommerce/base-components/loading-mask';
8
- import { ExperimentalOrderShippingPackages } from '@woocommerce/blocks-checkout';
9
- import {
10
- getShippingRatesPackageCount,
11
- getShippingRatesRateCount,
12
- } from '@woocommerce/base-utils';
13
- import { useStoreCart } from '@woocommerce/base-context/hooks';
14
- import { CartResponseShippingRate } from '@woocommerce/type-defs/cart-response';
15
- import { ReactElement } from 'react';
16
-
17
- /**
18
- * Internal dependencies
19
- */
20
- import ShippingRatesControlPackage, {
21
- PackageRateRenderOption,
22
- } from '../shipping-rates-control-package';
23
-
24
- interface PackagesProps {
25
- packages: CartResponseShippingRate[];
26
- collapse?: boolean;
27
- collapsible?: boolean;
28
- showItems?: boolean;
29
- noResultsMessage: ReactElement;
30
- renderOption: PackageRateRenderOption;
31
- }
32
-
33
- /**
34
- * Renders multiple packages within the slotfill.
35
- *
36
- * @param {Object} props Incoming props.
37
- * @param {Array} props.packages Array of packages.
38
- * @param {boolean} props.collapsible If the package should be rendered as a
39
- * @param {ReactElement} props.noResultsMessage Rendered when there are no rates in a package.
40
- * collapsible panel.
41
- * @param {boolean} props.collapse If the panel should be collapsed by default,
42
- * only works if collapsible is true.
43
- * @param {boolean} props.showItems If we should items below the package name.
44
- * @param {PackageRateRenderOption} [props.renderOption] Function to render a shipping rate.
45
- * @return {JSX.Element|null} Rendered components.
46
- */
47
- const Packages = ( {
48
- packages,
49
- collapse,
50
- showItems,
51
- collapsible,
52
- noResultsMessage,
53
- renderOption,
54
- }: PackagesProps ): JSX.Element | null => {
55
- // If there are no packages, return nothing.
56
- if ( ! packages.length ) {
57
- return null;
58
- }
59
- return (
60
- <>
61
- { packages.map( ( { package_id: packageId, ...packageData } ) => (
62
- <ShippingRatesControlPackage
63
- key={ packageId }
64
- packageId={ packageId }
65
- packageData={ packageData }
66
- collapsible={ collapsible }
67
- collapse={ collapse }
68
- showItems={ showItems }
69
- noResultsMessage={ noResultsMessage }
70
- renderOption={ renderOption }
71
- />
72
- ) ) }
73
- </>
74
- );
75
- };
76
-
77
- interface ShippingRatesControlProps {
78
- collapsible?: boolean;
79
- shippingRates: CartResponseShippingRate[];
80
- className?: string;
81
- shippingRatesLoading: boolean;
82
- noResultsMessage: ReactElement;
83
- renderOption: PackageRateRenderOption;
84
- }
85
- /**
86
- * Renders the shipping rates control element.
87
- *
88
- * @param {Object} props Incoming props.
89
- * @param {Array} props.shippingRates Array of packages containing shipping rates.
90
- * @param {boolean} props.shippingRatesLoading True when rates are being loaded.
91
- * @param {string} props.className Class name for package rates.
92
- * @param {boolean} [props.collapsible] If true, when multiple packages are rendered they can be toggled open and closed.
93
- * @param {ReactElement} props.noResultsMessage Rendered when there are no packages.
94
- * @param {Function} [props.renderOption] Function to render a shipping rate.
95
- */
96
- const ShippingRatesControl = ( {
97
- shippingRates,
98
- shippingRatesLoading,
99
- className,
100
- collapsible = false,
101
- noResultsMessage,
102
- renderOption,
103
- }: ShippingRatesControlProps ): JSX.Element => {
104
- useEffect( () => {
105
- if ( shippingRatesLoading ) {
106
- return;
107
- }
108
- const packageCount = getShippingRatesPackageCount( shippingRates );
109
- const shippingOptions = getShippingRatesRateCount( shippingRates );
110
- if ( packageCount === 1 ) {
111
- speak(
112
- sprintf(
113
- /* translators: %d number of shipping options found. */
114
- _n(
115
- '%d shipping option was found.',
116
- '%d shipping options were found.',
117
- shippingOptions,
118
- 'woo-gutenberg-products-block'
119
- ),
120
- shippingOptions
121
- )
122
- );
123
- } else {
124
- speak(
125
- sprintf(
126
- /* translators: %d number of shipping packages packages. */
127
- _n(
128
- 'Shipping option searched for %d package.',
129
- 'Shipping options searched for %d packages.',
130
- packageCount,
131
- 'woo-gutenberg-products-block'
132
- ),
133
- packageCount
134
- ) +
135
- ' ' +
136
- sprintf(
137
- /* translators: %d number of shipping options available. */
138
- _n(
139
- '%d shipping option was found',
140
- '%d shipping options were found',
141
- shippingOptions,
142
- 'woo-gutenberg-products-block'
143
- ),
144
- shippingOptions
145
- )
146
- );
147
- }
148
- }, [ shippingRatesLoading, shippingRates ] );
149
-
150
- // Prepare props to pass to the ExperimentalOrderShippingPackages slot fill.
151
- // We need to pluck out receiveCart.
152
- // eslint-disable-next-line no-unused-vars
153
- const { extensions, ...cart } = useStoreCart();
154
- const slotFillProps = {
155
- className,
156
- collapsible,
157
- noResultsMessage,
158
- renderOption,
159
- extensions,
160
- cart,
161
- components: {
162
- ShippingRatesControlPackage,
163
- },
164
- };
165
-
166
- return (
167
- <LoadingMask
168
- isLoading={ shippingRatesLoading }
169
- screenReaderLabel={ __(
170
- 'Loading shipping rates…',
171
- 'woo-gutenberg-products-block'
172
- ) }
173
- showSpinner={ true }
174
- >
175
- <ExperimentalOrderShippingPackages.Slot { ...slotFillProps } />
176
- <ExperimentalOrderShippingPackages>
177
- <Packages
178
- packages={ shippingRates }
179
- noResultsMessage={ noResultsMessage }
180
- renderOption={ renderOption }
181
- />
182
- </ExperimentalOrderShippingPackages>
183
- </LoadingMask>
184
- );
185
- };
186
-
187
- export default ShippingRatesControl;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/shipping-rates-control/package-options.js ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import RadioControl, {
6
+ RadioControlOptionLayout,
7
+ } from '@woocommerce/base-components/radio-control';
8
+
9
+ const PackageOptions = ( {
10
+ className,
11
+ noResultsMessage,
12
+ onChange,
13
+ options,
14
+ renderOption,
15
+ selected,
16
+ } ) => {
17
+ if ( options.length === 0 ) {
18
+ return noResultsMessage;
19
+ }
20
+
21
+ if ( options.length > 1 ) {
22
+ return (
23
+ <RadioControl
24
+ className={ className }
25
+ onChange={ onChange }
26
+ selected={ selected }
27
+ options={ options.map( renderOption ) }
28
+ />
29
+ );
30
+ }
31
+
32
+ const {
33
+ label,
34
+ secondaryLabel,
35
+ description,
36
+ secondaryDescription,
37
+ } = renderOption( options[ 0 ] );
38
+
39
+ return (
40
+ <RadioControlOptionLayout
41
+ label={ label }
42
+ secondaryLabel={ secondaryLabel }
43
+ description={ description }
44
+ secondaryDescription={ secondaryDescription }
45
+ />
46
+ );
47
+ };
48
+
49
+ PackageOptions.propTypes = {
50
+ onChange: PropTypes.func.isRequired,
51
+ options: PropTypes.arrayOf( PropTypes.object ).isRequired,
52
+ renderOption: PropTypes.func.isRequired,
53
+ className: PropTypes.string,
54
+ noResultsMessage: PropTypes.node,
55
+ selected: PropTypes.string,
56
+ };
57
+
58
+ export default PackageOptions;
assets/js/base/components/cart-checkout/shipping-rates-control/package.js ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { _n, sprintf } from '@wordpress/i18n';
6
+ import { decodeEntities } from '@wordpress/html-entities';
7
+ import Label from '@woocommerce/base-components/label';
8
+ import Title from '@woocommerce/base-components/title';
9
+ import Panel from '@woocommerce/base-components/panel';
10
+ import classNames from 'classnames';
11
+
12
+ /**
13
+ * Internal dependencies
14
+ */
15
+ import PackageOptions from './package-options';
16
+ import './style.scss';
17
+
18
+ const Package = ( {
19
+ className,
20
+ collapsible = false,
21
+ noResultsMessage,
22
+ onChange,
23
+ renderOption,
24
+ selected,
25
+ shippingRate,
26
+ showItems,
27
+ title,
28
+ } ) => {
29
+ const header = (
30
+ <>
31
+ { title && (
32
+ <Title
33
+ className="wc-block-components-shipping-rates-control__package-title"
34
+ headingLevel="3"
35
+ >
36
+ { title }
37
+ </Title>
38
+ ) }
39
+ { showItems && (
40
+ <ul className="wc-block-components-shipping-rates-control__package-items">
41
+ { Object.values( shippingRate.items ).map( ( v ) => {
42
+ const name = decodeEntities( v.name );
43
+ const quantity = v.quantity;
44
+ return (
45
+ <li
46
+ key={ name }
47
+ className="wc-block-components-shipping-rates-control__package-item"
48
+ >
49
+ <Label
50
+ label={ `${ name } ×${ quantity }` }
51
+ screenReaderLabel={ sprintf(
52
+ // translators: %1$s name of the product (ie: Sunglasses), %2$d number of units in the current cart package
53
+ _n(
54
+ '%1$s (%2$d unit)',
55
+ '%1$s (%2$d units)',
56
+ quantity,
57
+ 'woo-gutenberg-products-block'
58
+ ),
59
+ name,
60
+ quantity
61
+ ) }
62
+ />
63
+ </li>
64
+ );
65
+ } ) }
66
+ </ul>
67
+ ) }
68
+ </>
69
+ );
70
+ const body = (
71
+ <PackageOptions
72
+ className={ className }
73
+ noResultsMessage={ noResultsMessage }
74
+ onChange={ onChange }
75
+ options={ shippingRate.shipping_rates }
76
+ renderOption={ renderOption }
77
+ selected={ selected }
78
+ />
79
+ );
80
+ if ( collapsible ) {
81
+ return (
82
+ <Panel
83
+ className="wc-block-components-shipping-rates-control__package"
84
+ hasBorder={ true }
85
+ initialOpen={ true }
86
+ title={ header }
87
+ >
88
+ { body }
89
+ </Panel>
90
+ );
91
+ }
92
+ return (
93
+ <div
94
+ className={ classNames(
95
+ 'wc-block-components-shipping-rates-control__package',
96
+ className
97
+ ) }
98
+ >
99
+ { header }
100
+ { body }
101
+ </div>
102
+ );
103
+ };
104
+
105
+ Package.propTypes = {
106
+ onChange: PropTypes.func.isRequired,
107
+ renderOption: PropTypes.func.isRequired,
108
+ shippingRate: PropTypes.shape( {
109
+ shipping_rates: PropTypes.arrayOf( PropTypes.object ).isRequired,
110
+ items: PropTypes.arrayOf(
111
+ PropTypes.shape( {
112
+ name: PropTypes.string.isRequired,
113
+ key: PropTypes.string.isRequired,
114
+ quantity: PropTypes.number.isRequired,
115
+ } ).isRequired
116
+ ).isRequired,
117
+ } ).isRequired,
118
+ className: PropTypes.string,
119
+ collapsible: PropTypes.bool,
120
+ noResultsMessage: PropTypes.node,
121
+ selected: PropTypes.string,
122
+ showItems: PropTypes.bool,
123
+ title: PropTypes.string,
124
+ };
125
+
126
+ export default Package;
assets/js/base/components/cart-checkout/shipping-rates-control/packages.js ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { useSelectShippingRate } from '@woocommerce/base-hooks';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import Package from './package';
11
+ import './style.scss';
12
+
13
+ const Packages = ( {
14
+ className,
15
+ collapsible = false,
16
+ noResultsMessage = null,
17
+ renderOption,
18
+ shippingRates = [],
19
+ } ) => {
20
+ const { selectShippingRate, selectedShippingRates } = useSelectShippingRate(
21
+ shippingRates
22
+ );
23
+
24
+ if ( ! shippingRates.length ) {
25
+ return noResultsMessage;
26
+ }
27
+
28
+ /* eslint-disable camelcase */
29
+ return (
30
+ <div className="wc-block-components-shipping-rates-control">
31
+ { shippingRates.map( ( { package_id, ...shippingRate } ) => (
32
+ <Package
33
+ key={ package_id }
34
+ className={ className }
35
+ collapsible={ collapsible }
36
+ noResultsMessage={ noResultsMessage }
37
+ onChange={ ( newShippingRate ) => {
38
+ selectShippingRate( newShippingRate, package_id );
39
+ } }
40
+ renderOption={ renderOption }
41
+ selected={ selectedShippingRates[ package_id ] }
42
+ shippingRate={ shippingRate }
43
+ showItems={ shippingRates.length > 1 }
44
+ title={
45
+ shippingRates.length > 1 ? shippingRate.name : null
46
+ }
47
+ />
48
+ ) ) }
49
+ </div>
50
+ );
51
+ /* eslint-enable */
52
+ };
53
+
54
+ Packages.propTypes = {
55
+ renderOption: PropTypes.func.isRequired,
56
+ className: PropTypes.string,
57
+ collapsible: PropTypes.bool,
58
+ noResultsMessage: PropTypes.node,
59
+ shippingRates: PropTypes.arrayOf(
60
+ PropTypes.shape( {
61
+ items: PropTypes.arrayOf(
62
+ PropTypes.shape( {
63
+ key: PropTypes.string,
64
+ name: PropTypes.string,
65
+ quantity: PropTypes.number,
66
+ } )
67
+ ).isRequired,
68
+ package_id: PropTypes.number,
69
+ name: PropTypes.string,
70
+ destination: PropTypes.object,
71
+ shipping_rates: PropTypes.arrayOf( PropTypes.object ),
72
+ } ).isRequired
73
+ ).isRequired,
74
+ };
75
+
76
+ export default Packages;
assets/js/base/components/cart-checkout/shipping-rates-control/style.scss ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .wc-block-components-shipping-rates-control__package {
2
+ .wc-block-components-shipping-rates-control__package-title {
3
+ margin: 0;
4
+ }
5
+ }
6
+
7
+ .wc-block-components-shipping-rates-control__package-items {
8
+ @include font-size(small);
9
+ display: block;
10
+ list-style: none;
11
+ margin: 0;
12
+ padding: 0;
13
+ }
14
+
15
+ .wc-block-components-shipping-rates-control__package-item {
16
+ @include wrap-break-word();
17
+ display: inline-block;
18
+ margin: 0;
19
+ padding: 0;
20
+ }
21
+
22
+ .wc-block-components-shipping-rates-control__package-item:not(:last-child)::after {
23
+ content: ", ";
24
+ white-space: pre;
25
+ }
26
+
27
+ .components-notice.wc-block-components-shipping-rates-control__no-results-notice {
28
+ margin-bottom: 0;
29
+ }
30
+
31
+ .wc-block-components-shipping-rates-control {
32
+ .wc-blocks-components-panel__content {
33
+ padding-bottom: 0;
34
+ }
35
+ }
assets/js/base/components/cart-checkout/totals/discount/stories/index.js DELETED
@@ -1,37 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { text, boolean } from '@storybook/addon-knobs';
5
- import { currencyKnob } from '@woocommerce/knobs';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import TotalsDiscount from '../';
11
-
12
- export default {
13
- title:
14
- 'WooCommerce Blocks/@base-components/cart-checkout/totals/TotalsDiscount',
15
- component: TotalsDiscount,
16
- };
17
-
18
- export const Default = () => {
19
- const cartCoupons = [ { code: 'COUPON' } ];
20
- const currency = currencyKnob();
21
- const isRemovingCoupon = boolean( 'Toggle isRemovingCoupon state', false );
22
- const totalDiscount = text( 'Total discount', '1000' );
23
- const totalDiscountTax = text( 'Total discount tax', '200' );
24
-
25
- return (
26
- <TotalsDiscount
27
- cartCoupons={ cartCoupons }
28
- currency={ currency }
29
- isRemovingCoupon={ isRemovingCoupon }
30
- removeCoupon={ () => void null }
31
- values={ {
32
- total_discount: totalDiscount,
33
- total_discount_tax: totalDiscountTax,
34
- } }
35
- />
36
- );
37
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/discount/style.scss DELETED
@@ -1,9 +0,0 @@
1
- .wc-block-components-totals-discount__coupon-list {
2
- list-style: none;
3
- margin: 0;
4
- padding: 0;
5
- }
6
-
7
- .wc-block-components-totals-discount .wc-block-components-totals-item__value {
8
- color: $discount-color;
9
- }
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/footer-item/stories/index.js DELETED
@@ -1,32 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { text } from '@storybook/addon-knobs';
5
- import { currencyKnob } from '@woocommerce/knobs';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import TotalsFooterItem from '../';
11
-
12
- export default {
13
- title:
14
- 'WooCommerce Blocks/@base-components/cart-checkout/totals/TotalsFooterItem',
15
- component: TotalsFooterItem,
16
- };
17
-
18
- export const Default = () => {
19
- const currency = currencyKnob();
20
- const totalPrice = text( 'Total price', '1200' );
21
- const totalTax = text( 'Total tax', '200' );
22
-
23
- return (
24
- <TotalsFooterItem
25
- currency={ currency }
26
- values={ {
27
- total_price: totalPrice,
28
- total_tax: totalTax,
29
- } }
30
- />
31
- );
32
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/footer-item/test/__snapshots__/index.js.snap DELETED
@@ -1,79 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`TotalsFooterItem Does not show the "including %s of tax" line if tax is 0 1`] = `
4
- <div>
5
- <div
6
- class="wc-block-components-totals-item wc-block-components-totals-footer-item"
7
- >
8
- <span
9
- class="wc-block-components-totals-item__label"
10
- >
11
- Total
12
- </span>
13
- <span
14
- class="wc-block-formatted-money-amount wc-block-components-formatted-money-amount wc-block-components-totals-item__value"
15
- >
16
- £85.00
17
- </span>
18
- <div
19
- class="wc-block-components-totals-item__description"
20
- />
21
- </div>
22
- </div>
23
- `;
24
-
25
- exports[`TotalsFooterItem Does not show the "including %s of tax" line if tax is disabled 1`] = `
26
- <div>
27
- <div
28
- class="wc-block-components-totals-item wc-block-components-totals-footer-item"
29
- >
30
- <span
31
- class="wc-block-components-totals-item__label"
32
- >
33
- Total
34
- </span>
35
- <span
36
- class="wc-block-formatted-money-amount wc-block-components-formatted-money-amount wc-block-components-totals-item__value"
37
- >
38
- £85.00
39
- </span>
40
- <div
41
- class="wc-block-components-totals-item__description"
42
- />
43
- </div>
44
- </div>
45
- `;
46
-
47
- exports[`TotalsFooterItem Shows the "including %s of tax" line if tax is greater than 0 1`] = `
48
- <div>
49
- <div
50
- class="wc-block-components-totals-item wc-block-components-totals-footer-item"
51
- >
52
- <span
53
- class="wc-block-components-totals-item__label"
54
- >
55
- Total
56
- </span>
57
- <span
58
- class="wc-block-formatted-money-amount wc-block-components-formatted-money-amount wc-block-components-totals-item__value"
59
- >
60
- £85.00
61
- </span>
62
- <div
63
- class="wc-block-components-totals-item__description"
64
- >
65
- <p
66
- class="wc-block-components-totals-footer-item-tax"
67
- >
68
- Including
69
- <span
70
- class="wc-block-formatted-money-amount wc-block-components-formatted-money-amount wc-block-components-totals-footer-item-tax-value"
71
- >
72
- £1.00
73
- </span>
74
- in taxes
75
- </p>
76
- </div>
77
- </div>
78
- </div>
79
- `;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/footer-item/test/index.js DELETED
@@ -1,81 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { render } from '@testing-library/react';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import TotalsFooterItem from '../index';
10
- import { allSettings } from '../../../../../../settings/shared/settings-init';
11
-
12
- describe( 'TotalsFooterItem', () => {
13
- beforeEach( () => {
14
- allSettings.taxesEnabled = true;
15
- allSettings.displayCartPricesIncludingTax = true;
16
- } );
17
- const currency = {
18
- code: 'GBP',
19
- decimalSeparator: '.',
20
- minorUnit: 2,
21
- prefix: '£',
22
- suffix: '',
23
- symbol: '£',
24
- thousandSeparator: ',',
25
- };
26
-
27
- const values = {
28
- currency_code: 'GBP',
29
- currency_decimal_separator: '.',
30
- currency_minor_unit: 2,
31
- currency_prefix: '£',
32
- currency_suffix: '',
33
- currency_symbol: '£',
34
- currency_thousand_separator: ',',
35
- tax_lines: [],
36
- length: 2,
37
- total_discount: '0',
38
- total_discount_tax: '0',
39
- total_fees: '0',
40
- total_fees_tax: '0',
41
- total_items: '7100',
42
- total_items_tax: '0',
43
- total_price: '8500',
44
- total_shipping: '0',
45
- total_shipping_tax: '0',
46
- total_tax: '0',
47
- };
48
-
49
- it( 'Does not show the "including %s of tax" line if tax is 0', () => {
50
- const { container } = render(
51
- <TotalsFooterItem currency={ currency } values={ values } />
52
- );
53
- expect( container ).toMatchSnapshot();
54
- } );
55
-
56
- it( 'Does not show the "including %s of tax" line if tax is disabled', () => {
57
- allSettings.taxesEnabled = false;
58
- /* This shouldn't ever happen if taxes are disabled, but this is to test whether the taxesEnabled setting works */
59
- const valuesWithTax = {
60
- ...values,
61
- total_tax: '100',
62
- total_items_tax: '100',
63
- };
64
- const { container } = render(
65
- <TotalsFooterItem currency={ currency } values={ valuesWithTax } />
66
- );
67
- expect( container ).toMatchSnapshot();
68
- } );
69
-
70
- it( 'Shows the "including %s of tax" line if tax is greater than 0', () => {
71
- const valuesWithTax = {
72
- ...values,
73
- total_tax: '100',
74
- total_items_tax: '100',
75
- };
76
- const { container } = render(
77
- <TotalsFooterItem currency={ currency } values={ valuesWithTax } />
78
- );
79
- expect( container ).toMatchSnapshot();
80
- } );
81
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/index.js CHANGED
@@ -1,4 +1,8 @@
1
- export { default as TotalsCoupon } from './coupon';
2
- export { default as TotalsDiscount } from './discount';
3
- export { default as TotalsFooterItem } from './footer-item';
4
- export { default as TotalsShipping } from './shipping';
 
 
 
 
1
+ export { default as SubtotalsItem } from './subtotals-item';
2
+ export { default as TotalsCouponCodeInput } from './totals-coupon-code-input';
3
+ export { default as TotalsDiscountItem } from './totals-discount-item';
4
+ export { default as TotalsFeesItem } from './totals-fees-item';
5
+ export { default as TotalsFooterItem } from './totals-footer-item';
6
+ export { default as TotalsItem } from './totals-item';
7
+ export { default as TotalsShippingItem } from './totals-shipping-item';
8
+ export { default as TotalsTaxesItem } from './totals-taxes-item';
assets/js/base/components/cart-checkout/totals/shipping/shipping-rate-selector.js DELETED
@@ -1,48 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __ } from '@wordpress/i18n';
5
- import { Notice } from 'wordpress-components';
6
- import classnames from 'classnames';
7
-
8
- /**
9
- * Internal dependencies
10
- */
11
- import ShippingRatesControl from '../../shipping-rates-control';
12
-
13
- const ShippingRateSelector = ( {
14
- hasRates,
15
- shippingRates,
16
- shippingRatesLoading,
17
- } ) => {
18
- const legend = hasRates
19
- ? __( 'Shipping options', 'woo-gutenberg-products-block' )
20
- : __( 'Choose a shipping option', 'woo-gutenberg-products-block' );
21
- return (
22
- <fieldset className="wc-block-components-totals-shipping__fieldset">
23
- <legend className="screen-reader-text">{ legend }</legend>
24
- <ShippingRatesControl
25
- className="wc-block-components-totals-shipping__options"
26
- collapsible={ true }
27
- noResultsMessage={
28
- <Notice
29
- isDismissible={ false }
30
- className={ classnames(
31
- 'wc-block-components-shipping-rates-control__no-results-notice',
32
- 'woocommerce-error'
33
- ) }
34
- >
35
- { __(
36
- 'No shipping options were found.',
37
- 'woo-gutenberg-products-block'
38
- ) }
39
- </Notice>
40
- }
41
- shippingRates={ shippingRates }
42
- shippingRatesLoading={ shippingRatesLoading }
43
- />
44
- </fieldset>
45
- );
46
- };
47
-
48
- export default ShippingRateSelector;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/shipping/shipping-via.tsx DELETED
@@ -1,17 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __ } from '@wordpress/i18n';
5
-
6
- export const ShippingVia = ( {
7
- selectedShippingRates,
8
- }: {
9
- selectedShippingRates: string[];
10
- } ): JSX.Element => {
11
- return (
12
- <div className="wc-block-components-totals-item__description wc-block-components-totals-shipping__via">
13
- { __( 'via', 'woo-gutenberg-products-block' ) }{ ' ' }
14
- { selectedShippingRates.join( ', ' ) }
15
- </div>
16
- );
17
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/shipping/stories/index.js DELETED
@@ -1,35 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { boolean, text } from '@storybook/addon-knobs';
5
- import { currencyKnob } from '@woocommerce/knobs';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import TotalsShipping from '../';
11
-
12
- export default {
13
- title: 'WooCommerce Blocks/@blocks-checkout/TotalsShipping',
14
- component: TotalsShipping,
15
- };
16
-
17
- export const Default = () => {
18
- const currency = currencyKnob();
19
- const showCalculator = boolean( 'Show calculator', true );
20
- const showRateSelector = boolean( 'Show rate selector', true );
21
- const totalShipping = text( 'Total shipping', '1000' );
22
- const totalShippingTax = text( 'Total shipping tax', '200' );
23
-
24
- return (
25
- <TotalsShipping
26
- currency={ currency }
27
- showCalculator={ showCalculator }
28
- showRateSelector={ showRateSelector }
29
- values={ {
30
- total_shipping: totalShipping,
31
- total_shipping_tax: totalShippingTax,
32
- } }
33
- />
34
- );
35
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/subtotals-item/index.js ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
6
+ import PropTypes from 'prop-types';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import TotalsItem from '../totals-item';
12
+
13
+ const SubtotalsItem = ( { currency, values } ) => {
14
+ const { total_items: totalItems, total_items_tax: totalItemsTax } = values;
15
+ const itemsValue = parseInt( totalItems, 10 );
16
+ const itemsTaxValue = parseInt( totalItemsTax, 10 );
17
+
18
+ return (
19
+ <TotalsItem
20
+ currency={ currency }
21
+ label={ __( 'Subtotal', 'woo-gutenberg-products-block' ) }
22
+ value={
23
+ DISPLAY_CART_PRICES_INCLUDING_TAX
24
+ ? itemsValue + itemsTaxValue
25
+ : itemsValue
26
+ }
27
+ />
28
+ );
29
+ };
30
+
31
+ SubtotalsItem.propTypes = {
32
+ currency: PropTypes.object.isRequired,
33
+ values: PropTypes.shape( {
34
+ total_items: PropTypes.string,
35
+ total_items_tax: PropTypes.string,
36
+ } ).isRequired,
37
+ };
38
+
39
+ export default SubtotalsItem;
assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/index.js RENAMED
@@ -6,21 +6,19 @@ import { useState, useEffect, useRef } from '@wordpress/element';
6
  import Button from '@woocommerce/base-components/button';
7
  import { ValidatedTextInput } from '@woocommerce/base-components/text-input';
8
  import Label from '@woocommerce/base-components/label';
 
9
  import LoadingMask from '@woocommerce/base-components/loading-mask';
10
  import PropTypes from 'prop-types';
11
  import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
12
- import {
13
- ValidationInputError,
14
- useValidationContext,
15
- } from '@woocommerce/base-context';
16
- import { Panel } from '@woocommerce/blocks-checkout';
17
 
18
  /**
19
  * Internal dependencies
20
  */
21
  import './style.scss';
22
 
23
- const TotalsCoupon = ( {
24
  instanceId,
25
  isLoading = false,
26
  initialOpen = false,
@@ -29,6 +27,7 @@ const TotalsCoupon = ( {
29
  const [ couponValue, setCouponValue ] = useState( '' );
30
  const currentIsLoading = useRef( false );
31
  const { getValidationError, getValidationErrorId } = useValidationContext();
 
32
  const validationError = getValidationError( 'coupon' );
33
 
34
  useEffect( () => {
@@ -45,21 +44,22 @@ const TotalsCoupon = ( {
45
  return (
46
  <Panel
47
  className="wc-block-components-totals-coupon"
48
- hasBorder={ false }
49
  initialOpen={ initialOpen }
50
  title={
51
  <Label
52
  label={ __(
53
- 'Coupon code',
54
  'woo-gutenberg-products-block'
55
  ) }
56
  screenReaderLabel={ __(
57
- 'Apply a coupon code',
58
  'woo-gutenberg-products-block'
59
  ) }
60
  htmlFor={ textInputId }
61
  />
62
  }
 
63
  >
64
  <LoadingMask
65
  screenReaderLabel={ __(
@@ -113,9 +113,9 @@ const TotalsCoupon = ( {
113
  );
114
  };
115
 
116
- TotalsCoupon.propTypes = {
117
  onSubmit: PropTypes.func,
118
  isLoading: PropTypes.bool,
119
  };
120
 
121
- export default withInstanceId( TotalsCoupon );
6
  import Button from '@woocommerce/base-components/button';
7
  import { ValidatedTextInput } from '@woocommerce/base-components/text-input';
8
  import Label from '@woocommerce/base-components/label';
9
+ import { ValidationInputError } from '@woocommerce/base-components/validation';
10
  import LoadingMask from '@woocommerce/base-components/loading-mask';
11
  import PropTypes from 'prop-types';
12
  import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
13
+ import { useValidationContext } from '@woocommerce/base-context';
14
+ import Panel from '@woocommerce/base-components/panel';
 
 
 
15
 
16
  /**
17
  * Internal dependencies
18
  */
19
  import './style.scss';
20
 
21
+ const TotalsCouponCodeInput = ( {
22
  instanceId,
23
  isLoading = false,
24
  initialOpen = false,
27
  const [ couponValue, setCouponValue ] = useState( '' );
28
  const currentIsLoading = useRef( false );
29
  const { getValidationError, getValidationErrorId } = useValidationContext();
30
+
31
  const validationError = getValidationError( 'coupon' );
32
 
33
  useEffect( () => {
44
  return (
45
  <Panel
46
  className="wc-block-components-totals-coupon"
47
+ hasBorder={ true }
48
  initialOpen={ initialOpen }
49
  title={
50
  <Label
51
  label={ __(
52
+ 'Coupon Code?',
53
  'woo-gutenberg-products-block'
54
  ) }
55
  screenReaderLabel={ __(
56
+ 'Introduce Coupon Code',
57
  'woo-gutenberg-products-block'
58
  ) }
59
  htmlFor={ textInputId }
60
  />
61
  }
62
+ titleTag="h2"
63
  >
64
  <LoadingMask
65
  screenReaderLabel={ __(
113
  );
114
  };
115
 
116
+ TotalsCouponCodeInput.propTypes = {
117
  onSubmit: PropTypes.func,
118
  isLoading: PropTypes.bool,
119
  };
120
 
121
+ export default withInstanceId( TotalsCouponCodeInput );
assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/stories/index.js RENAMED
@@ -10,12 +10,11 @@ import {
10
  /**
11
  * Internal dependencies
12
  */
13
- import TotalsCoupon from '../';
14
 
15
  export default {
16
- title:
17
- 'WooCommerce Blocks/@base-components/cart-checkout/totals/TotalsCoupon',
18
- component: TotalsCoupon,
19
  };
20
 
21
  const StoryComponent = ( { validCoupon, isLoading, invalidCouponText } ) => {
@@ -25,7 +24,7 @@ const StoryComponent = ( { validCoupon, isLoading, invalidCouponText } ) => {
25
  setValidationErrors( { coupon: invalidCouponText } );
26
  }
27
  };
28
- return <TotalsCoupon isLoading={ isLoading } onSubmit={ onSubmit } />;
29
  };
30
 
31
  export const Default = () => {
10
  /**
11
  * Internal dependencies
12
  */
13
+ import CouponInput from '../';
14
 
15
  export default {
16
+ title: 'WooCommerce Blocks/@base-components/CouponInput',
17
+ component: CouponInput,
 
18
  };
19
 
20
  const StoryComponent = ( { validCoupon, isLoading, invalidCouponText } ) => {
24
  setValidationErrors( { coupon: invalidCouponText } );
25
  }
26
  };
27
+ return <CouponInput isLoading={ isLoading } onSubmit={ onSubmit } />;
28
  };
29
 
30
  export const Default = () => {
assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/style.scss RENAMED
@@ -1,19 +1,7 @@
1
- .wc-block-components-totals-coupon {
2
-
3
- .wc-block-components-panel__button {
4
- margin-top: 0;
5
- padding-top: 0;
6
- }
7
-
8
- .wc-block-components-panel__content {
9
- padding-bottom: 0;
10
- }
11
- }
12
-
13
  .wc-block-components-totals-coupon__form {
14
  display: flex;
15
- width: 100%;
16
  margin-bottom: 0;
 
17
 
18
  .wc-block-components-totals-coupon__input {
19
  margin-bottom: 0;
@@ -22,20 +10,22 @@
22
  }
23
 
24
  .wc-block-components-totals-coupon__button {
25
- height: em(48px);
26
  flex-shrink: 0;
27
  margin-left: $gap-smaller;
28
  padding-left: $gap-large;
29
  padding-right: $gap-large;
30
  white-space: nowrap;
31
  }
32
-
33
- .wc-block-components-totals-coupon__button.no-margin {
34
- margin: 0;
35
- }
36
  }
37
 
38
  .wc-block-components-totals-coupon__content {
39
  flex-direction: column;
40
  position: relative;
 
 
 
 
 
 
41
  }
 
 
 
 
 
 
 
 
 
 
 
 
1
  .wc-block-components-totals-coupon__form {
2
  display: flex;
 
3
  margin-bottom: 0;
4
+ width: 100%;
5
 
6
  .wc-block-components-totals-coupon__input {
7
  margin-bottom: 0;
10
  }
11
 
12
  .wc-block-components-totals-coupon__button {
13
+ height: 48px;
14
  flex-shrink: 0;
15
  margin-left: $gap-smaller;
16
  padding-left: $gap-large;
17
  padding-right: $gap-large;
18
  white-space: nowrap;
19
  }
 
 
 
 
20
  }
21
 
22
  .wc-block-components-totals-coupon__content {
23
  flex-direction: column;
24
  position: relative;
25
+
26
+ .wc-block-components-validation-error {
27
+ margin-top: $gap-smaller;
28
+ position: relative;
29
+ width: 100%;
30
+ }
31
  }
assets/js/base/components/cart-checkout/totals/{discount → totals-discount-item}/index.js RENAMED
@@ -2,21 +2,18 @@
2
  * External dependencies
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
 
5
  import LoadingMask from '@woocommerce/base-components/loading-mask';
6
  import { RemovableChip } from '@woocommerce/base-components/chip';
7
  import PropTypes from 'prop-types';
8
- import {
9
- __experimentalApplyCheckoutFilter,
10
- TotalsItem,
11
- } from '@woocommerce/blocks-checkout';
12
- import { getSetting } from '@woocommerce/settings';
13
 
14
  /**
15
  * Internal dependencies
16
  */
 
17
  import './style.scss';
18
 
19
- const TotalsDiscount = ( {
20
  cartCoupons = [],
21
  currency,
22
  isRemovingCoupon,
@@ -34,27 +31,16 @@ const TotalsDiscount = ( {
34
  }
35
 
36
  const discountTaxValue = parseInt( totalDiscountTax, 10 );
37
- const discountTotalValue = getSetting(
38
- 'displayCartPricesIncludingTax',
39
- false
40
- )
41
  ? discountValue + discountTaxValue
42
  : discountValue;
43
 
44
- const filteredCartCoupons = __experimentalApplyCheckoutFilter( {
45
- arg: {
46
- context: 'summary',
47
- },
48
- filterName: 'coupons',
49
- defaultValue: cartCoupons,
50
- } );
51
-
52
  return (
53
  <TotalsItem
54
  className="wc-block-components-totals-discount"
55
  currency={ currency }
56
  description={
57
- filteredCartCoupons.length !== 0 && (
58
  <LoadingMask
59
  screenReaderLabel={ __(
60
  'Removing coupon…',
@@ -64,36 +50,34 @@ const TotalsDiscount = ( {
64
  showSpinner={ false }
65
  >
66
  <ul className="wc-block-components-totals-discount__coupon-list">
67
- { filteredCartCoupons.map( ( cartCoupon ) => {
68
- return (
69
- <RemovableChip
70
- key={ 'coupon-' + cartCoupon.code }
71
- className="wc-block-components-totals-discount__coupon-list-item"
72
- text={ cartCoupon.label }
73
- screenReaderText={ sprintf(
74
- /* translators: %s Coupon code. */
75
- __(
76
- 'Coupon: %s',
77
- 'woo-gutenberg-products-block'
78
- ),
79
- cartCoupon.label
80
- ) }
81
- disabled={ isRemovingCoupon }
82
- onRemove={ () => {
83
- removeCoupon( cartCoupon.code );
84
- } }
85
- radius="large"
86
- ariaLabel={ sprintf(
87
- /* translators: %s is a coupon code. */
88
- __(
89
- 'Remove coupon "%s"',
90
- 'woo-gutenberg-products-block'
91
- ),
92
- cartCoupon.label
93
- ) }
94
- />
95
- );
96
- } ) }
97
  </ul>
98
  </LoadingMask>
99
  )
@@ -108,7 +92,7 @@ const TotalsDiscount = ( {
108
  );
109
  };
110
 
111
- TotalsDiscount.propTypes = {
112
  cartCoupons: PropTypes.arrayOf(
113
  PropTypes.shape( {
114
  code: PropTypes.string.isRequired,
@@ -123,4 +107,4 @@ TotalsDiscount.propTypes = {
123
  } ).isRequired,
124
  };
125
 
126
- export default TotalsDiscount;
2
  * External dependencies
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
5
+ import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
6
  import LoadingMask from '@woocommerce/base-components/loading-mask';
7
  import { RemovableChip } from '@woocommerce/base-components/chip';
8
  import PropTypes from 'prop-types';
 
 
 
 
 
9
 
10
  /**
11
  * Internal dependencies
12
  */
13
+ import TotalsItem from '../totals-item';
14
  import './style.scss';
15
 
16
+ const TotalsDiscountItem = ( {
17
  cartCoupons = [],
18
  currency,
19
  isRemovingCoupon,
31
  }
32
 
33
  const discountTaxValue = parseInt( totalDiscountTax, 10 );
34
+ const discountTotalValue = DISPLAY_CART_PRICES_INCLUDING_TAX
 
 
 
35
  ? discountValue + discountTaxValue
36
  : discountValue;
37
 
 
 
 
 
 
 
 
 
38
  return (
39
  <TotalsItem
40
  className="wc-block-components-totals-discount"
41
  currency={ currency }
42
  description={
43
+ cartCoupons.length !== 0 && (
44
  <LoadingMask
45
  screenReaderLabel={ __(
46
  'Removing coupon…',
50
  showSpinner={ false }
51
  >
52
  <ul className="wc-block-components-totals-discount__coupon-list">
53
+ { cartCoupons.map( ( cartCoupon ) => (
54
+ <RemovableChip
55
+ key={ 'coupon-' + cartCoupon.code }
56
+ className="wc-block-components-totals-discount__coupon-list-item"
57
+ text={ cartCoupon.code }
58
+ screenReaderText={ sprintf(
59
+ /* Translators: %s Coupon code. */
60
+ __(
61
+ 'Coupon: %s',
62
+ 'woo-gutenberg-products-block'
63
+ ),
64
+ cartCoupon.code
65
+ ) }
66
+ disabled={ isRemovingCoupon }
67
+ onRemove={ () => {
68
+ removeCoupon( cartCoupon.code );
69
+ } }
70
+ radius="large"
71
+ ariaLabel={ sprintf(
72
+ /* Translators: %s is a coupon code. */
73
+ __(
74
+ 'Remove coupon "%s"',
75
+ 'woo-gutenberg-products-block'
76
+ ),
77
+ cartCoupon.code
78
+ ) }
79
+ />
80
+ ) ) }
 
 
81
  </ul>
82
  </LoadingMask>
83
  )
92
  );
93
  };
94
 
95
+ TotalsDiscountItem.propTypes = {
96
  cartCoupons: PropTypes.arrayOf(
97
  PropTypes.shape( {
98
  code: PropTypes.string.isRequired,
107
  } ).isRequired,
108
  };
109
 
110
+ export default TotalsDiscountItem;
assets/js/base/components/cart-checkout/totals/totals-discount-item/style.scss ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ .wc-block-components-totals-discount__coupon-list {
2
+ list-style: none;
3
+ margin: 0;
4
+ padding: 0;
5
+ }
assets/js/base/components/cart-checkout/totals/totals-fees-item/index.js ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
6
+ import { useShippingDataContext } from '@woocommerce/base-context';
7
+ import PropTypes from 'prop-types';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import TotalsItem from '../totals-item';
13
+
14
+ const TotalsFeesItem = ( { currency, values } ) => {
15
+ const { needsShipping } = useShippingDataContext();
16
+ if ( ! needsShipping ) {
17
+ return null;
18
+ }
19
+ const { total_fees: totalFees, total_fees_tax: totalFeesTax } = values;
20
+ const feesValue = parseInt( totalFees, 10 );
21
+
22
+ if ( ! feesValue ) {
23
+ return null;
24
+ }
25
+
26
+ const feesTaxValue = parseInt( totalFeesTax, 10 );
27
+
28
+ return (
29
+ <TotalsItem
30
+ className="wc-block-components-totals-fees"
31
+ currency={ currency }
32
+ label={ __( 'Fees', 'woo-gutenberg-products-block' ) }
33
+ value={
34
+ DISPLAY_CART_PRICES_INCLUDING_TAX
35
+ ? feesValue + feesTaxValue
36
+ : feesValue
37
+ }
38
+ />
39
+ );
40
+ };
41
+
42
+ TotalsFeesItem.propTypes = {
43
+ currency: PropTypes.object.isRequired,
44
+ values: PropTypes.shape( {
45
+ total_fees: PropTypes.string,
46
+ total_fees_tax: PropTypes.string,
47
+ } ).isRequired,
48
+ };
49
+
50
+ export default TotalsFeesItem;
assets/js/base/components/cart-checkout/totals/{footer-item → totals-footer-item}/index.js RENAMED
@@ -2,50 +2,33 @@
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
 
 
 
 
5
  import { createInterpolateElement } from 'wordpress-element';
6
  import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
7
  import PropTypes from 'prop-types';
8
- import {
9
- __experimentalApplyCheckoutFilter,
10
- TotalsItem,
11
- } from '@woocommerce/blocks-checkout';
12
- import { useStoreCart } from '@woocommerce/base-context/hooks';
13
- import { getSetting } from '@woocommerce/settings';
14
 
15
  /**
16
  * Internal dependencies
17
  */
 
18
  import './style.scss';
19
 
20
- const TotalsFooterItem = ( { currency, values } ) => {
21
- const SHOW_TAXES =
22
- getSetting( 'taxesEnabled', true ) &&
23
- getSetting( 'displayCartPricesIncludingTax', false );
24
 
 
25
  const { total_price: totalPrice, total_tax: totalTax } = values;
26
 
27
- // Prepare props to pass to the __experimentalApplyCheckoutFilter filter.
28
- // We need to pluck out receiveCart.
29
- // eslint-disable-next-line no-unused-vars
30
- const { receiveCart, ...cart } = useStoreCart();
31
- const label = __experimentalApplyCheckoutFilter( {
32
- filterName: 'totalLabel',
33
- defaultValue: __( 'Total', 'woo-gutenberg-products-block' ),
34
- extensions: cart.extensions,
35
- arg: { cart },
36
- } );
37
-
38
- const parsedTaxValue = parseInt( totalTax, 10 );
39
-
40
  return (
41
  <TotalsItem
42
  className="wc-block-components-totals-footer-item"
43
  currency={ currency }
44
- label={ label }
45
  value={ parseInt( totalPrice, 10 ) }
46
  description={
47
- SHOW_TAXES &&
48
- parsedTaxValue !== 0 && (
49
  <p className="wc-block-components-totals-footer-item-tax">
50
  { createInterpolateElement(
51
  __(
@@ -57,7 +40,8 @@ const TotalsFooterItem = ( { currency, values } ) => {
57
  <FormattedMonetaryAmount
58
  className="wc-block-components-totals-footer-item-tax-value"
59
  currency={ currency }
60
- value={ parsedTaxValue }
 
61
  />
62
  ),
63
  }
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
+ import {
6
+ TAXES_ENABLED,
7
+ DISPLAY_CART_PRICES_INCLUDING_TAX,
8
+ } from '@woocommerce/block-settings';
9
  import { createInterpolateElement } from 'wordpress-element';
10
  import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
11
  import PropTypes from 'prop-types';
 
 
 
 
 
 
12
 
13
  /**
14
  * Internal dependencies
15
  */
16
+ import TotalsItem from '../totals-item';
17
  import './style.scss';
18
 
19
+ const SHOW_TAXES = TAXES_ENABLED && DISPLAY_CART_PRICES_INCLUDING_TAX;
 
 
 
20
 
21
+ const TotalsFooterItem = ( { currency, values } ) => {
22
  const { total_price: totalPrice, total_tax: totalTax } = values;
23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  return (
25
  <TotalsItem
26
  className="wc-block-components-totals-footer-item"
27
  currency={ currency }
28
+ label={ __( 'Total', 'woo-gutenberg-products-block' ) }
29
  value={ parseInt( totalPrice, 10 ) }
30
  description={
31
+ SHOW_TAXES && (
 
32
  <p className="wc-block-components-totals-footer-item-tax">
33
  { createInterpolateElement(
34
  __(
40
  <FormattedMonetaryAmount
41
  className="wc-block-components-totals-footer-item-tax-value"
42
  currency={ currency }
43
+ displayType="text"
44
+ value={ parseInt( totalTax, 10 ) }
45
  />
46
  ),
47
  }
assets/js/base/components/cart-checkout/totals/{footer-item → totals-footer-item}/style.scss RENAMED
@@ -5,7 +5,7 @@
5
  }
6
 
7
  .wc-block-components-totals-item__label {
8
- font-weight: 700;
9
  }
10
 
11
  .wc-block-components-totals-footer-item-tax {
5
  }
6
 
7
  .wc-block-components-totals-item__label {
8
+ font-weight: normal;
9
  }
10
 
11
  .wc-block-components-totals-footer-item-tax {
assets/js/base/components/cart-checkout/totals/totals-item/index.js ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import classnames from 'classnames';
6
+ import { isValidElement } from '@wordpress/element';
7
+ import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import './style.scss';
13
+
14
+ const TotalsItem = ( { className, currency, label, value, description } ) => {
15
+ return (
16
+ <div
17
+ className={ classnames(
18
+ 'wc-block-components-totals-item',
19
+ className
20
+ ) }
21
+ >
22
+ <span className="wc-block-components-totals-item__label">
23
+ { label }
24
+ </span>
25
+ { isValidElement( value ) ? (
26
+ <div className="wc-block-components-totals-item__value">
27
+ { value }
28
+ </div>
29
+ ) : (
30
+ <FormattedMonetaryAmount
31
+ className="wc-block-components-totals-item__value"
32
+ currency={ currency }
33
+ displayType="text"
34
+ value={ value }
35
+ />
36
+ ) }
37
+ <div className="wc-block-components-totals-item__description">
38
+ { description }
39
+ </div>
40
+ </div>
41
+ );
42
+ };
43
+
44
+ TotalsItem.propTypes = {
45
+ currency: PropTypes.object,
46
+ label: PropTypes.string.isRequired,
47
+ value: PropTypes.oneOfType( [ PropTypes.number, PropTypes.node ] ),
48
+ className: PropTypes.string,
49
+ description: PropTypes.node,
50
+ };
51
+
52
+ export default TotalsItem;
{packages/checkout/totals/item → assets/js/base/components/cart-checkout/totals/totals-item}/style.scss RENAMED
@@ -1,20 +1,16 @@
1
  .wc-block-components-totals-item {
2
  display: flex;
3
  flex-wrap: wrap;
4
- margin: em($gap-small) 0 0;
5
  width: 100%;
6
-
7
- &:first-child {
8
- margin-top: 0;
9
- }
10
  }
11
 
12
  .wc-block-components-totals-item__label {
13
  flex-grow: 1;
 
14
  }
15
 
16
  .wc-block-components-totals-item__value {
17
- font-weight: bold;
18
  white-space: nowrap;
19
  }
20
 
1
  .wc-block-components-totals-item {
2
  display: flex;
3
  flex-wrap: wrap;
4
+ padding: em($gap-small) 0;
5
  width: 100%;
 
 
 
 
6
  }
7
 
8
  .wc-block-components-totals-item__label {
9
  flex-grow: 1;
10
+ font-weight: bold;
11
  }
12
 
13
  .wc-block-components-totals-item__value {
 
14
  white-space: nowrap;
15
  }
16
 
assets/js/base/components/cart-checkout/totals/{shipping → totals-shipping-item}/has-shipping-rate.js RENAMED
File without changes
assets/js/base/components/cart-checkout/totals/{shipping/index.tsx → totals-shipping-item/index.js} RENAMED
@@ -1,143 +1,50 @@
1
  /**
2
  * External dependencies
3
  */
4
- import classnames from 'classnames';
5
  import { __ } from '@wordpress/i18n';
 
 
 
 
 
 
6
  import { useState } from '@wordpress/element';
7
- import { useStoreCart } from '@woocommerce/base-context/hooks';
8
- import { TotalsItem } from '@woocommerce/blocks-checkout';
9
- import type { Currency } from '@woocommerce/price-format';
10
- import type { ReactElement } from 'react';
11
- import { getSetting, EnteredAddress } from '@woocommerce/settings';
12
- import { ShippingVia } from '@woocommerce/base-components/cart-checkout/totals/shipping/shipping-via';
13
 
14
  /**
15
  * Internal dependencies
16
  */
 
17
  import ShippingRateSelector from './shipping-rate-selector';
18
  import hasShippingRate from './has-shipping-rate';
19
- import ShippingCalculator from '../../shipping-calculator';
20
- import ShippingLocation from '../../shipping-location';
21
  import './style.scss';
22
 
23
- interface CalculatorButtonProps {
24
- label?: string;
25
- isShippingCalculatorOpen: boolean;
26
- setIsShippingCalculatorOpen: ( isShippingCalculatorOpen: boolean ) => void;
27
- }
28
-
29
- const CalculatorButton = ( {
30
- label = __( 'Calculate', 'woo-gutenberg-products-block' ),
31
- isShippingCalculatorOpen,
32
- setIsShippingCalculatorOpen,
33
- }: CalculatorButtonProps ): ReactElement => {
34
- return (
35
- <button
36
- className="wc-block-components-totals-shipping__change-address-button"
37
- onClick={ () => {
38
- setIsShippingCalculatorOpen( ! isShippingCalculatorOpen );
39
- } }
40
- aria-expanded={ isShippingCalculatorOpen }
41
- >
42
- { label }
43
- </button>
44
- );
45
- };
46
-
47
- interface ShippingAddressProps {
48
- showCalculator: boolean;
49
- isShippingCalculatorOpen: boolean;
50
- setIsShippingCalculatorOpen: CalculatorButtonProps[ 'setIsShippingCalculatorOpen' ];
51
- shippingAddress: EnteredAddress;
52
- }
53
-
54
- const ShippingAddress = ( {
55
- showCalculator,
56
- isShippingCalculatorOpen,
57
- setIsShippingCalculatorOpen,
58
- shippingAddress,
59
- }: ShippingAddressProps ): ReactElement | null => {
60
- return (
61
- <>
62
- <ShippingLocation address={ shippingAddress } />
63
- { showCalculator && (
64
- <CalculatorButton
65
- label={ __(
66
- '(change address)',
67
- 'woo-gutenberg-products-block'
68
- ) }
69
- isShippingCalculatorOpen={ isShippingCalculatorOpen }
70
- setIsShippingCalculatorOpen={ setIsShippingCalculatorOpen }
71
- />
72
- ) }
73
- </>
74
- );
75
- };
76
-
77
- interface NoShippingPlaceholderProps {
78
- showCalculator: boolean;
79
- isShippingCalculatorOpen: boolean;
80
- setIsShippingCalculatorOpen: CalculatorButtonProps[ 'setIsShippingCalculatorOpen' ];
81
- }
82
-
83
- const NoShippingPlaceholder = ( {
84
- showCalculator,
85
- isShippingCalculatorOpen,
86
- setIsShippingCalculatorOpen,
87
- }: NoShippingPlaceholderProps ): ReactElement => {
88
- if ( ! showCalculator ) {
89
- return (
90
- <em>
91
- { __(
92
- 'Calculated during checkout',
93
- 'woo-gutenberg-products-block'
94
- ) }
95
- </em>
96
- );
97
- }
98
-
99
- return (
100
- <CalculatorButton
101
- isShippingCalculatorOpen={ isShippingCalculatorOpen }
102
- setIsShippingCalculatorOpen={ setIsShippingCalculatorOpen }
103
- />
104
- );
105
- };
106
-
107
- interface TotalShippingProps {
108
- currency: Currency;
109
- values: {
110
- // eslint-disable-next-line camelcase
111
- total_shipping: string;
112
- // eslint-disable-next-line camelcase
113
- total_shipping_tax: string;
114
- }; // Values in use
115
- showCalculator?: boolean; //Whether to display the rate selector below the shipping total.
116
- showRateSelector?: boolean; // Whether to show shipping calculator or not.
117
- className?: string;
118
- }
119
-
120
- const TotalsShipping = ( {
121
  currency,
122
  values,
123
  showCalculator = true,
124
  showRateSelector = true,
125
- className,
126
- }: TotalShippingProps ): ReactElement => {
127
  const [ isShippingCalculatorOpen, setIsShippingCalculatorOpen ] = useState(
128
  false
129
  );
130
  const {
131
- shippingAddress,
132
- cartHasCalculatedShipping,
133
  shippingRates,
134
  shippingRatesLoading,
 
 
135
  } = useStoreCart();
136
 
137
- const totalShippingValue = getSetting(
138
- 'displayCartPricesIncludingTax',
139
- false
140
- )
141
  ? parseInt( values.total_shipping, 10 ) +
142
  parseInt( values.total_shipping_tax, 10 )
143
  : parseInt( values.total_shipping, 10 );
@@ -147,21 +54,8 @@ const TotalsShipping = ( {
147
  setIsShippingCalculatorOpen,
148
  };
149
 
150
- const selectedShippingRates = shippingRates.flatMap(
151
- ( shippingPackage ) => {
152
- return shippingPackage.shipping_rates
153
- .filter( ( rate ) => rate.selected )
154
- .flatMap( ( rate ) => rate.name );
155
- }
156
- );
157
-
158
  return (
159
- <div
160
- className={ classnames(
161
- 'wc-block-components-totals-shipping',
162
- className
163
- ) }
164
- >
165
  <TotalsItem
166
  label={ __( 'Shipping', 'woo-gutenberg-products-block' ) }
167
  value={
@@ -177,18 +71,11 @@ const TotalsShipping = ( {
177
  description={
178
  <>
179
  { cartHasCalculatedShipping && (
180
- <>
181
- <ShippingVia
182
- selectedShippingRates={
183
- selectedShippingRates
184
- }
185
- />
186
- <ShippingAddress
187
- shippingAddress={ shippingAddress }
188
- showCalculator={ showCalculator }
189
- { ...calculatorButtonProps }
190
- />
191
- </>
192
  ) }
193
  </>
194
  }
@@ -212,4 +99,79 @@ const TotalsShipping = ( {
212
  );
213
  };
214
 
215
- export default TotalsShipping;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  /**
2
  * External dependencies
3
  */
 
4
  import { __ } from '@wordpress/i18n';
5
+ import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
6
+ import {
7
+ ShippingCalculator,
8
+ ShippingLocation,
9
+ } from '@woocommerce/base-components/cart-checkout';
10
+ import PropTypes from 'prop-types';
11
  import { useState } from '@wordpress/element';
12
+ import { useStoreCart } from '@woocommerce/base-hooks';
 
 
 
 
 
13
 
14
  /**
15
  * Internal dependencies
16
  */
17
+ import TotalsItem from '../totals-item';
18
  import ShippingRateSelector from './shipping-rate-selector';
19
  import hasShippingRate from './has-shipping-rate';
 
 
20
  import './style.scss';
21
 
22
+ /**
23
+ * Renders the shipping totals row, rates, and calculator if enabled.
24
+ *
25
+ * @param {Object} props Incoming props for the component.
26
+ * @param {Object} props.currency Currency information.
27
+ * @param {Object} props.values Values in use.
28
+ * @param {boolean} props.showRateSelector Whether to display the rate selector below the shipping total.
29
+ * @param {boolean} props.showCalculator Whether to show shipping calculator or not.
30
+ */
31
+ const TotalsShippingItem = ( {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  currency,
33
  values,
34
  showCalculator = true,
35
  showRateSelector = true,
36
+ } ) => {
 
37
  const [ isShippingCalculatorOpen, setIsShippingCalculatorOpen ] = useState(
38
  false
39
  );
40
  const {
 
 
41
  shippingRates,
42
  shippingRatesLoading,
43
+ shippingAddress,
44
+ cartHasCalculatedShipping,
45
  } = useStoreCart();
46
 
47
+ const totalShippingValue = DISPLAY_CART_PRICES_INCLUDING_TAX
 
 
 
48
  ? parseInt( values.total_shipping, 10 ) +
49
  parseInt( values.total_shipping_tax, 10 )
50
  : parseInt( values.total_shipping, 10 );
54
  setIsShippingCalculatorOpen,
55
  };
56
 
 
 
 
 
 
 
 
 
57
  return (
58
+ <div className="wc-block-components-totals-shipping">
 
 
 
 
 
59
  <TotalsItem
60
  label={ __( 'Shipping', 'woo-gutenberg-products-block' ) }
61
  value={
71
  description={
72
  <>
73
  { cartHasCalculatedShipping && (
74
+ <ShippingAddress
75
+ shippingAddress={ shippingAddress }
76
+ showCalculator={ showCalculator }
77
+ { ...calculatorButtonProps }
78
+ />
 
 
 
 
 
 
 
79
  ) }
80
  </>
81
  }
99
  );
100
  };
101
 
102
+ const ShippingAddress = ( {
103
+ showCalculator,
104
+ isShippingCalculatorOpen,
105
+ setIsShippingCalculatorOpen,
106
+ shippingAddress,
107
+ } ) => {
108
+ return (
109
+ <>
110
+ <ShippingLocation address={ shippingAddress } />
111
+ { showCalculator && (
112
+ <CalculatorButton
113
+ label={ __(
114
+ '(change address)',
115
+ 'woo-gutenberg-products-block'
116
+ ) }
117
+ isShippingCalculatorOpen={ isShippingCalculatorOpen }
118
+ setIsShippingCalculatorOpen={ setIsShippingCalculatorOpen }
119
+ />
120
+ ) }
121
+ </>
122
+ );
123
+ };
124
+
125
+ const NoShippingPlaceholder = ( {
126
+ showCalculator,
127
+ isShippingCalculatorOpen,
128
+ setIsShippingCalculatorOpen,
129
+ } ) => {
130
+ if ( ! showCalculator ) {
131
+ return (
132
+ <em>
133
+ { __(
134
+ 'Calculated during checkout',
135
+ 'woo-gutenberg-products-block'
136
+ ) }
137
+ </em>
138
+ );
139
+ }
140
+
141
+ return (
142
+ <CalculatorButton
143
+ isShippingCalculatorOpen={ isShippingCalculatorOpen }
144
+ setIsShippingCalculatorOpen={ setIsShippingCalculatorOpen }
145
+ />
146
+ );
147
+ };
148
+
149
+ const CalculatorButton = ( {
150
+ label = __( 'Calculate', 'woo-gutenberg-products-block' ),
151
+ isShippingCalculatorOpen,
152
+ setIsShippingCalculatorOpen,
153
+ } ) => {
154
+ return (
155
+ <button
156
+ className="wc-block-components-totals-shipping__change-address-button"
157
+ onClick={ () => {
158
+ setIsShippingCalculatorOpen( ! isShippingCalculatorOpen );
159
+ } }
160
+ aria-expanded={ isShippingCalculatorOpen }
161
+ >
162
+ { label }
163
+ </button>
164
+ );
165
+ };
166
+
167
+ TotalsShippingItem.propTypes = {
168
+ currency: PropTypes.object.isRequired,
169
+ values: PropTypes.shape( {
170
+ total_shipping: PropTypes.string,
171
+ total_shipping_tax: PropTypes.string,
172
+ } ).isRequired,
173
+ showRateSelector: PropTypes.bool,
174
+ showCalculator: PropTypes.bool,
175
+ };
176
+
177
+ export default TotalsShippingItem;
assets/js/base/components/cart-checkout/totals/totals-shipping-item/shipping-rate-selector.js ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
6
+ import { decodeEntities } from '@wordpress/html-entities';
7
+ import { getCurrencyFromPriceResponse } from '@woocommerce/base-utils';
8
+ import { ShippingRatesControl } from '@woocommerce/base-components/cart-checkout';
9
+ import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
10
+ import { Notice } from 'wordpress-components';
11
+ import classnames from 'classnames';
12
+
13
+ const renderShippingRatesControlOption = ( option ) => {
14
+ const priceWithTaxes = DISPLAY_CART_PRICES_INCLUDING_TAX
15
+ ? parseInt( option.price, 10 ) + parseInt( option.taxes, 10 )
16
+ : parseInt( option.price, 10 );
17
+ return {
18
+ label: decodeEntities( option.name ),
19
+ value: option.rate_id,
20
+ description: (
21
+ <>
22
+ { Number.isFinite( priceWithTaxes ) && (
23
+ <FormattedMonetaryAmount
24
+ currency={ getCurrencyFromPriceResponse( option ) }
25
+ value={ priceWithTaxes }
26
+ />
27
+ ) }
28
+ { Number.isFinite( priceWithTaxes ) && option.delivery_time
29
+ ? ' — '
30
+ : null }
31
+ { decodeEntities( option.delivery_time ) }
32
+ </>
33
+ ),
34
+ };
35
+ };
36
+
37
+ const ShippingRateSelector = ( {
38
+ hasRates,
39
+ shippingRates,
40
+ shippingRatesLoading,
41
+ } ) => {
42
+ return (
43
+ <fieldset className="wc-block-components-totals-shipping__fieldset">
44
+ <legend className="screen-reader-text">
45
+ { hasRates
46
+ ? __( 'Shipping options', 'woo-gutenberg-products-block' )
47
+ : __(
48
+ 'Choose a shipping option',
49
+ 'woo-gutenberg-products-block'
50
+ ) }
51
+ </legend>
52
+ <ShippingRatesControl
53
+ className="wc-block-components-totals-shipping__options"
54
+ collapsibleWhenMultiple={ true }
55
+ noResultsMessage={
56
+ <Notice
57
+ isDismissible={ false }
58
+ className={ classnames(
59
+ 'wc-block-components-shipping-rates-control__no-results-notice',
60
+ 'woocommerce-error'
61
+ ) }
62
+ >
63
+ { __(
64
+ 'No shipping options were found.',
65
+ 'woo-gutenberg-products-block'
66
+ ) }
67
+ </Notice>
68
+ }
69
+ renderOption={ renderShippingRatesControlOption }
70
+ shippingRates={ shippingRates }
71
+ shippingRatesLoading={ shippingRatesLoading }
72
+ />
73
+ </fieldset>
74
+ );
75
+ };
76
+
77
+ export default ShippingRateSelector;
assets/js/base/components/cart-checkout/totals/{shipping → totals-shipping-item}/style.scss RENAMED
@@ -1,4 +1,6 @@
1
  .wc-block-components-totals-shipping {
 
 
2
  // Added extra label for specificity.
3
  fieldset.wc-block-components-totals-shipping__fieldset {
4
  background-color: transparent;
@@ -7,10 +9,6 @@
7
  border: 0;
8
  }
9
 
10
- .wc-block-components-totals-shipping__via {
11
- margin-bottom: $gap;
12
- }
13
-
14
  .wc-block-components-totals-shipping__options {
15
  .wc-block-components-radio-control__label,
16
  .wc-block-components-radio-control__description,
@@ -21,8 +19,15 @@
21
  }
22
  }
23
 
 
 
 
 
 
 
 
24
  .wc-block-components-shipping-rates-control__no-results-notice {
25
- margin: 0 0 em($gap-small);
26
  }
27
 
28
  .wc-block-components-totals-shipping__change-address-button {
@@ -34,9 +39,8 @@
34
  opacity: 0.8;
35
  }
36
  }
37
- }
38
 
39
- // Extra classes for specificity.
40
- .theme-twentytwentyone.theme-twentytwentyone.theme-twentytwentyone .wc-block-components-totals-shipping__change-address-button {
41
- @include link-button();
42
  }
1
  .wc-block-components-totals-shipping {
2
+ @include with-translucent-border(1px 0 0);
3
+
4
  // Added extra label for specificity.
5
  fieldset.wc-block-components-totals-shipping__fieldset {
6
  background-color: transparent;
9
  border: 0;
10
  }
11
 
 
 
 
 
12
  .wc-block-components-totals-shipping__options {
13
  .wc-block-components-radio-control__label,
14
  .wc-block-components-radio-control__description,
19
  }
20
  }
21
 
22
+ .wc-block-components-radio-control__option,
23
+ .wc-block-components-radio-control__option-layout {
24
+ &:last-child::after {
25
+ display: none;
26
+ }
27
+ }
28
+
29
  .wc-block-components-shipping-rates-control__no-results-notice {
30
+ margin-bottom: em($gap-small);
31
  }
32
 
33
  .wc-block-components-totals-shipping__change-address-button {
39
  opacity: 0.8;
40
  }
41
  }
 
42
 
43
+ .wc-blocks-components-panel:last-child::after {
44
+ border-bottom-width: 0;
45
+ }
46
  }
assets/js/base/components/cart-checkout/totals/totals-taxes-item/index.js ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import PropTypes from 'prop-types';
6
+ import {
7
+ TAXES_ENABLED,
8
+ DISPLAY_ITEMIZED_TAXES,
9
+ } from '@woocommerce/block-settings';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import TotalsItem from '../totals-item';
15
+ import './style.scss';
16
+
17
+ const TotalsTaxesItem = ( { currency, values } ) => {
18
+ const { total_tax: totalTax, tax_lines: taxLines } = values;
19
+
20
+ if ( ! TAXES_ENABLED ) {
21
+ return null;
22
+ }
23
+
24
+ if ( ! DISPLAY_ITEMIZED_TAXES ) {
25
+ return (
26
+ <TotalsItem
27
+ className="wc-block-components-totals-taxes"
28
+ currency={ currency }
29
+ label={ __( 'Taxes', 'woo-gutenberg-products-block' ) }
30
+ value={ parseInt( totalTax, 10 ) }
31
+ />
32
+ );
33
+ }
34
+
35
+ return (
36
+ <>
37
+ { taxLines.map( ( { name, price }, i ) => (
38
+ <TotalsItem
39
+ key={ `tax-line-${ i }` }
40
+ className="wc-block-components-totals-taxes"
41
+ currency={ currency }
42
+ label={ name }
43
+ value={ parseInt( price, 10 ) }
44
+ />
45
+ ) ) }{ ' ' }
46
+ </>
47
+ );
48
+ };
49
+
50
+ TotalsTaxesItem.propTypes = {
51
+ currency: PropTypes.object.isRequired,
52
+ values: PropTypes.shape( {
53
+ total_tax: PropTypes.string,
54
+ } ).isRequired,
55
+ };
56
+
57
+ export default TotalsTaxesItem;
assets/js/base/components/cart-checkout/totals/totals-taxes-item/style.scss ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ .wc-block-components-totals-taxes {
2
+ @include with-translucent-border(1px 0 0);
3
+ }
assets/js/base/components/checkbox-control/stories/index.js DELETED
@@ -1,27 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { text } from '@storybook/addon-knobs';
5
- import { useState } from 'react';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import CheckboxControl from '../';
11
-
12
- export default {
13
- title: 'WooCommerce Blocks/@base-components/CheckboxControl',
14
- component: CheckboxControl,
15
- };
16
-
17
- export const Default = () => {
18
- const [ checked, setChecked ] = useState( false );
19
-
20
- return (
21
- <CheckboxControl
22
- label={ text( 'Label', 'Yes please' ) }
23
- checked={ checked }
24
- onChange={ ( value ) => setChecked( value ) }
25
- />
26
- );
27
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/checkbox-control/style.scss CHANGED
@@ -6,28 +6,22 @@
6
  position: relative;
7
 
8
  .wc-block-components-checkbox__input[type="checkbox"] {
9
- font-size: 1em;
10
  appearance: none;
11
- border: 2px solid $input-border-gray;
12
  border-radius: 2px;
13
- height: em(24px);
14
- width: em(24px);
15
  margin: 0;
16
- min-height: 24px;
17
- min-width: 24px;
18
  overflow: hidden;
19
  position: static;
20
  vertical-align: middle;
21
  background-color: #fff;
22
 
23
  &:checked {
24
- background: #fff;
25
- border-color: $input-border-gray;
26
- }
27
-
28
- &::before,
29
- &::after {
30
- content: "";
31
  }
32
 
33
  &:not(:checked) + .wc-block-components-checkbox__mark {
@@ -36,30 +30,26 @@
36
 
37
  .has-dark-controls & {
38
  border-color: $controls-border-dark;
39
- background-color: $input-background-dark;
40
 
41
  &:checked {
42
- background: $input-background-dark;
43
  border-color: $controls-border-dark;
44
  }
45
  }
46
  }
47
 
48
  .wc-block-components-checkbox__mark {
49
- fill: #000;
50
  position: absolute;
51
- left: em(3px);
52
  top: em(-2px);
53
- width: em(18px);
54
- height: em(18px);
55
-
56
- .has-dark-controls & {
57
- fill: #fff;
58
- }
59
  }
60
 
61
  .wc-block-components-checkbox__label {
62
- padding-left: $gap;
63
  vertical-align: middle;
64
  }
65
  }
@@ -81,8 +71,7 @@
81
  }
82
 
83
  .wc-block-components-checkbox__input[type="checkbox"]:checked,
84
- .has-dark-controls
85
- .wc-block-components-checkbox__input[type="checkbox"]:checked {
86
  background-color: #fff;
87
  border-color: var(--form--border-color);
88
  }
6
  position: relative;
7
 
8
  .wc-block-components-checkbox__input[type="checkbox"] {
 
9
  appearance: none;
10
+ border: 2px solid currentColor;
11
  border-radius: 2px;
12
+ height: em(18px);
13
+ width: em(18px);
14
  margin: 0;
15
+ min-height: 18px;
16
+ min-width: 18px;
17
  overflow: hidden;
18
  position: static;
19
  vertical-align: middle;
20
  background-color: #fff;
21
 
22
  &:checked {
23
+ background: currentColor;
24
+ border-color: currentColor;
 
 
 
 
 
25
  }
26
 
27
  &:not(:checked) + .wc-block-components-checkbox__mark {
30
 
31
  .has-dark-controls & {
32
  border-color: $controls-border-dark;
33
+ background-color: transparent;
34
 
35
  &:checked {
36
+ background: transparent;
37
  border-color: $controls-border-dark;
38
  }
39
  }
40
  }
41
 
42
  .wc-block-components-checkbox__mark {
43
+ fill: #fff;
44
  position: absolute;
45
+ left: em(1px);
46
  top: em(-2px);
47
+ width: em(16px);
48
+ height: em(16px);
 
 
 
 
49
  }
50
 
51
  .wc-block-components-checkbox__label {
52
+ padding-left: $gap-smaller;
53
  vertical-align: middle;
54
  }
55
  }
71
  }
72
 
73
  .wc-block-components-checkbox__input[type="checkbox"]:checked,
74
+ .has-dark-controls .wc-block-components-checkbox__input[type="checkbox"]:checked {
 
75
  background-color: #fff;
76
  border-color: var(--form--border-color);
77
  }
assets/js/base/components/checkbox-list/index.js CHANGED
@@ -58,7 +58,7 @@ const CheckboxList = ( {
58
  } }
59
  aria-expanded={ false }
60
  aria-label={ sprintf(
61
- /* translators: %s is referring the remaining count of options */
62
  _n(
63
  'Show %s more option',
64
  'Show %s more options',
@@ -69,7 +69,7 @@ const CheckboxList = ( {
69
  ) }
70
  >
71
  { sprintf(
72
- /* translators: %s number of options to reveal. */
73
  _n(
74
  'Show %s more',
75
  'Show %s more',
@@ -110,7 +110,7 @@ const CheckboxList = ( {
110
  const optionCount = options.length;
111
  const shouldTruncateOptions = optionCount > limit + 5;
112
  return (
113
- <>
114
  { options.map( ( option, index ) => (
115
  <Fragment key={ option.value }>
116
  <li
@@ -138,7 +138,7 @@ const CheckboxList = ( {
138
  </Fragment>
139
  ) ) }
140
  { shouldTruncateOptions && renderedShowLess }
141
- </>
142
  );
143
  }, [
144
  options,
58
  } }
59
  aria-expanded={ false }
60
  aria-label={ sprintf(
61
+ /* Translators: %s is referring the remaining count of options */
62
  _n(
63
  'Show %s more option',
64
  'Show %s more options',
69
  ) }
70
  >
71
  { sprintf(
72
+ // translators: %s number of options to reveal.
73
  _n(
74
  'Show %s more',
75
  'Show %s more',
110
  const optionCount = options.length;
111
  const shouldTruncateOptions = optionCount > limit + 5;
112
  return (
113
+ <Fragment>
114
  { options.map( ( option, index ) => (
115
  <Fragment key={ option.value }>
116
  <li
138
  </Fragment>
139
  ) ) }
140
  { shouldTruncateOptions && renderedShowLess }
141
+ </Fragment>
142
  );
143
  }, [
144
  options,
assets/js/base/components/chip/removable-chip.js CHANGED
@@ -9,7 +9,7 @@ import { Icon, noAlt } from '@woocommerce/icons';
9
  /**
10
  * Internal dependencies
11
  */
12
- import Chip from './chip.js';
13
 
14
  /**
15
  * Component used to render a "chip" -- an item containing some text with
9
  /**
10
  * Internal dependencies
11
  */
12
+ import { Chip } from './index.js';
13
 
14
  /**
15
  * Component used to render a "chip" -- an item containing some text with
assets/js/base/components/chip/stories/index.js DELETED
@@ -1,42 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { text, select, boolean } from '@storybook/addon-knobs';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import * as components from '../';
10
-
11
- export default {
12
- title: 'WooCommerce Blocks/@base-components/Chip',
13
- component: Chip,
14
- };
15
-
16
- const radii = [ 'none', 'small', 'medium', 'large' ];
17
-
18
- export const Chip = () => (
19
- <components.Chip
20
- text={ text( 'Text', 'example' ) }
21
- radius={ select( 'Radius', radii ) }
22
- screenReaderText={ text(
23
- 'Screen reader text',
24
- 'Example screen reader text'
25
- ) }
26
- element={ select( 'Element', [ 'li', 'div', 'span' ], 'li' ) }
27
- />
28
- );
29
-
30
- export const RemovableChip = () => (
31
- <components.RemovableChip
32
- text={ text( 'Text', 'example' ) }
33
- radius={ select( 'Radius', radii ) }
34
- screenReaderText={ text(
35
- 'Screen reader text',
36
- 'Example screen reader text'
37
- ) }
38
- disabled={ boolean( 'Disabled', false ) }
39
- removeOnAnyClick={ boolean( 'Remove on any click', false ) }
40
- element={ select( 'Element', [ 'li', 'div', 'span' ], 'li' ) }
41
- />
42
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/country-input/CountryInputProps.ts DELETED
@@ -1,15 +0,0 @@
1
- export interface CountryInputProps {
2
- className?: string;
3
- label: string;
4
- id: string;
5
- autoComplete?: string;
6
- value: string;
7
- onChange: ( value: string ) => void;
8
- required?: boolean;
9
- errorMessage?: string;
10
- errorId: null | 'shipping-missing-country';
11
- }
12
-
13
- export type CountryInputWithCountriesProps = CountryInputProps & {
14
- countries: Record< string, string >;
15
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/country-input/billing-country-input.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { ALLOWED_COUNTRIES } from '@woocommerce/block-settings';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import CountryInput from './country-input.js';
11
+
12
+ const BillingCountryInput = ( props ) => {
13
+ return <CountryInput countries={ ALLOWED_COUNTRIES } { ...props } />;
14
+ };
15
+
16
+ BillingCountryInput.propTypes = {
17
+ onChange: PropTypes.func.isRequired,
18
+ className: PropTypes.string,
19
+ label: PropTypes.string,
20
+ value: PropTypes.string,
21
+ };
22
+
23
+ export default BillingCountryInput;
assets/js/base/components/country-input/billing-country-input.tsx DELETED
@@ -1,16 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { ALLOWED_COUNTRIES } from '@woocommerce/block-settings';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import CountryInput from './country-input';
10
- import type { CountryInputProps } from './CountryInputProps';
11
-
12
- const BillingCountryInput = ( props: CountryInputProps ): JSX.Element => {
13
- return <CountryInput countries={ ALLOWED_COUNTRIES } { ...props } />;
14
- };
15
-
16
- export default BillingCountryInput;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/country-input/{country-input.tsx → country-input.js} RENAMED
@@ -3,6 +3,7 @@
3
  */
4
  import { useMemo } from '@wordpress/element';
5
  import { __ } from '@wordpress/i18n';
 
6
  import { decodeEntities } from '@wordpress/html-entities';
7
  import classnames from 'classnames';
8
 
@@ -11,7 +12,6 @@ import classnames from 'classnames';
11
  */
12
  import { ValidatedSelect } from '../select';
13
  import './style.scss';
14
- import type { CountryInputWithCountriesProps } from './CountryInputProps';
15
 
16
  const CountryInput = ( {
17
  className,
@@ -27,7 +27,7 @@ const CountryInput = ( {
27
  'Please select a country.',
28
  'woo-gutenberg-products-block'
29
  ),
30
- }: CountryInputWithCountriesProps ): JSX.Element => {
31
  const options = useMemo(
32
  () =>
33
  Object.keys( countries ).map( ( key ) => ( {
@@ -81,4 +81,16 @@ const CountryInput = ( {
81
  );
82
  };
83
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  export default CountryInput;
3
  */
4
  import { useMemo } from '@wordpress/element';
5
  import { __ } from '@wordpress/i18n';
6
+ import PropTypes from 'prop-types';
7
  import { decodeEntities } from '@wordpress/html-entities';
8
  import classnames from 'classnames';
9
 
12
  */
13
  import { ValidatedSelect } from '../select';
14
  import './style.scss';
 
15
 
16
  const CountryInput = ( {
17
  className,
27
  'Please select a country.',
28
  'woo-gutenberg-products-block'
29
  ),
30
+ } ) => {
31
  const options = useMemo(
32
  () =>
33
  Object.keys( countries ).map( ( key ) => ( {
81
  );
82
  };
83
 
84
+ CountryInput.propTypes = {
85
+ countries: PropTypes.objectOf( PropTypes.string ).isRequired,
86
+ onChange: PropTypes.func.isRequired,
87
+ className: PropTypes.string,
88
+ id: PropTypes.string,
89
+ label: PropTypes.string,
90
+ value: PropTypes.string,
91
+ autoComplete: PropTypes.string,
92
+ errorId: PropTypes.string,
93
+ errorMessage: PropTypes.string,
94
+ };
95
+
96
  export default CountryInput;
assets/js/base/components/country-input/{index.ts → index.js} RENAMED
File without changes
assets/js/base/components/country-input/shipping-country-input.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { SHIPPING_COUNTRIES } from '@woocommerce/block-settings';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import CountryInput from './country-input.js';
11
+
12
+ const ShippingCountryInput = ( props ) => {
13
+ return <CountryInput countries={ SHIPPING_COUNTRIES } { ...props } />;
14
+ };
15
+
16
+ ShippingCountryInput.propTypes = {
17
+ onChange: PropTypes.func.isRequired,
18
+ className: PropTypes.string,
19
+ label: PropTypes.string,
20
+ value: PropTypes.string,
21
+ };
22
+
23
+ export default ShippingCountryInput;
assets/js/base/components/country-input/shipping-country-input.tsx DELETED
@@ -1,16 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { SHIPPING_COUNTRIES } from '@woocommerce/block-settings';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import CountryInput from './country-input';
10
- import { CountryInputProps } from './CountryInputProps';
11
-
12
- const ShippingCountryInput = ( props: CountryInputProps ): JSX.Element => {
13
- return <CountryInput countries={ SHIPPING_COUNTRIES } { ...props } />;
14
- };
15
-
16
- export default ShippingCountryInput;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/dropdown-selector/index.js CHANGED
@@ -155,7 +155,7 @@ const DropdownSelector = ( {
155
  checked.length > 0 && multiple
156
  ? null
157
  : sprintf(
158
- /* translators: %s attribute name. */
159
  __(
160
  'Any %s',
161
  'woo-gutenberg-products-block'
155
  checked.length > 0 && multiple
156
  ? null
157
  : sprintf(
158
+ // Translators: %s attribute name.
159
  __(
160
  'Any %s',
161
  'woo-gutenberg-products-block'
assets/js/base/components/dropdown-selector/menu.js CHANGED
@@ -38,7 +38,7 @@ const DropdownSelectorMenu = ( {
38
  item: option.value,
39
  'aria-label': selected
40
  ? sprintf(
41
- /* translators: %s is referring to the filter option being removed. */
42
  __(
43
  'Remove %s filter',
44
  'woo-gutenberg-products-block'
38
  item: option.value,
39
  'aria-label': selected
40
  ? sprintf(
41
+ /* Translators: %s is referring to the filter option being removed. */
42
  __(
43
  'Remove %s filter',
44
  'woo-gutenberg-products-block'
assets/js/base/components/dropdown-selector/selected-chip.js CHANGED
@@ -13,7 +13,7 @@ const DropdownSelectorSelectedChip = ( { onRemoveItem, option } ) => {
13
  onRemoveItem( option.value );
14
  } }
15
  ariaLabel={ sprintf(
16
- /* translators: %s is referring to the filter option being removed. */
17
  __( 'Remove %s filter', 'woo-gutenberg-products-block' ),
18
  option.name
19
  ) }
13
  onRemoveItem( option.value );
14
  } }
15
  ariaLabel={ sprintf(
16
+ /* Translators: %s is referring to the filter option being removed. */
17
  __( 'Remove %s filter', 'woo-gutenberg-products-block' ),
18
  option.name
19
  ) }
assets/js/base/components/filter-submit-button/index.js CHANGED
@@ -14,7 +14,7 @@ import './style.scss';
14
  const FilterSubmitButton = ( {
15
  className,
16
  disabled,
17
- /* translators: Submit button text for filters. */
18
  label = __( 'Go', 'woo-gutenberg-products-block' ),
19
  onClick,
20
  screenReaderLabel = __( 'Apply filter', 'woo-gutenberg-products-block' ),
14
  const FilterSubmitButton = ( {
15
  className,
16
  disabled,
17
+ // translators: Submit button text for filters.
18
  label = __( 'Go', 'woo-gutenberg-products-block' ),
19
  onClick,
20
  screenReaderLabel = __( 'Apply filter', 'woo-gutenberg-products-block' ),
assets/js/base/components/formatted-monetary-amount/{index.tsx → index.js} RENAMED
@@ -1,33 +1,21 @@
1
  /**
2
  * External dependencies
3
  */
4
- import NumberFormat, {
5
- NumberFormatValues,
6
- NumberFormatProps,
7
- } from 'react-number-format';
8
  import classNames from 'classnames';
9
- import type { Currency } from '@woocommerce/price-format';
10
- import type { ReactElement } from 'react';
11
 
12
  /**
13
  * Internal dependencies
14
  */
15
  import './style.scss';
16
 
17
- interface FormattedMonetaryAmountProps {
18
- className?: string;
19
- displayType?: NumberFormatProps[ 'displayType' ];
20
- value: number | string; // Value of money amount.
21
- currency: Currency | Record< string, never >; // Currency configuration object.
22
- onValueChange?: ( unit: number ) => void; // Function to call when value changes.
23
- }
24
-
25
  /**
26
  * Formats currency data into the expected format for NumberFormat.
 
 
 
27
  */
28
- const currencyToNumberFormat = (
29
- currency: FormattedMonetaryAmountProps[ 'currency' ]
30
- ) => {
31
  return {
32
  thousandSeparator: currency.thousandSeparator,
33
  decimalSeparator: currency.decimalSeparator,
@@ -40,22 +28,25 @@ const currencyToNumberFormat = (
40
  };
41
 
42
  /**
43
- * FormattedMonetaryAmount component.
44
  *
45
  * Takes a price and returns a formatted price using the NumberFormat component.
 
 
 
 
 
 
 
46
  */
47
  const FormattedMonetaryAmount = ( {
48
  className,
49
- value: rawValue,
50
  currency,
51
  onValueChange,
52
- displayType = 'text',
53
  ...props
54
- }: FormattedMonetaryAmountProps ): ReactElement | null => {
55
- const value =
56
- typeof rawValue === 'string' ? parseInt( rawValue, 10 ) : rawValue;
57
-
58
- if ( ! Number.isFinite( value ) ) {
59
  return null;
60
  }
61
 
@@ -71,6 +62,7 @@ const FormattedMonetaryAmount = ( {
71
  className
72
  );
73
  const numberFormatProps = {
 
74
  ...props,
75
  ...currencyToNumberFormat( currency ),
76
  value: undefined,
@@ -80,20 +72,15 @@ const FormattedMonetaryAmount = ( {
80
 
81
  // Wrapper for NumberFormat onValueChange which handles subunit conversion.
82
  const onValueChangeWrapper = onValueChange
83
- ? ( values: NumberFormatValues ) => {
84
- const minorUnitValue =
85
- ( ( values.value as unknown ) as number ) *
86
- 10 ** currency.minorUnit;
87
  onValueChange( minorUnitValue );
88
  }
89
- : () => {
90
- /* not used */
91
- };
92
 
93
  return (
94
  <NumberFormat
95
  className={ classes }
96
- displayType={ displayType }
97
  { ...numberFormatProps }
98
  value={ priceValue }
99
  onValueChange={ onValueChangeWrapper }
1
  /**
2
  * External dependencies
3
  */
4
+ import NumberFormat from 'react-number-format';
 
 
 
5
  import classNames from 'classnames';
 
 
6
 
7
  /**
8
  * Internal dependencies
9
  */
10
  import './style.scss';
11
 
 
 
 
 
 
 
 
 
12
  /**
13
  * Formats currency data into the expected format for NumberFormat.
14
+ *
15
+ * @param {Object} currency Currency data.
16
+ * @return {Object} Formatted props for NumberFormat.
17
  */
18
+ const currencyToNumberFormat = ( currency ) => {
 
 
19
  return {
20
  thousandSeparator: currency.thousandSeparator,
21
  decimalSeparator: currency.decimalSeparator,
28
  };
29
 
30
  /**
31
+ * Formatted price component.
32
  *
33
  * Takes a price and returns a formatted price using the NumberFormat component.
34
+ *
35
+ * @param {Object} props Component props.
36
+ * @param {string} props.className CSS class used.
37
+ * @param {number} props.value Value of money amount.
38
+ * @param {Object} props.currency Currency configuration object.
39
+ * @param {function():any} props.onValueChange Function to call when value changes.
40
+ * @param {Object} props.props Rest of props passed into component.
41
  */
42
  const FormattedMonetaryAmount = ( {
43
  className,
44
+ value,
45
  currency,
46
  onValueChange,
 
47
  ...props
48
+ } ) => {
49
+ if ( value === '-' ) {
 
 
 
50
  return null;
51
  }
52
 
62
  className
63
  );
64
  const numberFormatProps = {
65
+ displayType: 'text',
66
  ...props,
67
  ...currencyToNumberFormat( currency ),
68
  value: undefined,
72
 
73
  // Wrapper for NumberFormat onValueChange which handles subunit conversion.
74
  const onValueChangeWrapper = onValueChange
75
+ ? ( values ) => {
76
+ const minorUnitValue = values.value * 10 ** currency.minorUnit;
 
 
77
  onValueChange( minorUnitValue );
78
  }
79
+ : () => {};
 
 
80
 
81
  return (
82
  <NumberFormat
83
  className={ classes }
 
84
  { ...numberFormatProps }
85
  value={ priceValue }
86
  onValueChange={ onValueChangeWrapper }
assets/js/base/components/label/{index.tsx → index.js} RENAMED
@@ -1,29 +1,27 @@
1
  /**
2
  * External dependencies
3
  */
4
- import { Fragment } from '@wordpress/element';
 
5
  import classNames from 'classnames';
6
- import type { ReactElement, HTMLProps } from 'react';
7
-
8
- interface LabelProps extends HTMLProps< HTMLElement > {
9
- label?: string;
10
- screenReaderLabel?: string;
11
- wrapperElement?: string;
12
- wrapperProps?: HTMLProps< HTMLElement >;
13
- }
14
 
15
  /**
16
  * Component used to render an accessible text given a label and/or a
17
  * screenReaderLabel. The wrapper element and wrapper props can also be
18
  * specified via props.
19
  *
 
 
 
 
 
20
  */
21
  const Label = ( {
22
  label,
23
  screenReaderLabel,
24
  wrapperElement,
25
  wrapperProps = {},
26
- }: LabelProps ): ReactElement => {
27
  let Wrapper;
28
 
29
  const hasLabel = typeof label !== 'undefined' && label !== null;
@@ -59,4 +57,11 @@ const Label = ( {
59
  return <Wrapper { ...wrapperProps }>{ label }</Wrapper>;
60
  };
61
 
 
 
 
 
 
 
 
62
  export default Label;
1
  /**
2
  * External dependencies
3
  */
4
+ import PropTypes from 'prop-types';
5
+ import { Fragment } from 'react';
6
  import classNames from 'classnames';
 
 
 
 
 
 
 
 
7
 
8
  /**
9
  * Component used to render an accessible text given a label and/or a
10
  * screenReaderLabel. The wrapper element and wrapper props can also be
11
  * specified via props.
12
  *
13
+ * @param {Object} props Incoming props for the component.
14
+ * @param {string} [props.label] Label content.
15
+ * @param {string} [props.screenReaderLabel] Content for screen readers.
16
+ * @param {string} [props.wrapperElement] What element is used to wrap the label.
17
+ * @param {Object} [props.wrapperProps] Props passed into wrapper element.
18
  */
19
  const Label = ( {
20
  label,
21
  screenReaderLabel,
22
  wrapperElement,
23
  wrapperProps = {},
24
+ } ) => {
25
  let Wrapper;
26
 
27
  const hasLabel = typeof label !== 'undefined' && label !== null;
57
  return <Wrapper { ...wrapperProps }>{ label }</Wrapper>;
58
  };
59
 
60
+ Label.propTypes = {
61
+ label: PropTypes.node,
62
+ screenReaderLabel: PropTypes.node,
63
+ wrapperElement: PropTypes.elementType,
64
+ wrapperProps: PropTypes.object,
65
+ };
66
+
67
  export default Label;
assets/js/base/components/loading-mask/index.js CHANGED
@@ -4,14 +4,13 @@
4
  import { __ } from '@wordpress/i18n';
5
  import PropTypes from 'prop-types';
6
  import classNames from 'classnames';
 
7
 
8
  /**
9
  * Internal dependencies
10
  */
11
  import './style.scss';
12
- import Spinner from '../spinner';
13
 
14
- // @todo Find a way to block buttons/form components when LoadingMask isLoading
15
  const LoadingMask = ( {
16
  children,
17
  className,
@@ -19,27 +18,29 @@ const LoadingMask = ( {
19
  showSpinner = false,
20
  isLoading = true,
21
  } ) => {
 
 
 
 
 
22
  return (
23
  <div
24
- className={ classNames( className, {
25
- 'wc-block-components-loading-mask': isLoading,
26
- } ) }
 
27
  >
28
- { isLoading && showSpinner && <Spinner /> }
29
  <div
30
- className={ classNames( {
31
- 'wc-block-components-loading-mask__children': isLoading,
32
- } ) }
33
- aria-hidden={ isLoading }
34
  >
35
  { children }
36
  </div>
37
- { isLoading && (
38
- <span className="screen-reader-text">
39
- { screenReaderLabel ||
40
- __( 'Loading…', 'woo-gutenberg-products-block' ) }
41
- </span>
42
- ) }
43
  </div>
44
  );
45
  };
4
  import { __ } from '@wordpress/i18n';
5
  import PropTypes from 'prop-types';
6
  import classNames from 'classnames';
7
+ import { Spinner } from 'wordpress-components';
8
 
9
  /**
10
  * Internal dependencies
11
  */
12
  import './style.scss';
 
13
 
 
14
  const LoadingMask = ( {
15
  children,
16
  className,
18
  showSpinner = false,
19
  isLoading = true,
20
  } ) => {
21
+ // If nothing is loading, just pass through the children.
22
+ if ( ! isLoading ) {
23
+ return children;
24
+ }
25
+
26
  return (
27
  <div
28
+ className={ classNames(
29
+ className,
30
+ 'wc-block-components-loading-mask'
31
+ ) }
32
  >
33
+ { showSpinner && <Spinner /> }
34
  <div
35
+ className="wc-block-components-loading-mask__children"
36
+ aria-hidden={ true }
 
 
37
  >
38
  { children }
39
  </div>
40
+ <span className="screen-reader-text">
41
+ { screenReaderLabel ||
42
+ __( 'Loading…', 'woo-gutenberg-products-block' ) }
43
+ </span>
 
 
44
  </div>
45
  );
46
  };
assets/js/base/components/loading-mask/style.scss CHANGED
@@ -1,7 +1,6 @@
1
  .wc-block-components-loading-mask {
2
  position: relative;
3
  min-height: 18px + $gap;
4
- pointer-events: none;
5
 
6
  .components-spinner {
7
  position: absolute;
@@ -10,8 +9,8 @@
10
  left: 50%;
11
  transform: translate(-50%, -50%);
12
  }
 
13
 
14
- .wc-block-components-loading-mask__children {
15
- opacity: 0.25;
16
- }
17
  }
1
  .wc-block-components-loading-mask {
2
  position: relative;
3
  min-height: 18px + $gap;
 
4
 
5
  .components-spinner {
6
  position: absolute;
9
  left: 50%;
10
  transform: translate(-50%, -50%);
11
  }
12
+ }
13
 
14
+ .wc-block-components-loading-mask__children {
15
+ opacity: 0.5;
 
16
  }
packages/checkout/panel/index.tsx → assets/js/base/components/panel/index.js RENAMED
@@ -2,8 +2,8 @@
2
  * External dependencies
3
  */
4
  import { useState } from '@wordpress/element';
5
- import type { ReactNode, ReactElement } from 'react';
6
  import classNames from 'classnames';
 
7
  import { Icon, chevronUp, chevronDown } from '@woocommerce/icons';
8
 
9
  /**
@@ -11,15 +11,6 @@ import { Icon, chevronUp, chevronDown } from '@woocommerce/icons';
11
  */
12
  import './style.scss';
13
 
14
- interface PanelProps {
15
- children?: ReactNode;
16
- className?: string;
17
- initialOpen?: boolean;
18
- hasBorder?: boolean;
19
- title?: ReactNode;
20
- titleTag?: keyof JSX.IntrinsicElements;
21
- }
22
-
23
  const Panel = ( {
24
  children,
25
  className,
@@ -27,31 +18,31 @@ const Panel = ( {
27
  hasBorder = false,
28
  title,
29
  titleTag: TitleTag = 'div',
30
- }: PanelProps ): ReactElement => {
31
- const [ isOpen, setIsOpen ] = useState< boolean >( initialOpen );
32
 
33
  return (
34
  <div
35
- className={ classNames( className, 'wc-block-components-panel', {
36
  'has-border': hasBorder,
37
  } ) }
38
  >
39
  <TitleTag>
40
  <button
41
  aria-expanded={ isOpen }
42
- className="wc-block-components-panel__button"
43
  onClick={ () => setIsOpen( ! isOpen ) }
44
  >
45
  <Icon
46
  aria-hidden="true"
47
- className="wc-block-components-panel__button-icon"
48
  srcElement={ isOpen ? chevronUp : chevronDown }
49
  />
50
  { title }
51
  </button>
52
  </TitleTag>
53
  <div
54
- className="wc-block-components-panel__content"
55
  hidden={ ! isOpen }
56
  >
57
  { children }
@@ -60,4 +51,12 @@ const Panel = ( {
60
  );
61
  };
62
 
 
 
 
 
 
 
 
 
63
  export default Panel;
2
  * External dependencies
3
  */
4
  import { useState } from '@wordpress/element';
 
5
  import classNames from 'classnames';
6
+ import PropTypes from 'prop-types';
7
  import { Icon, chevronUp, chevronDown } from '@woocommerce/icons';
8
 
9
  /**
11
  */
12
  import './style.scss';
13
 
 
 
 
 
 
 
 
 
 
14
  const Panel = ( {
15
  children,
16
  className,
18
  hasBorder = false,
19
  title,
20
  titleTag: TitleTag = 'div',
21
+ } ) => {
22
+ const [ isOpen, setIsOpen ] = useState( initialOpen );
23
 
24
  return (
25
  <div
26
+ className={ classNames( className, 'wc-blocks-components-panel', {
27
  'has-border': hasBorder,
28
  } ) }
29
  >
30
  <TitleTag>
31
  <button
32
  aria-expanded={ isOpen }
33
+ className="wc-blocks-components-panel__button"
34
  onClick={ () => setIsOpen( ! isOpen ) }
35
  >
36
  <Icon
37
  aria-hidden="true"
38
+ className="wc-blocks-components-panel__button-icon"
39
  srcElement={ isOpen ? chevronUp : chevronDown }
40
  />
41
  { title }
42
  </button>
43
  </TitleTag>
44
  <div
45
+ className="wc-blocks-components-panel__content"
46
  hidden={ ! isOpen }
47
  >
48
  { children }
51
  );
52
  };
53
 
54
+ Panel.propTypes = {
55
+ className: PropTypes.string,
56
+ hasBorder: PropTypes.bool,
57
+ initialOpen: PropTypes.bool,
58
+ title: PropTypes.element,
59
+ titleTag: PropTypes.string,
60
+ };
61
+
62
  export default Panel;
assets/js/base/components/panel/style.scss ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .wc-blocks-components-panel.has-border {
2
+ @include with-translucent-border( 1px 0 );
3
+
4
+ + .wc-blocks-components-panel.has-border::after {
5
+ border-top-width: 0;
6
+ }
7
+ }
8
+
9
+ .wc-blocks-components-panel__button {
10
+ @include reset-box();
11
+ height: auto;
12
+ line-height: 1;
13
+ margin-bottom: em(6px);
14
+ margin-top: em(6px);
15
+ padding-bottom: em($gap-small - 6px);
16
+ padding-right: #{24px + $gap-smaller};
17
+ padding-top: em($gap-small - 6px);
18
+ position: relative;
19
+ text-align: left;
20
+ width: 100%;
21
+
22
+ &,
23
+ &:hover,
24
+ &:focus,
25
+ &:active {
26
+ @include reset-typography();
27
+ background: transparent;
28
+ box-shadow: none;
29
+ }
30
+
31
+ > .wc-blocks-components-panel__button-icon {
32
+ fill: currentColor;
33
+ position: absolute;
34
+ right: 0;
35
+ top: 50%;
36
+ transform: translateY(-50%);
37
+ width: auto;
38
+ }
39
+ }
40
+
41
+ .wc-blocks-components-panel__content {
42
+ padding-bottom: em($gap);
43
+ overflow: auto;
44
+ }
45
+
46
+ .theme-twentytwenty .wc-blocks-components-panel__button,
47
+ .theme-twentyseventeen .wc-blocks-components-panel__button {
48
+ background: transparent;
49
+ color: inherit;
50
+ }
assets/js/base/components/payment-methods/express-payment-methods.js ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import {
5
+ useExpressPaymentMethods,
6
+ usePaymentMethodInterface,
7
+ } from '@woocommerce/base-hooks';
8
+ import {
9
+ cloneElement,
10
+ isValidElement,
11
+ useCallback,
12
+ useRef,
13
+ } from '@wordpress/element';
14
+ import {
15
+ useEditorContext,
16
+ usePaymentMethodDataContext,
17
+ } from '@woocommerce/base-context';
18
+
19
+ /**
20
+ * Internal dependencies
21
+ */
22
+ import PaymentMethodErrorBoundary from './payment-method-error-boundary';
23
+
24
+ const ExpressPaymentMethods = () => {
25
+ const { isEditor } = useEditorContext();
26
+ const {
27
+ setActivePaymentMethod,
28
+ activePaymentMethod,
29
+ paymentMethodData,
30
+ setPaymentStatus,
31
+ } = usePaymentMethodDataContext();
32
+ const paymentMethodInterface = usePaymentMethodInterface();
33
+ const { paymentMethods } = useExpressPaymentMethods();
34
+ const previousActivePaymentMethod = useRef( activePaymentMethod );
35
+ const previousPaymentMethodData = useRef( paymentMethodData );
36
+
37
+ const onExpressPaymentClick = useCallback(
38
+ ( paymentMethodId ) => () => {
39
+ previousActivePaymentMethod.current = activePaymentMethod;
40
+ previousPaymentMethodData.current = paymentMethodData;
41
+ setPaymentStatus().started();
42
+ setActivePaymentMethod( paymentMethodId );
43
+ },
44
+ [
45
+ activePaymentMethod,
46
+ paymentMethodData,
47
+ setActivePaymentMethod,
48
+ setPaymentStatus,
49
+ ]
50
+ );
51
+ const onExpressPaymentClose = useCallback( () => {
52
+ setActivePaymentMethod( previousActivePaymentMethod.current );
53
+ if ( previousPaymentMethodData.current.isSavedToken ) {
54
+ setPaymentStatus().success( previousPaymentMethodData.current );
55
+ }
56
+ }, [ setActivePaymentMethod, setPaymentStatus ] );
57
+ const paymentMethodIds = Object.keys( paymentMethods );
58
+ const content =
59
+ paymentMethodIds.length > 0 ? (
60
+ paymentMethodIds.map( ( id ) => {
61
+ const expressPaymentMethod = isEditor
62
+ ? paymentMethods[ id ].edit
63
+ : paymentMethods[ id ].content;
64
+ return isValidElement( expressPaymentMethod ) ? (
65
+ <li key={ id } id={ `express-payment-method-${ id }` }>
66
+ { cloneElement( expressPaymentMethod, {
67
+ ...paymentMethodInterface,
68
+ onClick: onExpressPaymentClick( id ),
69
+ onClose: onExpressPaymentClose,
70
+ } ) }
71
+ </li>
72
+ ) : null;
73
+ } )
74
+ ) : (
75
+ <li key="noneRegistered">No registered Payment Methods</li>
76
+ );
77
+ return (
78
+ <PaymentMethodErrorBoundary isEditor={ isEditor }>
79
+ <ul className="wc-block-components-express-payment__event-buttons">
80
+ { content }
81
+ </ul>
82
+ </PaymentMethodErrorBoundary>
83
+ );
84
+ };
85
+
86
+ export default ExpressPaymentMethods;
assets/js/base/components/payment-methods/express-payment/cart-express-payment.js ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import {
6
+ useEmitResponse,
7
+ useExpressPaymentMethods,
8
+ } from '@woocommerce/base-hooks';
9
+ import { StoreNoticesProvider } from '@woocommerce/base-context';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import ExpressPaymentMethods from '../express-payment-methods';
15
+ import './style.scss';
16
+
17
+ const CartExpressPayment = () => {
18
+ const { paymentMethods, isInitialized } = useExpressPaymentMethods();
19
+ const { noticeContexts } = useEmitResponse();
20
+
21
+ if (
22
+ ! isInitialized ||
23
+ ( isInitialized && Object.keys( paymentMethods ).length === 0 )
24
+ ) {
25
+ return null;
26
+ }
27
+
28
+ return (
29
+ <>
30
+ <div className="wc-block-components-express-payment wc-block-components-express-payment--cart">
31
+ <div className="wc-block-components-express-payment__content">
32
+ <StoreNoticesProvider
33
+ context={ noticeContexts.EXPRESS_PAYMENTS }
34
+ >
35
+ <ExpressPaymentMethods />
36
+ </StoreNoticesProvider>
37
+ </div>
38
+ </div>
39
+ <div className="wc-block-components-express-payment-continue-rule wc-block-components-express-payment-continue-rule--cart">
40
+ { /* translators: Shown in the Cart block between the express payment methods and the Proceed to Checkout button */ }
41
+ { __( 'Or', 'woo-gutenberg-products-block' ) }
42
+ </div>
43
+ </>
44
+ );
45
+ };
46
+
47
+ export default CartExpressPayment;
assets/js/base/components/payment-methods/express-payment/checkout-express-payment.js ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import {
6
+ useEmitResponse,
7
+ useExpressPaymentMethods,
8
+ } from '@woocommerce/base-hooks';
9
+ import {
10
+ StoreNoticesProvider,
11
+ useEditorContext,
12
+ } from '@woocommerce/base-context';
13
+ import Title from '@woocommerce/base-components/title';
14
+ import { CURRENT_USER_IS_ADMIN } from '@woocommerce/block-settings';
15
+
16
+ /**
17
+ * Internal dependencies
18
+ */
19
+ import ExpressPaymentMethods from '../express-payment-methods';
20
+ import './style.scss';
21
+
22
+ const CheckoutExpressPayment = () => {
23
+ const { paymentMethods, isInitialized } = useExpressPaymentMethods();
24
+ const { isEditor } = useEditorContext();
25
+ const { noticeContexts } = useEmitResponse();
26
+
27
+ if (
28
+ ! isInitialized ||
29
+ ( isInitialized && Object.keys( paymentMethods ).length === 0 )
30
+ ) {
31
+ // Make sure errors are shown in the editor and for admins. For example,
32
+ // when a payment method fails to register.
33
+ if ( isEditor || CURRENT_USER_IS_ADMIN ) {
34
+ return (
35
+ <StoreNoticesProvider
36
+ context={ noticeContexts.EXPRESS_PAYMENTS }
37
+ ></StoreNoticesProvider>
38
+ );
39
+ }
40
+ return null;
41
+ }
42
+
43
+ return (
44
+ <>
45
+ <div className="wc-block-components-express-payment wc-block-components-express-payment--checkout">
46
+ <div className="wc-block-components-express-payment__title-container">
47
+ <Title
48
+ className="wc-block-components-express-payment__title"
49
+ headingLevel="2"
50
+ >
51
+ { __(
52
+ 'Express checkout',
53
+ 'woo-gutenberg-products-block'
54
+ ) }
55
+ </Title>
56
+ </div>
57
+ <div className="wc-block-components-express-payment__content">
58
+ <StoreNoticesProvider
59
+ context={ noticeContexts.EXPRESS_PAYMENTS }
60
+ >
61
+ <p>
62
+ { __(
63
+ 'In a hurry? Use one of our express checkout options below:',
64
+ 'woo-gutenberg-products-block'
65
+ ) }
66
+ </p>
67
+ <ExpressPaymentMethods />
68
+ </StoreNoticesProvider>
69
+ </div>
70
+ </div>
71
+ <div className="wc-block-components-express-payment-continue-rule wc-block-components-express-payment-continue-rule--checkout">
72
+ { __( 'Or continue below', 'woo-gutenberg-products-block' ) }
73
+ </div>
74
+ </>
75
+ );
76
+ };
77
+
78
+ export default CheckoutExpressPayment;
assets/js/{blocks/cart-checkout → base/components}/payment-methods/express-payment/index.js RENAMED
File without changes
assets/js/{blocks/cart-checkout → base/components}/payment-methods/express-payment/style.scss RENAMED
File without changes
assets/js/{blocks/cart-checkout → base/components}/payment-methods/index.js RENAMED
File without changes
assets/js/{blocks/cart-checkout → base/components}/payment-methods/no-payment-methods/index.js RENAMED
@@ -43,7 +43,7 @@ const NoPaymentMethodsPlaceholder = () => {
43
  ) }
44
  </span>
45
  <Button
46
- isSecondary
47
  href={ `${ ADMIN_URL }admin.php?page=wc-settings&tab=checkout` }
48
  target="_blank"
49
  rel="noopener noreferrer"
43
  ) }
44
  </span>
45
  <Button
46
+ isDefault
47
  href={ `${ ADMIN_URL }admin.php?page=wc-settings&tab=checkout` }
48
  target="_blank"
49
  rel="noopener noreferrer"
assets/js/{blocks/cart-checkout → base/components}/payment-methods/no-payment-methods/style.scss RENAMED
File without changes
assets/js/{blocks/cart-checkout → base/components}/payment-methods/payment-method-error-boundary.js RENAMED
@@ -3,9 +3,9 @@
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import { Component } from 'react';
 
6
  import PropTypes from 'prop-types';
7
- import { CURRENT_USER_IS_ADMIN } from '@woocommerce/settings';
8
- import { StoreNoticesContainer } from '@woocommerce/base-context';
9
 
10
  class PaymentMethodErrorBoundary extends Component {
11
  state = { errorMessage: '', hasError: false };
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import { Component } from 'react';
6
+ import { StoreNoticesContainer } from '@woocommerce/base-components/store-notices-container';
7
  import PropTypes from 'prop-types';
8
+ import { CURRENT_USER_IS_ADMIN } from '@woocommerce/block-settings';
 
9
 
10
  class PaymentMethodErrorBoundary extends Component {
11
  state = { errorMessage: '', hasError: false };
assets/js/base/components/payment-methods/payment-method-options.js ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import {
5
+ usePaymentMethods,
6
+ usePaymentMethodInterface,
7
+ useStoreNotices,
8
+ useEmitResponse,
9
+ } from '@woocommerce/base-hooks';
10
+ import { cloneElement } from '@wordpress/element';
11
+ import { __ } from '@wordpress/i18n';
12
+ import {
13
+ useEditorContext,
14
+ usePaymentMethodDataContext,
15
+ } from '@woocommerce/base-context';
16
+
17
+ /**
18
+ * Internal dependencies
19
+ */
20
+ import Tabs from '../tabs';
21
+ import PaymentMethodTab from './payment-method-tab';
22
+
23
+ /**
24
+ * Component used to render all non-saved payment method options.
25
+ *
26
+ * @return {*} The rendered component.
27
+ */
28
+ const PaymentMethodOptions = () => {
29
+ const {
30
+ setActivePaymentMethod,
31
+ expressPaymentMethods,
32
+ } = usePaymentMethodDataContext();
33
+ const { paymentMethods } = usePaymentMethods();
34
+ const {
35
+ activePaymentMethod,
36
+ ...paymentMethodInterface
37
+ } = usePaymentMethodInterface();
38
+ const expressPaymentMethodActive = Object.keys(
39
+ expressPaymentMethods
40
+ ).includes( activePaymentMethod );
41
+ const { noticeContexts } = useEmitResponse();
42
+ const { removeNotice } = useStoreNotices();
43
+ const { isEditor } = useEditorContext();
44
+
45
+ return expressPaymentMethodActive ? null : (
46
+ <Tabs
47
+ className="wc-block-components-checkout-payment-methods"
48
+ onSelect={ ( tabName ) => {
49
+ setActivePaymentMethod( tabName );
50
+ removeNotice( 'wc-payment-error', noticeContexts.PAYMENTS );
51
+ } }
52
+ tabs={ Object.keys( paymentMethods ).map( ( name ) => {
53
+ const {
54
+ ariaLabel,
55
+ edit,
56
+ content,
57
+ label,
58
+ supports,
59
+ } = paymentMethods[ name ];
60
+ const component = isEditor ? edit : content;
61
+ return {
62
+ name,
63
+ title:
64
+ typeof label === 'string'
65
+ ? label
66
+ : cloneElement( label, {
67
+ components:
68
+ paymentMethodInterface.components,
69
+ } ),
70
+ ariaLabel,
71
+ content: (
72
+ <PaymentMethodTab
73
+ allowsSaving={ supports.savePaymentInfo }
74
+ >
75
+ { cloneElement( component, {
76
+ activePaymentMethod,
77
+ ...paymentMethodInterface,
78
+ } ) }
79
+ </PaymentMethodTab>
80
+ ),
81
+ };
82
+ } ) }
83
+ initialTabName={ activePaymentMethod }
84
+ ariaLabel={ __(
85
+ 'Payment Methods',
86
+ 'woo-gutenberg-products-block'
87
+ ) }
88
+ id="wc-block-payment-methods"
89
+ />
90
+ );
91
+ };
92
+
93
+ export default PaymentMethodOptions;
assets/js/{blocks/cart-checkout/payment-methods/payment-method-card.js → base/components/payment-methods/payment-method-tab.js} RENAMED
@@ -16,16 +16,16 @@ import PropTypes from 'prop-types';
16
  import PaymentMethodErrorBoundary from './payment-method-error-boundary';
17
 
18
  /**
19
- * Component used to render the contents of a payment method card.
20
  *
21
- * @param {Object} props Incoming props for the component.
22
- * @param {boolean} props.showSaveOption Whether that payment method allows saving
23
- * the data for future purchases.
24
- * @param {Object} props.children Content of the payment method card.
25
  *
26
  * @return {*} The rendered component.
27
  */
28
- const PaymentMethodCard = ( { children, showSaveOption } ) => {
29
  const { isEditor } = useEditorContext();
30
  const {
31
  shouldSavePayment,
@@ -36,7 +36,7 @@ const PaymentMethodCard = ( { children, showSaveOption } ) => {
36
  return (
37
  <PaymentMethodErrorBoundary isEditor={ isEditor }>
38
  { children }
39
- { customerId > 0 && showSaveOption && (
40
  <CheckboxControl
41
  className="wc-block-components-payment-methods__save-card-info"
42
  label={ __(
@@ -53,9 +53,9 @@ const PaymentMethodCard = ( { children, showSaveOption } ) => {
53
  );
54
  };
55
 
56
- PaymentMethodCard.propTypes = {
57
- showSaveOption: PropTypes.bool,
58
  children: PropTypes.node,
59
  };
60
 
61
- export default PaymentMethodCard;
16
  import PaymentMethodErrorBoundary from './payment-method-error-boundary';
17
 
18
  /**
19
+ * Component used to render the contents of a payment method tab.
20
  *
21
+ * @param {Object} props Incoming props for the component.
22
+ * @param {boolean} props.allowsSaving Whether that payment method allows saving
23
+ * the data for future purchases.
24
+ * @param {Object} props.children Content of the payment method tab.
25
  *
26
  * @return {*} The rendered component.
27
  */
28
+ const PaymentMethodTab = ( { children, allowsSaving } ) => {
29
  const { isEditor } = useEditorContext();
30
  const {
31
  shouldSavePayment,
36
  return (
37
  <PaymentMethodErrorBoundary isEditor={ isEditor }>
38
  { children }
39
+ { customerId > 0 && allowsSaving && (
40
  <CheckboxControl
41
  className="wc-block-components-payment-methods__save-card-info"
42
  label={ __(
53
  );
54
  };
55
 
56
+ PaymentMethodTab.propTypes = {
57
+ allowsSaving: PropTypes.bool,
58
  children: PropTypes.node,
59
  };
60
 
61
+ export default PaymentMethodTab;
assets/js/base/components/payment-methods/payment-methods.js ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { usePaymentMethods } from '@woocommerce/base-hooks';
5
+ import { useCallback, useState } from '@wordpress/element';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import NoPaymentMethods from './no-payment-methods';
11
+ import PaymentMethodOptions from './payment-method-options';
12
+ import SavedPaymentMethodOptions from './saved-payment-method-options';
13
+
14
+ /**
15
+ * PaymentMethods component.
16
+ *
17
+ * @return {*} The rendered component.
18
+ */
19
+ const PaymentMethods = () => {
20
+ const { isInitialized, paymentMethods } = usePaymentMethods();
21
+ const [ showNewPaymentMethods, setShowNewPaymentMethods ] = useState(
22
+ true
23
+ );
24
+ const onChange = useCallback(
25
+ ( token ) => {
26
+ setShowNewPaymentMethods( token === '0' );
27
+ },
28
+ [ setShowNewPaymentMethods ]
29
+ );
30
+
31
+ if ( isInitialized && Object.keys( paymentMethods ).length === 0 ) {
32
+ return <NoPaymentMethods />;
33
+ }
34
+
35
+ return (
36
+ <>
37
+ <SavedPaymentMethodOptions onChange={ onChange } />
38
+ { showNewPaymentMethods && <PaymentMethodOptions /> }
39
+ </>
40
+ );
41
+ };
42
+
43
+ export default PaymentMethods;
assets/js/{blocks/cart-checkout → base/components}/payment-methods/saved-payment-method-options.js RENAMED
@@ -1,20 +1,15 @@
1
  /**
2
  * External dependencies
3
  */
4
- import {
5
- useEffect,
6
- useRef,
7
- useCallback,
8
- cloneElement,
9
- } from '@wordpress/element';
10
  import { __, sprintf } from '@wordpress/i18n';
11
- import { usePaymentMethodDataContext } from '@woocommerce/base-context';
12
- import RadioControl from '@woocommerce/base-components/radio-control';
13
  import {
14
- usePaymentMethodInterface,
15
- usePaymentMethods,
16
- } from '@woocommerce/base-context/hooks';
 
17
  import { getPaymentMethods } from '@woocommerce/blocks-registry';
 
18
 
19
  /**
20
  * @typedef {import('@woocommerce/type-defs/contexts').CustomerPaymentMethod} CustomerPaymentMethod
@@ -37,7 +32,7 @@ const getCcOrEcheckPaymentMethodOption = (
37
  return {
38
  value: tokenId + '',
39
  label: sprintf(
40
- /* translators: %1$s is referring to the payment method brand, %2$s is referring to the last 4 digits of the payment card, %3$s is referring to the expiry date. */
41
  __(
42
  '%1$s ending in %2$s (expires %3$s)',
43
  'woo-gutenberg-product-blocks'
@@ -50,9 +45,9 @@ const getCcOrEcheckPaymentMethodOption = (
50
  onChange: ( token ) => {
51
  const savedTokenKey = `wc-${ method.gateway }-payment-token`;
52
  setActivePaymentMethod( method.gateway );
53
- setPaymentStatus().started( {
54
  payment_method: method.gateway,
55
- [ savedTokenKey ]: token + '',
56
  isSavedToken: true,
57
  } );
58
  },
@@ -76,7 +71,7 @@ const getDefaultPaymentMethodOptions = (
76
  return {
77
  value: tokenId + '',
78
  label: sprintf(
79
- /* translators: %s is the name of the payment method gateway. */
80
  __( 'Saved token for %s', 'woo-gutenberg-products-block' ),
81
  method.gateway
82
  ),
@@ -84,27 +79,24 @@ const getDefaultPaymentMethodOptions = (
84
  onChange: ( token ) => {
85
  const savedTokenKey = `wc-${ method.gateway }-payment-token`;
86
  setActivePaymentMethod( method.gateway );
87
- setPaymentStatus().started( {
88
  payment_method: method.gateway,
89
- [ savedTokenKey ]: token + '',
90
  isSavedToken: true,
91
  } );
92
  },
93
  };
94
  };
95
 
96
- const SavedPaymentMethodOptions = () => {
 
97
  const {
98
  setPaymentStatus,
99
  customerPaymentMethods,
100
- activePaymentMethod,
101
  setActivePaymentMethod,
102
- activeSavedToken,
103
- setActiveSavedToken,
104
  } = usePaymentMethodDataContext();
 
105
  const standardMethods = getPaymentMethods();
106
- const { paymentMethods } = usePaymentMethods();
107
- const paymentMethodInterface = usePaymentMethodInterface();
108
 
109
  /**
110
  * @type {Object} Options
@@ -114,9 +106,13 @@ const SavedPaymentMethodOptions = () => {
114
 
115
  const updateToken = useCallback(
116
  ( token ) => {
117
- setActiveSavedToken( token );
 
 
 
 
118
  },
119
- [ setActiveSavedToken ]
120
  );
121
 
122
  useEffect( () => {
@@ -125,6 +121,11 @@ const SavedPaymentMethodOptions = () => {
125
  .flatMap( ( type ) => {
126
  const typeMethods = customerPaymentMethods[ type ];
127
  return typeMethods.map( ( paymentMethod ) => {
 
 
 
 
 
128
  const option =
129
  type === 'cc' || type === 'echeck'
130
  ? getCcOrEcheckPaymentMethodOption(
@@ -137,11 +138,7 @@ const SavedPaymentMethodOptions = () => {
137
  setActivePaymentMethod,
138
  setPaymentStatus
139
  );
140
- if (
141
- ! activePaymentMethod &&
142
- paymentMethod.is_default &&
143
- activeSavedToken === ''
144
- ) {
145
  updateToken( paymentMethod.tokenId + '' );
146
  option.onChange( paymentMethod.tokenId );
147
  }
@@ -153,34 +150,31 @@ const SavedPaymentMethodOptions = () => {
153
  }, [
154
  customerPaymentMethods,
155
  updateToken,
156
- activeSavedToken,
157
- activePaymentMethod,
158
  setActivePaymentMethod,
159
  setPaymentStatus,
160
  standardMethods,
161
  ] );
162
 
163
- const savedPaymentMethodHandler =
164
- !! activeSavedToken &&
165
- paymentMethods[ activePaymentMethod ] &&
166
- paymentMethods[ activePaymentMethod ]?.savedTokenComponent
167
- ? cloneElement(
168
- paymentMethods[ activePaymentMethod ]?.savedTokenComponent,
169
- { token: activeSavedToken, ...paymentMethodInterface }
170
- )
171
- : null;
172
-
173
  return currentOptions.current.length > 0 ? (
174
- <>
175
- <RadioControl
176
- id={ 'wc-payment-method-saved-tokens' }
177
- selected={ activeSavedToken }
178
- onChange={ updateToken }
179
- options={ currentOptions.current }
180
- />
181
- { savedPaymentMethodHandler }
182
- </>
183
  ) : null;
184
  };
185
 
 
 
 
 
186
  export default SavedPaymentMethodOptions;
1
  /**
2
  * External dependencies
3
  */
4
+ import { useEffect, useState, useRef, useCallback } from '@wordpress/element';
 
 
 
 
 
5
  import { __, sprintf } from '@wordpress/i18n';
 
 
6
  import {
7
+ useEditorContext,
8
+ usePaymentMethodDataContext,
9
+ } from '@woocommerce/base-context';
10
+ import RadioControl from '@woocommerce/base-components/radio-control';
11
  import { getPaymentMethods } from '@woocommerce/blocks-registry';
12
+ import PropTypes from 'prop-types';
13
 
14
  /**
15
  * @typedef {import('@woocommerce/type-defs/contexts').CustomerPaymentMethod} CustomerPaymentMethod
32
  return {
33
  value: tokenId + '',
34
  label: sprintf(
35
+ /* Translators: %1$s is referring to the payment method brand, %2$s is referring to the last 4 digits of the payment card, %3$s is referring to the expiry date. */
36
  __(
37
  '%1$s ending in %2$s (expires %3$s)',
38
  'woo-gutenberg-product-blocks'
45
  onChange: ( token ) => {
46
  const savedTokenKey = `wc-${ method.gateway }-payment-token`;
47
  setActivePaymentMethod( method.gateway );
48
+ setPaymentStatus().success( {
49
  payment_method: method.gateway,
50
+ [ savedTokenKey ]: token,
51
  isSavedToken: true,
52
  } );
53
  },
71
  return {
72
  value: tokenId + '',
73
  label: sprintf(
74
+ // Translators: %s is the name of the payment method gateway.
75
  __( 'Saved token for %s', 'woo-gutenberg-products-block' ),
76
  method.gateway
77
  ),
79
  onChange: ( token ) => {
80
  const savedTokenKey = `wc-${ method.gateway }-payment-token`;
81
  setActivePaymentMethod( method.gateway );
82
+ setPaymentStatus().success( {
83
  payment_method: method.gateway,
84
+ [ savedTokenKey ]: token,
85
  isSavedToken: true,
86
  } );
87
  },
88
  };
89
  };
90
 
91
+ const SavedPaymentMethodOptions = ( { onChange } ) => {
92
+ const { isEditor } = useEditorContext();
93
  const {
94
  setPaymentStatus,
95
  customerPaymentMethods,
 
96
  setActivePaymentMethod,
 
 
97
  } = usePaymentMethodDataContext();
98
+ const [ selectedToken, setSelectedToken ] = useState( '' );
99
  const standardMethods = getPaymentMethods();
 
 
100
 
101
  /**
102
  * @type {Object} Options
106
 
107
  const updateToken = useCallback(
108
  ( token ) => {
109
+ if ( token === '0' ) {
110
+ setPaymentStatus().started();
111
+ }
112
+ setSelectedToken( token );
113
+ onChange( token );
114
  },
115
+ [ onChange, setSelectedToken, setPaymentStatus ]
116
  );
117
 
118
  useEffect( () => {
121
  .flatMap( ( type ) => {
122
  const typeMethods = customerPaymentMethods[ type ];
123
  return typeMethods.map( ( paymentMethod ) => {
124
+ const method =
125
+ standardMethods[ paymentMethod.method.gateway ];
126
+ if ( ! method?.supports?.savePaymentInfo ) {
127
+ return null;
128
+ }
129
  const option =
130
  type === 'cc' || type === 'echeck'
131
  ? getCcOrEcheckPaymentMethodOption(
138
  setActivePaymentMethod,
139
  setPaymentStatus
140
  );
141
+ if ( paymentMethod.is_default && selectedToken === '' ) {
 
 
 
 
142
  updateToken( paymentMethod.tokenId + '' );
143
  option.onChange( paymentMethod.tokenId );
144
  }
150
  }, [
151
  customerPaymentMethods,
152
  updateToken,
153
+ selectedToken,
 
154
  setActivePaymentMethod,
155
  setPaymentStatus,
156
  standardMethods,
157
  ] );
158
 
159
+ // In the editor, show `Use a new payment method` option as selected.
160
+ const selectedOption = isEditor ? '0' : selectedToken + '';
161
+ const newPaymentMethodOption = {
162
+ value: '0',
163
+ label: __( 'Use a new payment method', 'woo-gutenberg-product-blocks' ),
164
+ name: `wc-saved-payment-method-token-new`,
165
+ };
 
 
 
166
  return currentOptions.current.length > 0 ? (
167
+ <RadioControl
168
+ id={ 'wc-payment-method-saved-tokens' }
169
+ selected={ selectedOption }
170
+ onChange={ updateToken }
171
+ options={ [ ...currentOptions.current, newPaymentMethodOption ] }
172
+ />
 
 
 
173
  ) : null;
174
  };
175
 
176
+ SavedPaymentMethodOptions.propTypes = {
177
+ onChange: PropTypes.func.isRequired,
178
+ };
179
+
180
  export default SavedPaymentMethodOptions;
assets/js/{blocks/cart-checkout → base/components}/payment-methods/style.scss RENAMED
@@ -143,6 +143,21 @@
143
  }
144
  }
145
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
146
  .wc-block-components-checkout-payment-methods * {
147
  pointer-events: all; // Overrides parent disabled component in editor context
148
  }
@@ -168,79 +183,3 @@
168
  margin-left: $gap-smaller;
169
  }
170
  }
171
-
172
- .wc-block-checkout__payment-method {
173
- .wc-block-components-radio-control__option {
174
- padding-left: 56px;
175
-
176
- &::after {
177
- content: none;
178
- }
179
-
180
- .wc-block-components-radio-control__input {
181
- left: 16px;
182
- }
183
- }
184
-
185
- // We need to add the first-child and last-child pseudoclasses for specificity.
186
- .wc-block-components-radio-control__option,
187
- .wc-block-components-radio-control__option:first-child,
188
- .wc-block-components-radio-control__option:last-child {
189
- margin: 0;
190
- padding-bottom: em($gap);
191
- padding-top: em($gap);
192
- }
193
-
194
- .wc-block-components-radio-control__option-checked {
195
- font-weight: bold;
196
- }
197
-
198
- .wc-block-components-radio-control-accordion-option,
199
- .wc-block-components-radio-control__option {
200
- @include with-translucent-border(1px 1px 0 1px);
201
- }
202
-
203
- .wc-block-components-radio-control__option:last-child::after,
204
- .wc-block-components-radio-control-accordion-option:last-child::after {
205
- border-width: 1px;
206
- }
207
-
208
- .wc-block-components-radio-control-accordion-option {
209
- .wc-block-components-radio-control__option::after {
210
- border-width: 0;
211
- }
212
- .wc-block-components-radio-control__label img {
213
- height: 24px;
214
- }
215
- }
216
-
217
- .wc-block-components-radio-control.disable-radio-control {
218
- .wc-block-components-radio-control__option {
219
- padding-left: 16px;
220
- }
221
-
222
- .wc-block-components-radio-control__input {
223
- display: none;
224
- }
225
- }
226
-
227
- .wc-block-components-checkout-step__description-payments-aligned {
228
- padding-top: 14px;
229
- height: 28px;
230
- }
231
-
232
- }
233
-
234
- .wc-block-components-radio-control-accordion-content {
235
- padding: 0 $gap em($gap) $gap;
236
-
237
- &:empty {
238
- display: none;
239
- }
240
- }
241
-
242
- .wc-block-checkout__order-notes {
243
- .wc-block-components-checkout-step__content {
244
- padding-bottom: 0;
245
- }
246
- }
143
  }
144
  }
145
 
146
+ .wc-blocks-credit-card-images {
147
+ padding-top: $gap-small;
148
+ display: flex;
149
+
150
+ .wc-blocks-credit-cart-icon {
151
+ height: 18px;
152
+ width: auto;
153
+ margin-right: $gap-small;
154
+
155
+ &:last-child {
156
+ margin-right: 0;
157
+ }
158
+ }
159
+ }
160
+
161
  .wc-block-components-checkout-payment-methods * {
162
  pointer-events: all; // Overrides parent disabled component in editor context
163
  }
183
  margin-left: $gap-smaller;
184
  }
185
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/{blocks/cart-checkout → base/components}/payment-methods/test/payment-methods.js RENAMED
@@ -6,39 +6,26 @@ import {
6
  registerPaymentMethod,
7
  __experimentalDeRegisterPaymentMethod,
8
  } from '@woocommerce/blocks-registry';
9
- import {
10
- PaymentMethodDataProvider,
11
- usePaymentMethodDataContext,
12
- } from '@woocommerce/base-context';
13
 
14
  /**
15
  * Internal dependencies
16
  */
17
  import PaymentMethods from '../payment-methods';
18
 
19
- jest.mock( '../saved-payment-method-options', () => ( { onChange } ) => {
20
- return (
21
- <>
22
- <span>Saved payment method options</span>
23
- <button onClick={ () => onChange( '0' ) }>Select saved</button>
24
- </>
25
- );
26
- } );
27
-
28
- jest.mock(
29
- '@woocommerce/base-components/radio-control-accordion',
30
- () => ( { onChange } ) => (
31
- <>
32
- <span>Payment method options</span>
33
- <button onClick={ () => onChange( 'stripe' ) }>
34
- Select new payment
35
- </button>
36
- </>
37
- )
38
- );
39
 
40
  const registerMockPaymentMethods = () => {
41
- [ 'stripe' ].forEach( ( name ) => {
42
  registerPaymentMethod( {
43
  name,
44
  label: name,
@@ -46,18 +33,13 @@ const registerMockPaymentMethods = () => {
46
  edit: <div>A payment method</div>,
47
  icons: null,
48
  canMakePayment: () => true,
49
- supports: {
50
- showSavedCards: true,
51
- showSaveOption: true,
52
- features: [ 'products' ],
53
- },
54
  ariaLabel: name,
55
  } );
56
  } );
57
  };
58
 
59
  const resetMockPaymentMethods = () => {
60
- [ 'stripe' ].forEach( ( name ) => {
61
  __experimentalDeRegisterPaymentMethod( name );
62
  } );
63
  };
@@ -80,27 +62,11 @@ describe( 'PaymentMethods', () => {
80
  } );
81
  } );
82
 
83
- test( 'selecting new payment method', async () => {
84
- const ShowActivePaymentMethod = () => {
85
- const {
86
- activePaymentMethod,
87
- activeSavedToken,
88
- } = usePaymentMethodDataContext();
89
- return (
90
- <>
91
- <div>
92
- { 'Active Payment Method: ' + activePaymentMethod }
93
- </div>
94
- <div>{ 'Active Saved Token: ' + activeSavedToken }</div>
95
- </>
96
- );
97
- };
98
-
99
  registerMockPaymentMethods();
100
  render(
101
  <PaymentMethodDataProvider>
102
  <PaymentMethods />
103
- <ShowActivePaymentMethod />
104
  </PaymentMethodDataProvider>
105
  );
106
 
@@ -113,21 +79,33 @@ describe( 'PaymentMethods', () => {
113
  );
114
  expect( savedPaymentMethodOptions ).not.toBeNull();
115
  expect( paymentMethodOptions ).not.toBeNull();
116
- const savedToken = screen.queryByText(
117
- /Active Payment Method: stripe/
118
- );
119
- expect( savedToken ).toBeNull();
120
  } );
121
 
122
- fireEvent.click( screen.getByText( 'Select new payment' ) );
123
 
124
  await waitFor( () => {
125
- const activePaymentMethod = screen.queryByText(
126
- /Active Payment Method: stripe/
 
 
 
127
  );
128
- expect( activePaymentMethod ).not.toBeNull();
 
129
  } );
130
 
 
 
 
 
 
 
 
 
 
 
 
 
131
  resetMockPaymentMethods();
132
  } );
133
  } );
6
  registerPaymentMethod,
7
  __experimentalDeRegisterPaymentMethod,
8
  } from '@woocommerce/blocks-registry';
9
+ import { PaymentMethodDataProvider } from '@woocommerce/base-context';
 
 
 
10
 
11
  /**
12
  * Internal dependencies
13
  */
14
  import PaymentMethods from '../payment-methods';
15
 
16
+ jest.mock( '../payment-method-options', () => () => (
17
+ <span>Payment method options</span>
18
+ ) );
19
+ jest.mock( '../saved-payment-method-options', () => ( { onChange } ) => (
20
+ <>
21
+ <span>Saved payment method options</span>
22
+ <button onClick={ () => onChange( '1' ) }>Select saved</button>
23
+ <button onClick={ () => onChange( '0' ) }>Select not saved</button>
24
+ </>
25
+ ) );
 
 
 
 
 
 
 
 
 
 
26
 
27
  const registerMockPaymentMethods = () => {
28
+ [ 'cheque' ].forEach( ( name ) => {
29
  registerPaymentMethod( {
30
  name,
31
  label: name,
33
  edit: <div>A payment method</div>,
34
  icons: null,
35
  canMakePayment: () => true,
 
 
 
 
 
36
  ariaLabel: name,
37
  } );
38
  } );
39
  };
40
 
41
  const resetMockPaymentMethods = () => {
42
+ [ 'cheque' ].forEach( ( name ) => {
43
  __experimentalDeRegisterPaymentMethod( name );
44
  } );
45
  };
62
  } );
63
  } );
64
 
65
+ test( 'should hide/show PaymentMethodOptions when a saved payment method is checked/unchecked', async () => {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  registerMockPaymentMethods();
67
  render(
68
  <PaymentMethodDataProvider>
69
  <PaymentMethods />
 
70
  </PaymentMethodDataProvider>
71
  );
72
 
79
  );
80
  expect( savedPaymentMethodOptions ).not.toBeNull();
81
  expect( paymentMethodOptions ).not.toBeNull();
 
 
 
 
82
  } );
83
 
84
+ fireEvent.click( screen.getByText( 'Select saved' ) );
85
 
86
  await waitFor( () => {
87
+ const savedPaymentMethodOptions = screen.queryByText(
88
+ /Saved payment method options/
89
+ );
90
+ const paymentMethodOptions = screen.queryByText(
91
+ /Payment method options/
92
  );
93
+ expect( savedPaymentMethodOptions ).not.toBeNull();
94
+ expect( paymentMethodOptions ).toBeNull();
95
  } );
96
 
97
+ fireEvent.click( screen.getByText( 'Select not saved' ) );
98
+
99
+ await waitFor( () => {
100
+ const savedPaymentMethodOptions = screen.queryByText(
101
+ /Saved payment method options/
102
+ );
103
+ const paymentMethodOptions = screen.queryByText(
104
+ /Payment method options/
105
+ );
106
+ expect( savedPaymentMethodOptions ).not.toBeNull();
107
+ expect( paymentMethodOptions ).not.toBeNull();
108
+ } );
109
  resetMockPaymentMethods();
110
  } );
111
  } );
assets/js/base/components/price-slider/index.js CHANGED
@@ -3,6 +3,7 @@
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import {
 
6
  useState,
7
  useEffect,
8
  useCallback,
@@ -12,7 +13,6 @@ import {
12
  import PropTypes from 'prop-types';
13
  import classnames from 'classnames';
14
  import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
15
- import { isObject } from '@woocommerce/types';
16
 
17
  /**
18
  * Internal dependencies
@@ -242,13 +242,10 @@ const PriceSlider = ( {
242
  ! hasValidConstraints && 'is-disabled'
243
  );
244
 
245
- const activeElement = isObject( minRange.current )
246
- ? minRange.current.ownerDocument.activeElement
247
- : undefined;
248
  const minRangeStep =
249
- activeElement && activeElement === minRange.current ? stepValue : 1;
250
  const maxRangeStep =
251
- activeElement && activeElement === maxRange.current ? stepValue : 1;
252
 
253
  return (
254
  <div className={ classes }>
@@ -308,7 +305,7 @@ const PriceSlider = ( {
308
  </div>
309
  <div className="wc-block-price-filter__controls wc-block-components-price-slider__controls">
310
  { showInputFields && (
311
- <>
312
  <FormattedMonetaryAmount
313
  currency={ currency }
314
  displayType="input"
@@ -345,7 +342,7 @@ const PriceSlider = ( {
345
  disabled={ isLoading || ! hasValidConstraints }
346
  value={ maxPriceInput }
347
  />
348
- </>
349
  ) }
350
  { ! showInputFields &&
351
  ! isLoading &&
@@ -356,11 +353,13 @@ const PriceSlider = ( {
356
  : &nbsp;
357
  <FormattedMonetaryAmount
358
  currency={ currency }
 
359
  value={ minPrice }
360
  />
361
  &nbsp;&ndash;&nbsp;
362
  <FormattedMonetaryAmount
363
  currency={ currency }
 
364
  value={ maxPrice }
365
  />
366
  </div>
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import {
6
+ Fragment,
7
  useState,
8
  useEffect,
9
  useCallback,
13
  import PropTypes from 'prop-types';
14
  import classnames from 'classnames';
15
  import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
 
16
 
17
  /**
18
  * Internal dependencies
242
  ! hasValidConstraints && 'is-disabled'
243
  );
244
 
 
 
 
245
  const minRangeStep =
246
+ minRange && document.activeElement === minRange.current ? stepValue : 1;
247
  const maxRangeStep =
248
+ maxRange && document.activeElement === maxRange.current ? stepValue : 1;
249
 
250
  return (
251
  <div className={ classes }>
305
  </div>
306
  <div className="wc-block-price-filter__controls wc-block-components-price-slider__controls">
307
  { showInputFields && (
308
+ <Fragment>
309
  <FormattedMonetaryAmount
310
  currency={ currency }
311
  displayType="input"
342
  disabled={ isLoading || ! hasValidConstraints }
343
  value={ maxPriceInput }
344
  />
345
+ </Fragment>
346
  ) }
347
  { ! showInputFields &&
348
  ! isLoading &&
353
  : &nbsp;
354
  <FormattedMonetaryAmount
355
  currency={ currency }
356
+ displayType="text"
357
  value={ minPrice }
358
  />
359
  &nbsp;&ndash;&nbsp;
360
  <FormattedMonetaryAmount
361
  currency={ currency }
362
+ displayType="text"
363
  value={ maxPrice }
364
  />
365
  </div>
assets/js/base/components/price-slider/style.scss CHANGED
@@ -2,8 +2,8 @@
2
  @mixin thumb {
3
  background-color: transparent;
4
  background-position: 0 0;
5
- width: 28px;
6
- height: 23px;
7
  border: 0;
8
  padding: 0;
9
  margin: 0;
@@ -11,8 +11,7 @@
11
  cursor: pointer;
12
  z-index: 20;
13
  pointer-events: auto;
14
- background-image: url("data:image/svg+xml,%3Csvg width='56' height='46' viewBox='0 0 56 46' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0)'%3E%3Cpath d='M25.3176 9.9423L16.9013 3.7991C15.1953 2.5706 13.2618 1.9003 11.2146 2.0121H11.1009C6.21029 2.3471 2.11589 6.3681 2.00219 11.2827C1.88849 16.644 6.21019 21 11.6696 21H11.7833C13.603 21 15.4228 20.3298 16.9013 19.213L25.3176 12.958C26.2275 12.0645 26.2275 10.7242 25.3176 9.9423V9.9423Z' fill='white' stroke='%23757575'/%3E%3Cpath d='M13 7V16M10 7V16V7Z' stroke='%23B8B8B8'/%3E%3Cpath d='M25.3176 9.94227L16.9013 3.79907C15.1953 2.57057 13.2618 1.90027 11.2146 2.01207H11.1009C6.21029 2.34707 2.11589 6.36807 2.00219 11.2827C1.88849 16.644 6.21019 21 11.6696 21H11.7833C13.603 21 15.4228 20.3298 16.9013 19.213L25.3176 12.958C26.2275 12.0645 26.2275 10.7242 25.3176 9.94227V9.94227Z' fill='white' stroke='%23757575'/%3E%3Cpath d='M13 7V16M10 7V16V7Z' stroke='%23B8B8B8'/%3E%3Cpath d='M25.3176 32.9423L16.9013 26.7991C15.1953 25.5706 13.2618 24.9003 11.2146 25.0121H11.1009C6.21029 25.347 2.11589 29.368 2.00219 34.2827C1.88849 39.644 6.21019 44 11.6696 44H11.7833C13.603 44 15.4228 43.3298 16.9013 42.213L25.3176 35.958C26.2275 35.0645 26.2275 33.7242 25.3176 32.9423V32.9423Z' fill='%23F8F3F7' stroke='white' stroke-opacity='0.75' stroke-width='3'/%3E%3Cpath d='M25.3176 32.9423L16.9013 26.7991C15.1953 25.5706 13.2618 24.9003 11.2146 25.0121H11.1009C6.21029 25.347 2.11589 29.368 2.00219 34.2827C1.88849 39.644 6.21019 44 11.6696 44H11.7833C13.603 44 15.4228 43.3298 16.9013 42.213L25.3176 35.958C26.2275 35.0645 26.2275 33.7242 25.3176 32.9423V32.9423Z' stroke='%23757575'/%3E%3Cpath d='M13 30V39M10 30V39V30Z' stroke='%23757575'/%3E%3Cpath d='M30.6824 9.94227L39.0987 3.79907C40.8047 2.57057 42.7382 1.90027 44.7854 2.01207H44.8991C49.7897 2.34707 53.8841 6.36807 53.9978 11.2827C54.1115 16.644 49.7898 21 44.3304 21H44.2167C42.397 21 40.5772 20.3298 39.0987 19.213L30.6824 12.958C29.7725 12.0645 29.7725 10.7242 30.6824 9.94227V9.94227Z' fill='white' stroke='%23757575'/%3E%3Cpath d='M43 6.99997V16M46 6.99997V16V6.99997Z' stroke='%23B8B8B8'/%3E%3Cpath d='M30.6824 32.9423L39.0987 26.7991C40.8047 25.5706 42.7382 24.9003 44.7854 25.0121H44.8991C49.7897 25.347 53.8841 29.368 53.9978 34.2827C54.1115 39.644 49.7898 44 44.3304 44H44.2167C42.397 44 40.5772 43.3298 39.0987 42.213L30.6824 35.958C29.7725 35.0645 29.7725 33.7242 30.6824 32.9423V32.9423Z' fill='%23F8F3F7' stroke='white' stroke-opacity='0.75' stroke-width='3'/%3E%3Cpath d='M30.6824 32.9423L39.0987 26.7991C40.8047 25.5706 42.7382 24.9003 44.7854 25.0121H44.8991C49.7897 25.347 53.8841 29.368 53.9978 34.2827C54.1115 39.644 49.7898 44 44.3304 44H44.2167C42.397 44 40.5772 43.3298 39.0987 42.213L30.6824 35.958C29.7725 35.0645 29.7725 33.7242 30.6824 32.9423V32.9423Z' stroke='%23757575'/%3E%3Cpath d='M43 30V39M46 30V39V30Z' stroke='%23757575'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0'%3E%3Crect width='56' height='46' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E%0A");
15
-
16
  transition: transform .2s ease-in-out;
17
  -webkit-appearance: none;
18
  -moz-appearance: none;
@@ -20,11 +19,12 @@
20
 
21
  &:hover {
22
  @include thumbFocus;
 
23
  }
24
  }
25
  @mixin thumbFocus {
26
- background-position-y: -23px;
27
- transform: scale(1.1);
28
  }
29
  /* stylelint-enable */
30
  @mixin track {
2
  @mixin thumb {
3
  background-color: transparent;
4
  background-position: 0 0;
5
+ width: 26px;
6
+ height: 21px;
7
  border: 0;
8
  padding: 0;
9
  margin: 0;
11
  cursor: pointer;
12
  z-index: 20;
13
  pointer-events: auto;
14
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='52' height='42'%3E%3Cdefs%3E%3Cpath id='a' d='M23.3176 7.9423l-8.4163-6.1432C13.1953.5706 11.2618-.0997 9.2146.0121h-.1137C4.2103.347.1159 4.368.0022 9.2827-.1115 14.644 4.2102 19 9.6696 19h.1137c1.8197 0 3.6395-.6702 5.118-1.787l8.4163-6.255c.9099-.8935.9099-2.2338 0-3.0157z'/%3E%3Cpath id='b' d='M23.3176 7.9423l-8.4163-6.1432C13.1953.5706 11.2618-.0997 9.2146.0121h-.1137C4.2103.347.1159 4.368.0022 9.2827-.1115 14.644 4.2102 19 9.6696 19h.1137c1.8197 0 3.6395-.6702 5.118-1.787l8.4163-6.255c.9099-.8935.9099-2.2338 0-3.0157z'/%3E%3C/defs%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath fill='%23FFF' fill-rule='nonzero' stroke='#{encode-color($gray-700)}' d='M24.3176 8.9423l-8.4163-6.1432c-1.706-1.2285-3.6395-1.8988-5.6867-1.787h-.1137c-4.8906.335-8.985 4.356-9.0987 9.2706C.8885 15.644 5.2102 20 10.6696 20h.1137c1.8197 0 3.6395-.6702 5.118-1.787l8.4163-6.255c.9099-.8935.9099-2.2338 0-3.0157z'/%3E%3Cpath stroke='%23B8B8B8' d='M9 6v9m3-9v9'/%3E%3Cg fill-rule='nonzero' transform='translate(1 22)'%3E%3Cuse fill='%23F8F3F7' stroke='%23FFF' stroke-opacity='.75' stroke-width='3' xlink:href='%23a'/%3E%3Cuse stroke='#{encode-color($gray-700)}' xlink:href='%23a'/%3E%3C/g%3E%3Cpath stroke='#{encode-color($gray-700)}' d='M9 27v9m3-9v9'/%3E%3Cg%3E%3Cpath fill='%23FFF' fill-rule='nonzero' stroke='#{encode-color($gray-700)}' d='M27.6824 8.9423l8.4163-6.1432c1.706-1.2285 3.6395-1.8988 5.6867-1.787h.1137c4.8906.335 8.985 4.356 9.0987 9.2706C51.1115 15.644 46.7898 20 41.3304 20h-.1137c-1.8197 0-3.6395-.6702-5.118-1.787l-8.4163-6.255c-.9099-.8935-.9099-2.2338 0-3.0157z'/%3E%3Cpath stroke='%23B8B8B8' d='M43 6v9m-3-9v9'/%3E%3C/g%3E%3Cg%3E%3Cg fill-rule='nonzero' transform='matrix(-1 0 0 1 51 22)'%3E%3Cuse fill='%23F8F3F7' stroke='%23FFF' stroke-opacity='.75' stroke-width='3' xlink:href='%23b'/%3E%3Cuse stroke='#{encode-color($gray-700)}' xlink:href='%23b'/%3E%3C/g%3E%3Cpath stroke='#{encode-color($gray-700)}' d='M43 27v9m-3-9v9'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");
 
15
  transition: transform .2s ease-in-out;
16
  -webkit-appearance: none;
17
  -moz-appearance: none;
19
 
20
  &:hover {
21
  @include thumbFocus;
22
+ transform: scale(1.1);
23
  }
24
  }
25
  @mixin thumbFocus {
26
+ background-position-y: -21px;
27
+ filter: drop-shadow(3px 0 0 rgba(255, 255, 255, .75)) drop-shadow(-3px 0 0 rgba(255, 255, 255, .75));
28
  }
29
  /* stylelint-enable */
30
  @mixin track {
assets/js/base/components/{product-list/product-list-item → product-list-item}/index.js RENAMED
File without changes
assets/js/base/components/{product-list/product-list-item → product-list-item}/utils.js RENAMED
File without changes
assets/js/base/components/product-list/container.js CHANGED
@@ -7,12 +7,9 @@ import PropTypes from 'prop-types';
7
  /**
8
  * Internal dependencies
9
  */
10
- import ProductList from './product-list';
11
 
12
- const ProductListContainer = ( {
13
- attributes,
14
- hideOutOfStockItems = false,
15
- } ) => {
16
  const [ currentPage, setPage ] = useState( 1 );
17
  const [ currentSort, setSort ] = useState( attributes.orderby );
18
  useEffect( () => {
@@ -31,7 +28,6 @@ const ProductListContainer = ( {
31
  return (
32
  <ProductList
33
  attributes={ attributes }
34
- hideOutOfStockItems={ hideOutOfStockItems }
35
  currentPage={ currentPage }
36
  onPageChange={ onPageChange }
37
  onSortChange={ onSortChange }
@@ -42,7 +38,6 @@ const ProductListContainer = ( {
42
 
43
  ProductListContainer.propTypes = {
44
  attributes: PropTypes.object.isRequired,
45
- hideOutOfStockItems: PropTypes.bool,
46
  };
47
 
48
  export default ProductListContainer;
7
  /**
8
  * Internal dependencies
9
  */
10
+ import ProductList from './index';
11
 
12
+ const ProductListContainer = ( { attributes } ) => {
 
 
 
13
  const [ currentPage, setPage ] = useState( 1 );
14
  const [ currentSort, setSort ] = useState( attributes.orderby );
15
  useEffect( () => {
28
  return (
29
  <ProductList
30
  attributes={ attributes }
 
31
  currentPage={ currentPage }
32
  onPageChange={ onPageChange }
33
  onSortChange={ onSortChange }
38
 
39
  ProductListContainer.propTypes = {
40
  attributes: PropTypes.object.isRequired,
 
41
  };
42
 
43
  export default ProductListContainer;
assets/js/base/components/product-list/index.js CHANGED
@@ -1,2 +1,242 @@
1
- export { default as ProductList } from './product-list';
2
- export { default as ProductListContainer } from './container';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __, _n, sprintf } from '@wordpress/i18n';
5
+ import { isEqual } from 'lodash';
6
+ import PropTypes from 'prop-types';
7
+ import classnames from 'classnames';
8
+ import Pagination from '@woocommerce/base-components/pagination';
9
+ import ProductSortSelect from '@woocommerce/base-components/product-sort-select';
10
+ import ProductListItem from '@woocommerce/base-components/product-list-item';
11
+ import { useEffect } from '@wordpress/element';
12
+ import {
13
+ usePrevious,
14
+ useStoreProducts,
15
+ useSynchronizedQueryState,
16
+ useQueryStateByKey,
17
+ } from '@woocommerce/base-hooks';
18
+ import withScrollToTop from '@woocommerce/base-hocs/with-scroll-to-top';
19
+ import { useInnerBlockLayoutContext } from '@woocommerce/shared-context';
20
+ import { speak } from '@wordpress/a11y';
21
+
22
+ /**
23
+ * Internal dependencies
24
+ */
25
+ import './style.scss';
26
+ import NoProducts from './no-products';
27
+ import NoMatchingProducts from './no-matching-products';
28
+
29
+ const generateQuery = ( { sortValue, currentPage, attributes } ) => {
30
+ const { columns, rows } = attributes;
31
+ const getSortArgs = ( orderName ) => {
32
+ switch ( orderName ) {
33
+ case 'menu_order':
34
+ case 'popularity':
35
+ case 'rating':
36
+ case 'price':
37
+ return {
38
+ orderby: orderName,
39
+ order: 'asc',
40
+ };
41
+ case 'price-desc':
42
+ return {
43
+ orderby: 'price',
44
+ order: 'desc',
45
+ };
46
+ case 'date':
47
+ return {
48
+ orderby: 'date',
49
+ order: 'desc',
50
+ };
51
+ }
52
+ };
53
+ return {
54
+ ...getSortArgs( sortValue ),
55
+ catalog_visibility: 'catalog',
56
+ per_page: columns * rows,
57
+ page: currentPage,
58
+ };
59
+ };
60
+
61
+ /**
62
+ * Given a query state, returns the same query without the attributes related to
63
+ * pagination and sorting.
64
+ *
65
+ * @param {Object} query Query to extract the attributes from.
66
+ *
67
+ * @return {Object} Same query without pagination and sorting attributes.
68
+ */
69
+
70
+ const extractPaginationAndSortAttributes = ( query ) => {
71
+ /* eslint-disable-next-line no-unused-vars, camelcase */
72
+ const { order, orderby, page, per_page, ...totalQuery } = query;
73
+ return totalQuery || {};
74
+ };
75
+
76
+ const announceLoadingCompletion = ( totalProducts ) => {
77
+ if ( ! Number.isFinite( totalProducts ) ) {
78
+ return;
79
+ }
80
+
81
+ if ( totalProducts === 0 ) {
82
+ speak( __( 'No products found', 'woo-gutenberg-products-block' ) );
83
+ } else {
84
+ speak(
85
+ sprintf(
86
+ // translators: %s is an integer higher than 0 (1, 2, 3...)
87
+ _n(
88
+ '%d product found',
89
+ '%d products found',
90
+ totalProducts,
91
+ 'woo-gutenberg-products-block'
92
+ ),
93
+ totalProducts
94
+ )
95
+ );
96
+ }
97
+ };
98
+
99
+ const areQueryTotalsDifferent = (
100
+ { totalQuery: nextQuery, totalProducts: nextProducts },
101
+ { totalQuery: currentQuery } = {}
102
+ ) => ! isEqual( nextQuery, currentQuery ) && Number.isFinite( nextProducts );
103
+
104
+ const ProductList = ( {
105
+ attributes,
106
+ currentPage,
107
+ onPageChange,
108
+ onSortChange,
109
+ sortValue,
110
+ scrollToTop,
111
+ } ) => {
112
+ const [ queryState ] = useSynchronizedQueryState(
113
+ generateQuery( {
114
+ attributes,
115
+ sortValue,
116
+ currentPage,
117
+ } )
118
+ );
119
+ const { products, totalProducts, productsLoading } = useStoreProducts(
120
+ queryState
121
+ );
122
+ const { parentClassName } = useInnerBlockLayoutContext();
123
+ const totalQuery = extractPaginationAndSortAttributes( queryState );
124
+
125
+ // These are possible filters.
126
+ const [ productAttributes, setProductAttributes ] = useQueryStateByKey(
127
+ 'attributes',
128
+ []
129
+ );
130
+ const [ minPrice, setMinPrice ] = useQueryStateByKey( 'min_price' );
131
+ const [ maxPrice, setMaxPrice ] = useQueryStateByKey( 'max_price' );
132
+
133
+ // Only update previous query totals if the query is different and
134
+ // the total number of products is a finite number.
135
+ const previousQueryTotals = usePrevious(
136
+ { totalQuery, totalProducts },
137
+ areQueryTotalsDifferent
138
+ );
139
+
140
+ // If query state (excluding pagination/sorting attributes) changed,
141
+ // reset pagination to the first page.
142
+ useEffect( () => {
143
+ if ( isEqual( totalQuery, previousQueryTotals?.totalQuery ) ) {
144
+ return;
145
+ }
146
+ onPageChange( 1 );
147
+
148
+ // Make sure there was a previous query, so we don't announce it on page load.
149
+ if ( previousQueryTotals?.totalQuery ) {
150
+ announceLoadingCompletion( totalProducts );
151
+ }
152
+ }, [
153
+ previousQueryTotals?.totalQuery,
154
+ totalProducts,
155
+ onPageChange,
156
+ totalQuery,
157
+ ] );
158
+
159
+ const onPaginationChange = ( newPage ) => {
160
+ scrollToTop( { focusableSelector: 'a, button' } );
161
+ onPageChange( newPage );
162
+ };
163
+
164
+ const getClassnames = () => {
165
+ const { columns, rows, alignButtons, align } = attributes;
166
+ const alignClass = typeof align !== 'undefined' ? 'align' + align : '';
167
+
168
+ return classnames(
169
+ parentClassName,
170
+ alignClass,
171
+ 'has-' + columns + '-columns',
172
+ {
173
+ 'has-multiple-rows': rows > 1,
174
+ 'has-aligned-buttons': alignButtons,
175
+ }
176
+ );
177
+ };
178
+
179
+ const { contentVisibility } = attributes;
180
+ const perPage = attributes.columns * attributes.rows;
181
+ const totalPages =
182
+ ! Number.isFinite( totalProducts ) &&
183
+ Number.isFinite( previousQueryTotals?.totalProducts ) &&
184
+ isEqual( totalQuery, previousQueryTotals?.totalQuery )
185
+ ? Math.ceil( previousQueryTotals.totalProducts / perPage )
186
+ : Math.ceil( totalProducts / perPage );
187
+ const listProducts = products.length
188
+ ? products
189
+ : Array.from( { length: perPage } );
190
+ const hasProducts = products.length !== 0 || productsLoading;
191
+ const hasFilters =
192
+ productAttributes.length > 0 ||
193
+ Number.isFinite( minPrice ) ||
194
+ Number.isFinite( maxPrice );
195
+
196
+ return (
197
+ <div className={ getClassnames() }>
198
+ { contentVisibility.orderBy && hasProducts && (
199
+ <ProductSortSelect
200
+ onChange={ onSortChange }
201
+ value={ sortValue }
202
+ />
203
+ ) }
204
+ { ! hasProducts && hasFilters && (
205
+ <NoMatchingProducts
206
+ resetCallback={ () => {
207
+ setProductAttributes( [] );
208
+ setMinPrice( null );
209
+ setMaxPrice( null );
210
+ } }
211
+ />
212
+ ) }
213
+ { ! hasProducts && ! hasFilters && <NoProducts /> }
214
+ { hasProducts && (
215
+ <ul className={ `${ parentClassName }__products` }>
216
+ { listProducts.map( ( product = {}, i ) => (
217
+ <ProductListItem
218
+ key={ product.id || i }
219
+ attributes={ attributes }
220
+ product={ product }
221
+ />
222
+ ) ) }
223
+ </ul>
224
+ ) }
225
+ { totalPages > 1 && (
226
+ <Pagination
227
+ currentPage={ currentPage }
228
+ onPageChange={ onPaginationChange }
229
+ totalPages={ totalPages }
230
+ />
231
+ ) }
232
+ </div>
233
+ );
234
+ };
235
+
236
+ ProductList.propTypes = {
237
+ attributes: PropTypes.object.isRequired,
238
+ // From withScrollToTop.
239
+ scrollToTop: PropTypes.func,
240
+ };
241
+
242
+ export default withScrollToTop( ProductList );
assets/js/base/components/product-list/product-list.js DELETED
@@ -1,262 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __, _n, sprintf } from '@wordpress/i18n';
5
- import { isEqual } from 'lodash';
6
- import PropTypes from 'prop-types';
7
- import classnames from 'classnames';
8
- import Pagination from '@woocommerce/base-components/pagination';
9
- import { useEffect } from '@wordpress/element';
10
- import { usePrevious } from '@woocommerce/base-hooks';
11
- import {
12
- useStoreEvents,
13
- useStoreProducts,
14
- useSynchronizedQueryState,
15
- useQueryStateByKey,
16
- } from '@woocommerce/base-context/hooks';
17
- import withScrollToTop from '@woocommerce/base-hocs/with-scroll-to-top';
18
- import { useInnerBlockLayoutContext } from '@woocommerce/shared-context';
19
- import { speak } from '@wordpress/a11y';
20
-
21
- /**
22
- * Internal dependencies
23
- */
24
- import NoProducts from './no-products';
25
- import NoMatchingProducts from './no-matching-products';
26
- import ProductSortSelect from './product-sort-select';
27
- import ProductListItem from './product-list-item';
28
- import './style.scss';
29
-
30
- const generateQuery = ( {
31
- sortValue,
32
- currentPage,
33
- attributes,
34
- hideOutOfStockItems,
35
- } ) => {
36
- const { columns, rows } = attributes;
37
- const getSortArgs = ( orderName ) => {
38
- switch ( orderName ) {
39
- case 'menu_order':
40
- case 'popularity':
41
- case 'rating':
42
- case 'price':
43
- return {
44
- orderby: orderName,
45
- order: 'asc',
46
- };
47
- case 'price-desc':
48
- return {
49
- orderby: 'price',
50
- order: 'desc',
51
- };
52
- case 'date':
53
- return {
54
- orderby: 'date',
55
- order: 'desc',
56
- };
57
- }
58
- };
59
-
60
- return {
61
- ...getSortArgs( sortValue ),
62
- catalog_visibility: 'catalog',
63
- per_page: columns * rows,
64
- page: currentPage,
65
- ...( hideOutOfStockItems && {
66
- stock_status: [ 'instock', 'onbackorder' ],
67
- } ),
68
- };
69
- };
70
-
71
- /**
72
- * Given a query state, returns the same query without the attributes related to
73
- * pagination and sorting.
74
- *
75
- * @param {Object} query Query to extract the attributes from.
76
- *
77
- * @return {Object} Same query without pagination and sorting attributes.
78
- */
79
-
80
- const extractPaginationAndSortAttributes = ( query ) => {
81
- /* eslint-disable-next-line no-unused-vars, camelcase */
82
- const { order, orderby, page, per_page, ...totalQuery } = query;
83
- return totalQuery || {};
84
- };
85
-
86
- const announceLoadingCompletion = ( totalProducts ) => {
87
- if ( ! Number.isFinite( totalProducts ) ) {
88
- return;
89
- }
90
-
91
- if ( totalProducts === 0 ) {
92
- speak( __( 'No products found', 'woo-gutenberg-products-block' ) );
93
- } else {
94
- speak(
95
- sprintf(
96
- /* translators: %s is an integer higher than 0 (1, 2, 3...) */
97
- _n(
98
- '%d product found',
99
- '%d products found',
100
- totalProducts,
101
- 'woo-gutenberg-products-block'
102
- ),
103
- totalProducts
104
- )
105
- );
106
- }
107
- };
108
-
109
- const areQueryTotalsDifferent = (
110
- { totalQuery: nextQuery, totalProducts: nextProducts },
111
- { totalQuery: currentQuery } = {}
112
- ) => ! isEqual( nextQuery, currentQuery ) && Number.isFinite( nextProducts );
113
-
114
- const ProductList = ( {
115
- attributes,
116
- currentPage,
117
- onPageChange,
118
- onSortChange,
119
- sortValue,
120
- scrollToTop,
121
- hideOutOfStockItems = false,
122
- } ) => {
123
- const [ queryState ] = useSynchronizedQueryState(
124
- generateQuery( {
125
- attributes,
126
- sortValue,
127
- currentPage,
128
- hideOutOfStockItems,
129
- } )
130
- );
131
- const { products, totalProducts, productsLoading } = useStoreProducts(
132
- queryState
133
- );
134
- const { parentClassName, parentName } = useInnerBlockLayoutContext();
135
- const totalQuery = extractPaginationAndSortAttributes( queryState );
136
- const { dispatchStoreEvent } = useStoreEvents();
137
-
138
- // These are possible filters.
139
- const [ productAttributes, setProductAttributes ] = useQueryStateByKey(
140
- 'attributes',
141
- []
142
- );
143
- const [ minPrice, setMinPrice ] = useQueryStateByKey( 'min_price' );
144
- const [ maxPrice, setMaxPrice ] = useQueryStateByKey( 'max_price' );
145
-
146
- // Only update previous query totals if the query is different and the total number of products is a finite number.
147
- const previousQueryTotals = usePrevious(
148
- { totalQuery, totalProducts },
149
- areQueryTotalsDifferent
150
- );
151
-
152
- // If the product list changes, trigger an event.
153
- useEffect( () => {
154
- dispatchStoreEvent( 'product-list-render', {
155
- products,
156
- listName: parentName,
157
- } );
158
- }, [ products, parentName, dispatchStoreEvent ] );
159
-
160
- // If query state (excluding pagination/sorting attributes) changed, reset pagination to the first page.
161
- useEffect( () => {
162
- if ( isEqual( totalQuery, previousQueryTotals?.totalQuery ) ) {
163
- return;
164
- }
165
- onPageChange( 1 );
166
-
167
- // Make sure there was a previous query, so we don't announce it on page load.
168
- if ( previousQueryTotals?.totalQuery ) {
169
- announceLoadingCompletion( totalProducts );
170
- }
171
- }, [
172
- previousQueryTotals?.totalQuery,
173
- totalProducts,
174
- onPageChange,
175
- totalQuery,
176
- ] );
177
-
178
- const onPaginationChange = ( newPage ) => {
179
- scrollToTop( { focusableSelector: 'a, button' } );
180
- onPageChange( newPage );
181
- };
182
-
183
- const getClassnames = () => {
184
- const { columns, rows, alignButtons, align } = attributes;
185
- const alignClass = typeof align !== 'undefined' ? 'align' + align : '';
186
-
187
- return classnames(
188
- parentClassName,
189
- alignClass,
190
- 'has-' + columns + '-columns',
191
- {
192
- 'has-multiple-rows': rows > 1,
193
- 'has-aligned-buttons': alignButtons,
194
- }
195
- );
196
- };
197
-
198
- const { contentVisibility } = attributes;
199
- const perPage = attributes.columns * attributes.rows;
200
- const totalPages =
201
- ! Number.isFinite( totalProducts ) &&
202
- Number.isFinite( previousQueryTotals?.totalProducts ) &&
203
- isEqual( totalQuery, previousQueryTotals?.totalQuery )
204
- ? Math.ceil( previousQueryTotals.totalProducts / perPage )
205
- : Math.ceil( totalProducts / perPage );
206
- const listProducts = products.length
207
- ? products
208
- : Array.from( { length: perPage } );
209
- const hasProducts = products.length !== 0 || productsLoading;
210
- const hasFilters =
211
- productAttributes.length > 0 ||
212
- Number.isFinite( minPrice ) ||
213
- Number.isFinite( maxPrice );
214
-
215
- return (
216
- <div className={ getClassnames() }>
217
- { contentVisibility.orderBy && hasProducts && (
218
- <ProductSortSelect
219
- onChange={ onSortChange }
220
- value={ sortValue }
221
- />
222
- ) }
223
- { ! hasProducts && hasFilters && (
224
- <NoMatchingProducts
225
- resetCallback={ () => {
226
- setProductAttributes( [] );
227
- setMinPrice( null );
228
- setMaxPrice( null );
229
- } }
230
- />
231
- ) }
232
- { ! hasProducts && ! hasFilters && <NoProducts /> }
233
- { hasProducts && (
234
- <ul className={ `${ parentClassName }__products` }>
235
- { listProducts.map( ( product = {}, i ) => (
236
- <ProductListItem
237
- key={ product.id || i }
238
- attributes={ attributes }
239
- product={ product }
240
- />
241
- ) ) }
242
- </ul>
243
- ) }
244
- { totalPages > 1 && (
245
- <Pagination
246
- currentPage={ currentPage }
247
- onPageChange={ onPaginationChange }
248
- totalPages={ totalPages }
249
- />
250
- ) }
251
- </div>
252
- );
253
- };
254
-
255
- ProductList.propTypes = {
256
- attributes: PropTypes.object.isRequired,
257
- hideOutOfStockItems: PropTypes.bool,
258
- // From withScrollToTop.
259
- scrollToTop: PropTypes.func,
260
- };
261
-
262
- export default withScrollToTop( ProductList );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/product-list/style.scss CHANGED
@@ -55,11 +55,6 @@
55
  list-style: none;
56
  }
57
 
58
- // Increased specificity necessary as Gutenberg's generic reset overrides box sizing
59
- .wc-block-grid__product.wc-block-grid__product {
60
- box-sizing: border-box;
61
- }
62
-
63
  .theme-twentytwenty .wc-block-grid,
64
  .wc-block-grid {
65
  &.has-aligned-buttons {
55
  list-style: none;
56
  }
57
 
 
 
 
 
 
58
  .theme-twentytwenty .wc-block-grid,
59
  .wc-block-grid {
60
  &.has-aligned-buttons {
assets/js/base/components/product-name/index.tsx DELETED
@@ -1,48 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { decodeEntities } from '@wordpress/html-entities';
5
- import classnames from 'classnames';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import './style.scss';
11
-
12
- /**
13
- * Render the Product name.
14
- *
15
- * The store API runs titles through `wp_kses_post()` which removes dangerous HTML tags, so using it inside `dangerouslySetInnerHTML` is considered safe.
16
- */
17
- export default ( {
18
- className = '',
19
- disabled = false,
20
- name,
21
- permalink = '',
22
- ...props
23
- }: {
24
- className: string;
25
- disabled: boolean;
26
- name: string;
27
- permalink: string;
28
- } ): JSX.Element => {
29
- const classes = classnames( 'wc-block-components-product-name', className );
30
- return disabled ? (
31
- <span
32
- className={ classes }
33
- { ...props }
34
- dangerouslySetInnerHTML={ {
35
- __html: decodeEntities( name ),
36
- } }
37
- />
38
- ) : (
39
- <a
40
- className={ classes }
41
- href={ permalink }
42
- { ...props }
43
- dangerouslySetInnerHTML={ {
44
- __html: decodeEntities( name ),
45
- } }
46
- />
47
- );
48
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/product-name/test/__snapshots__/index.js.snap DELETED
@@ -1,49 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`ProductName should merge classes and props 1`] = `
4
- <a
5
- className="wc-block-components-product-name lorem-ipsum"
6
- dangerouslySetInnerHTML={
7
- Object {
8
- "__html": "Test product",
9
- }
10
- }
11
- href="/"
12
- rel="nofollow"
13
- />
14
- `;
15
-
16
- exports[`ProductName should not render a link if disabled is true 1`] = `
17
- <span
18
- className="wc-block-components-product-name"
19
- dangerouslySetInnerHTML={
20
- Object {
21
- "__html": "Test product",
22
- }
23
- }
24
- />
25
- `;
26
-
27
- exports[`ProductName should render a link if disabled is false 1`] = `
28
- <a
29
- className="wc-block-components-product-name"
30
- dangerouslySetInnerHTML={
31
- Object {
32
- "__html": "Test product",
33
- }
34
- }
35
- href="/"
36
- />
37
- `;
38
-
39
- exports[`ProductName should render a link if disabled is not defined 1`] = `
40
- <a
41
- className="wc-block-components-product-name"
42
- dangerouslySetInnerHTML={
43
- Object {
44
- "__html": "Test product",
45
- }
46
- }
47
- href="/"
48
- />
49
- `;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/product-price/index.js CHANGED
@@ -1,12 +1,10 @@
1
  /**
2
  * External dependencies
3
  */
4
- import { __, sprintf } from '@wordpress/i18n';
5
  import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
6
  import classNames from 'classnames';
7
  import PropTypes from 'prop-types';
8
- import { createInterpolateElement } from 'wordpress-element';
9
- import { formatPrice } from '@woocommerce/price-format';
10
 
11
  /**
12
  * Internal dependencies
@@ -14,6 +12,7 @@ import { formatPrice } from '@woocommerce/price-format';
14
  import './style.scss';
15
 
16
  const PriceRange = ( {
 
17
  currency,
18
  maxPrice,
19
  minPrice,
@@ -21,44 +20,32 @@ const PriceRange = ( {
21
  priceStyle,
22
  } ) => {
23
  return (
24
- <>
25
- <span className="screen-reader-text">
26
- { sprintf(
27
- /* translators: %1$s min price, %2$s max price */
28
- __(
29
- 'Price between %1$s and %2$s',
30
- 'woo-gutenberg-products-block'
31
- ),
32
- formatPrice( minPrice ),
33
- formatPrice( maxPrice )
34
  ) }
35
- </span>
36
- <span aria-hidden={ true }>
37
- <FormattedMonetaryAmount
38
- className={ classNames(
39
- 'wc-block-components-product-price__value',
40
- priceClassName
41
- ) }
42
- currency={ currency }
43
- value={ minPrice }
44
- style={ priceStyle }
45
- />
46
- &nbsp;&mdash;&nbsp;
47
- <FormattedMonetaryAmount
48
- className={ classNames(
49
- 'wc-block-components-product-price__value',
50
- priceClassName
51
- ) }
52
- currency={ currency }
53
- value={ maxPrice }
54
- style={ priceStyle }
55
- />
56
- </span>
57
- </>
58
  );
59
  };
60
 
61
  const SalePrice = ( {
 
62
  currency,
63
  regularPriceClassName,
64
  regularPriceStyle,
@@ -68,7 +55,7 @@ const SalePrice = ( {
68
  price,
69
  } ) => {
70
  return (
71
- <>
72
  <span className="screen-reader-text">
73
  { __( 'Previous price:', 'woo-gutenberg-products-block' ) }
74
  </span>
@@ -106,7 +93,7 @@ const SalePrice = ( {
106
  ) }
107
  value={ price }
108
  />
109
- </>
110
  );
111
  };
112
 
@@ -114,7 +101,6 @@ const ProductPrice = ( {
114
  align,
115
  className,
116
  currency,
117
- format = '<price/>',
118
  maxPrice = null,
119
  minPrice = null,
120
  price = null,
@@ -133,25 +119,12 @@ const ProductPrice = ( {
133
  }
134
  );
135
 
136
- if ( ! format.includes( '<price/>' ) ) {
137
- format = '<price/>';
138
- // eslint-disable-next-line no-console
139
- console.error( 'Price formats need to include the `<price/>` tag.' );
140
- }
141
-
142
  const isDiscounted = regularPrice && price !== regularPrice;
143
- let priceComponent = (
144
- <span
145
- className={ classNames(
146
- 'wc-block-components-product-price__value',
147
- priceClassName
148
- ) }
149
- />
150
- );
151
 
152
  if ( isDiscounted ) {
153
- priceComponent = (
154
  <SalePrice
 
155
  currency={ currency }
156
  price={ price }
157
  priceClassName={ priceClassName }
@@ -161,9 +134,12 @@ const ProductPrice = ( {
161
  regularPriceStyle={ regularPriceStyle }
162
  />
163
  );
164
- } else if ( minPrice !== null && maxPrice !== null ) {
165
- priceComponent = (
 
 
166
  <PriceRange
 
167
  currency={ currency }
168
  maxPrice={ maxPrice }
169
  minPrice={ minPrice }
@@ -171,25 +147,32 @@ const ProductPrice = ( {
171
  priceStyle={ priceStyle }
172
  />
173
  );
174
- } else if ( price !== null ) {
175
- priceComponent = (
176
- <FormattedMonetaryAmount
177
- className={ classNames(
178
- 'wc-block-components-product-price__value',
179
- priceClassName
180
- ) }
181
- currency={ currency }
182
- value={ price }
183
- style={ priceStyle }
184
- />
 
 
 
 
185
  );
186
  }
187
 
188
  return (
189
  <span className={ wrapperClassName }>
190
- { createInterpolateElement( format, {
191
- price: priceComponent,
192
- } ) }
 
 
 
193
  </span>
194
  );
195
  };
@@ -198,7 +181,6 @@ ProductPrice.propTypes = {
198
  align: PropTypes.oneOf( [ 'left', 'center', 'right' ] ),
199
  className: PropTypes.string,
200
  currency: PropTypes.object,
201
- format: PropTypes.string,
202
  price: PropTypes.oneOfType( [ PropTypes.number, PropTypes.string ] ),
203
  priceClassName: PropTypes.string,
204
  priceStyle: PropTypes.object,
1
  /**
2
  * External dependencies
3
  */
4
+ import { __ } from '@wordpress/i18n';
5
  import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
6
  import classNames from 'classnames';
7
  import PropTypes from 'prop-types';
 
 
8
 
9
  /**
10
  * Internal dependencies
12
  import './style.scss';
13
 
14
  const PriceRange = ( {
15
+ className,
16
  currency,
17
  maxPrice,
18
  minPrice,
20
  priceStyle,
21
  } ) => {
22
  return (
23
+ <span className={ className }>
24
+ <FormattedMonetaryAmount
25
+ className={ classNames(
26
+ 'wc-block-components-product-price__value',
27
+ priceClassName
 
 
 
 
 
28
  ) }
29
+ currency={ currency }
30
+ value={ minPrice }
31
+ style={ priceStyle }
32
+ />
33
+ &nbsp;&mdash;&nbsp;
34
+ <FormattedMonetaryAmount
35
+ className={ classNames(
36
+ 'wc-block-components-product-price__value',
37
+ priceClassName
38
+ ) }
39
+ currency={ currency }
40
+ value={ maxPrice }
41
+ style={ priceStyle }
42
+ />
43
+ </span>
 
 
 
 
 
 
 
 
44
  );
45
  };
46
 
47
  const SalePrice = ( {
48
+ className,
49
  currency,
50
  regularPriceClassName,
51
  regularPriceStyle,
55
  price,
56
  } ) => {
57
  return (
58
+ <span className={ className }>
59
  <span className="screen-reader-text">
60
  { __( 'Previous price:', 'woo-gutenberg-products-block' ) }
61
  </span>
93
  ) }
94
  value={ price }
95
  />
96
+ </span>
97
  );
98
  };
99
 
101
  align,
102
  className,
103
  currency,
 
104
  maxPrice = null,
105
  minPrice = null,
106
  price = null,
119
  }
120
  );
121
 
 
 
 
 
 
 
122
  const isDiscounted = regularPrice && price !== regularPrice;
 
 
 
 
 
 
 
 
123
 
124
  if ( isDiscounted ) {
125
+ return (
126
  <SalePrice
127
+ className={ wrapperClassName }
128
  currency={ currency }
129
  price={ price }
130
  priceClassName={ priceClassName }
134
  regularPriceStyle={ regularPriceStyle }
135
  />
136
  );
137
+ }
138
+
139
+ if ( minPrice !== null && maxPrice !== null ) {
140
+ return (
141
  <PriceRange
142
+ className={ wrapperClassName }
143
  currency={ currency }
144
  maxPrice={ maxPrice }
145
  minPrice={ minPrice }
147
  priceStyle={ priceStyle }
148
  />
149
  );
150
+ }
151
+
152
+ if ( price !== null ) {
153
+ return (
154
+ <span className={ wrapperClassName }>
155
+ <FormattedMonetaryAmount
156
+ className={ classNames(
157
+ 'wc-block-components-product-price__value',
158
+ priceClassName
159
+ ) }
160
+ currency={ currency }
161
+ value={ price }
162
+ style={ priceStyle }
163
+ />
164
+ </span>
165
  );
166
  }
167
 
168
  return (
169
  <span className={ wrapperClassName }>
170
+ <span
171
+ className={ classNames(
172
+ 'wc-block-components-product-price__value',
173
+ priceClassName
174
+ ) }
175
+ />
176
  </span>
177
  );
178
  };
181
  align: PropTypes.oneOf( [ 'left', 'center', 'right' ] ),
182
  className: PropTypes.string,
183
  currency: PropTypes.object,
 
184
  price: PropTypes.oneOfType( [ PropTypes.number, PropTypes.string ] ),
185
  priceClassName: PropTypes.string,
186
  priceStyle: PropTypes.object,
assets/js/base/components/product-price/stories/index.js CHANGED
@@ -2,7 +2,6 @@
2
  * External dependencies
3
  */
4
  import { number, select } from '@storybook/addon-knobs';
5
- import { currencyKnob } from '@woocommerce/knobs';
6
 
7
  /**
8
  * Internal dependencies
@@ -14,9 +13,37 @@ export default {
14
  component: ProductPrice,
15
  };
16
 
17
- export const standard = () => {
18
  const align = select( 'Align', [ 'left', 'center', 'right' ], 'left' );
19
- const currency = currencyKnob();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  const price = number( 'Price', 4000 );
21
 
22
  return (
@@ -25,8 +52,7 @@ export const standard = () => {
25
  };
26
 
27
  export const sale = () => {
28
- const align = select( 'Align', [ 'left', 'center', 'right' ], 'left' );
29
- const currency = currencyKnob();
30
  const price = number( 'Price', 3000 );
31
  const regularPrice = number( 'Regular price', 4000 );
32
 
@@ -41,8 +67,7 @@ export const sale = () => {
41
  };
42
 
43
  export const range = () => {
44
- const align = select( 'Align', [ 'left', 'center', 'right' ], 'left' );
45
- const currency = currencyKnob();
46
  const minPrice = number( 'Min price', 3000 );
47
  const maxPrice = number( 'Max price', 5000 );
48
 
2
  * External dependencies
3
  */
4
  import { number, select } from '@storybook/addon-knobs';
 
5
 
6
  /**
7
  * Internal dependencies
13
  component: ProductPrice,
14
  };
15
 
16
+ const getKnobs = () => {
17
  const align = select( 'Align', [ 'left', 'center', 'right' ], 'left' );
18
+ const currencies = [
19
+ {
20
+ label: 'USD',
21
+ code: 'USD',
22
+ symbol: '$',
23
+ thousandSeparator: ',',
24
+ decimalSeparator: '.',
25
+ minorUnit: 2,
26
+ prefix: '$',
27
+ suffix: '',
28
+ },
29
+ {
30
+ label: 'EUR',
31
+ code: 'EUR',
32
+ symbol: '€',
33
+ thousandSeparator: '.',
34
+ decimalSeparator: ',',
35
+ minorUnit: 2,
36
+ prefix: '',
37
+ suffix: '€',
38
+ },
39
+ ];
40
+ const currency = select( 'Currency', currencies, currencies[ 0 ] );
41
+
42
+ return { align, currency };
43
+ };
44
+
45
+ export const standard = () => {
46
+ const { align, currency } = getKnobs();
47
  const price = number( 'Price', 4000 );
48
 
49
  return (
52
  };
53
 
54
  export const sale = () => {
55
+ const { align, currency } = getKnobs();
 
56
  const price = number( 'Price', 3000 );
57
  const regularPrice = number( 'Regular price', 4000 );
58
 
67
  };
68
 
69
  export const range = () => {
70
+ const { align, currency } = getKnobs();
 
71
  const minPrice = number( 'Min price', 3000 );
72
  const maxPrice = number( 'Max price', 5000 );
73
 
assets/js/base/components/product-price/test/__snapshots__/index.js.snap DELETED
@@ -1,57 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`ProductPrice should apply the format if one is provided 1`] = `
4
- <span
5
- className="price wc-block-components-product-price"
6
- >
7
- pre price
8
- <span
9
- className="screen-reader-text"
10
- >
11
- Previous price:
12
- </span>
13
- <del
14
- className="wc-block-components-product-price__regular"
15
- >
16
- £1.00
17
- </del>
18
- <span
19
- className="screen-reader-text"
20
- >
21
- Discounted price:
22
- </span>
23
- <ins
24
- className="wc-block-components-product-price__value is-discounted"
25
- >
26
- £0.50
27
- </ins>
28
- Test format
29
- </span>
30
- `;
31
-
32
- exports[`ProductPrice should use default price if no format is provided 1`] = `
33
- <span
34
- className="price wc-block-components-product-price"
35
- >
36
- <span
37
- className="screen-reader-text"
38
- >
39
- Previous price:
40
- </span>
41
- <del
42
- className="wc-block-components-product-price__regular"
43
- >
44
- £1.00
45
- </del>
46
- <span
47
- className="screen-reader-text"
48
- >
49
- Discounted price:
50
- </span>
51
- <ins
52
- className="wc-block-components-product-price__value is-discounted"
53
- >
54
- £0.50
55
- </ins>
56
- </span>
57
- `;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/product-price/test/index.js DELETED
@@ -1,63 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import TestRenderer from 'react-test-renderer';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import ProductPrice from '../index';
10
-
11
- describe( 'ProductPrice', () => {
12
- const currency = {
13
- code: 'GBP',
14
- currency_code: 'GBP',
15
- currency_decimal_separator: '.',
16
- currency_minor_unit: 2,
17
- currency_prefix: '£',
18
- currency_suffix: '',
19
- currency_symbol: '£',
20
- currency_thousand_separator: ',',
21
- decimalSeparator: '.',
22
- minorUnit: 2,
23
- prefix: '£',
24
- price: '61400',
25
- price_range: null,
26
- raw_prices: {
27
- precision: 6,
28
- price: '614000000',
29
- regular_price: '614000000',
30
- sale_price: '614000000',
31
- },
32
- regular_price: '61400',
33
- sale_price: '61400',
34
- suffix: '',
35
- symbol: '£',
36
- thousandSeparator: ',',
37
- };
38
-
39
- test( 'should use default price if no format is provided', () => {
40
- const component = TestRenderer.create(
41
- <ProductPrice
42
- price={ 50 }
43
- regularPrice={ 100 }
44
- currency={ currency }
45
- />
46
- );
47
-
48
- expect( component.toJSON() ).toMatchSnapshot();
49
- } );
50
-
51
- test( 'should apply the format if one is provided', () => {
52
- const component = TestRenderer.create(
53
- <ProductPrice
54
- price={ 50 }
55
- regularPrice={ 100 }
56
- currency={ currency }
57
- format="pre price <price/> Test format"
58
- />
59
- );
60
-
61
- expect( component.toJSON() ).toMatchSnapshot();
62
- } );
63
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/{product-list/product-sort-select → product-sort-select}/index.js RENAMED
File without changes
assets/js/base/components/{product-list/product-sort-select → product-sort-select}/style.scss RENAMED
File without changes
assets/js/base/components/quantity-selector/{index.tsx → index.js} RENAMED
@@ -3,37 +3,25 @@
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
5
  import { speak } from '@wordpress/a11y';
 
6
  import classNames from 'classnames';
7
  import { useCallback } from '@wordpress/element';
8
  import { DOWN, UP } from '@wordpress/keycodes';
9
- import { isNumber } from '@woocommerce/types';
10
 
11
  /**
12
  * Internal dependencies
13
  */
14
  import './style.scss';
15
 
16
- interface QuantitySelectorProps {
17
- className?: string;
18
- quantity?: number;
19
- minimum?: number;
20
- maximum: number;
21
- onChange: ( newQuantity: number ) => void;
22
- itemName?: string;
23
- disabled: boolean;
24
- }
25
-
26
  const QuantitySelector = ( {
27
  className,
28
  quantity = 1,
29
  minimum = 1,
30
  maximum,
31
- onChange = () => {
32
- /* Do nothing. */
33
- },
34
  itemName = '',
35
  disabled,
36
- }: QuantitySelectorProps ): JSX.Element => {
37
  const classes = classNames(
38
  'wc-block-components-quantity-selector',
39
  className
@@ -84,7 +72,7 @@ const QuantitySelector = ( {
84
  onKeyDown={ quantityInputOnKeyDown }
85
  onChange={ ( event ) => {
86
  let value =
87
- ! isNumber( event.target.value ) || ! event.target.value
88
  ? 0
89
  : parseInt( event.target.value, 10 );
90
  if ( hasMaximum ) {
@@ -96,7 +84,7 @@ const QuantitySelector = ( {
96
  }
97
  } }
98
  aria-label={ sprintf(
99
- /* translators: %s refers to the item name in the cart. */
100
  __(
101
  'Quantity of %s in your cart.',
102
  'woo-gutenberg-products-block'
@@ -116,7 +104,7 @@ const QuantitySelector = ( {
116
  onChange( newQuantity );
117
  speak(
118
  sprintf(
119
- /* translators: %s refers to the item name in the cart. */
120
  __(
121
  'Quantity reduced to %s.',
122
  'woo-gutenberg-products-block'
@@ -140,7 +128,7 @@ const QuantitySelector = ( {
140
  onChange( newQuantity );
141
  speak(
142
  sprintf(
143
- /* translators: %s refers to the item name in the cart. */
144
  __(
145
  'Quantity increased to %s.',
146
  'woo-gutenberg-products-block'
@@ -156,4 +144,14 @@ const QuantitySelector = ( {
156
  );
157
  };
158
 
 
 
 
 
 
 
 
 
 
 
159
  export default QuantitySelector;
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
5
  import { speak } from '@wordpress/a11y';
6
+ import PropTypes from 'prop-types';
7
  import classNames from 'classnames';
8
  import { useCallback } from '@wordpress/element';
9
  import { DOWN, UP } from '@wordpress/keycodes';
 
10
 
11
  /**
12
  * Internal dependencies
13
  */
14
  import './style.scss';
15
 
 
 
 
 
 
 
 
 
 
 
16
  const QuantitySelector = ( {
17
  className,
18
  quantity = 1,
19
  minimum = 1,
20
  maximum,
21
+ onChange = () => null,
 
 
22
  itemName = '',
23
  disabled,
24
+ } ) => {
25
  const classes = classNames(
26
  'wc-block-components-quantity-selector',
27
  className
72
  onKeyDown={ quantityInputOnKeyDown }
73
  onChange={ ( event ) => {
74
  let value =
75
+ isNaN( event.target.value ) || ! event.target.value
76
  ? 0
77
  : parseInt( event.target.value, 10 );
78
  if ( hasMaximum ) {
84
  }
85
  } }
86
  aria-label={ sprintf(
87
+ /* Translators: %s refers to the item name in the cart. */
88
  __(
89
  'Quantity of %s in your cart.',
90
  'woo-gutenberg-products-block'
104
  onChange( newQuantity );
105
  speak(
106
  sprintf(
107
+ /* Translators: %s refers to the item name in the cart. */
108
  __(
109
  'Quantity reduced to %s.',
110
  'woo-gutenberg-products-block'
128
  onChange( newQuantity );
129
  speak(
130
  sprintf(
131
+ /* Translators: %s refers to the item name in the cart. */
132
  __(
133
  'Quantity increased to %s.',
134
  'woo-gutenberg-products-block'
144
  );
145
  };
146
 
147
+ QuantitySelector.propTypes = {
148
+ className: PropTypes.string,
149
+ quantity: PropTypes.number,
150
+ minimum: PropTypes.number,
151
+ maximum: PropTypes.number,
152
+ onChange: PropTypes.func,
153
+ itemName: PropTypes.string,
154
+ disabled: PropTypes.bool,
155
+ };
156
+
157
  export default QuantitySelector;
assets/js/base/components/quantity-selector/style.scss CHANGED
@@ -12,13 +12,12 @@
12
 
13
  .wc-block-components-quantity-selector {
14
  display: flex;
15
- width: 107px;
16
  border: 1px solid $gray-300;
17
  background: #fff;
18
  border-radius: 4px;
19
  // needed so that buttons fill the container.
20
  box-sizing: content-box;
21
- margin: 0 0 0.25em 0;
22
 
23
  .has-dark-controls & {
24
  background-color: transparent;
@@ -67,7 +66,6 @@
67
  -webkit-appearance: none;
68
  margin: 0;
69
  }
70
-
71
  .wc-block-components-quantity-selector__button {
72
  @include reset-button;
73
  @include font-size(regular);
@@ -76,7 +74,6 @@
76
  color: $gray-900;
77
  font-style: normal;
78
  text-align: center;
79
- text-decoration: none;
80
 
81
  &:hover,
82
  &:focus {
@@ -101,21 +98,10 @@
101
  }
102
  }
103
  }
104
-
105
- > .wc-block-components-quantity-selector__button--minus {
106
  order: 1;
107
  }
108
-
109
- > .wc-block-components-quantity-selector__button--plus {
110
  order: 3;
111
  }
112
  }
113
-
114
- .theme-twentyseventeen {
115
- .wc-block-components-quantity-selector .wc-block-components-quantity-selector__button {
116
- &:hover,
117
- &:focus {
118
- background: none transparent;
119
- }
120
- }
121
- }
12
 
13
  .wc-block-components-quantity-selector {
14
  display: flex;
15
+ min-width: 100px;
16
  border: 1px solid $gray-300;
17
  background: #fff;
18
  border-radius: 4px;
19
  // needed so that buttons fill the container.
20
  box-sizing: content-box;
 
21
 
22
  .has-dark-controls & {
23
  background-color: transparent;
66
  -webkit-appearance: none;
67
  margin: 0;
68
  }
 
69
  .wc-block-components-quantity-selector__button {
70
  @include reset-button;
71
  @include font-size(regular);
74
  color: $gray-900;
75
  font-style: normal;
76
  text-align: center;
 
77
 
78
  &:hover,
79
  &:focus {
98
  }
99
  }
100
  }
101
+ .wc-block-components-quantity-selector__button--minus {
 
102
  order: 1;
103
  }
104
+ .wc-block-components-quantity-selector__button--plus {
 
105
  order: 3;
106
  }
107
  }
 
 
 
 
 
 
 
 
 
assets/js/base/components/radio-control-accordion/index.js DELETED
@@ -1,73 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import classnames from 'classnames';
5
- import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import RadioControlOption from '../radio-control/option';
11
-
12
- const RadioControlAccordion = ( {
13
- className,
14
- instanceId,
15
- id,
16
- selected,
17
- onChange,
18
- options = [],
19
- } ) => {
20
- const radioControlId = id || instanceId;
21
-
22
- return (
23
- options.length && (
24
- <div
25
- className={ classnames(
26
- 'wc-block-components-radio-control',
27
- className
28
- ) }
29
- >
30
- { options.map( ( option ) => {
31
- const hasOptionContent =
32
- typeof option === 'object' && 'content' in option;
33
- const checked = option.value === selected;
34
- return (
35
- <div
36
- className="wc-block-components-radio-control-accordion-option"
37
- key={ option.value }
38
- >
39
- <RadioControlOption
40
- name={ `radio-control-${ radioControlId }` }
41
- checked={ checked }
42
- option={ option }
43
- onChange={ ( value ) => {
44
- onChange( value );
45
- if (
46
- typeof option.onChange === 'function'
47
- ) {
48
- option.onChange( value );
49
- }
50
- } }
51
- />
52
- { hasOptionContent && checked && (
53
- <div
54
- className={ classnames(
55
- 'wc-block-components-radio-control-accordion-content',
56
- {
57
- 'wc-block-components-radio-control-accordion-content-hide': ! checked,
58
- }
59
- ) }
60
- >
61
- { option.content }
62
- </div>
63
- ) }
64
- </div>
65
- );
66
- } ) }
67
- </div>
68
- )
69
- );
70
- };
71
-
72
- export default withInstanceId( RadioControlAccordion );
73
- export { RadioControlAccordion };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/radio-control/index.js CHANGED
@@ -30,7 +30,7 @@ const RadioControl = ( {
30
  >
31
  { options.map( ( option ) => (
32
  <RadioControlOption
33
- key={ `${ radioControlId }-${ option.value }` }
34
  name={ `radio-control-${ radioControlId }` }
35
  checked={ option.value === selected }
36
  option={ option }
30
  >
31
  { options.map( ( option ) => (
32
  <RadioControlOption
33
+ key={ option.value }
34
  name={ `radio-control-${ radioControlId }` }
35
  checked={ option.value === selected }
36
  option={ option }
assets/js/base/components/radio-control/{option-layout.tsx → option-layout.js} RENAMED
@@ -1,22 +1,16 @@
1
- /**
2
- * External dependencies
3
- */
4
- import type { ReactElement } from 'react';
5
- import type { PackageRateOption } from '@woocommerce/type-defs/shipping';
6
-
7
  const OptionLayout = ( {
8
  label,
9
  secondaryLabel,
10
  description,
11
  secondaryDescription,
12
  id,
13
- }: Partial< PackageRateOption > ): ReactElement => {
14
  return (
15
  <div className="wc-block-components-radio-control__option-layout">
16
  <div className="wc-block-components-radio-control__label-group">
17
  { label && (
18
  <span
19
- id={ id && `${ id }__label` }
20
  className="wc-block-components-radio-control__label"
21
  >
22
  { label }
@@ -24,7 +18,7 @@ const OptionLayout = ( {
24
  ) }
25
  { secondaryLabel && (
26
  <span
27
- id={ id && `${ id }__secondary-label` }
28
  className="wc-block-components-radio-control__secondary-label"
29
  >
30
  { secondaryLabel }
@@ -34,7 +28,7 @@ const OptionLayout = ( {
34
  <div className="wc-block-components-radio-control__description-group">
35
  { description && (
36
  <span
37
- id={ id && `${ id }__description` }
38
  className="wc-block-components-radio-control__description"
39
  >
40
  { description }
@@ -42,7 +36,7 @@ const OptionLayout = ( {
42
  ) }
43
  { secondaryDescription && (
44
  <span
45
- id={ id && `${ id }__secondary-description` }
46
  className="wc-block-components-radio-control__secondary-description"
47
  >
48
  { secondaryDescription }
 
 
 
 
 
 
1
  const OptionLayout = ( {
2
  label,
3
  secondaryLabel,
4
  description,
5
  secondaryDescription,
6
  id,
7
+ } ) => {
8
  return (
9
  <div className="wc-block-components-radio-control__option-layout">
10
  <div className="wc-block-components-radio-control__label-group">
11
  { label && (
12
  <span
13
+ id={ id ? `${ id }__label` : null }
14
  className="wc-block-components-radio-control__label"
15
  >
16
  { label }
18
  ) }
19
  { secondaryLabel && (
20
  <span
21
+ id={ id ? `${ id }__secondary-label` : null }
22
  className="wc-block-components-radio-control__secondary-label"
23
  >
24
  { secondaryLabel }
28
  <div className="wc-block-components-radio-control__description-group">
29
  { description && (
30
  <span
31
+ id={ id ? `${ id }__description` : null }
32
  className="wc-block-components-radio-control__description"
33
  >
34
  { description }
36
  ) }
37
  { secondaryDescription && (
38
  <span
39
+ id={ id ? `${ id }__secondary-description` : null }
40
  className="wc-block-components-radio-control__secondary-description"
41
  >
42
  { secondaryDescription }
assets/js/base/components/radio-control/option.js CHANGED
@@ -20,12 +20,7 @@ const Option = ( { checked, name, onChange, option } ) => {
20
 
21
  return (
22
  <label
23
- className={ classnames(
24
- 'wc-block-components-radio-control__option',
25
- {
26
- 'wc-block-components-radio-control__option-checked': checked,
27
- }
28
- ) }
29
  htmlFor={ `${ name }-${ value }` }
30
  >
31
  <input
20
 
21
  return (
22
  <label
23
+ className="wc-block-components-radio-control__option"
 
 
 
 
 
24
  htmlFor={ `${ name }-${ value }` }
25
  >
26
  <input
assets/js/base/components/radio-control/style.scss CHANGED
@@ -1,21 +1,15 @@
1
  .wc-block-components-radio-control__option {
2
  @include reset-typography();
 
3
  display: block;
4
- margin: em($gap) 0;
5
- padding: 0 0 0 em($gap-largest);
6
- position: relative;
7
-
8
- &:first-child {
9
- margin-top: 0;
10
- }
11
- &:last-child {
12
- margin-bottom: 0;
13
- }
14
  }
15
 
16
  .wc-block-components-radio-control__option-layout {
 
17
  display: table;
18
  width: 100%;
 
19
  }
20
 
21
  .wc-block-components-radio-control__option .wc-block-components-radio-control__option-layout {
@@ -41,10 +35,10 @@
41
 
42
  .wc-block-components-radio-control__label,
43
  .wc-block-components-radio-control__secondary-label {
 
44
  // Currently, max() CSS function calls need to be wrapped with unquote.
45
  // See: https://github.com/sass/sass/issues/2378#issuecomment-367490840
46
- // These values should be the same as the control input height.
47
- line-height: unquote("max(1.5rem, 24px)");
48
  }
49
 
50
  .wc-block-components-radio-control__description,
@@ -57,45 +51,59 @@
57
  .wc-block-components-radio-control {
58
  .wc-block-components-radio-control__input {
59
  appearance: none;
60
- background: #fff;
61
- border: 2px solid $input-border-gray;
62
  border-radius: 50%;
63
  display: inline-block;
64
- height: em(24px); // =1.5rem
65
- min-height: 24px;
66
- min-width: 24px;
67
- width: em(24px);
68
- // The code belows centers the input vertically.
69
  position: absolute;
70
- left: 0;
71
- top: 50%;
72
- transform: translate(0, -50%);
73
 
74
  &:checked::before {
75
- background: #000;
76
  border-radius: 50%;
77
  content: "";
78
  display: block;
79
- height: em(12px);
80
  left: 50%;
81
  margin: 0;
82
- min-height: 12px;
83
- min-width: 12px;
84
  position: absolute;
85
  top: 50%;
86
  transform: translate(-50%, -50%);
87
- width: em(12px);
88
  }
89
 
90
  .has-dark-controls & {
91
  border-color: $controls-border-dark;
92
- background-color: $input-background-dark;
93
 
94
  &:checked::before {
95
  background: $input-text-dark;
96
  }
97
  }
98
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99
  }
100
 
101
  .theme-twentytwentyone {
1
  .wc-block-components-radio-control__option {
2
  @include reset-typography();
3
+ @include with-translucent-border( 0 0 1px );
4
  display: block;
5
+ padding: $gap-small $gap-small 0 #{$gap-larger * 2};
 
 
 
 
 
 
 
 
 
6
  }
7
 
8
  .wc-block-components-radio-control__option-layout {
9
+ @include with-translucent-border( 0 0 1px );
10
  display: table;
11
  width: 100%;
12
+ padding-bottom: $gap-small;
13
  }
14
 
15
  .wc-block-components-radio-control__option .wc-block-components-radio-control__option-layout {
35
 
36
  .wc-block-components-radio-control__label,
37
  .wc-block-components-radio-control__secondary-label {
38
+ line-height: 20px;
39
  // Currently, max() CSS function calls need to be wrapped with unquote.
40
  // See: https://github.com/sass/sass/issues/2378#issuecomment-367490840
41
+ line-height: unquote("max(1rem, 20px)");
 
42
  }
43
 
44
  .wc-block-components-radio-control__description,
51
  .wc-block-components-radio-control {
52
  .wc-block-components-radio-control__input {
53
  appearance: none;
54
+ background: transparent;
55
+ border: 2px solid currentColor;
56
  border-radius: 50%;
57
  display: inline-block;
58
+ height: 1.25rem;
59
+ left: $gap-large;
60
+ min-height: 20px;
61
+ min-width: 20px;
 
62
  position: absolute;
63
+ top: $gap-small;
64
+ width: 1.25rem;
 
65
 
66
  &:checked::before {
67
+ background: currentColor;
68
  border-radius: 50%;
69
  content: "";
70
  display: block;
71
+ height: 0.625em;
72
  left: 50%;
73
  margin: 0;
74
+ min-height: 10px;
75
+ min-width: 10px;
76
  position: absolute;
77
  top: 50%;
78
  transform: translate(-50%, -50%);
79
+ width: 0.625em;
80
  }
81
 
82
  .has-dark-controls & {
83
  border-color: $controls-border-dark;
 
84
 
85
  &:checked::before {
86
  background: $input-text-dark;
87
  }
88
  }
89
  }
90
+
91
+ @include breakpoint( ">782px" ) {
92
+ .wc-block-components-radio-control__input {
93
+ height: 1rem;
94
+ margin-top: 2px;
95
+ min-height: 16px;
96
+ min-width: 16px;
97
+ width: 1rem;
98
+
99
+ &:checked::before {
100
+ height: 0.5em;
101
+ min-height: 8px;
102
+ min-width: 8px;
103
+ width: 0.5em;
104
+ }
105
+ }
106
+ }
107
  }
108
 
109
  .theme-twentytwentyone {
assets/js/base/components/read-more/test/index.js CHANGED
@@ -11,19 +11,19 @@ const longContent =
11
 
12
  describe( 'ReadMore Component', () => {
13
  describe( 'Test the truncateHtml function', () => {
14
- it( 'Truncate long HTML content to length of 10', () => {
15
  const truncatedContent = truncateHtml( longContent, 10 );
16
 
17
  expect( truncatedContent ).toEqual( '<p>Lorem ipsum...</p>' );
18
  } );
19
- it( 'Truncate long HTML content, but avoid cutting off HTML tags.', () => {
20
  const truncatedContent = truncateHtml( longContent, 40 );
21
 
22
  expect( truncatedContent ).toEqual(
23
  '<p>Lorem ipsum dolor sit amet, <strong>consectetur...</strong></p>'
24
  );
25
  } );
26
- it( 'No need to truncate short HTML content.', () => {
27
  const truncatedContent = truncateHtml( shortContent, 100 );
28
 
29
  expect( truncatedContent ).toEqual(
11
 
12
  describe( 'ReadMore Component', () => {
13
  describe( 'Test the truncateHtml function', () => {
14
+ it( 'Truncate long HTML content to length of 10', async () => {
15
  const truncatedContent = truncateHtml( longContent, 10 );
16
 
17
  expect( truncatedContent ).toEqual( '<p>Lorem ipsum...</p>' );
18
  } );
19
+ it( 'Truncate long HTML content, but avoid cutting off HTML tags.', async () => {
20
  const truncatedContent = truncateHtml( longContent, 40 );
21
 
22
  expect( truncatedContent ).toEqual(
23
  '<p>Lorem ipsum dolor sit amet, <strong>consectetur...</strong></p>'
24
  );
25
  } );
26
+ it( 'No need to truncate short HTML content.', async () => {
27
  const truncatedContent = truncateHtml( shortContent, 100 );
28
 
29
  expect( truncatedContent ).toEqual(
assets/js/base/components/reviews/review-list-item/index.js CHANGED
@@ -124,19 +124,22 @@ function getReviewRating( review ) {
124
  const starStyle = {
125
  width: ( rating / 5 ) * 100 + '%' /* stylelint-disable-line */,
126
  };
127
- const ratingText = sprintf(
128
- /* translators: %f is referring to the average rating value */
129
- __( 'Rated %f out of 5', 'woo-gutenberg-products-block' ),
130
- rating
131
- );
132
  return (
133
  <div className="wc-block-review-list-item__rating wc-block-components-review-list-item__rating">
134
  <div
135
  className="wc-block-review-list-item__rating__stars wc-block-components-review-list-item__rating__stars"
136
  role="img"
137
- aria-label={ ratingText }
138
  >
139
- <span style={ starStyle }>{ ratingText }</span>
 
 
 
 
 
 
 
 
 
140
  </div>
141
  </div>
142
  );
124
  const starStyle = {
125
  width: ( rating / 5 ) * 100 + '%' /* stylelint-disable-line */,
126
  };
 
 
 
 
 
127
  return (
128
  <div className="wc-block-review-list-item__rating wc-block-components-review-list-item__rating">
129
  <div
130
  className="wc-block-review-list-item__rating__stars wc-block-components-review-list-item__rating__stars"
131
  role="img"
 
132
  >
133
+ <span style={ starStyle }>
134
+ { sprintf(
135
+ /* Translators: %f to the average rating for the review. */
136
+ __(
137
+ 'Rated %f out of 5',
138
+ 'woo-gutenberg-products-block'
139
+ ),
140
+ rating
141
+ ) }
142
+ </span>
143
  </div>
144
  </div>
145
  );
assets/js/base/components/reviews/review-list/index.js CHANGED
@@ -2,7 +2,10 @@
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
- import { getSetting } from '@woocommerce/settings';
 
 
 
6
 
7
  /**
8
  * Internal dependencies
@@ -11,13 +14,11 @@ import ReviewListItem from '../review-list-item';
11
  import './style.scss';
12
 
13
  const ReviewList = ( { attributes, reviews } ) => {
14
- const showAvatars = getSetting( 'showAvatars', true );
15
- const reviewRatingsEnabled = getSetting( 'reviewRatingsEnabled', true );
16
  const showReviewImage =
17
- ( showAvatars || attributes.imageType === 'product' ) &&
18
  attributes.showReviewImage;
19
  const showReviewRating =
20
- reviewRatingsEnabled && attributes.showReviewRating;
21
  const attrs = {
22
  ...attributes,
23
  showReviewImage,
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
+ import {
6
+ REVIEW_RATINGS_ENABLED,
7
+ SHOW_AVATARS,
8
+ } from '@woocommerce/block-settings';
9
 
10
  /**
11
  * Internal dependencies
14
  import './style.scss';
15
 
16
  const ReviewList = ( { attributes, reviews } ) => {
 
 
17
  const showReviewImage =
18
+ ( SHOW_AVATARS || attributes.imageType === 'product' ) &&
19
  attributes.showReviewImage;
20
  const showReviewRating =
21
+ REVIEW_RATINGS_ENABLED && attributes.showReviewRating;
22
  const attrs = {
23
  ...attributes,
24
  showReviewImage,
assets/js/base/components/select/index.js CHANGED
@@ -1,2 +1,61 @@
1
- export { default as Select } from './select';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  export { default as ValidatedSelect } from './validated';
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import classnames from 'classnames';
6
+ import { CustomSelectControl } from 'wordpress-components';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import './style.scss';
12
+
13
+ const Select = ( {
14
+ className,
15
+ feedback,
16
+ id,
17
+ label,
18
+ onChange,
19
+ options,
20
+ value,
21
+ } ) => {
22
+ return (
23
+ <div
24
+ id={ id }
25
+ className={ classnames( 'wc-block-components-select', className, {
26
+ 'is-active': value,
27
+ } ) }
28
+ >
29
+ <CustomSelectControl
30
+ label={ label }
31
+ onChange={ ( { selectedItem } ) => {
32
+ onChange( selectedItem.key );
33
+ } }
34
+ options={ options }
35
+ value={ value || null }
36
+ />
37
+ { feedback }
38
+ </div>
39
+ );
40
+ };
41
+
42
+ Select.propTypes = {
43
+ onChange: PropTypes.func.isRequired,
44
+ options: PropTypes.arrayOf(
45
+ PropTypes.shape( {
46
+ key: PropTypes.string.isRequired,
47
+ name: PropTypes.string.isRequired,
48
+ } ).isRequired
49
+ ).isRequired,
50
+ className: PropTypes.string,
51
+ feedback: PropTypes.node,
52
+ id: PropTypes.string,
53
+ label: PropTypes.string,
54
+ value: PropTypes.shape( {
55
+ key: PropTypes.string.isRequired,
56
+ name: PropTypes.string.isRequired,
57
+ } ),
58
+ };
59
+
60
+ export default Select;
61
  export { default as ValidatedSelect } from './validated';
assets/js/base/components/select/select.js DELETED
@@ -1,60 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import PropTypes from 'prop-types';
5
- import classnames from 'classnames';
6
- import { CustomSelectControl } from 'wordpress-components';
7
-
8
- /**
9
- * Internal dependencies
10
- */
11
- import './style.scss';
12
-
13
- const Select = ( {
14
- className,
15
- feedback,
16
- id,
17
- label,
18
- onChange,
19
- options,
20
- value,
21
- } ) => {
22
- return (
23
- <div
24
- id={ id }
25
- className={ classnames( 'wc-block-components-select', className, {
26
- 'is-active': value,
27
- } ) }
28
- >
29
- <CustomSelectControl
30
- label={ label }
31
- onChange={ ( { selectedItem } ) => {
32
- onChange( selectedItem.key );
33
- } }
34
- options={ options }
35
- value={ value || null }
36
- />
37
- { feedback }
38
- </div>
39
- );
40
- };
41
-
42
- Select.propTypes = {
43
- onChange: PropTypes.func.isRequired,
44
- options: PropTypes.arrayOf(
45
- PropTypes.shape( {
46
- key: PropTypes.string.isRequired,
47
- name: PropTypes.string.isRequired,
48
- } ).isRequired
49
- ).isRequired,
50
- className: PropTypes.string,
51
- feedback: PropTypes.node,
52
- id: PropTypes.string,
53
- label: PropTypes.string,
54
- value: PropTypes.shape( {
55
- key: PropTypes.string.isRequired,
56
- name: PropTypes.string.isRequired,
57
- } ),
58
- };
59
-
60
- export default Select;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/select/style.scss CHANGED
@@ -1,9 +1,8 @@
1
- .wc-block-components-form .wc-block-components-select,
2
  .wc-block-components-select {
3
  height: 3em;
4
  position: relative;
5
 
6
- label.components-custom-select-control__label {
7
  @include reset-typography();
8
  @include font-size(regular);
9
  line-height: 1.375; // =22px when font-size is 16px.
@@ -56,7 +55,7 @@
56
  &:focus,
57
  &:active {
58
  @include font-size(regular);
59
- background: #fff;
60
  box-shadow: none;
61
  color: $input-text-active;
62
  font-family: inherit;
@@ -71,10 +70,8 @@
71
  text-transform: none;
72
  white-space: nowrap;
73
  width: 100%;
74
- opacity: initial;
75
- border-radius: 4px;
76
  .has-dark-controls & {
77
- background: $input-background-dark;
78
  border-color: $input-border-dark;
79
  color: $input-text-dark;
80
  }
@@ -93,7 +90,6 @@
93
  margin: 0;
94
  max-height: 300px;
95
  overflow: auto;
96
- color: $input-text-active;
97
 
98
  // Required by IE11.
99
  &:empty {
@@ -122,41 +118,3 @@
122
  display: none;
123
  }
124
  }
125
-
126
- .theme-twentytwentyone {
127
- // Extra classes for specificity.
128
- &.theme-twentytwentyone.theme-twentytwentyone .components-custom-select-control__button {
129
- background-color: #fff;
130
- color: $input-text-active;
131
- }
132
-
133
- &.is-dark-theme {
134
- // If the theme is in dark mode, as well as the block, then this selector will match.
135
- .has-dark-controls {
136
- .components-custom-select-control__item {
137
- color: $input-text-dark;
138
- }
139
- }
140
-
141
- // If the theme is in dark mode, but the block isn't, then this selector will match.
142
- .components-custom-select-control__item {
143
- color: $input-text-active;
144
- }
145
- }
146
- }
147
-
148
- .theme-twentyseventeen {
149
- // Extra classes for specificity.
150
- &.theme-twentyseventeen.theme-twentyseventeen {
151
- .components-custom-select-control__button {
152
- background-color: $select-dropdown-light;
153
- color: $input-text-active;
154
- }
155
- .has-dark-controls {
156
- .components-custom-select-control__button {
157
- background-color: $select-dropdown-dark;
158
- color: $input-text-dark;
159
- }
160
- }
161
- }
162
- }
 
1
  .wc-block-components-select {
2
  height: 3em;
3
  position: relative;
4
 
5
+ label {
6
  @include reset-typography();
7
  @include font-size(regular);
8
  line-height: 1.375; // =22px when font-size is 16px.
55
  &:focus,
56
  &:active {
57
  @include font-size(regular);
58
+ background-color: #fff;
59
  box-shadow: none;
60
  color: $input-text-active;
61
  font-family: inherit;
70
  text-transform: none;
71
  white-space: nowrap;
72
  width: 100%;
 
 
73
  .has-dark-controls & {
74
+ background-color: $input-background-dark;
75
  border-color: $input-border-dark;
76
  color: $input-text-dark;
77
  }
90
  margin: 0;
91
  max-height: 300px;
92
  overflow: auto;
 
93
 
94
  // Required by IE11.
95
  &:empty {
118
  display: none;
119
  }
120
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/select/validated.js CHANGED
@@ -3,19 +3,17 @@
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import { useEffect } from 'react';
 
6
  import { useShallowEqual } from '@woocommerce/base-hooks';
7
  import PropTypes from 'prop-types';
8
  import classnames from 'classnames';
9
  import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
10
- import {
11
- ValidationInputError,
12
- useValidationContext,
13
- } from '@woocommerce/base-context';
14
 
15
  /**
16
  * Internal dependencies
17
  */
18
- import Select from './select';
 
19
  import './style.scss';
20
 
21
  const ValidatedSelect = ( {
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import { useEffect } from 'react';
6
+ import { useValidationContext } from '@woocommerce/base-context';
7
  import { useShallowEqual } from '@woocommerce/base-hooks';
8
  import PropTypes from 'prop-types';
9
  import classnames from 'classnames';
10
  import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
 
 
 
 
11
 
12
  /**
13
  * Internal dependencies
14
  */
15
+ import { ValidationInputError } from '../validation';
16
+ import Select from './index';
17
  import './style.scss';
18
 
19
  const ValidatedSelect = ( {
assets/js/base/components/sidebar-layout/style.scss CHANGED
@@ -18,9 +18,11 @@
18
  padding-left: percentage($gap-large / 1060px);
19
  width: 35%;
20
 
21
- .wc-block-components-panel > h2 {
22
- @include font-size(regular);
23
- @include reset-box();
 
 
24
  }
25
  }
26
 
@@ -45,23 +47,16 @@
45
  .is-large {
46
  .wc-block-components-sidebar {
47
  .wc-block-components-totals-item,
48
- .wc-block-components-panel {
49
  padding-left: $gap;
50
  padding-right: $gap;
51
  }
52
  }
53
  }
54
 
55
- .wc-block-components-sidebar .wc-block-components-panel > h2 {
56
- @include reset-typography();
57
- .wc-block-components-panel__button {
58
- font-weight: 400;
59
- }
60
- }
61
-
62
  // For Twenty Twenty we need to increase specificity a bit more.
63
  .theme-twentytwenty {
64
- .wc-block-components-sidebar .wc-block-components-panel > h2 {
65
  @include font-size(large);
66
  @include reset-box();
67
  }
18
  padding-left: percentage($gap-large / 1060px);
19
  width: 35%;
20
 
21
+ .wc-blocks-components-panel {
22
+ > h2 {
23
+ @include font-size(large);
24
+ @include reset-box();
25
+ }
26
  }
27
  }
28
 
47
  .is-large {
48
  .wc-block-components-sidebar {
49
  .wc-block-components-totals-item,
50
+ .wc-blocks-components-panel {
51
  padding-left: $gap;
52
  padding-right: $gap;
53
  }
54
  }
55
  }
56
 
 
 
 
 
 
 
 
57
  // For Twenty Twenty we need to increase specificity a bit more.
58
  .theme-twentytwenty {
59
+ .wc-block-components-sidebar .wc-blocks-components-panel > h2 {
60
  @include font-size(large);
61
  @include reset-box();
62
  }
assets/js/base/components/spinner/index.tsx DELETED
@@ -1,10 +0,0 @@
1
- /**
2
- * Internal dependencies
3
- */
4
- import './style.scss';
5
-
6
- const Spinner = (): JSX.Element => {
7
- return <span className="wc-block-components-spinner" aria-hidden="true" />;
8
- };
9
-
10
- export default Spinner;
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/spinner/style.scss DELETED
@@ -1,37 +0,0 @@
1
- .wc-block-components-spinner {
2
- position: absolute;
3
- width: 100%;
4
- height: 100%;
5
- color: inherit;
6
- box-sizing: content-box;
7
- text-align: center;
8
- font-size: 1.25em;
9
-
10
- &::after {
11
- content: " ";
12
- position: absolute;
13
- top: 50%;
14
- left: 50%;
15
- margin: -0.5em 0 0 -0.5em;
16
- width: 1em;
17
- height: 1em;
18
- box-sizing: border-box;
19
- transform-origin: 50% 50%;
20
- transform: translateZ(0) scale(0.5);
21
- backface-visibility: hidden;
22
- border-radius: 50%;
23
- border: 0.2em solid currentColor;
24
- border-left-color: transparent;
25
- animation: wc-block-components-spinner__animation 1s infinite linear;
26
- }
27
- }
28
-
29
- @keyframes wc-block-components-spinner__animation {
30
- 0% {
31
- animation-timing-function: cubic-bezier(0.5856, 0.0703, 0.4143, 0.9297);
32
- transform: rotate(0deg);
33
- }
34
- 100% {
35
- transform: rotate(360deg);
36
- }
37
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/state-input/StateInputProps.ts DELETED
@@ -1,15 +0,0 @@
1
- export interface StateInputProps {
2
- className?: string;
3
- label: string;
4
- id: string;
5
- autoComplete?: string;
6
- value: string;
7
- country: string;
8
- onChange: ( value: string ) => void;
9
- required?: boolean;
10
- errorMessage?: string;
11
- }
12
-
13
- export type StateInputWithStatesProps = StateInputProps & {
14
- states: Record< string, Record< string, string > >;
15
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/state-input/billing-state-input.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { ALLOWED_STATES } from '@woocommerce/block-settings';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import StateInput from './state-input.js';
11
+
12
+ const BillingStateInput = ( props ) => {
13
+ return <StateInput states={ ALLOWED_STATES } { ...props } />;
14
+ };
15
+
16
+ BillingStateInput.propTypes = {
17
+ onChange: PropTypes.func.isRequired,
18
+ className: PropTypes.string,
19
+ label: PropTypes.string,
20
+ value: PropTypes.string,
21
+ };
22
+
23
+ export default BillingStateInput;
assets/js/base/components/state-input/billing-state-input.tsx DELETED
@@ -1,16 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { ALLOWED_STATES } from '@woocommerce/block-settings';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import StateInput from './state-input';
10
- import type { StateInputProps } from './StateInputProps';
11
-
12
- const BillingStateInput = ( props: StateInputProps ): JSX.Element => {
13
- return <StateInput states={ ALLOWED_STATES } { ...props } />;
14
- };
15
-
16
- export default BillingStateInput;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/state-input/{index.ts → index.js} RENAMED
File without changes
assets/js/base/components/state-input/shipping-state-input.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { SHIPPING_STATES } from '@woocommerce/block-settings';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import StateInput from './state-input.js';
11
+
12
+ const ShippingStateInput = ( props ) => {
13
+ return <StateInput states={ SHIPPING_STATES } { ...props } />;
14
+ };
15
+
16
+ ShippingStateInput.propTypes = {
17
+ onChange: PropTypes.func.isRequired,
18
+ className: PropTypes.string,
19
+ label: PropTypes.string,
20
+ value: PropTypes.string,
21
+ };
22
+
23
+ export default ShippingStateInput;
assets/js/base/components/state-input/shipping-state-input.tsx DELETED
@@ -1,16 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { SHIPPING_STATES } from '@woocommerce/block-settings';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import StateInput from './state-input';
10
- import type { StateInputProps } from './StateInputProps';
11
-
12
- const ShippingStateInput = ( props: StateInputProps ): JSX.Element => {
13
- return <StateInput states={ SHIPPING_STATES } { ...props } />;
14
- };
15
-
16
- export default ShippingStateInput;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/state-input/{state-input.tsx → state-input.js} RENAMED
@@ -2,6 +2,7 @@
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
 
5
  import { decodeEntities } from '@wordpress/html-entities';
6
  import { useCallback, useMemo } from '@wordpress/element';
7
  import classnames from 'classnames';
@@ -9,10 +10,9 @@ import classnames from 'classnames';
9
  /**
10
  * Internal dependencies
11
  */
12
- import { ValidatedTextInput } from '../text-input';
13
  import { ValidatedSelect } from '../select';
14
  import './style.scss';
15
- import type { StateInputWithStatesProps } from './StateInputProps';
16
 
17
  const StateInput = ( {
18
  className,
@@ -24,7 +24,7 @@ const StateInput = ( {
24
  autoComplete = 'off',
25
  value = '',
26
  required = false,
27
- }: StateInputWithStatesProps ): JSX.Element => {
28
  const countryStates = states[ country ];
29
  const options = useMemo(
30
  () =>
@@ -100,7 +100,7 @@ const StateInput = ( {
100
  );
101
  }
102
  return (
103
- <ValidatedTextInput
104
  className={ className }
105
  id={ id }
106
  label={ label }
@@ -112,4 +112,20 @@ const StateInput = ( {
112
  );
113
  };
114
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
  export default StateInput;
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
+ import PropTypes from 'prop-types';
6
  import { decodeEntities } from '@wordpress/html-entities';
7
  import { useCallback, useMemo } from '@wordpress/element';
8
  import classnames from 'classnames';
10
  /**
11
  * Internal dependencies
12
  */
13
+ import { DebouncedValidatedTextInput } from '../text-input';
14
  import { ValidatedSelect } from '../select';
15
  import './style.scss';
 
16
 
17
  const StateInput = ( {
18
  className,
24
  autoComplete = 'off',
25
  value = '',
26
  required = false,
27
+ } ) => {
28
  const countryStates = states[ country ];
29
  const options = useMemo(
30
  () =>
100
  );
101
  }
102
  return (
103
+ <DebouncedValidatedTextInput
104
  className={ className }
105
  id={ id }
106
  label={ label }
112
  );
113
  };
114
 
115
+ StateInput.propTypes = {
116
+ states: PropTypes.objectOf(
117
+ PropTypes.oneOfType( [
118
+ PropTypes.array,
119
+ PropTypes.objectOf( PropTypes.string ),
120
+ ] )
121
+ ).isRequired,
122
+ onChange: PropTypes.func.isRequired,
123
+ autoComplete: PropTypes.string,
124
+ id: PropTypes.string,
125
+ className: PropTypes.string,
126
+ country: PropTypes.string,
127
+ label: PropTypes.string,
128
+ value: PropTypes.string,
129
+ };
130
+
131
  export default StateInput;
assets/js/base/components/store-notices-container/index.js ADDED
@@ -0,0 +1,2 @@
 
 
1
+ export { default as StoreNoticesContainer } from './store-notices-container';
2
+ export { default as SnackbarNoticesContainer } from './snackbar-notices';
assets/js/base/components/store-notices-container/snackbar-notices.js ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { SnackbarList } from 'wordpress-components';
5
+ import { useStoreNotices } from '@woocommerce/base-hooks';
6
+ import { useEditorContext } from '@woocommerce/base-context';
7
+
8
+ const NoticesContainer = () => {
9
+ const { isEditor } = useEditorContext();
10
+ const { notices, removeNotice } = useStoreNotices();
11
+
12
+ if ( isEditor ) {
13
+ return null;
14
+ }
15
+
16
+ const snackbarNotices = notices.filter(
17
+ ( notice ) => notice.type === 'snackbar'
18
+ );
19
+
20
+ return (
21
+ <SnackbarList
22
+ notices={ snackbarNotices }
23
+ className={ 'wc-block-components-notices__snackbar' }
24
+ onRemove={ removeNotice }
25
+ />
26
+ );
27
+ };
28
+
29
+ export default NoticesContainer;
assets/js/base/{context/providers/store-notices/components → components/store-notices-container}/store-notices-container.js RENAMED
@@ -4,6 +4,7 @@
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import { Notice } from 'wordpress-components';
 
7
 
8
  /**
9
  * Internal dependencies
@@ -23,7 +24,8 @@ const getWooClassName = ( { status = 'default' } ) => {
23
  return '';
24
  };
25
 
26
- const StoreNoticesContainer = ( { className, notices, removeNotice } ) => {
 
27
  const regularNotices = notices.filter(
28
  ( notice ) => notice.type !== 'snackbar'
29
  );
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import { Notice } from 'wordpress-components';
7
+ import { useStoreNoticesContext } from '@woocommerce/base-context';
8
 
9
  /**
10
  * Internal dependencies
24
  return '';
25
  };
26
 
27
+ const StoreNoticesContainer = ( { className, notices } ) => {
28
+ const { removeNotice } = useStoreNoticesContext();
29
  const regularNotices = notices.filter(
30
  ( notice ) => notice.type !== 'snackbar'
31
  );
assets/js/base/{context/providers/store-notices/components → components/store-notices-container}/style.scss RENAMED
@@ -22,3 +22,24 @@
22
  margin-top: 1em;
23
  }
24
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  margin-top: 1em;
23
  }
24
  }
25
+
26
+ .wc-block-components-notices__snackbar {
27
+ position: fixed;
28
+ bottom: 20px;
29
+ left: 16px;
30
+ width: auto;
31
+
32
+ @include breakpoint( "<782px" ) {
33
+ position: fixed;
34
+ top: 10px;
35
+ left: 0;
36
+ bottom: auto;
37
+ }
38
+
39
+ .components-snackbar-list__notice-container {
40
+ @include breakpoint( "<782px" ) {
41
+ margin-left: 10px;
42
+ margin-right: 10px;
43
+ }
44
+ }
45
+ }
assets/js/base/components/summary/{index.tsx → index.js} RENAMED
@@ -2,19 +2,12 @@
2
  * External dependencies
3
  */
4
  import { RawHTML, useMemo } from '@wordpress/element';
5
- import { WordCountType } from '@woocommerce/block-settings';
6
 
7
  /**
8
  * Internal dependencies
9
  */
10
  import { generateSummary } from './utils';
11
 
12
- interface SummaryProps {
13
- className?: string;
14
- source: string;
15
- maxLength?: number;
16
- countType?: WordCountType;
17
- }
18
  /**
19
  * Summary component.
20
  *
@@ -29,7 +22,7 @@ export const Summary = ( {
29
  maxLength = 15,
30
  countType = 'words',
31
  className = '',
32
- }: SummaryProps ): JSX.Element => {
33
  const summaryText = useMemo( () => {
34
  return generateSummary( source, maxLength, countType );
35
  }, [ source, maxLength, countType ] );
2
  * External dependencies
3
  */
4
  import { RawHTML, useMemo } from '@wordpress/element';
 
5
 
6
  /**
7
  * Internal dependencies
8
  */
9
  import { generateSummary } from './utils';
10
 
 
 
 
 
 
 
11
  /**
12
  * Summary component.
13
  *
22
  maxLength = 15,
23
  countType = 'words',
24
  className = '',
25
+ } ) => {
26
  const summaryText = useMemo( () => {
27
  return generateSummary( source, maxLength, countType );
28
  }, [ source, maxLength, countType ] );
assets/js/base/components/text-input/debounced-validated.js ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { useState, useEffect } from '@wordpress/element';
5
+ import { ValidatedTextInput } from '@woocommerce/base-components/text-input';
6
+ import { useShallowEqual } from '@woocommerce/base-hooks';
7
+ import { useDebouncedCallback } from 'use-debounce';
8
+ import PropTypes from 'prop-types';
9
+
10
+ const DebouncedValidatedTextInput = ( { onChange, value = '', ...props } ) => {
11
+ // Keep a local copy of the value so we can debounce updates.
12
+ const [ inputValue, setInputValue ] = useState( value );
13
+ const [ debouncedCallback ] = useDebouncedCallback( ( newValue ) => {
14
+ onChange( newValue );
15
+ }, 400 );
16
+ const debouncedOnChange = useShallowEqual( debouncedCallback );
17
+ useEffect( () => {
18
+ debouncedOnChange( inputValue );
19
+ }, [ debouncedOnChange, inputValue ] );
20
+
21
+ return (
22
+ <ValidatedTextInput
23
+ onChange={ setInputValue }
24
+ value={ inputValue }
25
+ { ...props }
26
+ />
27
+ );
28
+ };
29
+
30
+ DebouncedValidatedTextInput.propTypes = {
31
+ onChange: PropTypes.func.isRequired,
32
+ value: PropTypes.string,
33
+ };
34
+
35
+ export default DebouncedValidatedTextInput;
assets/js/base/components/text-input/{text-input.tsx → index.js} RENAMED
@@ -1,7 +1,8 @@
1
  /**
2
  * External dependencies
3
  */
4
- import { forwardRef, InputHTMLAttributes } from 'react';
 
5
  import classnames from 'classnames';
6
  import { useState } from '@wordpress/element';
7
 
@@ -11,24 +12,7 @@ import { useState } from '@wordpress/element';
11
  import Label from '../label';
12
  import './style.scss';
13
 
14
- interface TextInputProps
15
- extends Omit<
16
- InputHTMLAttributes< HTMLInputElement >,
17
- 'onChange' | 'onBlur'
18
- > {
19
- id: string;
20
- ariaLabel?: string;
21
- label?: string;
22
- ariaDescribedBy?: string;
23
- screenReaderLabel?: string;
24
- help?: string;
25
- feedback?: boolean | JSX.Element;
26
- autoComplete?: string;
27
- onChange: ( newValue: string ) => void;
28
- onBlur?: ( newValue: string ) => void;
29
- }
30
-
31
- const TextInput = forwardRef< HTMLInputElement, TextInputProps >(
32
  (
33
  {
34
  className,
@@ -45,11 +29,8 @@ const TextInput = forwardRef< HTMLInputElement, TextInputProps >(
45
  value = '',
46
  onChange,
47
  required = false,
48
- onBlur = () => {
49
- /* Do nothing */
50
- },
51
  feedback,
52
- ...rest
53
  },
54
  ref
55
  ) => {
@@ -76,8 +57,8 @@ const TextInput = forwardRef< HTMLInputElement, TextInputProps >(
76
  onChange( event.target.value );
77
  } }
78
  onFocus={ () => setIsActive( true ) }
79
- onBlur={ ( event ) => {
80
- onBlur( event.target.value );
81
  setIsActive( false );
82
  } }
83
  aria-label={ ariaLabel || label }
@@ -88,7 +69,6 @@ const TextInput = forwardRef< HTMLInputElement, TextInputProps >(
88
  : ariaDescribedBy
89
  }
90
  required={ required }
91
- { ...rest }
92
  />
93
  <Label
94
  label={ label }
@@ -113,4 +93,21 @@ const TextInput = forwardRef< HTMLInputElement, TextInputProps >(
113
  }
114
  );
115
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
  export default TextInput;
 
 
1
  /**
2
  * External dependencies
3
  */
4
+ import { forwardRef } from 'react';
5
+ import PropTypes from 'prop-types';
6
  import classnames from 'classnames';
7
  import { useState } from '@wordpress/element';
8
 
12
  import Label from '../label';
13
  import './style.scss';
14
 
15
+ const TextInput = forwardRef(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  (
17
  {
18
  className,
29
  value = '',
30
  onChange,
31
  required = false,
32
+ onBlur = () => {},
 
 
33
  feedback,
 
34
  },
35
  ref
36
  ) => {
57
  onChange( event.target.value );
58
  } }
59
  onFocus={ () => setIsActive( true ) }
60
+ onBlur={ () => {
61
+ onBlur();
62
  setIsActive( false );
63
  } }
64
  aria-label={ ariaLabel || label }
69
  : ariaDescribedBy
70
  }
71
  required={ required }
 
72
  />
73
  <Label
74
  label={ label }
93
  }
94
  );
95
 
96
+ TextInput.propTypes = {
97
+ id: PropTypes.string.isRequired,
98
+ onChange: PropTypes.func.isRequired,
99
+ value: PropTypes.string,
100
+ ariaLabel: PropTypes.string,
101
+ ariaDescribedBy: PropTypes.string,
102
+ label: PropTypes.string,
103
+ screenReaderLabel: PropTypes.string,
104
+ disabled: PropTypes.bool,
105
+ help: PropTypes.string,
106
+ autoCapitalize: PropTypes.string,
107
+ autoComplete: PropTypes.string,
108
+ required: PropTypes.bool,
109
+ };
110
+
111
  export default TextInput;
112
+ export { default as ValidatedTextInput } from './validated';
113
+ export { default as DebouncedValidatedTextInput } from './debounced-validated';
assets/js/base/components/text-input/index.ts DELETED
@@ -1,2 +0,0 @@
1
- export { default as TextInput } from './text-input';
2
- export { default as ValidatedTextInput } from './validated-text-input';
 
 
assets/js/base/components/text-input/style.scss CHANGED
@@ -1,4 +1,3 @@
1
- .wc-block-components-form .wc-block-components-text-input,
2
  .wc-block-components-text-input {
3
  position: relative;
4
  margin-top: em($gap-large);
@@ -40,7 +39,6 @@
40
  input[type="tel"],
41
  input[type="url"],
42
  input[type="text"],
43
- input[type="number"],
44
  input[type="email"] {
45
  @include font-size(regular);
46
  background-color: #fff;
@@ -58,35 +56,17 @@
58
 
59
  &:focus {
60
  background-color: #fff;
61
- color: $input-text-active;
62
  }
63
-
64
  .has-dark-controls & {
65
  background-color: $input-background-dark;
66
  border-color: $input-border-dark;
67
  color: $input-text-dark;
68
-
69
- &:focus {
70
- background-color: $input-background-dark;
71
- color: $input-text-dark;
72
- }
73
- }
74
- }
75
-
76
- input[type="number"] {
77
- -moz-appearance: textfield;
78
-
79
- &::-webkit-outer-spin-button,
80
- &::-webkit-inner-spin-button {
81
- appearance: none;
82
- margin: 0;
83
  }
84
  }
85
 
86
  &.is-active input[type="tel"],
87
  &.is-active input[type="url"],
88
  &.is-active input[type="text"],
89
- &.is-active input[type="number"],
90
  &.is-active input[type="email"] {
91
  padding: em($gap-large) 0 em($gap-smallest) $gap;
92
  }
 
1
  .wc-block-components-text-input {
2
  position: relative;
3
  margin-top: em($gap-large);
39
  input[type="tel"],
40
  input[type="url"],
41
  input[type="text"],
 
42
  input[type="email"] {
43
  @include font-size(regular);
44
  background-color: #fff;
56
 
57
  &:focus {
58
  background-color: #fff;
 
59
  }
 
60
  .has-dark-controls & {
61
  background-color: $input-background-dark;
62
  border-color: $input-border-dark;
63
  color: $input-text-dark;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  }
65
  }
66
 
67
  &.is-active input[type="tel"],
68
  &.is-active input[type="url"],
69
  &.is-active input[type="text"],
 
70
  &.is-active input[type="email"] {
71
  padding: em($gap-large) 0 em($gap-smallest) $gap;
72
  }
assets/js/base/components/text-input/validated-text-input.tsx DELETED
@@ -1,166 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __ } from '@wordpress/i18n';
5
- import { useCallback, useRef, useEffect, useState } from 'react';
6
- import classnames from 'classnames';
7
- import {
8
- ValidationInputError,
9
- useValidationContext,
10
- } from '@woocommerce/base-context';
11
- import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
12
- import { isString } from '@woocommerce/types';
13
-
14
- /**
15
- * Internal dependencies
16
- */
17
- import TextInput from './text-input';
18
- import './style.scss';
19
-
20
- interface ValidatedTextInputPropsWithId {
21
- instanceId?: string;
22
- id: string;
23
- }
24
-
25
- interface ValidatedTextInputPropsWithInstanceId {
26
- instanceId: string;
27
- id?: string;
28
- }
29
-
30
- type ValidatedTextInputProps = (
31
- | ValidatedTextInputPropsWithId
32
- | ValidatedTextInputPropsWithInstanceId
33
- ) & {
34
- className?: string;
35
- ariaDescribedBy?: string;
36
- errorId?: string;
37
- validateOnMount?: boolean;
38
- focusOnMount?: boolean;
39
- showError?: boolean;
40
- errorMessage?: string;
41
- onChange: ( newValue: string ) => void;
42
- };
43
-
44
- const ValidatedTextInput = ( {
45
- className,
46
- instanceId,
47
- id,
48
- ariaDescribedBy,
49
- errorId,
50
- validateOnMount = true,
51
- focusOnMount = false,
52
- onChange,
53
- showError = true,
54
- errorMessage: passedErrorMessage = '',
55
- ...rest
56
- }: ValidatedTextInputProps ) => {
57
- const [ isPristine, setIsPristine ] = useState( true );
58
- const inputRef = useRef< HTMLInputElement >( null );
59
- const {
60
- getValidationError,
61
- hideValidationError,
62
- setValidationErrors,
63
- clearValidationError,
64
- getValidationErrorId,
65
- } = useValidationContext();
66
-
67
- const textInputId =
68
- typeof id !== 'undefined' ? id : 'textinput-' + instanceId;
69
- const errorIdString = errorId !== undefined ? errorId : textInputId;
70
-
71
- const validateInput = useCallback(
72
- ( errorsHidden = true ) => {
73
- const inputObject = inputRef.current || null;
74
- if ( ! inputObject ) {
75
- return;
76
- }
77
- // Trim white space before validation.
78
- inputObject.value = inputObject.value.trim();
79
- const inputIsValid = inputObject.checkValidity();
80
- if ( inputIsValid ) {
81
- clearValidationError( errorIdString );
82
- } else {
83
- setValidationErrors( {
84
- [ errorIdString ]: {
85
- message:
86
- inputObject.validationMessage ||
87
- __(
88
- 'Invalid value.',
89
- 'woo-gutenberg-products-block'
90
- ),
91
- hidden: errorsHidden,
92
- },
93
- } );
94
- }
95
- },
96
- [ clearValidationError, errorIdString, setValidationErrors ]
97
- );
98
-
99
- useEffect( () => {
100
- if ( isPristine ) {
101
- if ( focusOnMount ) {
102
- inputRef.current?.focus();
103
- }
104
- setIsPristine( false );
105
- }
106
- }, [ focusOnMount, isPristine, setIsPristine ] );
107
-
108
- useEffect( () => {
109
- if ( isPristine ) {
110
- if ( validateOnMount ) {
111
- validateInput();
112
- }
113
- setIsPristine( false );
114
- }
115
- }, [ isPristine, setIsPristine, validateOnMount, validateInput ] );
116
-
117
- // Remove validation errors when unmounted.
118
- useEffect( () => {
119
- return () => {
120
- clearValidationError( errorIdString );
121
- };
122
- }, [ clearValidationError, errorIdString ] );
123
-
124
- // @todo - When useValidationContext is converted to TypeScript, remove this cast and use the correct type.
125
- const errorMessage = ( getValidationError( errorIdString ) || {} ) as {
126
- message?: string;
127
- hidden?: boolean;
128
- };
129
- if ( isString( passedErrorMessage ) && passedErrorMessage !== '' ) {
130
- errorMessage.message = passedErrorMessage;
131
- }
132
- const hasError = errorMessage.message && ! errorMessage.hidden;
133
- const describedBy =
134
- showError && hasError && getValidationErrorId( errorIdString )
135
- ? getValidationErrorId( errorIdString )
136
- : ariaDescribedBy;
137
-
138
- return (
139
- <TextInput
140
- className={ classnames( className, {
141
- 'has-error': hasError,
142
- } ) }
143
- id={ textInputId }
144
- onBlur={ () => {
145
- validateInput( false );
146
- } }
147
- feedback={
148
- showError && (
149
- <ValidationInputError
150
- errorMessage={ passedErrorMessage }
151
- propertyName={ errorIdString }
152
- />
153
- )
154
- }
155
- ref={ inputRef }
156
- onChange={ ( val ) => {
157
- hideValidationError( errorIdString );
158
- onChange( val );
159
- } }
160
- ariaDescribedBy={ describedBy }
161
- { ...rest }
162
- />
163
- );
164
- };
165
-
166
- export default withInstanceId( ValidatedTextInput );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/text-input/validated.js ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { useCallback, useRef, useEffect, useState } from 'react';
6
+ import PropTypes from 'prop-types';
7
+ import classnames from 'classnames';
8
+ import { useValidationContext } from '@woocommerce/base-context';
9
+ import { ValidationInputError } from '@woocommerce/base-components/validation';
10
+ import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
11
+
12
+ /**
13
+ * Internal dependencies
14
+ */
15
+ import TextInput from './index';
16
+ import './style.scss';
17
+
18
+ const ValidatedTextInput = ( {
19
+ className,
20
+ instanceId,
21
+ id,
22
+ ariaDescribedBy,
23
+ errorId,
24
+ validateOnMount = true,
25
+ focusOnMount = false,
26
+ onChange,
27
+ showError = true,
28
+ ...rest
29
+ } ) => {
30
+ const [ isPristine, setIsPristine ] = useState( true );
31
+ const inputRef = useRef();
32
+ const {
33
+ getValidationError,
34
+ hideValidationError,
35
+ setValidationErrors,
36
+ clearValidationError,
37
+ getValidationErrorId,
38
+ } = useValidationContext();
39
+
40
+ const textInputId = id || 'textinput-' + instanceId;
41
+ errorId = errorId || textInputId;
42
+
43
+ const validateInput = useCallback(
44
+ ( errorsHidden = true ) => {
45
+ if ( inputRef.current.checkValidity() ) {
46
+ clearValidationError( errorId );
47
+ } else {
48
+ setValidationErrors( {
49
+ [ errorId ]: {
50
+ message:
51
+ inputRef.current.validationMessage ||
52
+ __(
53
+ 'Invalid value.',
54
+ 'woo-gutenberg-products-block'
55
+ ),
56
+ hidden: errorsHidden,
57
+ },
58
+ } );
59
+ }
60
+ },
61
+ [ clearValidationError, errorId, setValidationErrors ]
62
+ );
63
+
64
+ useEffect( () => {
65
+ if ( isPristine ) {
66
+ if ( focusOnMount ) {
67
+ inputRef.current.focus();
68
+ }
69
+ setIsPristine( false );
70
+ }
71
+ }, [ focusOnMount, isPristine, setIsPristine ] );
72
+
73
+ useEffect( () => {
74
+ if ( isPristine ) {
75
+ if ( validateOnMount ) {
76
+ validateInput();
77
+ }
78
+ setIsPristine( false );
79
+ }
80
+ }, [ isPristine, setIsPristine, validateOnMount, validateInput ] );
81
+
82
+ // Remove validation errors when unmounted.
83
+ useEffect( () => {
84
+ return () => {
85
+ clearValidationError( errorId );
86
+ };
87
+ }, [ clearValidationError, errorId ] );
88
+
89
+ const errorMessage = getValidationError( errorId ) || {};
90
+ const hasError = errorMessage.message && ! errorMessage.hidden;
91
+ const describedBy =
92
+ showError && hasError && getValidationErrorId( errorId )
93
+ ? getValidationErrorId( errorId )
94
+ : ariaDescribedBy;
95
+
96
+ return (
97
+ <TextInput
98
+ className={ classnames( className, {
99
+ 'has-error': hasError,
100
+ } ) }
101
+ id={ textInputId }
102
+ onBlur={ () => {
103
+ validateInput( false );
104
+ } }
105
+ feedback={
106
+ showError && <ValidationInputError propertyName={ errorId } />
107
+ }
108
+ ref={ inputRef }
109
+ onChange={ ( val ) => {
110
+ hideValidationError( errorId );
111
+ onChange( val );
112
+ } }
113
+ ariaDescribedBy={ describedBy }
114
+ { ...rest }
115
+ />
116
+ );
117
+ };
118
+
119
+ ValidatedTextInput.propTypes = {
120
+ onChange: PropTypes.func.isRequired,
121
+ id: PropTypes.string,
122
+ value: PropTypes.string,
123
+ ariaDescribedBy: PropTypes.string,
124
+ errorId: PropTypes.string,
125
+ validateOnMount: PropTypes.bool,
126
+ focusOnMount: PropTypes.bool,
127
+ showError: PropTypes.bool,
128
+ };
129
+
130
+ export default withInstanceId( ValidatedTextInput );
assets/js/base/components/title/index.js CHANGED
@@ -15,7 +15,7 @@ import './style.scss';
15
  * Component that renders a block title.
16
  *
17
  * @param {Object} props Incoming props for the component.
18
- * @param {React.ReactNode} [props.children] Children elements this component wraps.
19
  * @param {string} [props.className] CSS class used.
20
  * @param {string} props.headingLevel Heading level for title.
21
  * @param {Object} [props.props] Rest of props passed through to component.
15
  * Component that renders a block title.
16
  *
17
  * @param {Object} props Incoming props for the component.
18
+ * @param {React.ReactChildren} [props.children] Children elements this component wraps.
19
  * @param {string} [props.className] CSS class used.
20
  * @param {string} props.headingLevel Heading level for title.
21
  * @param {Object} [props.props] Rest of props passed through to component.
assets/js/base/components/title/style.scss CHANGED
@@ -2,7 +2,6 @@
2
  .wc-block-components-title.wc-block-components-title {
3
  @include reset-box();
4
  @include font-size(large);
5
- word-break: break-word;
6
  }
7
 
8
  // For Twenty Twenty we need to increase specificity a bit more.
@@ -10,6 +9,5 @@
10
  .wc-block-components-title.wc-block-components-title {
11
  @include reset-box();
12
  @include font-size(large);
13
- word-break: break-word;
14
  }
15
  }
2
  .wc-block-components-title.wc-block-components-title {
3
  @include reset-box();
4
  @include font-size(large);
 
5
  }
6
 
7
  // For Twenty Twenty we need to increase specificity a bit more.
9
  .wc-block-components-title.wc-block-components-title {
10
  @include reset-box();
11
  @include font-size(large);
 
12
  }
13
  }
assets/js/base/{context/providers/validation/components → components/validation}/index.js RENAMED
File without changes
assets/js/base/{context/providers/validation/components/validation-input-error → components/validation}/style.scss RENAMED
File without changes
assets/js/base/{context/providers/validation/components/validation-input-error/index.js → components/validation/validation-input-error.js} RENAMED
@@ -1,12 +1,12 @@
1
  /**
2
  * External dependencies
3
  */
 
4
  import PropTypes from 'prop-types';
5
 
6
  /**
7
  * Internal dependencies
8
  */
9
- import { useValidationContext } from '../../context';
10
  import './style.scss';
11
 
12
  export const ValidationInputError = ( {
@@ -15,8 +15,7 @@ export const ValidationInputError = ( {
15
  elementId = '',
16
  } ) => {
17
  const { getValidationError, getValidationErrorId } = useValidationContext();
18
-
19
- if ( ! errorMessage || typeof errorMessage !== 'string' ) {
20
  const error = getValidationError( propertyName ) || {};
21
  if ( error.message && ! error.hidden ) {
22
  errorMessage = error.message;
@@ -37,5 +36,3 @@ ValidationInputError.propTypes = {
37
  propertyName: PropTypes.string,
38
  elementId: PropTypes.string,
39
  };
40
-
41
- export default ValidationInputError;
1
  /**
2
  * External dependencies
3
  */
4
+ import { useValidationContext } from '@woocommerce/base-context';
5
  import PropTypes from 'prop-types';
6
 
7
  /**
8
  * Internal dependencies
9
  */
 
10
  import './style.scss';
11
 
12
  export const ValidationInputError = ( {
15
  elementId = '',
16
  } ) => {
17
  const { getValidationError, getValidationErrorId } = useValidationContext();
18
+ if ( ! errorMessage ) {
 
19
  const error = getValidationError( propertyName ) || {};
20
  if ( error.message && ! error.hidden ) {
21
  errorMessage = error.message;
36
  propertyName: PropTypes.string,
37
  elementId: PropTypes.string,
38
  };
 
 
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/actions.js RENAMED
File without changes
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/constants.js RENAMED
File without changes
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/event-emit.js RENAMED
@@ -6,7 +6,7 @@ import {
6
  reducer,
7
  emitEvent,
8
  emitEventWithAbort,
9
- } from '../../../event-emit';
10
 
11
  const EMIT_TYPES = {
12
  ADD_TO_CART_BEFORE_PROCESSING: 'add_to_cart_before_processing',
@@ -28,7 +28,7 @@ const EMIT_TYPES = {
28
  *
29
  * @return {Object} An object with the add to cart form emitter registration
30
  */
31
- const emitterObservers = ( dispatcher ) => ( {
32
  onAddToCartAfterProcessingWithSuccess: emitterCallback(
33
  EMIT_TYPES.ADD_TO_CART_AFTER_PROCESSING_WITH_SUCCESS,
34
  dispatcher
@@ -43,4 +43,10 @@ const emitterObservers = ( dispatcher ) => ( {
43
  ),
44
  } );
45
 
46
- export { EMIT_TYPES, emitterObservers, reducer, emitEvent, emitEventWithAbort };
 
 
 
 
 
 
6
  reducer,
7
  emitEvent,
8
  emitEventWithAbort,
9
+ } from '../../shared/event-emit';
10
 
11
  const EMIT_TYPES = {
12
  ADD_TO_CART_BEFORE_PROCESSING: 'add_to_cart_before_processing',
28
  *
29
  * @return {Object} An object with the add to cart form emitter registration
30
  */
31
+ const emitterSubscribers = ( dispatcher ) => ( {
32
  onAddToCartAfterProcessingWithSuccess: emitterCallback(
33
  EMIT_TYPES.ADD_TO_CART_AFTER_PROCESSING_WITH_SUCCESS,
34
  dispatcher
43
  ),
44
  } );
45
 
46
+ export {
47
+ EMIT_TYPES,
48
+ emitterSubscribers,
49
+ reducer,
50
+ emitEvent,
51
+ emitEventWithAbort,
52
+ };
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/index.js RENAMED
@@ -9,7 +9,11 @@ import {
9
  useEffect,
10
  } from '@wordpress/element';
11
  import { __ } from '@wordpress/i18n';
12
- import { useShallowEqual } from '@woocommerce/base-hooks';
 
 
 
 
13
  import {
14
  productIsPurchasable,
15
  productSupportsAddToCartForm,
@@ -23,14 +27,12 @@ import { reducer } from './reducer';
23
  import { DEFAULT_STATE, STATUS } from './constants';
24
  import {
25
  EMIT_TYPES,
26
- emitterObservers,
27
  emitEvent,
28
  emitEventWithAbort,
29
  reducer as emitReducer,
30
  } from './event-emit';
31
- import { useValidationContext } from '../../validation';
32
- import { useStoreNotices } from '../../../hooks/use-store-notices';
33
- import { useEmitResponse } from '../../../hooks/use-emit-response';
34
 
35
  /**
36
  * @typedef {import('@woocommerce/type-defs/add-to-cart-form').AddToCartFormDispatchActions} AddToCartFormDispatchActions
@@ -97,7 +99,7 @@ export const AddToCartFormStateContextProvider = ( {
97
  reducer,
98
  DEFAULT_STATE
99
  );
100
- const [ observers, observerDispatch ] = useReducer( emitReducer, {} );
101
  const currentObservers = useShallowEqual( observers );
102
  const { addErrorNotice, removeNotices } = useStoreNotices();
103
  const { setValidationErrors } = useValidationContext();
@@ -112,16 +114,16 @@ export const AddToCartFormStateContextProvider = ( {
112
  */
113
  const eventRegistration = useMemo(
114
  () => ( {
115
- onAddToCartAfterProcessingWithSuccess: emitterObservers(
116
- observerDispatch
117
  ).onAddToCartAfterProcessingWithSuccess,
118
- onAddToCartAfterProcessingWithError: emitterObservers(
119
- observerDispatch
120
  ).onAddToCartAfterProcessingWithError,
121
- onAddToCartBeforeProcessing: emitterObservers( observerDispatch )
122
  .onAddToCartBeforeProcessing,
123
  } ),
124
- [ observerDispatch ]
125
  );
126
 
127
  /**
@@ -206,31 +208,17 @@ export const AddToCartFormStateContextProvider = ( {
206
  */
207
  useEffect( () => {
208
  if ( addToCartFormState.status === STATUS.AFTER_PROCESSING ) {
209
- // @todo: This data package differs from what is passed through in
210
- // the checkout state context. Should we introduce a "context"
211
- // property in the data package for this emitted event so that
212
- // observers are able to know what context the event is firing in?
213
  const data = {
214
  processingResponse: addToCartFormState.processingResponse,
215
  };
216
 
217
- const handleErrorResponse = ( observerResponses ) => {
218
- let handled = false;
219
- observerResponses.forEach( ( response ) => {
220
- const { message, messageContext } = response;
221
- if (
222
- ( isErrorResponse( response ) ||
223
- isFailResponse( response ) ) &&
224
- message
225
- ) {
226
- const errorOptions = messageContext
227
- ? { context: messageContext }
228
- : undefined;
229
- handled = true;
230
- addErrorNotice( message, errorOptions );
231
- }
232
- } );
233
- return handled;
234
  };
235
 
236
  if ( addToCartFormState.hasError ) {
@@ -239,8 +227,13 @@ export const AddToCartFormStateContextProvider = ( {
239
  currentObservers,
240
  EMIT_TYPES.ADD_TO_CART_AFTER_PROCESSING_WITH_ERROR,
241
  data
242
- ).then( ( observerResponses ) => {
243
- if ( ! handleErrorResponse( observerResponses ) ) {
 
 
 
 
 
244
  // no error handling in place by anything so let's fall back to default
245
  const message =
246
  data.processingResponse?.message ||
@@ -261,8 +254,12 @@ export const AddToCartFormStateContextProvider = ( {
261
  currentObservers,
262
  EMIT_TYPES.ADD_TO_CART_AFTER_PROCESSING_WITH_SUCCESS,
263
  data
264
- ).then( ( observerResponses ) => {
265
- if ( handleErrorResponse( observerResponses ) ) {
 
 
 
 
266
  // this will set an error which will end up
267
  // triggering the onAddToCartAfterProcessingWithError emitter.
268
  // and then setting to IDLE state.
9
  useEffect,
10
  } from '@wordpress/element';
11
  import { __ } from '@wordpress/i18n';
12
+ import {
13
+ useStoreNotices,
14
+ useEmitResponse,
15
+ useShallowEqual,
16
+ } from '@woocommerce/base-hooks';
17
  import {
18
  productIsPurchasable,
19
  productSupportsAddToCartForm,
27
  import { DEFAULT_STATE, STATUS } from './constants';
28
  import {
29
  EMIT_TYPES,
30
+ emitterSubscribers,
31
  emitEvent,
32
  emitEventWithAbort,
33
  reducer as emitReducer,
34
  } from './event-emit';
35
+ import { useValidationContext } from '../../shared/validation';
 
 
36
 
37
  /**
38
  * @typedef {import('@woocommerce/type-defs/add-to-cart-form').AddToCartFormDispatchActions} AddToCartFormDispatchActions
99
  reducer,
100
  DEFAULT_STATE
101
  );
102
+ const [ observers, subscriber ] = useReducer( emitReducer, {} );
103
  const currentObservers = useShallowEqual( observers );
104
  const { addErrorNotice, removeNotices } = useStoreNotices();
105
  const { setValidationErrors } = useValidationContext();
114
  */
115
  const eventRegistration = useMemo(
116
  () => ( {
117
+ onAddToCartAfterProcessingWithSuccess: emitterSubscribers(
118
+ subscriber
119
  ).onAddToCartAfterProcessingWithSuccess,
120
+ onAddToCartAfterProcessingWithError: emitterSubscribers(
121
+ subscriber
122
  ).onAddToCartAfterProcessingWithError,
123
+ onAddToCartBeforeProcessing: emitterSubscribers( subscriber )
124
  .onAddToCartBeforeProcessing,
125
  } ),
126
+ [ subscriber ]
127
  );
128
 
129
  /**
208
  */
209
  useEffect( () => {
210
  if ( addToCartFormState.status === STATUS.AFTER_PROCESSING ) {
 
 
 
 
211
  const data = {
212
  processingResponse: addToCartFormState.processingResponse,
213
  };
214
 
215
+ const handleErrorResponse = ( response ) => {
216
+ if ( response.message ) {
217
+ const errorOptions = response.messageContext
218
+ ? { context: response.messageContext }
219
+ : undefined;
220
+ addErrorNotice( response.message, errorOptions );
221
+ }
 
 
 
 
 
 
 
 
 
 
222
  };
223
 
224
  if ( addToCartFormState.hasError ) {
227
  currentObservers,
228
  EMIT_TYPES.ADD_TO_CART_AFTER_PROCESSING_WITH_ERROR,
229
  data
230
+ ).then( ( response ) => {
231
+ if (
232
+ isErrorResponse( response ) ||
233
+ isFailResponse( response )
234
+ ) {
235
+ handleErrorResponse( response );
236
+ } else {
237
  // no error handling in place by anything so let's fall back to default
238
  const message =
239
  data.processingResponse?.message ||
254
  currentObservers,
255
  EMIT_TYPES.ADD_TO_CART_AFTER_PROCESSING_WITH_SUCCESS,
256
  data
257
+ ).then( ( response ) => {
258
+ if (
259
+ isErrorResponse( response ) ||
260
+ isFailResponse( response )
261
+ ) {
262
+ handleErrorResponse( response );
263
  // this will set an error which will end up
264
  // triggering the onAddToCartAfterProcessingWithError emitter.
265
  // and then setting to IDLE state.
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/reducer.js RENAMED
File without changes
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form/index.js RENAMED
@@ -1,8 +1,12 @@
 
 
 
 
 
1
  /**
2
  * Internal dependencies
3
  */
4
  import { AddToCartFormStateContextProvider } from '../form-state';
5
- import { ValidationContextProvider } from '../../validation';
6
  import FormSubmit from './submit';
7
 
8
  /**
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { ValidationContextProvider } from '@woocommerce/base-context';
5
+
6
  /**
7
  * Internal dependencies
8
  */
9
  import { AddToCartFormStateContextProvider } from '../form-state';
 
10
  import FormSubmit from './submit';
11
 
12
  /**
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form/submit/index.js RENAMED
@@ -3,16 +3,14 @@
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import triggerFetch from '@wordpress/api-fetch';
 
 
 
 
6
  import { useEffect, useCallback, useState } from '@wordpress/element';
 
7
  import { decodeEntities } from '@wordpress/html-entities';
8
-
9
- /**
10
- * Internal dependencies
11
- */
12
- import { useAddToCartFormContext } from '../../form-state';
13
- import { useValidationContext } from '../../../validation';
14
- import { useStoreCart } from '../../../../hooks/cart/use-store-cart';
15
- import { useStoreNotices } from '../../../../hooks/use-store-notices';
16
 
17
  /**
18
  * FormSubmit.
@@ -109,6 +107,7 @@ const FormSubmit = () => {
109
  }
110
  dispatchActions.setAfterProcessing( response );
111
  setIsSubmitting( false );
 
112
  } );
113
  } )
114
  .catch( ( error ) => {
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import triggerFetch from '@wordpress/api-fetch';
6
+ import {
7
+ useAddToCartFormContext,
8
+ useValidationContext,
9
+ } from '@woocommerce/base-context';
10
  import { useEffect, useCallback, useState } from '@wordpress/element';
11
+ import { useStoreCart, useStoreNotices } from '@woocommerce/base-hooks';
12
  import { decodeEntities } from '@wordpress/html-entities';
13
+ import { triggerFragmentRefresh } from '@woocommerce/base-utils';
 
 
 
 
 
 
 
14
 
15
  /**
16
  * FormSubmit.
107
  }
108
  dispatchActions.setAfterProcessing( response );
109
  setIsSubmitting( false );
110
+ triggerFragmentRefresh();
111
  } );
112
  } )
113
  .catch( ( error ) => {
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/index.js RENAMED
File without changes
assets/js/base/context/{providers/cart-checkout → cart-checkout}/cart/index.js RENAMED
File without changes
assets/js/base/context/cart-checkout/checkout-state/actions.js ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { TYPES } from './constants';
5
+
6
+ const {
7
+ SET_PRISTINE,
8
+ SET_IDLE,
9
+ SET_PROCESSING,
10
+ SET_BEFORE_PROCESSING,
11
+ SET_AFTER_PROCESSING,
12
+ SET_PROCESSING_RESPONSE,
13
+ SET_REDIRECT_URL,
14
+ SET_COMPLETE,
15
+ SET_HAS_ERROR,
16
+ SET_NO_ERROR,
17
+ INCREMENT_CALCULATING,
18
+ DECREMENT_CALCULATING,
19
+ SET_CUSTOMER_ID,
20
+ SET_ORDER_ID,
21
+ SET_SHOULD_CREATE_ACCOUNT,
22
+ SET_ORDER_NOTES,
23
+ } = TYPES;
24
+
25
+ /**
26
+ * All the actions that can be dispatched for the checkout.
27
+ */
28
+ export const actions = {
29
+ setPristine: () => ( {
30
+ type: SET_PRISTINE,
31
+ } ),
32
+ setIdle: () => ( {
33
+ type: SET_IDLE,
34
+ } ),
35
+ setProcessing: () => ( {
36
+ type: SET_PROCESSING,
37
+ } ),
38
+ setRedirectUrl: ( url ) => ( {
39
+ type: SET_REDIRECT_URL,
40
+ url,
41
+ } ),
42
+ setProcessingResponse: ( data ) => ( {
43
+ type: SET_PROCESSING_RESPONSE,
44
+ data,
45
+ } ),
46
+ setComplete: ( data ) => ( {
47
+ type: SET_COMPLETE,
48
+ data,
49
+ } ),
50
+ setBeforeProcessing: () => ( {
51
+ type: SET_BEFORE_PROCESSING,
52
+ } ),
53
+ setAfterProcessing: () => ( {
54
+ type: SET_AFTER_PROCESSING,
55
+ } ),
56
+ setHasError: ( hasError = true ) => {
57
+ const type = hasError ? SET_HAS_ERROR : SET_NO_ERROR;
58
+ return { type };
59
+ },
60
+ incrementCalculating: () => ( {
61
+ type: INCREMENT_CALCULATING,
62
+ } ),
63
+ decrementCalculating: () => ( {
64
+ type: DECREMENT_CALCULATING,
65
+ } ),
66
+ setCustomerId: ( customerId ) => ( {
67
+ type: SET_CUSTOMER_ID,
68
+ customerId,
69
+ } ),
70
+ setOrderId: ( orderId ) => ( {
71
+ type: SET_ORDER_ID,
72
+ orderId,
73
+ } ),
74
+ setShouldCreateAccount: ( shouldCreateAccount ) => ( {
75
+ type: SET_SHOULD_CREATE_ACCOUNT,
76
+ shouldCreateAccount,
77
+ } ),
78
+ setOrderNotes: ( orderNotes ) => ( {
79
+ type: SET_ORDER_NOTES,
80
+ orderNotes,
81
+ } ),
82
+ };
assets/js/base/context/cart-checkout/checkout-state/constants.js ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { getSetting } from '@woocommerce/settings';
5
+
6
+ /**
7
+ * @type {import("@woocommerce/type-defs/checkout").CheckoutStatusConstants}
8
+ */
9
+ export const STATUS = {
10
+ PRISTINE: 'pristine',
11
+ IDLE: 'idle',
12
+ PROCESSING: 'processing',
13
+ COMPLETE: 'complete',
14
+ BEFORE_PROCESSING: 'before_processing',
15
+ AFTER_PROCESSING: 'after_processing',
16
+ };
17
+
18
+ const checkoutData = getSetting( 'checkoutData', {
19
+ order_id: 0,
20
+ customer_id: 0,
21
+ } );
22
+
23
+ export const DEFAULT_STATE = {
24
+ redirectUrl: '',
25
+ status: STATUS.PRISTINE,
26
+ hasError: false,
27
+ calculatingCount: 0,
28
+ orderId: checkoutData.order_id,
29
+ orderNotes: '',
30
+ customerId: checkoutData.customer_id,
31
+ shouldCreateAccount: false,
32
+ processingResponse: null,
33
+ };
34
+
35
+ export const TYPES = {
36
+ SET_IDLE: 'set_idle',
37
+ SET_PRISTINE: 'set_pristine',
38
+ SET_REDIRECT_URL: 'set_redirect_url',
39
+ SET_COMPLETE: 'set_checkout_complete',
40
+ SET_BEFORE_PROCESSING: 'set_before_processing',
41
+ SET_AFTER_PROCESSING: 'set_after_processing',
42
+ SET_PROCESSING_RESPONSE: 'set_processing_response',
43
+ SET_PROCESSING: 'set_checkout_is_processing',
44
+ SET_HAS_ERROR: 'set_checkout_has_error',
45
+ SET_NO_ERROR: 'set_checkout_no_error',
46
+ SET_CUSTOMER_ID: 'set_checkout_customer_id',
47
+ SET_ORDER_ID: 'set_checkout_order_id',
48
+ SET_ORDER_NOTES: 'set_checkout_order_notes',
49
+ INCREMENT_CALCULATING: 'increment_calculating',
50
+ DECREMENT_CALCULATING: 'decrement_calculating',
51
+ };
assets/js/base/context/cart-checkout/checkout-state/event-emit.js ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import {
5
+ emitterCallback,
6
+ reducer,
7
+ emitEvent,
8
+ emitEventWithAbort,
9
+ } from '../../shared/event-emit';
10
+
11
+ const EMIT_TYPES = {
12
+ CHECKOUT_BEFORE_PROCESSING: 'checkout_before_processing',
13
+ CHECKOUT_AFTER_PROCESSING_WITH_SUCCESS:
14
+ 'checkout_after_processing_with_success',
15
+ CHECKOUT_AFTER_PROCESSING_WITH_ERROR:
16
+ 'checkout_after_processing_with_error',
17
+ };
18
+
19
+ /**
20
+ * Receives a reducer dispatcher and returns an object with the
21
+ * callback registration function for the checkout emit
22
+ * events.
23
+ *
24
+ * Calling the event registration function with the callback will register it
25
+ * for the event emitter and will return a dispatcher for removing the
26
+ * registered callback (useful for implementation in `useEffect`).
27
+ *
28
+ * @param {Function} dispatcher The emitter reducer dispatcher.
29
+ *
30
+ * @return {Object} An object with the checkout emmitter registration
31
+ */
32
+ const emitterSubscribers = ( dispatcher ) => ( {
33
+ onCheckoutAfterProcessingWithSuccess: emitterCallback(
34
+ EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_SUCCESS,
35
+ dispatcher
36
+ ),
37
+ onCheckoutAfterProcessingWithError: emitterCallback(
38
+ EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_ERROR,
39
+ dispatcher
40
+ ),
41
+ onCheckoutBeforeProcessing: emitterCallback(
42
+ EMIT_TYPES.CHECKOUT_BEFORE_PROCESSING,
43
+ dispatcher
44
+ ),
45
+ } );
46
+
47
+ export {
48
+ EMIT_TYPES,
49
+ emitterSubscribers,
50
+ reducer,
51
+ emitEvent,
52
+ emitEventWithAbort,
53
+ };
assets/js/base/context/{providers/cart-checkout/checkout-state/index.tsx → cart-checkout/checkout-state/index.js} RENAMED
@@ -11,45 +11,70 @@ import {
11
  useCallback,
12
  } from '@wordpress/element';
13
  import { __ } from '@wordpress/i18n';
14
- import { usePrevious } from '@woocommerce/base-hooks';
15
- import deprecated from '@wordpress/deprecated';
16
- import { isObject } from '@woocommerce/types';
 
 
 
17
 
18
  /**
19
  * Internal dependencies
20
  */
21
  import { actions } from './actions';
22
- import { reducer } from './reducer';
23
- import { getPaymentResultFromCheckoutResponse } from './utils';
24
- import {
25
- DEFAULT_STATE,
26
- STATUS,
27
- DEFAULT_CHECKOUT_STATE_DATA,
28
- } from './constants';
29
- import type {
30
- CheckoutStateDispatchActions,
31
- CheckoutStateContextType,
32
- } from './types';
33
  import {
34
  EMIT_TYPES,
35
- useEventEmitters,
36
  emitEvent,
37
  emitEventWithAbort,
38
  reducer as emitReducer,
39
  } from './event-emit';
40
- import { useValidationContext } from '../../validation';
41
- import { useStoreNotices } from '../../../hooks/use-store-notices';
42
- import { useStoreEvents } from '../../../hooks/use-store-events';
43
- import { useCheckoutNotices } from '../../../hooks/use-checkout-notices';
44
- import { useEmitResponse } from '../../../hooks/use-emit-response';
45
 
46
  /**
 
47
  * @typedef {import('@woocommerce/type-defs/contexts').CheckoutDataContext} CheckoutDataContext
48
  */
49
 
50
- const CheckoutContext = createContext( DEFAULT_CHECKOUT_STATE_DATA );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
 
52
- export const useCheckoutContext = (): CheckoutStateContextType => {
 
 
 
53
  return useContext( CheckoutContext );
54
  };
55
 
@@ -67,18 +92,15 @@ export const CheckoutStateProvider = ( {
67
  children,
68
  redirectUrl,
69
  isCart = false,
70
- }: {
71
- children: React.ReactChildren;
72
- redirectUrl: string;
73
- isCart: boolean;
74
- } ): JSX.Element => {
75
  // note, this is done intentionally so that the default state now has
76
  // the redirectUrl for when checkout is reset to PRISTINE state.
77
  DEFAULT_STATE.redirectUrl = redirectUrl;
78
  const [ checkoutState, dispatch ] = useReducer( reducer, DEFAULT_STATE );
 
 
79
  const { setValidationErrors } = useValidationContext();
80
  const { addErrorNotice, removeNotices } = useStoreNotices();
81
- const { dispatchCheckoutEvent } = useStoreEvents();
82
  const isCalculating = checkoutState.calculatingCount > 0;
83
  const {
84
  isSuccessResponse,
@@ -92,42 +114,31 @@ export const CheckoutStateProvider = ( {
92
  expressPaymentNotices,
93
  } = useCheckoutNotices();
94
 
95
- const [ observers, observerDispatch ] = useReducer( emitReducer, {} );
96
- const currentObservers = useRef( observers );
97
- const {
98
- onCheckoutAfterProcessingWithSuccess,
99
- onCheckoutAfterProcessingWithError,
100
- onCheckoutValidationBeforeProcessing,
101
- } = useEventEmitters( observerDispatch );
102
-
103
  // set observers on ref so it's always current.
104
  useEffect( () => {
105
  currentObservers.current = observers;
106
  }, [ observers ] );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
107
 
108
  /**
109
- * @deprecated use onCheckoutValidationBeforeProcessing instead
110
- *
111
- * To prevent the deprecation message being shown at render time
112
- * we need an extra function between useMemo and event emitters
113
- * so that the deprecated message gets shown only at invocation time.
114
- * (useMemo calls the passed function at render time)
115
- * See: https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/4039/commits/a502d1be8828848270993264c64220731b0ae181
116
  */
117
- const onCheckoutBeforeProcessing = useMemo( () => {
118
- return function (
119
- ...args: Parameters< typeof onCheckoutValidationBeforeProcessing >
120
- ) {
121
- deprecated( 'onCheckoutBeforeProcessing', {
122
- alternative: 'onCheckoutValidationBeforeProcessing',
123
- plugin: 'WooCommerce Blocks',
124
- } );
125
- return onCheckoutValidationBeforeProcessing( ...args );
126
- };
127
- }, [ onCheckoutValidationBeforeProcessing ] );
128
-
129
  const dispatchActions = useMemo(
130
- (): CheckoutStateDispatchActions => ( {
131
  resetCheckout: () => void dispatch( actions.setPristine() ),
132
  setRedirectUrl: ( url ) =>
133
  void dispatch( actions.setRedirectUrl( url ) ),
@@ -144,17 +155,35 @@ export const CheckoutStateProvider = ( {
144
  setOrderNotes: ( orderNotes ) =>
145
  void dispatch( actions.setOrderNotes( orderNotes ) ),
146
  setAfterProcessing: ( response ) => {
147
- const paymentResult = getPaymentResultFromCheckoutResponse(
148
- response
149
- );
150
-
151
- if ( paymentResult.redirectUrl ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  dispatch(
153
- actions.setRedirectUrl( paymentResult.redirectUrl )
 
 
154
  );
155
  }
156
- dispatch( actions.setProcessingResponse( paymentResult ) );
157
- dispatch( actions.setAfterProcessing() );
158
  },
159
  } ),
160
  []
@@ -167,7 +196,7 @@ export const CheckoutStateProvider = ( {
167
  removeNotices( 'error' );
168
  emitEvent(
169
  currentObservers.current,
170
- EMIT_TYPES.CHECKOUT_VALIDATION_BEFORE_PROCESSING,
171
  {}
172
  ).then( ( response ) => {
173
  if ( response !== true ) {
@@ -203,32 +232,12 @@ export const CheckoutStateProvider = ( {
203
  ) {
204
  return;
205
  }
206
-
207
- const handleErrorResponse = ( observerResponses: unknown[] ) => {
208
- let errorResponse = null;
209
- observerResponses.forEach( ( response ) => {
210
- if (
211
- isErrorResponse( response ) ||
212
- isFailResponse( response )
213
- ) {
214
- if ( response.message ) {
215
- const errorOptions = response.messageContext
216
- ? { context: response.messageContext }
217
- : undefined;
218
- errorResponse = response;
219
- addErrorNotice( response.message, errorOptions );
220
- }
221
- }
222
- } );
223
- return errorResponse;
224
- };
225
-
226
  if ( checkoutState.status === STATUS.AFTER_PROCESSING ) {
227
  const data = {
228
  redirectUrl: checkoutState.redirectUrl,
229
  orderId: checkoutState.orderId,
230
  customerId: checkoutState.customerId,
231
- orderNotes: checkoutState.orderNotes,
232
  processingResponse: checkoutState.processingResponse,
233
  };
234
  if ( checkoutState.hasError ) {
@@ -238,30 +247,34 @@ export const CheckoutStateProvider = ( {
238
  currentObservers.current,
239
  EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_ERROR,
240
  data
241
- ).then( ( observerResponses ) => {
242
- const errorResponse = handleErrorResponse(
243
- observerResponses
244
- );
245
- if ( errorResponse !== null ) {
 
 
 
 
 
 
 
246
  // irrecoverable error so set complete
247
- if ( ! shouldRetry( errorResponse ) ) {
248
- dispatch( actions.setComplete( errorResponse ) );
249
  } else {
250
  dispatch( actions.setIdle() );
251
  }
252
  } else {
253
  const hasErrorNotices =
254
  checkoutNotices.some(
255
- ( notice: { status: string } ) =>
256
- notice.status === 'error'
257
  ) ||
258
  expressPaymentNotices.some(
259
- ( notice: { status: string } ) =>
260
- notice.status === 'error'
261
  ) ||
262
  paymentNotices.some(
263
- ( notice: { status: string } ) =>
264
- notice.status === 'error'
265
  );
266
  if ( ! hasErrorNotices ) {
267
  // no error handling in place by anything so let's fall
@@ -285,43 +298,21 @@ export const CheckoutStateProvider = ( {
285
  currentObservers.current,
286
  EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_SUCCESS,
287
  data
288
- ).then( ( observerResponses: unknown[] ) => {
289
- let successResponse = null as null | Record<
290
- string,
291
- unknown
292
- >;
293
- let errorResponse = null as null | Record<
294
- string,
295
- unknown
296
- >;
297
-
298
- observerResponses.forEach( ( response ) => {
299
- if ( isSuccessResponse( response ) ) {
300
- // the last observer response always "wins" for success.
301
- successResponse = response;
302
- }
303
- if (
304
- isErrorResponse( response ) ||
305
- isFailResponse( response )
306
- ) {
307
- errorResponse = response;
308
- }
309
- } );
310
-
311
- if ( successResponse && ! errorResponse ) {
312
- dispatch( actions.setComplete( successResponse ) );
313
- } else if ( isObject( errorResponse ) ) {
314
- if ( errorResponse.message ) {
315
- const errorOptions = errorResponse.messageContext
316
- ? { context: errorResponse.messageContext }
317
  : undefined;
318
- addErrorNotice(
319
- errorResponse.message,
320
- errorOptions
321
- );
322
  }
323
- if ( ! shouldRetry( errorResponse ) ) {
324
- dispatch( actions.setComplete( errorResponse ) );
325
  } else {
326
  // this will set an error which will end up
327
  // triggering the onCheckoutAfterProcessingWithError emitter.
@@ -342,7 +333,7 @@ export const CheckoutStateProvider = ( {
342
  checkoutState.redirectUrl,
343
  checkoutState.orderId,
344
  checkoutState.customerId,
345
- checkoutState.orderNotes,
346
  checkoutState.processingResponse,
347
  previousStatus,
348
  previousHasError,
@@ -358,11 +349,13 @@ export const CheckoutStateProvider = ( {
358
  ] );
359
 
360
  const onSubmit = useCallback( () => {
361
- dispatchCheckoutEvent( 'submit' );
362
  dispatch( actions.setBeforeProcessing() );
363
- }, [ dispatchCheckoutEvent ] );
364
 
365
- const checkoutData: CheckoutStateContextType = {
 
 
 
366
  onSubmit,
367
  isComplete: checkoutState.status === STATUS.COMPLETE,
368
  isIdle: checkoutState.status === STATUS.IDLE,
@@ -372,10 +365,9 @@ export const CheckoutStateProvider = ( {
372
  isAfterProcessing: checkoutState.status === STATUS.AFTER_PROCESSING,
373
  hasError: checkoutState.hasError,
374
  redirectUrl: checkoutState.redirectUrl,
375
- onCheckoutBeforeProcessing,
376
- onCheckoutValidationBeforeProcessing,
377
  onCheckoutAfterProcessingWithSuccess,
378
  onCheckoutAfterProcessingWithError,
 
379
  dispatchActions,
380
  isCart,
381
  orderId: checkoutState.orderId,
11
  useCallback,
12
  } from '@wordpress/element';
13
  import { __ } from '@wordpress/i18n';
14
+ import {
15
+ useCheckoutNotices,
16
+ useStoreNotices,
17
+ useEmitResponse,
18
+ usePrevious,
19
+ } from '@woocommerce/base-hooks';
20
 
21
  /**
22
  * Internal dependencies
23
  */
24
  import { actions } from './actions';
25
+ import { reducer, prepareResponseData } from './reducer';
26
+ import { DEFAULT_STATE, STATUS } from './constants';
 
 
 
 
 
 
 
 
 
27
  import {
28
  EMIT_TYPES,
29
+ emitterSubscribers,
30
  emitEvent,
31
  emitEventWithAbort,
32
  reducer as emitReducer,
33
  } from './event-emit';
34
+ import { useValidationContext } from '../../shared/validation';
 
 
 
 
35
 
36
  /**
37
+ * @typedef {import('@woocommerce/type-defs/checkout').CheckoutDispatchActions} CheckoutDispatchActions
38
  * @typedef {import('@woocommerce/type-defs/contexts').CheckoutDataContext} CheckoutDataContext
39
  */
40
 
41
+ const CheckoutContext = createContext( {
42
+ isComplete: false,
43
+ isIdle: false,
44
+ isCalculating: false,
45
+ isProcessing: false,
46
+ isBeforeProcessing: false,
47
+ isAfterProcessing: false,
48
+ hasError: false,
49
+ redirectUrl: '',
50
+ orderId: 0,
51
+ orderNotes: '',
52
+ customerId: 0,
53
+ onSubmit: () => void null,
54
+ onCheckoutAfterProcessingWithSuccess: ( callback ) => void callback,
55
+ onCheckoutAfterProcessingWithError: ( callback ) => void callback,
56
+ onCheckoutBeforeProcessing: ( callback ) => void callback,
57
+ dispatchActions: {
58
+ resetCheckout: () => void null,
59
+ setRedirectUrl: ( url ) => void url,
60
+ setHasError: ( hasError ) => void hasError,
61
+ setAfterProcessing: ( response ) => void response,
62
+ incrementCalculating: () => void null,
63
+ decrementCalculating: () => void null,
64
+ setCustomerId: ( id ) => void id,
65
+ setOrderId: ( id ) => void id,
66
+ setOrderNotes: ( orderNotes ) => void orderNotes,
67
+ },
68
+ hasOrder: false,
69
+ isCart: false,
70
+ shouldCreateAccount: false,
71
+ setShouldCreateAccount: ( value ) => void value,
72
+ } );
73
 
74
+ /**
75
+ * @return {CheckoutDataContext} Returns the checkout data context value
76
+ */
77
+ export const useCheckoutContext = () => {
78
  return useContext( CheckoutContext );
79
  };
80
 
92
  children,
93
  redirectUrl,
94
  isCart = false,
95
+ } ) => {
 
 
 
 
96
  // note, this is done intentionally so that the default state now has
97
  // the redirectUrl for when checkout is reset to PRISTINE state.
98
  DEFAULT_STATE.redirectUrl = redirectUrl;
99
  const [ checkoutState, dispatch ] = useReducer( reducer, DEFAULT_STATE );
100
+ const [ observers, subscriber ] = useReducer( emitReducer, {} );
101
+ const currentObservers = useRef( observers );
102
  const { setValidationErrors } = useValidationContext();
103
  const { addErrorNotice, removeNotices } = useStoreNotices();
 
104
  const isCalculating = checkoutState.calculatingCount > 0;
105
  const {
106
  isSuccessResponse,
114
  expressPaymentNotices,
115
  } = useCheckoutNotices();
116
 
 
 
 
 
 
 
 
 
117
  // set observers on ref so it's always current.
118
  useEffect( () => {
119
  currentObservers.current = observers;
120
  }, [ observers ] );
121
+ const onCheckoutAfterProcessingWithSuccess = useMemo(
122
+ () =>
123
+ emitterSubscribers( subscriber )
124
+ .onCheckoutAfterProcessingWithSuccess,
125
+ [ subscriber ]
126
+ );
127
+ const onCheckoutAfterProcessingWithError = useMemo(
128
+ () =>
129
+ emitterSubscribers( subscriber ).onCheckoutAfterProcessingWithError,
130
+ [ subscriber ]
131
+ );
132
+ const onCheckoutBeforeProcessing = useMemo(
133
+ () => emitterSubscribers( subscriber ).onCheckoutBeforeProcessing,
134
+ [ subscriber ]
135
+ );
136
 
137
  /**
138
+ * @type {CheckoutDispatchActions}
 
 
 
 
 
 
139
  */
 
 
 
 
 
 
 
 
 
 
 
 
140
  const dispatchActions = useMemo(
141
+ () => ( {
142
  resetCheckout: () => void dispatch( actions.setPristine() ),
143
  setRedirectUrl: ( url ) =>
144
  void dispatch( actions.setRedirectUrl( url ) ),
155
  setOrderNotes: ( orderNotes ) =>
156
  void dispatch( actions.setOrderNotes( orderNotes ) ),
157
  setAfterProcessing: ( response ) => {
158
+ // capture general error message if this is an error response.
159
+ if (
160
+ ! response.payment_result &&
161
+ response.message &&
162
+ response?.data?.status !== 200
163
+ ) {
164
+ response.payment_result = {
165
+ ...response.payment_result,
166
+ message: response.message,
167
+ };
168
+ }
169
+ if ( response.payment_result ) {
170
+ if (
171
+ // eslint-disable-next-line camelcase
172
+ response.payment_result?.redirect_url
173
+ ) {
174
+ dispatch(
175
+ actions.setRedirectUrl(
176
+ response.payment_result.redirect_url
177
+ )
178
+ );
179
+ }
180
  dispatch(
181
+ actions.setProcessingResponse(
182
+ prepareResponseData( response.payment_result )
183
+ )
184
  );
185
  }
186
+ void dispatch( actions.setAfterProcessing() );
 
187
  },
188
  } ),
189
  []
196
  removeNotices( 'error' );
197
  emitEvent(
198
  currentObservers.current,
199
+ EMIT_TYPES.CHECKOUT_BEFORE_PROCESSING,
200
  {}
201
  ).then( ( response ) => {
202
  if ( response !== true ) {
232
  ) {
233
  return;
234
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
235
  if ( checkoutState.status === STATUS.AFTER_PROCESSING ) {
236
  const data = {
237
  redirectUrl: checkoutState.redirectUrl,
238
  orderId: checkoutState.orderId,
239
  customerId: checkoutState.customerId,
240
+ customerNote: checkoutState.customerNote,
241
  processingResponse: checkoutState.processingResponse,
242
  };
243
  if ( checkoutState.hasError ) {
247
  currentObservers.current,
248
  EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_ERROR,
249
  data
250
+ ).then( ( response ) => {
251
+ if (
252
+ isErrorResponse( response ) ||
253
+ isFailResponse( response )
254
+ ) {
255
+ if ( response.message ) {
256
+ const errorOptions = {
257
+ id: response?.messageContext,
258
+ context: response?.messageContext,
259
+ };
260
+ addErrorNotice( response.message, errorOptions );
261
+ }
262
  // irrecoverable error so set complete
263
+ if ( ! shouldRetry( response ) ) {
264
+ dispatch( actions.setComplete( response ) );
265
  } else {
266
  dispatch( actions.setIdle() );
267
  }
268
  } else {
269
  const hasErrorNotices =
270
  checkoutNotices.some(
271
+ ( notice ) => notice.status === 'error'
 
272
  ) ||
273
  expressPaymentNotices.some(
274
+ ( notice ) => notice.status === 'error'
 
275
  ) ||
276
  paymentNotices.some(
277
+ ( notice ) => notice.status === 'error'
 
278
  );
279
  if ( ! hasErrorNotices ) {
280
  // no error handling in place by anything so let's fall
298
  currentObservers.current,
299
  EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_SUCCESS,
300
  data
301
+ ).then( ( response ) => {
302
+ if ( isSuccessResponse( response ) ) {
303
+ dispatch( actions.setComplete( response ) );
304
+ } else if (
305
+ isErrorResponse( response ) ||
306
+ isFailResponse( response )
307
+ ) {
308
+ if ( response.message ) {
309
+ const errorOptions = response.messageContext
310
+ ? { context: response.messageContext }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
311
  : undefined;
312
+ addErrorNotice( response.message, errorOptions );
 
 
 
313
  }
314
+ if ( ! shouldRetry( response ) ) {
315
+ dispatch( actions.setComplete( response ) );
316
  } else {
317
  // this will set an error which will end up
318
  // triggering the onCheckoutAfterProcessingWithError emitter.
333
  checkoutState.redirectUrl,
334
  checkoutState.orderId,
335
  checkoutState.customerId,
336
+ checkoutState.customerNote,
337
  checkoutState.processingResponse,
338
  previousStatus,
339
  previousHasError,
349
  ] );
350
 
351
  const onSubmit = useCallback( () => {
 
352
  dispatch( actions.setBeforeProcessing() );
353
+ }, [] );
354
 
355
+ /**
356
+ * @type {CheckoutDataContext}
357
+ */
358
+ const checkoutData = {
359
  onSubmit,
360
  isComplete: checkoutState.status === STATUS.COMPLETE,
361
  isIdle: checkoutState.status === STATUS.IDLE,
365
  isAfterProcessing: checkoutState.status === STATUS.AFTER_PROCESSING,
366
  hasError: checkoutState.hasError,
367
  redirectUrl: checkoutState.redirectUrl,
 
 
368
  onCheckoutAfterProcessingWithSuccess,
369
  onCheckoutAfterProcessingWithError,
370
+ onCheckoutBeforeProcessing,
371
  dispatchActions,
372
  isCart,
373
  orderId: checkoutState.orderId,
assets/js/base/context/cart-checkout/checkout-state/reducer.js ADDED
@@ -0,0 +1,235 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { decodeEntities } from '@wordpress/html-entities';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { TYPES, DEFAULT_STATE, STATUS } from './constants';
10
+
11
+ const {
12
+ SET_PRISTINE,
13
+ SET_IDLE,
14
+ SET_PROCESSING,
15
+ SET_BEFORE_PROCESSING,
16
+ SET_AFTER_PROCESSING,
17
+ SET_PROCESSING_RESPONSE,
18
+ SET_REDIRECT_URL,
19
+ SET_COMPLETE,
20
+ SET_HAS_ERROR,
21
+ SET_NO_ERROR,
22
+ INCREMENT_CALCULATING,
23
+ DECREMENT_CALCULATING,
24
+ SET_CUSTOMER_ID,
25
+ SET_ORDER_ID,
26
+ SET_ORDER_NOTES,
27
+ SET_SHOULD_CREATE_ACCOUNT,
28
+ } = TYPES;
29
+
30
+ const {
31
+ PRISTINE,
32
+ IDLE,
33
+ PROCESSING,
34
+ BEFORE_PROCESSING,
35
+ AFTER_PROCESSING,
36
+ COMPLETE,
37
+ } = STATUS;
38
+
39
+ /**
40
+ * Prepares the payment_result data from the server checkout endpoint response.
41
+ *
42
+ * @param {Object} data The value of `payment_result` from the checkout
43
+ * processing endpoint response.
44
+ * @param {string} data.message If there was a general error message it will appear
45
+ * on this property.
46
+ * @param {string} data.payment_status The payment status. One of 'success', 'failure',
47
+ * 'pending', 'error'.
48
+ * @param {Array<Object>} data.payment_details An array of Objects with a 'key' property that is a
49
+ * string and value property that is a string. These are
50
+ * converted to a flat object where the key becomes the
51
+ * object property and value the property value.
52
+ *
53
+ * @return {Object} A new object with 'paymentStatus', and 'paymentDetails' as the properties.
54
+ */
55
+ export const prepareResponseData = ( data ) => {
56
+ const responseData = {
57
+ message: data?.message || '',
58
+ paymentStatus: data.payment_status,
59
+ paymentDetails: {},
60
+ };
61
+ if ( Array.isArray( data.payment_details ) ) {
62
+ data.payment_details.forEach( ( { key, value } ) => {
63
+ responseData.paymentDetails[ key ] = decodeEntities( value );
64
+ } );
65
+ }
66
+ return responseData;
67
+ };
68
+
69
+ /**
70
+ * Reducer for the checkout state
71
+ *
72
+ * @param {Object} state Current state.
73
+ * @param {Object} action Incoming action object.
74
+ * @param {string} action.url URL passed in.
75
+ * @param {string} action.type Type of action.
76
+ * @param {string} action.customerId Customer ID.
77
+ * @param {string} action.orderId Order ID.
78
+ * @param {Array} action.orderNotes Order notes.
79
+ * @param {boolean} action.shouldCreateAccount True if shopper has requested a user account (signup checkbox).
80
+ * @param {Object} action.data Other action payload.
81
+ */
82
+ export const reducer = (
83
+ state = DEFAULT_STATE,
84
+ { url, type, customerId, orderId, orderNotes, shouldCreateAccount, data }
85
+ ) => {
86
+ let newState = state;
87
+ switch ( type ) {
88
+ case SET_PRISTINE:
89
+ newState = DEFAULT_STATE;
90
+ break;
91
+ case SET_IDLE:
92
+ newState =
93
+ state.status !== IDLE
94
+ ? {
95
+ ...state,
96
+ status: IDLE,
97
+ }
98
+ : state;
99
+ break;
100
+ case SET_REDIRECT_URL:
101
+ newState =
102
+ url !== state.url
103
+ ? {
104
+ ...state,
105
+ redirectUrl: url,
106
+ }
107
+ : state;
108
+ break;
109
+ case SET_PROCESSING_RESPONSE:
110
+ newState = {
111
+ ...state,
112
+ processingResponse: data,
113
+ };
114
+ break;
115
+
116
+ case SET_COMPLETE:
117
+ newState =
118
+ state.status !== COMPLETE
119
+ ? {
120
+ ...state,
121
+ status: COMPLETE,
122
+ redirectUrl: data?.redirectUrl || state.redirectUrl,
123
+ }
124
+ : state;
125
+ break;
126
+ case SET_PROCESSING:
127
+ newState =
128
+ state.status !== PROCESSING
129
+ ? {
130
+ ...state,
131
+ status: PROCESSING,
132
+ hasError: false,
133
+ }
134
+ : state;
135
+ // clear any error state.
136
+ newState =
137
+ newState.hasError === false
138
+ ? newState
139
+ : { ...newState, hasError: false };
140
+ break;
141
+ case SET_BEFORE_PROCESSING:
142
+ newState =
143
+ state.status !== BEFORE_PROCESSING
144
+ ? {
145
+ ...state,
146
+ status: BEFORE_PROCESSING,
147
+ hasError: false,
148
+ }
149
+ : state;
150
+ break;
151
+ case SET_AFTER_PROCESSING:
152
+ newState =
153
+ state.status !== AFTER_PROCESSING
154
+ ? {
155
+ ...state,
156
+ status: AFTER_PROCESSING,
157
+ }
158
+ : state;
159
+ break;
160
+ case SET_HAS_ERROR:
161
+ newState = state.hasError
162
+ ? state
163
+ : {
164
+ ...state,
165
+ hasError: true,
166
+ };
167
+ newState =
168
+ state.status === PROCESSING ||
169
+ state.status === BEFORE_PROCESSING
170
+ ? {
171
+ ...newState,
172
+ status: IDLE,
173
+ }
174
+ : newState;
175
+ break;
176
+ case SET_NO_ERROR:
177
+ newState = state.hasError
178
+ ? {
179
+ ...state,
180
+ hasError: false,
181
+ }
182
+ : state;
183
+ break;
184
+ case INCREMENT_CALCULATING:
185
+ newState = {
186
+ ...state,
187
+ calculatingCount: state.calculatingCount + 1,
188
+ };
189
+ break;
190
+ case DECREMENT_CALCULATING:
191
+ newState = {
192
+ ...state,
193
+ calculatingCount: Math.max( 0, state.calculatingCount - 1 ),
194
+ };
195
+ break;
196
+ case SET_CUSTOMER_ID:
197
+ newState = {
198
+ ...state,
199
+ customerId,
200
+ };
201
+ break;
202
+ case SET_ORDER_ID:
203
+ newState = {
204
+ ...state,
205
+ orderId,
206
+ };
207
+ break;
208
+ case SET_SHOULD_CREATE_ACCOUNT:
209
+ if ( shouldCreateAccount !== state.shouldCreateAccount ) {
210
+ newState = {
211
+ ...state,
212
+ shouldCreateAccount,
213
+ };
214
+ }
215
+ break;
216
+ case SET_ORDER_NOTES:
217
+ if ( state.orderNotes !== orderNotes ) {
218
+ newState = {
219
+ ...state,
220
+ orderNotes,
221
+ };
222
+ }
223
+ break;
224
+ }
225
+ // automatically update state to idle from pristine as soon as it
226
+ // initially changes.
227
+ if (
228
+ newState !== state &&
229
+ type !== SET_PRISTINE &&
230
+ newState.status === PRISTINE
231
+ ) {
232
+ newState.status = IDLE;
233
+ }
234
+ return newState;
235
+ };
assets/js/base/context/{providers/cart-checkout → cart-checkout}/checkout/index.js RENAMED
@@ -2,9 +2,8 @@
2
  * External dependencies
3
  */
4
  import { PluginArea } from '@wordpress/plugins';
5
- import { CURRENT_USER_IS_ADMIN } from '@woocommerce/settings';
6
  import BlockErrorBoundary from '@woocommerce/base-components/block-error-boundary';
7
- import { SlotFillProvider } from '@woocommerce/blocks-checkout';
8
 
9
  /**
10
  * Internal dependencies
@@ -38,18 +37,16 @@ export const CheckoutProvider = ( {
38
  <CustomerDataProvider>
39
  <ShippingDataProvider>
40
  <PaymentMethodDataProvider>
41
- <SlotFillProvider>
42
- { children }
43
- { /* If the current user is an admin, we let BlockErrorBoundary render
44
- the error, or we simply die silently. */ }
45
- <BlockErrorBoundary
46
- renderError={
47
- CURRENT_USER_IS_ADMIN ? null : () => null
48
- }
49
- >
50
- <PluginArea scope="woocommerce-checkout" />
51
- </BlockErrorBoundary>
52
- </SlotFillProvider>
53
  <CheckoutProcessor />
54
  </PaymentMethodDataProvider>
55
  </ShippingDataProvider>
2
  * External dependencies
3
  */
4
  import { PluginArea } from '@wordpress/plugins';
5
+ import { CURRENT_USER_IS_ADMIN } from '@woocommerce/block-settings';
6
  import BlockErrorBoundary from '@woocommerce/base-components/block-error-boundary';
 
7
 
8
  /**
9
  * Internal dependencies
37
  <CustomerDataProvider>
38
  <ShippingDataProvider>
39
  <PaymentMethodDataProvider>
40
+ { children }
41
+ { /* If the current user is an admin, we let BlockErrorBoundary render
42
+ the error, or we simply die silently. */ }
43
+ <BlockErrorBoundary
44
+ renderError={
45
+ CURRENT_USER_IS_ADMIN ? null : () => null
46
+ }
47
+ >
48
+ <PluginArea />
49
+ </BlockErrorBoundary>
 
 
50
  <CheckoutProcessor />
51
  </PaymentMethodDataProvider>
52
  </ShippingDataProvider>
assets/js/base/context/{providers/cart-checkout → cart-checkout}/checkout/processor/index.js RENAMED
@@ -3,6 +3,13 @@
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import triggerFetch from '@wordpress/api-fetch';
 
 
 
 
 
 
 
6
  import {
7
  useEffect,
8
  useRef,
@@ -10,22 +17,12 @@ import {
10
  useState,
11
  useMemo,
12
  } from '@wordpress/element';
13
- import {
14
- emptyHiddenAddressFields,
15
- formatStoreApiErrorMessage,
16
- } from '@woocommerce/base-utils';
17
 
18
  /**
19
  * Internal dependencies
20
  */
21
  import { preparePaymentData } from './utils';
22
- import { useCheckoutContext } from '../../checkout-state';
23
- import { useShippingDataContext } from '../../shipping';
24
- import { useCustomerDataContext } from '../../customer';
25
- import { usePaymentMethodDataContext } from '../../payment-methods';
26
- import { useValidationContext } from '../../../validation';
27
- import { useStoreCart } from '../../../../hooks/cart/use-store-cart';
28
- import { useStoreNotices } from '../../../../hooks/use-store-notices';
29
 
30
  /**
31
  * CheckoutProcessor component.
@@ -37,7 +34,7 @@ import { useStoreNotices } from '../../../../hooks/use-store-notices';
37
  const CheckoutProcessor = () => {
38
  const {
39
  hasError: checkoutHasError,
40
- onCheckoutValidationBeforeProcessing,
41
  dispatchActions,
42
  redirectUrl,
43
  isProcessing: checkoutIsProcessing,
@@ -52,7 +49,6 @@ const CheckoutProcessor = () => {
52
  const { cartNeedsPayment, receiveCart } = useStoreCart();
53
  const {
54
  activePaymentMethod,
55
- isExpressPaymentMethodActive,
56
  currentStatus: currentPaymentStatus,
57
  paymentMethodData,
58
  expressPaymentMethods,
@@ -64,6 +60,9 @@ const CheckoutProcessor = () => {
64
  const currentShippingAddress = useRef( shippingAddress );
65
  const currentRedirectUrl = useRef( redirectUrl );
66
  const [ isProcessingOrder, setIsProcessingOrder ] = useState( false );
 
 
 
67
 
68
  const paymentMethodId = useMemo( () => {
69
  const merged = { ...expressPaymentMethods, ...paymentMethods };
@@ -71,20 +70,20 @@ const CheckoutProcessor = () => {
71
  }, [ activePaymentMethod, expressPaymentMethods, paymentMethods ] );
72
 
73
  const checkoutWillHaveError =
74
- ( hasValidationErrors && ! isExpressPaymentMethodActive ) ||
75
  currentPaymentStatus.hasError ||
76
  shippingErrorStatus.hasError;
77
 
78
  // If express payment method is active, let's suppress notices
79
  useEffect( () => {
80
- setIsSuppressed( isExpressPaymentMethodActive );
81
- }, [ isExpressPaymentMethodActive, setIsSuppressed ] );
82
 
83
  useEffect( () => {
84
  if (
85
  checkoutWillHaveError !== checkoutHasError &&
86
  ( checkoutIsProcessing || checkoutIsBeforeProcessing ) &&
87
- ! isExpressPaymentMethodActive
88
  ) {
89
  dispatchActions.setHasError( checkoutWillHaveError );
90
  }
@@ -93,7 +92,7 @@ const CheckoutProcessor = () => {
93
  checkoutHasError,
94
  checkoutIsProcessing,
95
  checkoutIsBeforeProcessing,
96
- isExpressPaymentMethodActive,
97
  dispatchActions,
98
  ] );
99
 
@@ -144,33 +143,29 @@ const CheckoutProcessor = () => {
144
 
145
  useEffect( () => {
146
  let unsubscribeProcessing;
147
- if ( ! isExpressPaymentMethodActive ) {
148
- unsubscribeProcessing = onCheckoutValidationBeforeProcessing(
149
  checkValidation,
150
  0
151
  );
152
  }
153
  return () => {
154
- if ( ! isExpressPaymentMethodActive ) {
155
  unsubscribeProcessing();
156
  }
157
  };
158
  }, [
159
- onCheckoutValidationBeforeProcessing,
160
  checkValidation,
161
- isExpressPaymentMethodActive,
162
  ] );
163
 
164
  const processOrder = useCallback( () => {
165
  setIsProcessingOrder( true );
166
  removeNotice( 'checkout' );
167
  let data = {
168
- billing_address: emptyHiddenAddressFields(
169
- currentBillingData.current
170
- ),
171
- shipping_address: emptyHiddenAddressFields(
172
- currentShippingAddress.current
173
- ),
174
  customer_note: orderNotes,
175
  should_create_account: shouldCreateAccount,
176
  };
@@ -205,12 +200,21 @@ const CheckoutProcessor = () => {
205
  fetchResponse.json().then( function ( response ) {
206
  if ( ! fetchResponse.ok ) {
207
  // We received an error response.
208
- addErrorNotice(
209
- formatStoreApiErrorMessage( response ),
210
- {
211
  id: 'checkout',
212
- }
213
- );
 
 
 
 
 
 
 
 
 
 
214
  dispatchActions.setHasError();
215
  }
216
  dispatchActions.setAfterProcessing( response );
@@ -233,18 +237,6 @@ const CheckoutProcessor = () => {
233
  if ( response.data?.cart ) {
234
  receiveCart( response.data.cart );
235
  }
236
- addErrorNotice( formatStoreApiErrorMessage( response ), {
237
- id: 'checkout',
238
- } );
239
-
240
- response.additional_errors?.forEach?.(
241
- ( additionalError ) => {
242
- addErrorNotice( additionalError.message, {
243
- id: additionalError.error_code,
244
- } );
245
- }
246
- );
247
-
248
  dispatchActions.setHasError();
249
  dispatchActions.setAfterProcessing( response );
250
  setIsProcessingOrder( false );
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import triggerFetch from '@wordpress/api-fetch';
6
+ import {
7
+ useCheckoutContext,
8
+ useShippingDataContext,
9
+ useCustomerDataContext,
10
+ usePaymentMethodDataContext,
11
+ useValidationContext,
12
+ } from '@woocommerce/base-context';
13
  import {
14
  useEffect,
15
  useRef,
17
  useState,
18
  useMemo,
19
  } from '@wordpress/element';
20
+ import { useStoreCart, useStoreNotices } from '@woocommerce/base-hooks';
 
 
 
21
 
22
  /**
23
  * Internal dependencies
24
  */
25
  import { preparePaymentData } from './utils';
 
 
 
 
 
 
 
26
 
27
  /**
28
  * CheckoutProcessor component.
34
  const CheckoutProcessor = () => {
35
  const {
36
  hasError: checkoutHasError,
37
+ onCheckoutBeforeProcessing,
38
  dispatchActions,
39
  redirectUrl,
40
  isProcessing: checkoutIsProcessing,
49
  const { cartNeedsPayment, receiveCart } = useStoreCart();
50
  const {
51
  activePaymentMethod,
 
52
  currentStatus: currentPaymentStatus,
53
  paymentMethodData,
54
  expressPaymentMethods,
60
  const currentShippingAddress = useRef( shippingAddress );
61
  const currentRedirectUrl = useRef( redirectUrl );
62
  const [ isProcessingOrder, setIsProcessingOrder ] = useState( false );
63
+ const expressPaymentMethodActive = Object.keys(
64
+ expressPaymentMethods
65
+ ).includes( activePaymentMethod );
66
 
67
  const paymentMethodId = useMemo( () => {
68
  const merged = { ...expressPaymentMethods, ...paymentMethods };
70
  }, [ activePaymentMethod, expressPaymentMethods, paymentMethods ] );
71
 
72
  const checkoutWillHaveError =
73
+ ( hasValidationErrors && ! expressPaymentMethodActive ) ||
74
  currentPaymentStatus.hasError ||
75
  shippingErrorStatus.hasError;
76
 
77
  // If express payment method is active, let's suppress notices
78
  useEffect( () => {
79
+ setIsSuppressed( expressPaymentMethodActive );
80
+ }, [ expressPaymentMethodActive, setIsSuppressed ] );
81
 
82
  useEffect( () => {
83
  if (
84
  checkoutWillHaveError !== checkoutHasError &&
85
  ( checkoutIsProcessing || checkoutIsBeforeProcessing ) &&
86
+ ! expressPaymentMethodActive
87
  ) {
88
  dispatchActions.setHasError( checkoutWillHaveError );
89
  }
92
  checkoutHasError,
93
  checkoutIsProcessing,
94
  checkoutIsBeforeProcessing,
95
+ expressPaymentMethodActive,
96
  dispatchActions,
97
  ] );
98
 
143
 
144
  useEffect( () => {
145
  let unsubscribeProcessing;
146
+ if ( ! expressPaymentMethodActive ) {
147
+ unsubscribeProcessing = onCheckoutBeforeProcessing(
148
  checkValidation,
149
  0
150
  );
151
  }
152
  return () => {
153
+ if ( ! expressPaymentMethodActive ) {
154
  unsubscribeProcessing();
155
  }
156
  };
157
  }, [
158
+ onCheckoutBeforeProcessing,
159
  checkValidation,
160
+ expressPaymentMethodActive,
161
  ] );
162
 
163
  const processOrder = useCallback( () => {
164
  setIsProcessingOrder( true );
165
  removeNotice( 'checkout' );
166
  let data = {
167
+ billing_address: currentBillingData.current,
168
+ shipping_address: currentShippingAddress.current,
 
 
 
 
169
  customer_note: orderNotes,
170
  should_create_account: shouldCreateAccount,
171
  };
200
  fetchResponse.json().then( function ( response ) {
201
  if ( ! fetchResponse.ok ) {
202
  // We received an error response.
203
+ if ( response.body && response.body.message ) {
204
+ addErrorNotice( response.body.message, {
 
205
  id: 'checkout',
206
+ } );
207
+ } else {
208
+ addErrorNotice(
209
+ __(
210
+ 'Something went wrong. Please contact us to get assistance.',
211
+ 'woo-gutenberg-products-block'
212
+ ),
213
+ {
214
+ id: 'checkout',
215
+ }
216
+ );
217
+ }
218
  dispatchActions.setHasError();
219
  }
220
  dispatchActions.setAfterProcessing( response );
237
  if ( response.data?.cart ) {
238
  receiveCart( response.data.cart );
239
  }
 
 
 
 
 
 
 
 
 
 
 
 
240
  dispatchActions.setHasError();
241
  dispatchActions.setAfterProcessing( response );
242
  setIsProcessingOrder( false );
assets/js/base/context/{providers/cart-checkout → cart-checkout}/checkout/processor/utils.js RENAMED
File without changes
assets/js/base/context/{providers/cart-checkout → cart-checkout}/customer/index.js RENAMED
@@ -2,11 +2,7 @@
2
  * External dependencies
3
  */
4
  import { createContext, useContext } from '@wordpress/element';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import { useCustomerData } from '../../../hooks/use-customer-data';
10
 
11
  /**
12
  * @typedef {import('@woocommerce/type-defs/contexts').CustomerDataContext} CustomerDataContext
2
  * External dependencies
3
  */
4
  import { createContext, useContext } from '@wordpress/element';
5
+ import { useCustomerData } from '@woocommerce/base-hooks';
 
 
 
 
6
 
7
  /**
8
  * @typedef {import('@woocommerce/type-defs/contexts').CustomerDataContext} CustomerDataContext
assets/js/base/context/{providers/cart-checkout → cart-checkout}/index.js RENAMED
File without changes
assets/js/base/context/cart-checkout/payment-methods/actions.js ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { ACTION_TYPES } from './constants';
5
+
6
+ const {
7
+ ERROR,
8
+ FAILED,
9
+ SUCCESS,
10
+ SET_REGISTERED_PAYMENT_METHODS,
11
+ SET_REGISTERED_EXPRESS_PAYMENT_METHODS,
12
+ SET_SHOULD_SAVE_PAYMENT_METHOD,
13
+ } = ACTION_TYPES;
14
+
15
+ /**
16
+ * Used to dispatch a status update only for the given type.
17
+ *
18
+ * @param {string} type
19
+ *
20
+ * @return {Object} The action object.
21
+ */
22
+ export const statusOnly = ( type ) => ( { type } );
23
+
24
+ /**
25
+ * Used to dispatch an error message along with setting current payment status
26
+ * to ERROR.
27
+ *
28
+ * @param {string} errorMessage Whatever error message accompanying the error
29
+ * condition.
30
+ *
31
+ * @return {Object} The action object.
32
+ */
33
+ export const error = ( errorMessage ) => ( {
34
+ type: ERROR,
35
+ errorMessage,
36
+ } );
37
+
38
+ /**
39
+ * Used to dispatch a payment failed status update.
40
+ *
41
+ * @param {Object} action Incoming data for the
42
+ * action.
43
+ * @param {string} action.errorMessage Any message accompanying
44
+ * the failed payment.
45
+ * @param {Object} action.paymentMethodData Arbitrary extra
46
+ * information about the
47
+ * payment method in use
48
+ * (varies per payment
49
+ * method).
50
+ *
51
+ * @return {Object} An action object.
52
+ */
53
+ export const failed = ( { errorMessage, paymentMethodData } ) => ( {
54
+ type: FAILED,
55
+ errorMessage,
56
+ paymentMethodData,
57
+ } );
58
+
59
+ /**
60
+ * Used to dispatch a payment success status update.
61
+ *
62
+ * @param {Object} action Incoming data for the
63
+ * action.
64
+ * @param {Object} action.paymentMethodData Arbitrary extra
65
+ * information about the
66
+ * payment method in use
67
+ * (varies per payment
68
+ * method).
69
+ *
70
+ * @return {Object} An action object.
71
+ */
72
+ export const success = ( { paymentMethodData } ) => ( {
73
+ type: SUCCESS,
74
+ paymentMethodData,
75
+ } );
76
+
77
+ /**
78
+ * Used to dispatch an action for updating a registered payment method in the
79
+ * state.
80
+ *
81
+ * @param {Object} paymentMethods Payment methods to register.
82
+ * @return {Object} An action object.
83
+ */
84
+ export const setRegisteredPaymentMethods = ( paymentMethods ) => ( {
85
+ type: SET_REGISTERED_PAYMENT_METHODS,
86
+ paymentMethods,
87
+ } );
88
+
89
+ /**
90
+ * Used to dispatch an action for updating a registered express payment
91
+ * method in the state.
92
+ *
93
+ * @param {Object} paymentMethods Payment methods to register.
94
+ * @return {Object} An action object.
95
+ */
96
+ export const setRegisteredExpressPaymentMethods = ( paymentMethods ) => ( {
97
+ type: SET_REGISTERED_EXPRESS_PAYMENT_METHODS,
98
+ paymentMethods,
99
+ } );
100
+
101
+ /**
102
+ * Set a flag indicating that the payment method info (e.g. a payment card)
103
+ * should be saved to user account after order completion.
104
+ *
105
+ * @param {boolean} shouldSavePaymentMethod
106
+ * @return {Object} An action object.
107
+ */
108
+ export const setShouldSavePaymentMethod = ( shouldSavePaymentMethod ) => ( {
109
+ type: SET_SHOULD_SAVE_PAYMENT_METHOD,
110
+ shouldSavePaymentMethod,
111
+ } );
assets/js/base/context/cart-checkout/payment-methods/constants.js ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * @typedef {import('@woocommerce/type-defs/contexts').PaymentMethodDataContext} PaymentMethodDataContext
3
+ */
4
+
5
+ export const STATUS = {
6
+ PRISTINE: 'pristine',
7
+ STARTED: 'started',
8
+ PROCESSING: 'processing',
9
+ ERROR: 'has_error',
10
+ FAILED: 'failed',
11
+ SUCCESS: 'success',
12
+ COMPLETE: 'complete',
13
+ };
14
+
15
+ export const ACTION_TYPES = {
16
+ ...STATUS,
17
+ SET_REGISTERED_PAYMENT_METHODS: 'set_registered_payment_methods',
18
+ SET_REGISTERED_EXPRESS_PAYMENT_METHODS:
19
+ 'set_registered_express_payment_methods',
20
+ SET_SHOULD_SAVE_PAYMENT_METHOD: 'set_should_save_payment_method',
21
+ };
22
+
23
+ /**
24
+ * @todo do typedefs for the payment event state.
25
+ */
26
+
27
+ // Note - if fields are added/shape is changed, you may want to update
28
+ // PRISTINE reducer clause to preserve your new field.
29
+ export const DEFAULT_PAYMENT_DATA = {
30
+ currentStatus: STATUS.PRISTINE,
31
+ shouldSavePaymentMethod: false,
32
+ paymentMethodData: {
33
+ payment_method: '',
34
+ // arbitrary data the payment method
35
+ // wants to pass along for payment
36
+ // processing server side.
37
+ },
38
+ hasSavedToken: false,
39
+ errorMessage: '',
40
+ paymentMethods: {},
41
+ expressPaymentMethods: {},
42
+ };
43
+
44
+ /**
45
+ * @type {PaymentMethodDataContext}
46
+ */
47
+ export const DEFAULT_PAYMENT_METHOD_DATA = {
48
+ setPaymentStatus: () => ( {
49
+ started: () => void null,
50
+ processing: () => void null,
51
+ completed: () => void null,
52
+ error: ( errorMessage ) => void errorMessage,
53
+ failed: ( errorMessage, paymentMethodData ) =>
54
+ void [ errorMessage, paymentMethodData ],
55
+ success: ( paymentMethodData, billingData ) =>
56
+ void [ paymentMethodData, billingData ],
57
+ } ),
58
+ currentStatus: {
59
+ isPristine: true,
60
+ isStarted: false,
61
+ isProcessing: false,
62
+ isFinished: false,
63
+ hasError: false,
64
+ hasFailed: false,
65
+ isSuccessful: false,
66
+ },
67
+ paymentStatuses: STATUS,
68
+ paymentMethodData: {},
69
+ errorMessage: '',
70
+ activePaymentMethod: '',
71
+ setActivePaymentMethod: () => void null,
72
+ customerPaymentMethods: {},
73
+ paymentMethods: {},
74
+ expressPaymentMethods: {},
75
+ paymentMethodsInitialized: false,
76
+ expressPaymentMethodsInitialized: false,
77
+ onPaymentProcessing: () => void null,
78
+ onPaymentSuccess: () => void null,
79
+ onPaymentFail: () => void null,
80
+ };
assets/js/base/context/cart-checkout/payment-methods/event-emit.js ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import {
5
+ reducer,
6
+ emitEvent,
7
+ emitEventWithAbort,
8
+ emitterCallback,
9
+ } from '../../shared/event-emit';
10
+
11
+ const EMIT_TYPES = {
12
+ PAYMENT_PROCESSING: 'payment_processing',
13
+ };
14
+
15
+ /**
16
+ * Receives a reducer dispatcher and returns an object with the
17
+ * various event emitters for the payment processing events.
18
+ *
19
+ * Calling the event registration function with the callback will register it
20
+ * for the event emitter and will return a dispatcher for removing the
21
+ * registered callback (useful for implementation in `useEffect`).
22
+ *
23
+ * @param {Function} dispatcher The emitter reducer dispatcher.
24
+ *
25
+ * @return {Object} An object with the various payment event emitter
26
+ * registration functions
27
+ */
28
+ const emitterSubscribers = ( dispatcher ) => ( {
29
+ onPaymentProcessing: emitterCallback(
30
+ EMIT_TYPES.PAYMENT_PROCESSING,
31
+ dispatcher
32
+ ),
33
+ } );
34
+
35
+ export {
36
+ EMIT_TYPES,
37
+ emitterSubscribers,
38
+ reducer,
39
+ emitEvent,
40
+ emitEventWithAbort,
41
+ };
assets/js/base/context/{providers/cart-checkout/payment-methods/index.ts → cart-checkout/payment-methods/index.js} RENAMED
File without changes
assets/js/base/context/cart-checkout/payment-methods/payment-method-data-context.js ADDED
@@ -0,0 +1,464 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import {
5
+ createContext,
6
+ useContext,
7
+ useState,
8
+ useReducer,
9
+ useCallback,
10
+ useEffect,
11
+ useRef,
12
+ useMemo,
13
+ } from '@wordpress/element';
14
+ import { getSetting } from '@woocommerce/settings';
15
+ import { useStoreNotices, useEmitResponse } from '@woocommerce/base-hooks';
16
+ import { useEditorContext } from '@woocommerce/base-context';
17
+
18
+ /**
19
+ * Internal dependencies
20
+ */
21
+ import {
22
+ STATUS,
23
+ DEFAULT_PAYMENT_DATA,
24
+ DEFAULT_PAYMENT_METHOD_DATA,
25
+ } from './constants';
26
+ import reducer from './reducer';
27
+ import {
28
+ statusOnly,
29
+ error,
30
+ failed,
31
+ success,
32
+ setRegisteredPaymentMethods,
33
+ setRegisteredExpressPaymentMethods,
34
+ setShouldSavePaymentMethod,
35
+ } from './actions';
36
+ import {
37
+ usePaymentMethods,
38
+ useExpressPaymentMethods,
39
+ } from './use-payment-method-registration';
40
+ import { useCustomerDataContext } from '../customer';
41
+ import { useCheckoutContext } from '../checkout-state';
42
+ import { useShippingDataContext } from '../shipping';
43
+ import {
44
+ EMIT_TYPES,
45
+ emitterSubscribers,
46
+ emitEventWithAbort,
47
+ reducer as emitReducer,
48
+ } from './event-emit';
49
+ import { useValidationContext } from '../../shared/validation';
50
+
51
+ /**
52
+ * @typedef {import('@woocommerce/type-defs/contexts').PaymentMethodDataContext} PaymentMethodDataContext
53
+ * @typedef {import('@woocommerce/type-defs/contexts').PaymentStatusDispatch} PaymentStatusDispatch
54
+ * @typedef {import('@woocommerce/type-defs/contexts').PaymentStatusDispatchers} PaymentStatusDispatchers
55
+ * @typedef {import('@woocommerce/type-defs/billing').BillingData} BillingData
56
+ * @typedef {import('@woocommerce/type-defs/contexts').CustomerPaymentMethod} CustomerPaymentMethod
57
+ * @typedef {import('@woocommerce/type-defs/contexts').ShippingDataResponse} ShippingDataResponse
58
+ */
59
+
60
+ const {
61
+ STARTED,
62
+ PROCESSING,
63
+ COMPLETE,
64
+ PRISTINE,
65
+ ERROR,
66
+ FAILED,
67
+ SUCCESS,
68
+ } = STATUS;
69
+
70
+ const PaymentMethodDataContext = createContext( DEFAULT_PAYMENT_METHOD_DATA );
71
+
72
+ /**
73
+ * @return {PaymentMethodDataContext} The data and functions exposed by the
74
+ * payment method context provider.
75
+ */
76
+ export const usePaymentMethodDataContext = () => {
77
+ return useContext( PaymentMethodDataContext );
78
+ };
79
+
80
+ /**
81
+ * Gets the payment methods saved for the current user after filtering out
82
+ * disabled ones.
83
+ *
84
+ * @param {Object[]} availablePaymentMethods List of available payment methods.
85
+ * @return {Object} Object containing the payment methods saved for a specific
86
+ * user which are available.
87
+ */
88
+ const getCustomerPaymentMethods = ( availablePaymentMethods = [] ) => {
89
+ const customerPaymentMethods = getSetting( 'customerPaymentMethods', {} );
90
+ const paymentMethodKeys = Object.keys( customerPaymentMethods );
91
+ if ( paymentMethodKeys.length === 0 ) {
92
+ return {};
93
+ }
94
+ const enabledCustomerPaymentMethods = {};
95
+ paymentMethodKeys.forEach( ( type ) => {
96
+ const methods = customerPaymentMethods[ type ].filter(
97
+ ( paymentMethod ) => {
98
+ return Object.keys( availablePaymentMethods ).includes(
99
+ paymentMethod.method.gateway
100
+ );
101
+ }
102
+ );
103
+ if ( methods.length ) {
104
+ enabledCustomerPaymentMethods[ type ] = methods;
105
+ }
106
+ } );
107
+ return enabledCustomerPaymentMethods;
108
+ };
109
+
110
+ /**
111
+ * PaymentMethodDataProvider is automatically included in the
112
+ * CheckoutDataProvider.
113
+ *
114
+ * This provides the api interface (via the context hook) for payment method
115
+ * status and data.
116
+ *
117
+ * @param {Object} props Incoming props for provider
118
+ * @param {Object} props.children The wrapped components in this
119
+ * provider.
120
+ */
121
+ export const PaymentMethodDataProvider = ( { children } ) => {
122
+ const { setBillingData } = useCustomerDataContext();
123
+ const {
124
+ isProcessing: checkoutIsProcessing,
125
+ isIdle: checkoutIsIdle,
126
+ isCalculating: checkoutIsCalculating,
127
+ hasError: checkoutHasError,
128
+ } = useCheckoutContext();
129
+ const {
130
+ isSuccessResponse,
131
+ isErrorResponse,
132
+ isFailResponse,
133
+ noticeContexts,
134
+ } = useEmitResponse();
135
+ const [ activePaymentMethod, setActive ] = useState( '' );
136
+ const [ observers, subscriber ] = useReducer( emitReducer, {} );
137
+ const currentObservers = useRef( observers );
138
+
139
+ const { isEditor, previewData } = useEditorContext();
140
+ const [ paymentData, dispatch ] = useReducer(
141
+ reducer,
142
+ DEFAULT_PAYMENT_DATA
143
+ );
144
+ const setActivePaymentMethod = useCallback(
145
+ ( paymentMethodSlug ) => {
146
+ setActive( paymentMethodSlug );
147
+ dispatch( statusOnly( PRISTINE ) );
148
+ },
149
+ [ setActive, dispatch ]
150
+ );
151
+ const paymentMethodsDispatcher = useCallback(
152
+ ( paymentMethods ) => {
153
+ dispatch( setRegisteredPaymentMethods( paymentMethods ) );
154
+ },
155
+ [ dispatch ]
156
+ );
157
+ const expressPaymentMethodsDispatcher = useCallback(
158
+ ( paymentMethods ) => {
159
+ dispatch( setRegisteredExpressPaymentMethods( paymentMethods ) );
160
+ },
161
+ [ dispatch ]
162
+ );
163
+ const paymentMethodsInitialized = usePaymentMethods(
164
+ paymentMethodsDispatcher
165
+ );
166
+ const expressPaymentMethodsInitialized = useExpressPaymentMethods(
167
+ expressPaymentMethodsDispatcher
168
+ );
169
+ const { setValidationErrors } = useValidationContext();
170
+ const { addErrorNotice, removeNotice } = useStoreNotices();
171
+ const { setShippingAddress } = useShippingDataContext();
172
+ const setShouldSavePayment = useCallback(
173
+ ( shouldSave ) => {
174
+ dispatch( setShouldSavePaymentMethod( shouldSave ) );
175
+ },
176
+ [ dispatch ]
177
+ );
178
+
179
+ const customerPaymentMethods = useMemo( () => {
180
+ if ( isEditor && previewData.previewSavedPaymentMethods ) {
181
+ return previewData.previewSavedPaymentMethods;
182
+ }
183
+ if (
184
+ ! paymentMethodsInitialized ||
185
+ paymentData.paymentMethods.length === 0
186
+ ) {
187
+ return {};
188
+ }
189
+ return getCustomerPaymentMethods( paymentData.paymentMethods );
190
+ }, [
191
+ isEditor,
192
+ previewData.previewSavedPaymentMethods,
193
+ paymentMethodsInitialized,
194
+ paymentData.paymentMethods,
195
+ ] );
196
+
197
+ const setExpressPaymentError = useCallback(
198
+ ( message ) => {
199
+ if ( message ) {
200
+ addErrorNotice( message, {
201
+ id: 'wc-express-payment-error',
202
+ context: noticeContexts.EXPRESS_PAYMENTS,
203
+ } );
204
+ } else {
205
+ removeNotice(
206
+ 'wc-express-payment-error',
207
+ noticeContexts.EXPRESS_PAYMENTS
208
+ );
209
+ }
210
+ },
211
+ [ addErrorNotice, noticeContexts.EXPRESS_PAYMENTS, removeNotice ]
212
+ );
213
+ // ensure observers are always current.
214
+ useEffect( () => {
215
+ currentObservers.current = observers;
216
+ }, [ observers ] );
217
+ const onPaymentProcessing = useMemo(
218
+ () => emitterSubscribers( subscriber ).onPaymentProcessing,
219
+ [ subscriber ]
220
+ );
221
+
222
+ const currentStatus = useMemo(
223
+ () => ( {
224
+ isPristine: paymentData.currentStatus === PRISTINE,
225
+ isStarted: paymentData.currentStatus === STARTED,
226
+ isProcessing: paymentData.currentStatus === PROCESSING,
227
+ isFinished: [ ERROR, FAILED, SUCCESS ].includes(
228
+ paymentData.currentStatus
229
+ ),
230
+ hasError: paymentData.currentStatus === ERROR,
231
+ hasFailed: paymentData.currentStatus === FAILED,
232
+ isSuccessful: paymentData.currentStatus === SUCCESS,
233
+ } ),
234
+ [ paymentData.currentStatus ]
235
+ );
236
+
237
+ /**
238
+ * @type {PaymentStatusDispatch}
239
+ */
240
+ const setPaymentStatus = useCallback(
241
+ () => ( {
242
+ started: () => dispatch( statusOnly( STARTED ) ),
243
+ processing: () => dispatch( statusOnly( PROCESSING ) ),
244
+ completed: () => dispatch( statusOnly( COMPLETE ) ),
245
+ /**
246
+ * @param {string} errorMessage An error message
247
+ */
248
+ error: ( errorMessage ) => dispatch( error( errorMessage ) ),
249
+ /**
250
+ * @param {string} errorMessage An error message
251
+ * @param {Object} paymentMethodData Arbitrary payment method data to
252
+ * accompany the checkout submission.
253
+ * @param {BillingData|null} [billingData] The billing data accompanying the
254
+ * payment method.
255
+ */
256
+ failed: ( errorMessage, paymentMethodData, billingData = null ) => {
257
+ if ( billingData ) {
258
+ setBillingData( billingData );
259
+ }
260
+ dispatch(
261
+ failed( {
262
+ errorMessage,
263
+ paymentMethodData,
264
+ } )
265
+ );
266
+ },
267
+ /**
268
+ * @param {Object} [paymentMethodData] Arbitrary payment method data to
269
+ * accompany the checkout.
270
+ * @param {BillingData|null} [billingData] The billing data accompanying the
271
+ * payment method.
272
+ * @param {ShippingDataResponse|null} [shippingData] The shipping data accompanying the
273
+ * payment method.
274
+ */
275
+ success: (
276
+ paymentMethodData = {},
277
+ billingData = null,
278
+ shippingData = null
279
+ ) => {
280
+ if ( billingData ) {
281
+ setBillingData( billingData );
282
+ }
283
+ if ( shippingData !== null && shippingData?.address ) {
284
+ setShippingAddress( shippingData.address );
285
+ }
286
+ dispatch(
287
+ success( {
288
+ paymentMethodData,
289
+ } )
290
+ );
291
+ },
292
+ } ),
293
+ [ dispatch, setBillingData, setShippingAddress ]
294
+ );
295
+
296
+ // flip payment to processing if checkout processing is complete, there are
297
+ // no errors, and payment status is started.
298
+ useEffect( () => {
299
+ if (
300
+ checkoutIsProcessing &&
301
+ ! checkoutHasError &&
302
+ ! checkoutIsCalculating &&
303
+ ! currentStatus.isFinished
304
+ ) {
305
+ setPaymentStatus().processing();
306
+ }
307
+ }, [
308
+ checkoutIsProcessing,
309
+ checkoutHasError,
310
+ checkoutIsCalculating,
311
+ currentStatus.isFinished,
312
+ setPaymentStatus,
313
+ ] );
314
+
315
+ // When checkout is returned to idle, set payment status to pristine
316
+ // but only if payment status is already not finished.
317
+ useEffect( () => {
318
+ if ( checkoutIsIdle && ! currentStatus.isSuccessful ) {
319
+ dispatch( statusOnly( PRISTINE ) );
320
+ }
321
+ }, [ checkoutIsIdle, currentStatus.isSuccessful ] );
322
+
323
+ // if checkout has an error and payment is not being made with a saved token
324
+ // and payment status is success, then let's sync payment status back to
325
+ // pristine.
326
+ useEffect( () => {
327
+ if (
328
+ checkoutHasError &&
329
+ currentStatus.isSuccessful &&
330
+ ! paymentData.hasSavedToken
331
+ ) {
332
+ dispatch( statusOnly( PRISTINE ) );
333
+ }
334
+ }, [
335
+ checkoutHasError,
336
+ currentStatus.isSuccessful,
337
+ paymentData.hasSavedToken,
338
+ ] );
339
+
340
+ // Set active (selected) payment method as needed.
341
+ useEffect( () => {
342
+ const paymentMethodKeys = Object.keys( paymentData.paymentMethods );
343
+ const allPaymentMethodKeys = [
344
+ ...paymentMethodKeys,
345
+ ...Object.keys( paymentData.expressPaymentMethods ),
346
+ ];
347
+ if ( ! paymentMethodsInitialized || ! paymentMethodKeys.length ) {
348
+ return;
349
+ }
350
+
351
+ setActive( ( currentActivePaymentMethod ) => {
352
+ // If there's no active payment method, or the active payment method has
353
+ // been removed (e.g. COD vs shipping methods), set one as active.
354
+ // Note: It's possible that the active payment method might be an
355
+ // express payment method. So registered express payment methods are
356
+ // included in the check here.
357
+ if (
358
+ ! currentActivePaymentMethod ||
359
+ ! allPaymentMethodKeys.includes( currentActivePaymentMethod )
360
+ ) {
361
+ dispatch( statusOnly( PRISTINE ) );
362
+ return Object.keys( paymentData.paymentMethods )[ 0 ];
363
+ }
364
+ return currentActivePaymentMethod;
365
+ } );
366
+ }, [
367
+ paymentMethodsInitialized,
368
+ paymentData.paymentMethods,
369
+ paymentData.expressPaymentMethods,
370
+ setActive,
371
+ ] );
372
+
373
+ // emit events.
374
+ useEffect( () => {
375
+ // Note: the nature of this event emitter is that it will bail on any
376
+ // observer that returns a response that !== true. However, this still
377
+ // allows for other observers that return true for continuing through
378
+ // to the next observer (or bailing if there's a problem).
379
+ if ( currentStatus.isProcessing ) {
380
+ removeNotice( 'wc-payment-error', noticeContexts.PAYMENTS );
381
+ emitEventWithAbort(
382
+ currentObservers.current,
383
+ EMIT_TYPES.PAYMENT_PROCESSING,
384
+ {}
385
+ ).then( ( response ) => {
386
+ if ( isSuccessResponse( response ) ) {
387
+ setPaymentStatus().success(
388
+ response?.meta?.paymentMethodData,
389
+ response?.meta?.billingData,
390
+ response?.meta?.shippingData
391
+ );
392
+ } else if ( isFailResponse( response ) ) {
393
+ if ( response.message && response.message.length ) {
394
+ addErrorNotice( response.message, {
395
+ id: 'wc-payment-error',
396
+ isDismissible: false,
397
+ context:
398
+ response?.messageContext ||
399
+ noticeContexts.PAYMENTS,
400
+ } );
401
+ }
402
+ setPaymentStatus().failed(
403
+ response?.message,
404
+ response?.meta?.paymentMethodData,
405
+ response?.meta?.billingData
406
+ );
407
+ } else if ( isErrorResponse( response ) ) {
408
+ if ( response.message && response.message.length ) {
409
+ addErrorNotice( response.message, {
410
+ id: 'wc-payment-error',
411
+ isDismissible: false,
412
+ context:
413
+ response?.messageContext ||
414
+ noticeContexts.PAYMENTS,
415
+ } );
416
+ }
417
+ setPaymentStatus().error( response.message );
418
+ setValidationErrors( response?.validationErrors );
419
+ } else {
420
+ // otherwise there are no payment methods doing anything so
421
+ // just consider success
422
+ setPaymentStatus().success();
423
+ }
424
+ } );
425
+ }
426
+ }, [
427
+ currentStatus.isProcessing,
428
+ setValidationErrors,
429
+ setPaymentStatus,
430
+ removeNotice,
431
+ noticeContexts.PAYMENTS,
432
+ isSuccessResponse,
433
+ isFailResponse,
434
+ isErrorResponse,
435
+ addErrorNotice,
436
+ ] );
437
+
438
+ /**
439
+ * @type {PaymentMethodDataContext}
440
+ */
441
+ const paymentContextData = {
442
+ setPaymentStatus,
443
+ currentStatus,
444
+ paymentStatuses: STATUS,
445
+ paymentMethodData: paymentData.paymentMethodData,
446
+ errorMessage: paymentData.errorMessage,
447
+ activePaymentMethod,
448
+ setActivePaymentMethod,
449
+ onPaymentProcessing,
450
+ customerPaymentMethods,
451
+ paymentMethods: paymentData.paymentMethods,
452
+ expressPaymentMethods: paymentData.expressPaymentMethods,
453
+ paymentMethodsInitialized,
454
+ expressPaymentMethodsInitialized,
455
+ setExpressPaymentError,
456
+ shouldSavePayment: paymentData.shouldSavePaymentMethod,
457
+ setShouldSavePayment,
458
+ };
459
+ return (
460
+ <PaymentMethodDataContext.Provider value={ paymentContextData }>
461
+ { children }
462
+ </PaymentMethodDataContext.Provider>
463
+ );
464
+ };
assets/js/base/context/cart-checkout/payment-methods/reducer.js ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { ACTION_TYPES, DEFAULT_PAYMENT_DATA } from './constants';
5
+ const {
6
+ STARTED,
7
+ ERROR,
8
+ FAILED,
9
+ SUCCESS,
10
+ PROCESSING,
11
+ PRISTINE,
12
+ COMPLETE,
13
+ SET_REGISTERED_PAYMENT_METHODS,
14
+ SET_REGISTERED_EXPRESS_PAYMENT_METHODS,
15
+ SET_SHOULD_SAVE_PAYMENT_METHOD,
16
+ } = ACTION_TYPES;
17
+
18
+ const hasSavedPaymentToken = ( paymentMethodData ) => {
19
+ return !! (
20
+ typeof paymentMethodData === 'object' && paymentMethodData.isSavedToken
21
+ );
22
+ };
23
+
24
+ /**
25
+ * Reducer for payment data state
26
+ *
27
+ * @param {Object} state Current state.
28
+ * @param {Object} action Current action.
29
+ * @param {string} action.type Action type.
30
+ * @param {Object} action.paymentMethodData Payment method data payload.
31
+ * @param {boolean} action.shouldSavePaymentMethod Should save payment method flag.
32
+ * @param {string} action.errorMessage Error message to store in state.
33
+ * @param {Object} action.paymentMethods Registered payment methods.
34
+ */
35
+ const reducer = (
36
+ state = DEFAULT_PAYMENT_DATA,
37
+ {
38
+ type,
39
+ paymentMethodData,
40
+ shouldSavePaymentMethod,
41
+ errorMessage,
42
+ paymentMethods,
43
+ }
44
+ ) => {
45
+ switch ( type ) {
46
+ case STARTED:
47
+ return state.currentStatus !== STARTED
48
+ ? {
49
+ ...state,
50
+ currentStatus: STARTED,
51
+ }
52
+ : state;
53
+ case ERROR:
54
+ return state.currentStatus !== ERROR
55
+ ? {
56
+ ...state,
57
+ currentStatus: ERROR,
58
+ errorMessage: errorMessage || state.errorMessage,
59
+ }
60
+ : state;
61
+ case FAILED:
62
+ return state.currentStatus !== FAILED
63
+ ? {
64
+ ...state,
65
+ currentStatus: FAILED,
66
+ paymentMethodData:
67
+ paymentMethodData || state.paymentMethodData,
68
+ errorMessage: errorMessage || state.errorMessage,
69
+ }
70
+ : state;
71
+ case SUCCESS:
72
+ return state.currentStatus !== SUCCESS
73
+ ? {
74
+ ...state,
75
+ currentStatus: SUCCESS,
76
+ paymentMethodData:
77
+ paymentMethodData || state.paymentMethodData,
78
+ hasSavedToken: hasSavedPaymentToken(
79
+ paymentMethodData
80
+ ),
81
+ }
82
+ : state;
83
+ case PROCESSING:
84
+ return state.currentStatus !== PROCESSING
85
+ ? {
86
+ ...state,
87
+ currentStatus: PROCESSING,
88
+ errorMessage: '',
89
+ }
90
+ : state;
91
+ case COMPLETE:
92
+ return state.currentStatus !== COMPLETE
93
+ ? {
94
+ ...state,
95
+ currentStatus: COMPLETE,
96
+ }
97
+ : state;
98
+
99
+ case PRISTINE:
100
+ return {
101
+ ...DEFAULT_PAYMENT_DATA,
102
+ currentStatus: PRISTINE,
103
+ // keep payment method registration state
104
+ paymentMethods: {
105
+ ...state.paymentMethods,
106
+ },
107
+ expressPaymentMethods: {
108
+ ...state.expressPaymentMethods,
109
+ },
110
+ shouldSavePaymentMethod: state.shouldSavePaymentMethod,
111
+ };
112
+ case SET_REGISTERED_PAYMENT_METHODS:
113
+ return {
114
+ ...state,
115
+ paymentMethods,
116
+ };
117
+ case SET_REGISTERED_EXPRESS_PAYMENT_METHODS:
118
+ return {
119
+ ...state,
120
+ expressPaymentMethods: paymentMethods,
121
+ };
122
+ case SET_SHOULD_SAVE_PAYMENT_METHOD:
123
+ return {
124
+ ...state,
125
+ shouldSavePaymentMethod,
126
+ };
127
+ }
128
+ return state;
129
+ };
130
+
131
+ export default reducer;
assets/js/base/context/{providers/cart-checkout → cart-checkout}/payment-methods/test/payment-method-data-context.js RENAMED
@@ -11,8 +11,10 @@ import {
11
  __experimentalDeRegisterPaymentMethod,
12
  __experimentalDeRegisterExpressPaymentMethod,
13
  } from '@woocommerce/blocks-registry';
14
- import { default as fetchMock } from 'jest-fetch-mock';
15
-
 
 
16
  /**
17
  * Internal dependencies
18
  */
@@ -20,15 +22,10 @@ import {
20
  usePaymentMethodDataContext,
21
  PaymentMethodDataProvider,
22
  } from '../payment-method-data-context';
23
- import {
24
- CheckoutExpressPayment,
25
- SavedPaymentMethodOptions,
26
- } from '../../../../../../blocks/cart-checkout/payment-methods';
27
- import { defaultCartState } from '../../../../../../data/default-states';
28
 
29
  jest.mock( '@woocommerce/settings', () => {
30
  const originalModule = jest.requireActual( '@woocommerce/settings' );
31
-
32
  return {
33
  // @ts-ignore We know @woocommerce/settings is an object.
34
  ...originalModule,
@@ -63,9 +60,6 @@ const registerMockPaymentMethods = () => {
63
  edit: <div>A payment method</div>,
64
  icons: null,
65
  canMakePayment: () => true,
66
- supports: {
67
- features: [ 'products' ],
68
- },
69
  ariaLabel: name,
70
  } );
71
  } );
@@ -78,9 +72,7 @@ const registerMockPaymentMethods = () => {
78
  icons: null,
79
  canMakePayment: () => true,
80
  supports: {
81
- showSavedCards: true,
82
- showSaveOption: true,
83
- features: [ 'products' ],
84
  },
85
  ariaLabel: name,
86
  } );
@@ -107,9 +99,6 @@ const registerMockPaymentMethods = () => {
107
  edit: <div>An express payment method</div>,
108
  canMakePayment: () => true,
109
  paymentMethodId: name,
110
- supports: {
111
- features: [ 'products' ],
112
- },
113
  } );
114
  } );
115
  };
@@ -130,11 +119,10 @@ describe( 'Testing Payment Method Data Context Provider', () => {
130
  if ( req.url.match( /wc\/store\/cart/ ) ) {
131
  return Promise.resolve( JSON.stringify( previewCart ) );
132
  }
133
- return Promise.resolve( '' );
134
  } );
135
  // need to clear the store resolution state between tests.
136
  await dispatch( storeKey ).invalidateResolutionForStore();
137
- await dispatch( storeKey ).receiveCart( defaultCartState.cartData );
138
  } );
139
  afterEach( async () => {
140
  resetMockPaymentMethods();
@@ -185,8 +173,6 @@ describe( 'Testing Payment Method Data Context Provider', () => {
185
  );
186
  expect( activePaymentMethod ).not.toBeNull();
187
  } );
188
- // ["`select` control in `@wordpress/data-controls` is deprecated. Please use built-in `resolveSelect` control in `@wordpress/data` instead."]
189
- expect( console ).toHaveWarned();
190
  } );
191
 
192
  it( 'resets saved payment method data after starting and closing an express payment method', async () => {
11
  __experimentalDeRegisterPaymentMethod,
12
  __experimentalDeRegisterExpressPaymentMethod,
13
  } from '@woocommerce/blocks-registry';
14
+ import {
15
+ CheckoutExpressPayment,
16
+ SavedPaymentMethodOptions,
17
+ } from '@woocommerce/base-components/payment-methods';
18
  /**
19
  * Internal dependencies
20
  */
22
  usePaymentMethodDataContext,
23
  PaymentMethodDataProvider,
24
  } from '../payment-method-data-context';
25
+ import { defaultCartState } from '../../../../../data/default-states';
 
 
 
 
26
 
27
  jest.mock( '@woocommerce/settings', () => {
28
  const originalModule = jest.requireActual( '@woocommerce/settings' );
 
29
  return {
30
  // @ts-ignore We know @woocommerce/settings is an object.
31
  ...originalModule,
60
  edit: <div>A payment method</div>,
61
  icons: null,
62
  canMakePayment: () => true,
 
 
 
63
  ariaLabel: name,
64
  } );
65
  } );
72
  icons: null,
73
  canMakePayment: () => true,
74
  supports: {
75
+ savePaymentInfo: true,
 
 
76
  },
77
  ariaLabel: name,
78
  } );
99
  edit: <div>An express payment method</div>,
100
  canMakePayment: () => true,
101
  paymentMethodId: name,
 
 
 
102
  } );
103
  } );
104
  };
119
  if ( req.url.match( /wc\/store\/cart/ ) ) {
120
  return Promise.resolve( JSON.stringify( previewCart ) );
121
  }
 
122
  } );
123
  // need to clear the store resolution state between tests.
124
  await dispatch( storeKey ).invalidateResolutionForStore();
125
+ await dispatch( storeKey ).receiveCart( defaultCartState );
126
  } );
127
  afterEach( async () => {
128
  resetMockPaymentMethods();
173
  );
174
  expect( activePaymentMethod ).not.toBeNull();
175
  } );
 
 
176
  } );
177
 
178
  it( 'resets saved payment method data after starting and closing an express payment method', async () => {
assets/js/base/context/{providers/cart-checkout/payment-methods/use-payment-method-registration.ts → cart-checkout/payment-methods/use-payment-method-registration.js} RENAMED
@@ -7,62 +7,57 @@ import {
7
  getExpressPaymentMethods,
8
  } from '@woocommerce/blocks-registry';
9
  import { useState, useEffect, useRef, useCallback } from '@wordpress/element';
10
- import { useShallowEqual } from '@woocommerce/base-hooks';
11
- import { CURRENT_USER_IS_ADMIN, getSetting } from '@woocommerce/settings';
12
-
13
- /**
14
- * Internal dependencies
15
- */
16
- import { useEditorContext } from '../../editor-context';
17
- import { useShippingDataContext } from '../shipping';
18
- import { useCustomerDataContext } from '../customer';
19
- import type {
20
- PaymentMethodsDispatcherType,
21
- PaymentMethods,
22
- ExpressPaymentMethods,
23
- PaymentMethodConfig,
24
- ExpressPaymentMethodConfig,
25
- } from './types';
26
- import { useStoreCart } from '../../../hooks/cart/use-store-cart';
27
- import { useStoreNotices } from '../../../hooks/use-store-notices';
28
- import { useEmitResponse } from '../../../hooks/use-emit-response';
29
 
30
  /**
31
  * This hook handles initializing registered payment methods and exposing all
32
  * registered payment methods that can be used in the current environment (via
33
  * the payment method's `canMakePayment` property).
34
  *
35
- * @param {function(Object):undefined} dispatcher A dispatcher for setting registered payment methods to an external state.
36
- * @param {Object} registeredPaymentMethods Registered payment methods to process.
37
- * @param {Array} paymentMethodsSortOrder Array of payment method names to sort by. This should match keys of registeredPaymentMethods.
38
- * @param {string} noticeContext Id of the context to append notices to.
 
 
 
 
 
 
39
  *
40
- * @return {boolean} Whether the payment methods have been initialized or not. True when all payment methods have been initialized.
 
41
  */
42
  const usePaymentMethodRegistration = (
43
- dispatcher: PaymentMethodsDispatcherType,
44
- registeredPaymentMethods: PaymentMethods | ExpressPaymentMethods,
45
- paymentMethodsSortOrder: string[],
46
- noticeContext: string
47
  ) => {
48
  const [ isInitialized, setIsInitialized ] = useState( false );
49
  const { isEditor } = useEditorContext();
50
- const { selectedRates } = useShippingDataContext();
51
- const { billingData, shippingAddress } = useCustomerDataContext();
52
  const selectedShippingMethods = useShallowEqual( selectedRates );
53
  const paymentMethodsOrder = useShallowEqual( paymentMethodsSortOrder );
54
- const {
55
- cartTotals,
56
- cartNeedsShipping,
57
- paymentRequirements,
58
- } = useStoreCart();
59
  const canPayArgument = useRef( {
60
  cartTotals,
61
  cartNeedsShipping,
62
- billingData,
63
  shippingAddress,
64
  selectedShippingMethods,
65
- paymentRequirements,
66
  } );
67
  const { addErrorNotice } = useStoreNotices();
68
 
@@ -70,26 +65,20 @@ const usePaymentMethodRegistration = (
70
  canPayArgument.current = {
71
  cartTotals,
72
  cartNeedsShipping,
73
- billingData,
74
  shippingAddress,
75
  selectedShippingMethods,
76
- paymentRequirements,
77
  };
78
  }, [
79
  cartTotals,
80
  cartNeedsShipping,
81
- billingData,
82
  shippingAddress,
83
  selectedShippingMethods,
84
- paymentRequirements,
85
  ] );
86
 
87
  const refreshCanMakePayments = useCallback( async () => {
88
  let availablePaymentMethods = {};
89
 
90
- const addAvailablePaymentMethod = (
91
- paymentMethod: PaymentMethodConfig | ExpressPaymentMethodConfig
92
- ) => {
93
  availablePaymentMethods = {
94
  ...availablePaymentMethods,
95
  [ paymentMethod.name ]: paymentMethod,
@@ -103,25 +92,15 @@ const usePaymentMethodRegistration = (
103
  continue;
104
  }
105
 
106
- // See if payment method should be available. This always evaluates to true in the editor context.
107
  try {
108
- const canPay = isEditor
109
- ? true
110
- : await Promise.resolve(
111
- paymentMethod.canMakePayment(
112
- canPayArgument.current
113
- )
114
- );
115
-
116
- if ( !! canPay ) {
117
- if (
118
- typeof canPay === 'object' &&
119
- canPay !== null &&
120
- canPay.error
121
- ) {
122
  throw new Error( canPay.error.message );
123
  }
124
-
125
  addAvailablePaymentMethod( paymentMethod );
126
  }
127
  } catch ( e ) {
@@ -147,7 +126,7 @@ const usePaymentMethodRegistration = (
147
 
148
  // Note: some payment methods use the `canMakePayment` callback to initialize / setup.
149
  // Example: Stripe CC, Stripe Payment Request.
150
- // That's why we track "is initialized" state here.
151
  setIsInitialized( true );
152
  }, [
153
  addErrorNotice,
@@ -163,12 +142,7 @@ const usePaymentMethodRegistration = (
163
  // Some payment methods (e.g. COD) can be disabled for specific shipping methods.
164
  useEffect( () => {
165
  refreshCanMakePayments();
166
- }, [
167
- refreshCanMakePayments,
168
- cartTotals,
169
- selectedShippingMethods,
170
- paymentRequirements,
171
- ] );
172
 
173
  return isInitialized;
174
  };
@@ -180,16 +154,14 @@ const usePaymentMethodRegistration = (
180
  *
181
  * @return {boolean} True when standard payment methods have been initialized.
182
  */
183
- export const usePaymentMethods = (
184
- dispatcher: PaymentMethodsDispatcherType
185
- ): boolean => {
186
- const standardMethods: PaymentMethods = getPaymentMethods() as PaymentMethods;
187
  const { noticeContexts } = useEmitResponse();
188
  // Ensure all methods are present in order.
189
- // Some payment methods may not be present in paymentGatewaySortOrder if they
190
  // depend on state, e.g. COD can depend on shipping method.
191
  const displayOrder = new Set( [
192
- ...( getSetting( 'paymentGatewaySortOrder', [] ) as [ ] ),
193
  ...Object.keys( standardMethods ),
194
  ] );
195
  return usePaymentMethodRegistration(
@@ -207,10 +179,8 @@ export const usePaymentMethods = (
207
  *
208
  * @return {boolean} True when express payment methods have been initialized.
209
  */
210
- export const useExpressPaymentMethods = (
211
- dispatcher: PaymentMethodsDispatcherType
212
- ): boolean => {
213
- const expressMethods: ExpressPaymentMethods = getExpressPaymentMethods() as ExpressPaymentMethods;
214
  const { noticeContexts } = useEmitResponse();
215
  return usePaymentMethodRegistration(
216
  dispatcher,
7
  getExpressPaymentMethods,
8
  } from '@woocommerce/blocks-registry';
9
  import { useState, useEffect, useRef, useCallback } from '@wordpress/element';
10
+ import {
11
+ useEditorContext,
12
+ useShippingDataContext,
13
+ } from '@woocommerce/base-context';
14
+ import {
15
+ useEmitResponse,
16
+ useShallowEqual,
17
+ useStoreCart,
18
+ useStoreNotices,
19
+ } from '@woocommerce/base-hooks';
20
+ import {
21
+ CURRENT_USER_IS_ADMIN,
22
+ PAYMENT_GATEWAY_SORT_ORDER,
23
+ } from '@woocommerce/block-settings';
 
 
 
 
 
24
 
25
  /**
26
  * This hook handles initializing registered payment methods and exposing all
27
  * registered payment methods that can be used in the current environment (via
28
  * the payment method's `canMakePayment` property).
29
  *
30
+ * @param {function(Object):undefined} dispatcher A dispatcher for setting registered
31
+ * payment methods to an external
32
+ * state.
33
+ * @param {Object} registeredPaymentMethods Registered payment methods to
34
+ * process.
35
+ * @param {Array} paymentMethodsSortOrder Array of payment method names to
36
+ * sort by. This should match keys of
37
+ * registeredPaymentMethods.
38
+ * @param {string} noticeContext Id of the context to append
39
+ * notices to.
40
  *
41
+ * @return {boolean} Whether the payment methods have been initialized or not. True when all payment
42
+ * methods have been initialized.
43
  */
44
  const usePaymentMethodRegistration = (
45
+ dispatcher,
46
+ registeredPaymentMethods,
47
+ paymentMethodsSortOrder,
48
+ noticeContext
49
  ) => {
50
  const [ isInitialized, setIsInitialized ] = useState( false );
51
  const { isEditor } = useEditorContext();
52
+ const { selectedRates, shippingAddress } = useShippingDataContext();
 
53
  const selectedShippingMethods = useShallowEqual( selectedRates );
54
  const paymentMethodsOrder = useShallowEqual( paymentMethodsSortOrder );
55
+ const { cartTotals, cartNeedsShipping } = useStoreCart();
 
 
 
 
56
  const canPayArgument = useRef( {
57
  cartTotals,
58
  cartNeedsShipping,
 
59
  shippingAddress,
60
  selectedShippingMethods,
 
61
  } );
62
  const { addErrorNotice } = useStoreNotices();
63
 
65
  canPayArgument.current = {
66
  cartTotals,
67
  cartNeedsShipping,
 
68
  shippingAddress,
69
  selectedShippingMethods,
 
70
  };
71
  }, [
72
  cartTotals,
73
  cartNeedsShipping,
 
74
  shippingAddress,
75
  selectedShippingMethods,
 
76
  ] );
77
 
78
  const refreshCanMakePayments = useCallback( async () => {
79
  let availablePaymentMethods = {};
80
 
81
+ const addAvailablePaymentMethod = ( paymentMethod ) => {
 
 
82
  availablePaymentMethods = {
83
  ...availablePaymentMethods,
84
  [ paymentMethod.name ]: paymentMethod,
92
  continue;
93
  }
94
 
95
+ // In front end, ask payment method if it should be available.
96
  try {
97
+ const canPay = await Promise.resolve(
98
+ paymentMethod.canMakePayment( canPayArgument.current )
99
+ );
100
+ if ( canPay ) {
101
+ if ( canPay.error ) {
 
 
 
 
 
 
 
 
 
102
  throw new Error( canPay.error.message );
103
  }
 
104
  addAvailablePaymentMethod( paymentMethod );
105
  }
106
  } catch ( e ) {
126
 
127
  // Note: some payment methods use the `canMakePayment` callback to initialize / setup.
128
  // Example: Stripe CC, Stripe Payment Request.
129
+ // That's why we track "is initialised" state here.
130
  setIsInitialized( true );
131
  }, [
132
  addErrorNotice,
142
  // Some payment methods (e.g. COD) can be disabled for specific shipping methods.
143
  useEffect( () => {
144
  refreshCanMakePayments();
145
+ }, [ refreshCanMakePayments, cartTotals, selectedShippingMethods ] );
 
 
 
 
 
146
 
147
  return isInitialized;
148
  };
154
  *
155
  * @return {boolean} True when standard payment methods have been initialized.
156
  */
157
+ export const usePaymentMethods = ( dispatcher ) => {
158
+ const standardMethods = getPaymentMethods();
 
 
159
  const { noticeContexts } = useEmitResponse();
160
  // Ensure all methods are present in order.
161
+ // Some payment methods may not be present in PAYMENT_GATEWAY_SORT_ORDER if they
162
  // depend on state, e.g. COD can depend on shipping method.
163
  const displayOrder = new Set( [
164
+ ...PAYMENT_GATEWAY_SORT_ORDER,
165
  ...Object.keys( standardMethods ),
166
  ] );
167
  return usePaymentMethodRegistration(
179
  *
180
  * @return {boolean} True when express payment methods have been initialized.
181
  */
182
+ export const useExpressPaymentMethods = ( dispatcher ) => {
183
+ const expressMethods = getExpressPaymentMethods();
 
 
184
  const { noticeContexts } = useEmitResponse();
185
  return usePaymentMethodRegistration(
186
  dispatcher,
assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/constants.js RENAMED
@@ -47,6 +47,7 @@ export const DEFAULT_SHIPPING_CONTEXT_DATA = {
47
  dispatchErrorStatus: () => null,
48
  shippingErrorTypes: ERROR_TYPES,
49
  shippingRates: [],
 
50
  shippingRatesLoading: false,
51
  selectedRates: [],
52
  setSelectedRates: () => null,
47
  dispatchErrorStatus: () => null,
48
  shippingErrorTypes: ERROR_TYPES,
49
  shippingRates: [],
50
+ setShippingRates: () => null,
51
  shippingRatesLoading: false,
52
  selectedRates: [],
53
  setSelectedRates: () => null,
assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/event-emit.js RENAMED
@@ -1,7 +1,7 @@
1
  /**
2
  * Internal dependencies
3
  */
4
- import { emitterCallback, reducer, emitEvent } from '../../../event-emit';
5
 
6
  const EMIT_TYPES = {
7
  SHIPPING_RATES_SUCCESS: 'shipping_rates_success',
@@ -21,7 +21,7 @@ const EMIT_TYPES = {
21
  * @param {Function} dispatcher A reducer dispatcher
22
  * @return {Object} An object with `onSuccess` and `onFail` emitter registration.
23
  */
24
- const emitterObservers = ( dispatcher ) => ( {
25
  onSuccess: emitterCallback( EMIT_TYPES.SHIPPING_RATES_SUCCESS, dispatcher ),
26
  onFail: emitterCallback( EMIT_TYPES.SHIPPING_RATES_FAIL, dispatcher ),
27
  onSelectSuccess: emitterCallback(
@@ -34,4 +34,4 @@ const emitterObservers = ( dispatcher ) => ( {
34
  ),
35
  } );
36
 
37
- export { EMIT_TYPES, emitterObservers, reducer, emitEvent };
1
  /**
2
  * Internal dependencies
3
  */
4
+ import { emitterCallback, reducer, emitEvent } from '../../shared/event-emit';
5
 
6
  const EMIT_TYPES = {
7
  SHIPPING_RATES_SUCCESS: 'shipping_rates_success',
21
  * @param {Function} dispatcher A reducer dispatcher
22
  * @return {Object} An object with `onSuccess` and `onFail` emitter registration.
23
  */
24
+ const emitterSubscribers = ( dispatcher ) => ( {
25
  onSuccess: emitterCallback( EMIT_TYPES.SHIPPING_RATES_SUCCESS, dispatcher ),
26
  onFail: emitterCallback( EMIT_TYPES.SHIPPING_RATES_FAIL, dispatcher ),
27
  onSelectSuccess: emitterCallback(
34
  ),
35
  } );
36
 
37
+ export { EMIT_TYPES, emitterSubscribers, reducer, emitEvent };
assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/index.js RENAMED
@@ -9,25 +9,26 @@ import {
9
  useMemo,
10
  useRef,
11
  } from '@wordpress/element';
12
- import isShallowEqual from '@wordpress/is-shallow-equal';
13
- import { deriveSelectedShippingRates } from '@woocommerce/base-utils';
 
 
 
14
 
15
  /**
16
  * Internal dependencies
17
  */
18
- import { ERROR_TYPES, DEFAULT_SHIPPING_CONTEXT_DATA } from './constants';
19
- import { hasInvalidShippingAddress } from './utils';
20
- import { errorStatusReducer } from './reducers';
 
 
21
  import {
22
  EMIT_TYPES,
23
- emitterObservers,
24
  reducer as emitReducer,
25
  emitEvent,
26
  } from './event-emit';
27
- import { useCheckoutContext } from '../checkout-state';
28
- import { useCustomerDataContext } from '../customer';
29
- import { useStoreCart } from '../../../hooks/cart/use-store-cart';
30
- import { useSelectShippingRates } from '../../../hooks/shipping/use-select-shipping-rates';
31
 
32
  /**
33
  * @typedef {import('@woocommerce/type-defs/contexts').ShippingDataContext} ShippingDataContext
@@ -35,17 +36,46 @@ import { useSelectShippingRates } from '../../../hooks/shipping/use-select-shipp
35
  */
36
 
37
  const { NONE, INVALID_ADDRESS, UNKNOWN } = ERROR_TYPES;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  const ShippingDataContext = createContext( DEFAULT_SHIPPING_CONTEXT_DATA );
39
 
40
  /**
41
- * @return {ShippingDataContext} Returns data and functions related to shipping methods.
 
42
  */
43
  export const useShippingDataContext = () => {
44
  return useContext( ShippingDataContext );
45
  };
46
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  /**
48
- * The shipping data provider exposes the interface for shipping in the checkout/cart.
 
49
  *
50
  * @param {Object} props Incoming props for provider
51
  * @param {React.ReactElement} props.children
@@ -60,24 +90,27 @@ export const ShippingDataProvider = ( { children } ) => {
60
  shippingRatesLoading,
61
  cartErrors,
62
  } = useStoreCart();
63
- const { selectShippingRate, isSelectingRate } = useSelectShippingRates();
64
  const [ shippingErrorStatus, dispatchErrorStatus ] = useReducer(
65
  errorStatusReducer,
66
  NONE
67
  );
68
- const [ observers, observerDispatch ] = useReducer( emitReducer, {} );
69
  const currentObservers = useRef( observers );
70
- const eventObservers = useMemo(
 
 
 
 
 
71
  () => ( {
72
- onShippingRateSuccess: emitterObservers( observerDispatch )
73
- .onSuccess,
74
- onShippingRateFail: emitterObservers( observerDispatch ).onFail,
75
- onShippingRateSelectSuccess: emitterObservers( observerDispatch )
76
  .onSelectSuccess,
77
- onShippingRateSelectFail: emitterObservers( observerDispatch )
78
  .onSelectFail,
79
  } ),
80
- [ observerDispatch ]
81
  );
82
 
83
  // set observers on ref so it's always current.
@@ -85,19 +118,6 @@ export const ShippingDataProvider = ( { children } ) => {
85
  currentObservers.current = observers;
86
  }, [ observers ] );
87
 
88
- // set selected rates on ref so it's always current.
89
- const selectedRates = useRef( () =>
90
- deriveSelectedShippingRates( shippingRates )
91
- );
92
- useEffect( () => {
93
- const derivedSelectedRates = deriveSelectedShippingRates(
94
- shippingRates
95
- );
96
- if ( ! isShallowEqual( selectedRates.current, derivedSelectedRates ) ) {
97
- selectedRates.current = derivedSelectedRates;
98
- }
99
- }, [ shippingRates ] );
100
-
101
  // increment/decrement checkout calculating counts when shipping is loading.
102
  useEffect( () => {
103
  if ( shippingRatesLoading ) {
@@ -107,7 +127,8 @@ export const ShippingDataProvider = ( { children } ) => {
107
  }
108
  }, [ shippingRatesLoading, dispatchActions ] );
109
 
110
- // increment/decrement checkout calculating counts when shipping rates are being selected.
 
111
  useEffect( () => {
112
  if ( isSelectingRate ) {
113
  dispatchActions.incrementCalculating();
@@ -178,10 +199,7 @@ export const ShippingDataProvider = ( { children } ) => {
178
 
179
  // emit shipping rate selection events.
180
  useEffect( () => {
181
- if ( isSelectingRate ) {
182
- return;
183
- }
184
- if ( currentErrorStatus.hasError ) {
185
  emitEvent(
186
  currentObservers.current,
187
  EMIT_TYPES.SHIPPING_RATE_SELECT_FAIL,
@@ -190,19 +208,28 @@ export const ShippingDataProvider = ( { children } ) => {
190
  hasInvalidAddress: currentErrorStatus.hasInvalidAddress,
191
  }
192
  );
193
- } else {
194
- emitEvent(
195
- currentObservers.current,
196
- EMIT_TYPES.SHIPPING_RATE_SELECT_SUCCESS,
197
- selectedRates.current
198
- );
199
  }
200
  }, [
 
201
  isSelectingRate,
202
  currentErrorStatus.hasError,
203
  currentErrorStatus.hasInvalidAddress,
204
  ] );
205
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
206
  /**
207
  * @type {ShippingDataContext}
208
  */
@@ -211,17 +238,21 @@ export const ShippingDataProvider = ( { children } ) => {
211
  dispatchErrorStatus,
212
  shippingErrorTypes: ERROR_TYPES,
213
  shippingRates,
 
214
  shippingRatesLoading,
215
- selectedRates: selectedRates.current,
216
- setSelectedRates: selectShippingRate,
217
  isSelectingRate,
218
  shippingAddress,
219
  setShippingAddress,
 
 
 
 
 
220
  needsShipping,
221
  hasCalculatedShipping,
222
- ...eventObservers,
223
  };
224
-
225
  return (
226
  <>
227
  <ShippingDataContext.Provider value={ ShippingData }>
9
  useMemo,
10
  useRef,
11
  } from '@wordpress/element';
12
+ import { useStoreCart, useSelectShippingRate } from '@woocommerce/base-hooks';
13
+ import {
14
+ useCheckoutContext,
15
+ useCustomerDataContext,
16
+ } from '@woocommerce/base-context';
17
 
18
  /**
19
  * Internal dependencies
20
  */
21
+ import {
22
+ ERROR_TYPES,
23
+ DEFAULT_SHIPPING_CONTEXT_DATA,
24
+ shippingErrorCodes,
25
+ } from './constants';
26
  import {
27
  EMIT_TYPES,
28
+ emitterSubscribers,
29
  reducer as emitReducer,
30
  emitEvent,
31
  } from './event-emit';
 
 
 
 
32
 
33
  /**
34
  * @typedef {import('@woocommerce/type-defs/contexts').ShippingDataContext} ShippingDataContext
36
  */
37
 
38
  const { NONE, INVALID_ADDRESS, UNKNOWN } = ERROR_TYPES;
39
+
40
+ /**
41
+ * Reducer for shipping status state
42
+ *
43
+ * @param {string} state The current status.
44
+ * @param {Object} action The incoming action.
45
+ * @param {string} action.type The type of action.
46
+ */
47
+ const errorStatusReducer = ( state, { type } ) => {
48
+ if ( Object.values( ERROR_TYPES ).includes( type ) ) {
49
+ return type;
50
+ }
51
+ return state;
52
+ };
53
+
54
  const ShippingDataContext = createContext( DEFAULT_SHIPPING_CONTEXT_DATA );
55
 
56
  /**
57
+ * @return {ShippingDataContext} Returns data and functions related to
58
+ * shipping methods.
59
  */
60
  export const useShippingDataContext = () => {
61
  return useContext( ShippingDataContext );
62
  };
63
 
64
+ const hasInvalidShippingAddress = ( errors ) => {
65
+ return errors.some( ( error ) => {
66
+ if (
67
+ error.code &&
68
+ Object.values( shippingErrorCodes ).includes( error.code )
69
+ ) {
70
+ return true;
71
+ }
72
+ return false;
73
+ } );
74
+ };
75
+
76
  /**
77
+ * The shipping data provider exposes the interface for shipping in the
78
+ * checkout/cart.
79
  *
80
  * @param {Object} props Incoming props for provider
81
  * @param {React.ReactElement} props.children
90
  shippingRatesLoading,
91
  cartErrors,
92
  } = useStoreCart();
 
93
  const [ shippingErrorStatus, dispatchErrorStatus ] = useReducer(
94
  errorStatusReducer,
95
  NONE
96
  );
97
+ const [ observers, subscriber ] = useReducer( emitReducer, {} );
98
  const currentObservers = useRef( observers );
99
+ const {
100
+ selectShippingRate: setSelectedRates,
101
+ selectedShippingRates: selectedRates,
102
+ isSelectingRate,
103
+ } = useSelectShippingRate( shippingRates );
104
+ const eventSubscribers = useMemo(
105
  () => ( {
106
+ onShippingRateSuccess: emitterSubscribers( subscriber ).onSuccess,
107
+ onShippingRateFail: emitterSubscribers( subscriber ).onFail,
108
+ onShippingRateSelectSuccess: emitterSubscribers( subscriber )
 
109
  .onSelectSuccess,
110
+ onShippingRateSelectFail: emitterSubscribers( subscriber )
111
  .onSelectFail,
112
  } ),
113
+ [ subscriber ]
114
  );
115
 
116
  // set observers on ref so it's always current.
118
  currentObservers.current = observers;
119
  }, [ observers ] );
120
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  // increment/decrement checkout calculating counts when shipping is loading.
122
  useEffect( () => {
123
  if ( shippingRatesLoading ) {
127
  }
128
  }, [ shippingRatesLoading, dispatchActions ] );
129
 
130
+ // increment/decrement checkout calculating counts when shipping rates are
131
+ // being selected.
132
  useEffect( () => {
133
  if ( isSelectingRate ) {
134
  dispatchActions.incrementCalculating();
199
 
200
  // emit shipping rate selection events.
201
  useEffect( () => {
202
+ if ( ! isSelectingRate && currentErrorStatus.hasError ) {
 
 
 
203
  emitEvent(
204
  currentObservers.current,
205
  EMIT_TYPES.SHIPPING_RATE_SELECT_FAIL,
208
  hasInvalidAddress: currentErrorStatus.hasInvalidAddress,
209
  }
210
  );
 
 
 
 
 
 
211
  }
212
  }, [
213
+ selectedRates,
214
  isSelectingRate,
215
  currentErrorStatus.hasError,
216
  currentErrorStatus.hasInvalidAddress,
217
  ] );
218
 
219
+ useEffect( () => {
220
+ if (
221
+ ! isSelectingRate &&
222
+ selectedRates &&
223
+ ! currentErrorStatus.hasError
224
+ ) {
225
+ emitEvent(
226
+ currentObservers.current,
227
+ EMIT_TYPES.SHIPPING_RATE_SELECT_SUCCESS,
228
+ selectedRates
229
+ );
230
+ }
231
+ }, [ selectedRates, isSelectingRate, currentErrorStatus.hasError ] );
232
+
233
  /**
234
  * @type {ShippingDataContext}
235
  */
238
  dispatchErrorStatus,
239
  shippingErrorTypes: ERROR_TYPES,
240
  shippingRates,
241
+ setShippingRates: setSelectedRates,
242
  shippingRatesLoading,
243
+ selectedRates,
244
+ setSelectedRates,
245
  isSelectingRate,
246
  shippingAddress,
247
  setShippingAddress,
248
+ onShippingRateSuccess: eventSubscribers.onShippingRateSuccess,
249
+ onShippingRateFail: eventSubscribers.onShippingRateFail,
250
+ onShippingRateSelectSuccess:
251
+ eventSubscribers.onShippingRateSelectSuccess,
252
+ onShippingRateSelectFail: eventSubscribers.onShippingRateSelectFail,
253
  needsShipping,
254
  hasCalculatedShipping,
 
255
  };
 
256
  return (
257
  <>
258
  <ShippingDataContext.Provider value={ ShippingData }>
assets/js/base/context/{providers/container-width-context.js → container-width-context.js} RENAMED
File without changes
assets/js/base/context/{providers/editor-context.js → editor/index.js} RENAMED
@@ -1,7 +1,7 @@
1
  /**
2
  * External dependencies
3
  */
4
- import { createContext, useContext, useCallback } from '@wordpress/element';
5
  import { useSelect } from '@wordpress/data';
6
 
7
  /**
@@ -13,7 +13,6 @@ const EditorContext = createContext( {
13
  isEditor: false,
14
  currentPostId: 0,
15
  previewData: {},
16
- getPreviewData: () => void null,
17
  } );
18
 
19
  /**
@@ -50,16 +49,6 @@ export const EditorProvider = ( {
50
  [ currentPostId ]
51
  );
52
 
53
- const getPreviewData = useCallback(
54
- ( name ) => {
55
- if ( name in previewData ) {
56
- return previewData[ name ];
57
- }
58
- return {};
59
- },
60
- [ previewData ]
61
- );
62
-
63
  /**
64
  * @type {EditorDataContext}
65
  */
@@ -67,7 +56,6 @@ export const EditorProvider = ( {
67
  isEditor: true,
68
  currentPostId: editingPostId,
69
  previewData,
70
- getPreviewData,
71
  };
72
 
73
  return (
1
  /**
2
  * External dependencies
3
  */
4
+ import { createContext, useContext } from '@wordpress/element';
5
  import { useSelect } from '@wordpress/data';
6
 
7
  /**
13
  isEditor: false,
14
  currentPostId: 0,
15
  previewData: {},
 
16
  } );
17
 
18
  /**
49
  [ currentPostId ]
50
  );
51
 
 
 
 
 
 
 
 
 
 
 
52
  /**
53
  * @type {EditorDataContext}
54
  */
56
  isEditor: true,
57
  currentPostId: editingPostId,
58
  previewData,
 
59
  };
60
 
61
  return (
assets/js/base/context/event-emit/emitter-callback.ts DELETED
@@ -1,16 +0,0 @@
1
- /**
2
- * Internal dependencies
3
- */
4
- import { actions } from './reducer';
5
- import type { ActionType, ActionCallbackType } from './types';
6
-
7
- export const emitterCallback = (
8
- type: string,
9
- observerDispatch: React.Dispatch< ActionType >
10
- ) => ( callback: ActionCallbackType, priority = 10 ): ( () => void ) => {
11
- const action = actions.addEventCallback( type, callback, priority );
12
- observerDispatch( action );
13
- return () => {
14
- observerDispatch( actions.removeEventCallback( type, action.id ) );
15
- };
16
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/event-emit/reducer.ts DELETED
@@ -1,65 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { uniqueId } from 'lodash';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import {
10
- ACTION,
11
- ActionType,
12
- ActionCallbackType,
13
- EventObserversType,
14
- } from './types';
15
-
16
- export const actions = {
17
- addEventCallback: (
18
- eventType: string,
19
- callback: ActionCallbackType,
20
- priority = 10
21
- ): ActionType => {
22
- return {
23
- id: uniqueId(),
24
- type: ACTION.ADD_EVENT_CALLBACK,
25
- eventType,
26
- callback,
27
- priority,
28
- };
29
- },
30
- removeEventCallback: ( eventType: string, id: string ): ActionType => {
31
- return {
32
- id,
33
- type: ACTION.REMOVE_EVENT_CALLBACK,
34
- eventType,
35
- };
36
- },
37
- };
38
-
39
- const initialState = {} as EventObserversType;
40
-
41
- /**
42
- * Handles actions for emitters
43
- */
44
- export const reducer = (
45
- state = initialState,
46
- { type, eventType, id, callback, priority }: ActionType
47
- ): typeof initialState => {
48
- const newEvents = state.hasOwnProperty( eventType )
49
- ? new Map( state[ eventType ] )
50
- : new Map();
51
- switch ( type ) {
52
- case ACTION.ADD_EVENT_CALLBACK:
53
- newEvents.set( id, { priority, callback } );
54
- return {
55
- ...state,
56
- [ eventType ]: newEvents,
57
- };
58
- case ACTION.REMOVE_EVENT_CALLBACK:
59
- newEvents.delete( id );
60
- return {
61
- ...state,
62
- [ eventType ]: newEvents,
63
- };
64
- }
65
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/event-emit/types.ts DELETED
@@ -1,18 +0,0 @@
1
- export enum ACTION {
2
- ADD_EVENT_CALLBACK = 'add_event_callback',
3
- REMOVE_EVENT_CALLBACK = 'remove_event_callback',
4
- }
5
-
6
- export type ActionCallbackType = ( ...args: unknown[] ) => unknown;
7
-
8
- export type ActionType = {
9
- type: ACTION;
10
- eventType: string;
11
- id: string;
12
- callback?: ActionCallbackType;
13
- priority?: number;
14
- };
15
-
16
- export type ObserverType = { priority: number; callback: ActionCallbackType };
17
- export type ObserversType = Map< string, ObserverType >;
18
- export type EventObserversType = Record< string, ObserversType >;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/event-emit/utils.ts DELETED
@@ -1,15 +0,0 @@
1
- /**
2
- * Internal dependencies
3
- */
4
- import type { EventObserversType, ObserverType } from './types';
5
-
6
- export const getObserversByPriority = (
7
- observers: EventObserversType,
8
- eventType: string
9
- ): ObserverType[] => {
10
- return observers[ eventType ]
11
- ? Array.from( observers[ eventType ].values() ).sort( ( a, b ) => {
12
- return a.priority - b.priority;
13
- } )
14
- : [];
15
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/cart/use-store-cart-item-quantity.ts DELETED
@@ -1,146 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { useSelect, useDispatch } from '@wordpress/data';
5
- import { useState, useEffect } from '@wordpress/element';
6
- import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
7
- import { useDebounce } from 'use-debounce';
8
- import { usePrevious } from '@woocommerce/base-hooks';
9
- import { triggerFragmentRefresh } from '@woocommerce/base-utils';
10
- import {
11
- CartItem,
12
- StoreCartItemQuantity,
13
- isNumber,
14
- isObject,
15
- isString,
16
- objectHasProp,
17
- } from '@woocommerce/types';
18
-
19
- /**
20
- * Internal dependencies
21
- */
22
- import { useStoreCart } from './use-store-cart';
23
- import { useCheckoutContext } from '../../providers/cart-checkout';
24
-
25
- /**
26
- * Ensures the object passed has props key: string and quantity: number
27
- */
28
- const cartItemHasQuantityAndKey = (
29
- cartItem: unknown /* Object that may have quantity and key */
30
- ): cartItem is Partial< CartItem > =>
31
- isObject( cartItem ) &&
32
- objectHasProp( cartItem, 'key' ) &&
33
- objectHasProp( cartItem, 'quantity' ) &&
34
- isString( cartItem.key ) &&
35
- isNumber( cartItem.quantity );
36
-
37
- /**
38
- * This is a custom hook for loading the Store API /cart/ endpoint and actions for removing or changing item quantity.
39
- *
40
- * @see https://github.com/woocommerce/woocommerce-gutenberg-products-block/tree/trunk/src/RestApi/StoreApi
41
- *
42
- * @param {CartItem} cartItem The cartItem to get quantity info from and will have quantity updated on.
43
- * @return {StoreCartItemQuantity} An object exposing data and actions relating to cart items.
44
- */
45
- export const useStoreCartItemQuantity = (
46
- cartItem: CartItem | Record< string, unknown >
47
- ): StoreCartItemQuantity => {
48
- const verifiedCartItem = { key: '', quantity: 1 };
49
-
50
- if ( cartItemHasQuantityAndKey( cartItem ) ) {
51
- verifiedCartItem.key = cartItem.key;
52
- verifiedCartItem.quantity = cartItem.quantity;
53
- }
54
- const {
55
- key: cartItemKey = '',
56
- quantity: cartItemQuantity = 1,
57
- } = verifiedCartItem;
58
- const { cartErrors } = useStoreCart();
59
- const { dispatchActions } = useCheckoutContext();
60
-
61
- // Store quantity in hook state. This is used to keep the UI updated while server request is updated.
62
- const [ quantity, setQuantity ] = useState< number >( cartItemQuantity );
63
- const [ debouncedQuantity ] = useDebounce< number >( quantity, 400 );
64
- const previousDebouncedQuantity = usePrevious( debouncedQuantity );
65
- const { removeItemFromCart, changeCartItemQuantity } = useDispatch(
66
- storeKey
67
- );
68
-
69
- // Track when things are already pending updates.
70
- const isPending = useSelect(
71
- ( select ) => {
72
- if ( ! cartItemKey ) {
73
- return {
74
- quantity: false,
75
- delete: false,
76
- };
77
- }
78
- const store = select( storeKey );
79
- return {
80
- quantity: store.isItemPendingQuantity( cartItemKey ),
81
- delete: store.isItemPendingDelete( cartItemKey ),
82
- };
83
- },
84
- [ cartItemKey ]
85
- );
86
-
87
- const removeItem = () => {
88
- return cartItemKey
89
- ? removeItemFromCart( cartItemKey ).then( () => {
90
- triggerFragmentRefresh();
91
- return true;
92
- } )
93
- : Promise.resolve( false );
94
- };
95
-
96
- // Observe debounced quantity value, fire action to update server on change.
97
- useEffect( () => {
98
- if (
99
- cartItemKey &&
100
- isNumber( previousDebouncedQuantity ) &&
101
- Number.isFinite( previousDebouncedQuantity ) &&
102
- previousDebouncedQuantity !== debouncedQuantity
103
- ) {
104
- changeCartItemQuantity( cartItemKey, debouncedQuantity );
105
- }
106
- }, [
107
- cartItemKey,
108
- changeCartItemQuantity,
109
- debouncedQuantity,
110
- previousDebouncedQuantity,
111
- ] );
112
-
113
- useEffect( () => {
114
- if ( isPending.delete ) {
115
- dispatchActions.incrementCalculating();
116
- } else {
117
- dispatchActions.decrementCalculating();
118
- }
119
- return () => {
120
- if ( isPending.delete ) {
121
- dispatchActions.decrementCalculating();
122
- }
123
- };
124
- }, [ dispatchActions, isPending.delete ] );
125
-
126
- useEffect( () => {
127
- if ( isPending.quantity || debouncedQuantity !== quantity ) {
128
- dispatchActions.incrementCalculating();
129
- } else {
130
- dispatchActions.decrementCalculating();
131
- }
132
- return () => {
133
- if ( isPending.quantity || debouncedQuantity !== quantity ) {
134
- dispatchActions.decrementCalculating();
135
- }
136
- };
137
- }, [ dispatchActions, isPending.quantity, debouncedQuantity, quantity ] );
138
-
139
- return {
140
- isPendingDelete: isPending.delete,
141
- quantity,
142
- setItemQuantity: setQuantity,
143
- removeItem,
144
- cartItemQuantityErrors: cartErrors,
145
- };
146
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/collections/index.js DELETED
@@ -1,3 +0,0 @@
1
- export * from './use-collection-data';
2
- export * from './use-collection-header';
3
- export * from './use-collection';
 
 
 
assets/js/base/context/hooks/index.js DELETED
@@ -1,14 +0,0 @@
1
- export * from './cart';
2
- export * from './collections';
3
- export * from './shipping';
4
- export * from './payment-methods';
5
- export * from './use-store-notices';
6
- export * from './use-store-events';
7
- export * from './use-query-state';
8
- export * from './use-store-products';
9
- export * from './use-store-add-to-cart';
10
- export * from './use-customer-data';
11
- export * from './use-checkout-address';
12
- export * from './use-checkout-notices';
13
- export * from './use-checkout-submit';
14
- export * from './use-emit-response';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/payment-methods/use-payment-methods.js DELETED
@@ -1,35 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { useShallowEqual } from '@woocommerce/base-hooks';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import { usePaymentMethodDataContext } from '../../providers/cart-checkout/payment-methods';
10
-
11
- const usePaymentMethodState = ( express = false ) => {
12
- const {
13
- paymentMethods,
14
- expressPaymentMethods,
15
- paymentMethodsInitialized,
16
- expressPaymentMethodsInitialized,
17
- } = usePaymentMethodDataContext();
18
-
19
- const currentPaymentMethods = useShallowEqual( paymentMethods );
20
- const currentExpressPaymentMethods = useShallowEqual(
21
- expressPaymentMethods
22
- );
23
-
24
- return {
25
- paymentMethods: express
26
- ? currentExpressPaymentMethods
27
- : currentPaymentMethods,
28
- isInitialized: express
29
- ? expressPaymentMethodsInitialized
30
- : paymentMethodsInitialized,
31
- };
32
- };
33
-
34
- export const usePaymentMethods = () => usePaymentMethodState();
35
- export const useExpressPaymentMethods = () => usePaymentMethodState( true );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/payment-methods/utils.ts DELETED
@@ -1,85 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __ } from '@wordpress/i18n';
5
- import {
6
- CartResponseTotals,
7
- objectHasProp,
8
- isString,
9
- } from '@woocommerce/types';
10
-
11
- export interface CartTotalItem {
12
- key: string;
13
- label: string;
14
- value: number;
15
- valueWithTax: number;
16
- }
17
-
18
- /**
19
- * Prepares the total items into a shape usable for display as passed on to
20
- * registered payment methods.
21
- *
22
- * @param {Object} totals Current cart total items
23
- * @param {boolean} needsShipping Whether or not shipping is needed.
24
- */
25
- export const prepareTotalItems = (
26
- totals: CartResponseTotals,
27
- needsShipping: boolean
28
- ): CartTotalItem[] => {
29
- const newTotals = [];
30
-
31
- const factory = ( label: string, property: string ): CartTotalItem => {
32
- const taxProperty = property + '_tax';
33
- const value =
34
- objectHasProp( totals, property ) && isString( totals[ property ] )
35
- ? parseInt( totals[ property ] as string, 10 )
36
- : 0;
37
- const tax =
38
- objectHasProp( totals, taxProperty ) &&
39
- isString( totals[ taxProperty ] )
40
- ? parseInt( totals[ taxProperty ] as string, 10 )
41
- : 0;
42
- return {
43
- key: property,
44
- label,
45
- value,
46
- valueWithTax: value + tax,
47
- };
48
- };
49
-
50
- newTotals.push(
51
- factory(
52
- __( 'Subtotal:', 'woo-gutenberg-products-block' ),
53
- 'total_items'
54
- )
55
- );
56
-
57
- newTotals.push(
58
- factory( __( 'Fees:', 'woo-gutenberg-products-block' ), 'total_fees' )
59
- );
60
-
61
- newTotals.push(
62
- factory(
63
- __( 'Discount:', 'woo-gutenberg-products-block' ),
64
- 'total_discount'
65
- )
66
- );
67
-
68
- newTotals.push( {
69
- key: 'total_tax',
70
- label: __( 'Taxes:', 'woo-gutenberg-products-block' ),
71
- value: parseInt( totals.total_tax, 10 ),
72
- valueWithTax: parseInt( totals.total_tax, 10 ),
73
- } );
74
-
75
- if ( needsShipping ) {
76
- newTotals.push(
77
- factory(
78
- __( 'Shipping:', 'woo-gutenberg-products-block' ),
79
- 'total_shipping'
80
- )
81
- );
82
- }
83
-
84
- return newTotals;
85
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/shipping/index.js DELETED
@@ -1,2 +0,0 @@
1
- export * from './use-select-shipping-rate';
2
- export * from './use-select-shipping-rates';
 
 
assets/js/base/context/hooks/shipping/use-select-shipping-rate.ts DELETED
@@ -1,81 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { useState, useEffect, useRef, useCallback } from '@wordpress/element';
5
- import isShallowEqual from '@wordpress/is-shallow-equal';
6
- import { CartShippingPackageShippingRate } from '@woocommerce/type-defs/cart';
7
-
8
- /**
9
- * Internal dependencies
10
- */
11
- import { useSelectShippingRates } from './use-select-shipping-rates';
12
- import { useStoreEvents } from '../use-store-events';
13
-
14
- /**
15
- * Selected rates are derived by looping over the shipping rates.
16
- *
17
- * @param {Array} shippingRates Array of shipping rates.
18
- * @return {string} Selected rate id.
19
- */
20
- // This will find the selected rate ID in an array of shipping rates.
21
- const deriveSelectedRateId = (
22
- shippingRates: CartShippingPackageShippingRate[]
23
- ) => shippingRates.find( ( rate ) => rate.selected )?.rate_id;
24
-
25
- /**
26
- * This is a custom hook for tracking selected shipping rates for a package and selecting a rate. State is used so
27
- * changes are reflected in the UI instantly.
28
- *
29
- * @param {string} packageId Package ID to select rates for.
30
- * @param {Array} shippingRates an array of packages with shipping rates.
31
- * @return {Object} This hook will return an object with these properties:
32
- * - selectShippingRate: A function that immediately returns the selected rate and dispatches an action generator.
33
- * - selectedShippingRate: The selected rate id.
34
- * - isSelectingRate: True when rates are being resolved to the API.
35
- */
36
- export const useSelectShippingRate = (
37
- packageId: string | number,
38
- shippingRates: CartShippingPackageShippingRate[]
39
- ): {
40
- selectShippingRate: ( newShippingRateId: string ) => unknown;
41
- selectedShippingRate: string | undefined;
42
- isSelectingRate: boolean;
43
- } => {
44
- const { dispatchCheckoutEvent } = useStoreEvents();
45
-
46
- // Rates are selected via the shipping data context provider.
47
- const { selectShippingRate, isSelectingRate } = useSelectShippingRates();
48
-
49
- // Selected rates are stored in state. This allows shipping rates changes to be shown in the UI instantly.
50
- // Defaults to the currently selected rate_id.
51
- const [ selectedShippingRate, setSelectedShippingRate ] = useState( () =>
52
- deriveSelectedRateId( shippingRates )
53
- );
54
-
55
- // This ref is used to track when changes come in via the props. When the incoming shipping rates change, update our local state if there are changes to selected methods.
56
- const currentShippingRates = useRef( shippingRates );
57
- useEffect( () => {
58
- if ( ! isShallowEqual( currentShippingRates.current, shippingRates ) ) {
59
- currentShippingRates.current = shippingRates;
60
- setSelectedShippingRate( deriveSelectedRateId( shippingRates ) );
61
- }
62
- }, [ shippingRates ] );
63
-
64
- // Sets a rate for a package in state (so changes are shown right away to consumers of the hook) and in the stores.
65
- const setPackageRateId = useCallback(
66
- ( newShippingRateId ) => {
67
- setSelectedShippingRate( newShippingRateId );
68
- selectShippingRate( newShippingRateId, packageId );
69
- dispatchCheckoutEvent( 'set-selected-shipping-rate', {
70
- shippingRateId: newShippingRateId,
71
- } );
72
- },
73
- [ packageId, selectShippingRate, dispatchCheckoutEvent ]
74
- );
75
-
76
- return {
77
- selectShippingRate: setPackageRateId,
78
- selectedShippingRate,
79
- isSelectingRate,
80
- };
81
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/shipping/use-select-shipping-rates.ts DELETED
@@ -1,55 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { useDispatch, useSelect } from '@wordpress/data';
5
- import { useCallback } from '@wordpress/element';
6
- import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
7
- import { useThrowError } from '@woocommerce/base-hooks';
8
-
9
- /**
10
- * This is a custom hook for selecting shipping rates
11
- *
12
- * @return {Object} This hook will return an object with these properties:
13
- * - selectShippingRate: A function that immediately returns the selected rate and dispatches an action generator.
14
- * - isSelectingRate: True when rates are being resolved to the API.
15
- */
16
- export const useSelectShippingRates = (): {
17
- selectShippingRate: (
18
- newShippingRateId: string,
19
- packageId: string | number
20
- ) => unknown;
21
- isSelectingRate: boolean;
22
- } => {
23
- const throwError = useThrowError();
24
- const { selectShippingRate } = ( useDispatch( storeKey ) as {
25
- selectShippingRate: unknown;
26
- } ) as {
27
- selectShippingRate: (
28
- newShippingRateId: string,
29
- packageId: string | number
30
- ) => Promise< unknown >;
31
- };
32
-
33
- // Sets a rate for a package in state (so changes are shown right away to consumers of the hook) and in the stores.
34
- const setRate = useCallback(
35
- ( newShippingRateId, packageId ) => {
36
- selectShippingRate( newShippingRateId, packageId ).catch(
37
- ( error ) => {
38
- // we throw this error because an error on selecting a rate is problematic.
39
- throwError( error );
40
- }
41
- );
42
- },
43
- [ throwError, selectShippingRate ]
44
- );
45
-
46
- // See if rates are being selected.
47
- const isSelectingRate = useSelect< boolean >( ( select ) => {
48
- return select( storeKey ).isShippingRateBeingSelected();
49
- }, [] );
50
-
51
- return {
52
- selectShippingRate: setRate,
53
- isSelectingRate,
54
- };
55
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/test/use-store-snackbar-notices.js DELETED
@@ -1,51 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { render, act } from '@testing-library/react';
5
- import { StoreSnackbarNoticesProvider } from '@woocommerce/base-context/providers';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import { useStoreSnackbarNotices } from '../use-store-snackbar-notices';
11
-
12
- describe( 'useStoreNoticesWithSnackbar', () => {
13
- function setup() {
14
- const returnVal = {};
15
-
16
- function TestComponent() {
17
- Object.assign( returnVal, useStoreSnackbarNotices() );
18
-
19
- return null;
20
- }
21
-
22
- render(
23
- <StoreSnackbarNoticesProvider>
24
- <TestComponent />
25
- </StoreSnackbarNoticesProvider>
26
- );
27
-
28
- return returnVal;
29
- }
30
-
31
- test( 'allows adding and removing notices and checking if there are notices of a specific type', () => {
32
- const storeNoticesData = setup();
33
-
34
- // Assert initial state.
35
- expect( storeNoticesData.notices ).toEqual( [] );
36
-
37
- // Add snackbar notice.
38
- act( () => {
39
- storeNoticesData.addSnackbarNotice( 'Snackbar notice' );
40
- } );
41
-
42
- expect( storeNoticesData.notices.length ).toBe( 1 );
43
-
44
- // Remove all remaining notices.
45
- act( () => {
46
- storeNoticesData.removeNotices();
47
- } );
48
-
49
- expect( storeNoticesData.notices.length ).toBe( 0 );
50
- } );
51
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/use-checkout-submit.js DELETED
@@ -1,47 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __ } from '@wordpress/i18n';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import { useCheckoutContext } from '../providers/cart-checkout/checkout-state';
10
- import { usePaymentMethodDataContext } from '../providers/cart-checkout/payment-methods';
11
- import { usePaymentMethods } from './payment-methods/use-payment-methods';
12
-
13
- /**
14
- * Returns the submitButtonText, onSubmit interface from the checkout context,
15
- * and an indication of submission status.
16
- */
17
- export const useCheckoutSubmit = () => {
18
- const {
19
- onSubmit,
20
- isCalculating,
21
- isBeforeProcessing,
22
- isProcessing,
23
- isAfterProcessing,
24
- isComplete,
25
- hasError,
26
- } = useCheckoutContext();
27
- const { paymentMethods = {} } = usePaymentMethods();
28
- const {
29
- activePaymentMethod,
30
- currentStatus: paymentStatus,
31
- } = usePaymentMethodDataContext();
32
- const paymentMethod = paymentMethods[ activePaymentMethod ] || {};
33
- const waitingForProcessing =
34
- isProcessing || isAfterProcessing || isBeforeProcessing;
35
- const waitingForRedirect = isComplete && ! hasError;
36
-
37
- return {
38
- submitButtonText:
39
- paymentMethod?.placeOrderButtonLabel ||
40
- __( 'Place Order', 'woo-gutenberg-products-block' ),
41
- onSubmit,
42
- isCalculating,
43
- isDisabled: isProcessing || paymentStatus.isDoingExpressPayment,
44
- waitingForProcessing,
45
- waitingForRedirect,
46
- };
47
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/use-customer-data.ts DELETED
@@ -1,181 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { useDispatch } from '@wordpress/data';
5
- import { useEffect, useState, useCallback, useRef } from '@wordpress/element';
6
- import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
7
- import { useDebounce } from 'use-debounce';
8
- import isShallowEqual from '@wordpress/is-shallow-equal';
9
- import {
10
- formatStoreApiErrorMessage,
11
- pluckAddress,
12
- pluckEmail,
13
- } from '@woocommerce/base-utils';
14
- import type {
15
- CartResponseBillingAddress,
16
- CartResponseShippingAddress,
17
- } from '@woocommerce/types';
18
-
19
- declare type CustomerData = {
20
- billingData: CartResponseBillingAddress;
21
- shippingAddress: CartResponseShippingAddress;
22
- };
23
-
24
- /**
25
- * Internal dependencies
26
- */
27
- import { useStoreCart } from './cart/use-store-cart';
28
- import { useStoreNotices } from './use-store-notices';
29
-
30
- function instanceOfCartResponseBillingAddress(
31
- address: CartResponseBillingAddress | CartResponseShippingAddress
32
- ): address is CartResponseBillingAddress {
33
- return 'email' in address;
34
- }
35
-
36
- /**
37
- * Does a shallow compare of important address data to determine if the cart needs updating on the server.
38
- *
39
- * This takes the current and previous address into account, as well as the billing email field.
40
- *
41
- * @param {Object} previousAddress An object containing all previous address information
42
- * @param {Object} address An object containing all address information
43
- *
44
- * @return {boolean} True if the store needs updating due to changed data.
45
- */
46
- const shouldUpdateAddressStore = <
47
- T extends CartResponseBillingAddress | CartResponseShippingAddress
48
- >(
49
- previousAddress: T,
50
- address: T
51
- ): boolean => {
52
- if (
53
- instanceOfCartResponseBillingAddress( address ) &&
54
- pluckEmail( address ) !==
55
- pluckEmail( previousAddress as CartResponseBillingAddress )
56
- ) {
57
- return true;
58
- }
59
-
60
- return (
61
- !! address.country &&
62
- ! isShallowEqual(
63
- pluckAddress( previousAddress ),
64
- pluckAddress( address )
65
- )
66
- );
67
- };
68
-
69
- /**
70
- * This is a custom hook for syncing customer address data (billing and shipping) with the server.
71
- */
72
- export const useCustomerData = (): {
73
- billingData: CartResponseBillingAddress;
74
- shippingAddress: CartResponseShippingAddress;
75
- setBillingData: ( data: CartResponseBillingAddress ) => void;
76
- setShippingAddress: ( data: CartResponseShippingAddress ) => void;
77
- } => {
78
- const { updateCustomerData } = useDispatch( storeKey );
79
- const { addErrorNotice, removeNotice } = useStoreNotices();
80
-
81
- // Grab the initial values from the store cart hook.
82
- const {
83
- billingAddress: initialBillingAddress,
84
- shippingAddress: initialShippingAddress,
85
- }: Omit< CustomerData, 'billingData' > & {
86
- billingAddress: CartResponseBillingAddress;
87
- } = useStoreCart();
88
-
89
- // State of customer data is tracked here from this point, using the initial values from the useStoreCart hook.
90
- const [ customerData, setCustomerData ] = useState< CustomerData >( {
91
- billingData: initialBillingAddress,
92
- shippingAddress: initialShippingAddress,
93
- } );
94
-
95
- // Store values last sent to the server in a ref to avoid requests unless important fields are changed.
96
- const previousCustomerData = useRef< CustomerData >( customerData );
97
-
98
- // Debounce updates to the customerData state so it's not triggered excessively.
99
- const [ debouncedCustomerData ] = useDebounce( customerData, 1000, {
100
- // Default equalityFn is prevData === newData.
101
- equalityFn: ( prevData, newData ) => {
102
- return (
103
- isShallowEqual( prevData.billingData, newData.billingData ) &&
104
- isShallowEqual(
105
- prevData.shippingAddress,
106
- newData.shippingAddress
107
- )
108
- );
109
- },
110
- } );
111
-
112
- /**
113
- * Set billing data.
114
- *
115
- * Contains special handling for email and phone so those fields are not overwritten if simply updating address.
116
- */
117
- const setBillingData = useCallback( ( newData ) => {
118
- setCustomerData( ( prevState ) => {
119
- return {
120
- ...prevState,
121
- billingData: {
122
- ...prevState.billingData,
123
- ...newData,
124
- },
125
- };
126
- } );
127
- }, [] );
128
-
129
- /**
130
- * Set shipping data.
131
- */
132
- const setShippingAddress = useCallback( ( newData ) => {
133
- setCustomerData( ( prevState ) => ( {
134
- ...prevState,
135
- shippingAddress: newData,
136
- } ) );
137
- }, [] );
138
-
139
- /**
140
- * This pushes changes to the API when the local state differs from the address in the cart.
141
- */
142
- useEffect( () => {
143
- // Only push updates when enough fields are populated.
144
- if (
145
- ! shouldUpdateAddressStore(
146
- previousCustomerData.current.billingData,
147
- debouncedCustomerData.billingData
148
- ) &&
149
- ! shouldUpdateAddressStore(
150
- previousCustomerData.current.shippingAddress,
151
- debouncedCustomerData.shippingAddress
152
- )
153
- ) {
154
- return;
155
- }
156
- previousCustomerData.current = debouncedCustomerData;
157
- updateCustomerData( {
158
- billing_address: debouncedCustomerData.billingData,
159
- shipping_address: debouncedCustomerData.shippingAddress,
160
- } )
161
- .then( () => {
162
- removeNotice( 'checkout' );
163
- } )
164
- .catch( ( response ) => {
165
- addErrorNotice( formatStoreApiErrorMessage( response ), {
166
- id: 'checkout',
167
- } );
168
- } );
169
- }, [
170
- debouncedCustomerData,
171
- addErrorNotice,
172
- removeNotice,
173
- updateCustomerData,
174
- ] );
175
- return {
176
- billingData: customerData.billingData,
177
- shippingAddress: customerData.shippingAddress,
178
- setBillingData,
179
- setShippingAddress,
180
- };
181
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/use-emit-response.ts DELETED
@@ -1,66 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { isObject } from '@woocommerce/types';
5
-
6
- export enum responseTypes {
7
- SUCCESS = 'success',
8
- FAIL = 'failure',
9
- ERROR = 'error',
10
- }
11
-
12
- export enum noticeContexts {
13
- PAYMENTS = 'wc/payment-area',
14
- EXPRESS_PAYMENTS = 'wc/express-payment-area',
15
- }
16
-
17
- export interface ResponseType extends Record< string, unknown > {
18
- type: responseTypes;
19
- retry?: boolean;
20
- }
21
-
22
- const isResponseOf = (
23
- response: unknown,
24
- type: string
25
- ): response is ResponseType => {
26
- return isObject( response ) && 'type' in response && response.type === type;
27
- };
28
-
29
- export const isSuccessResponse = (
30
- response: unknown
31
- ): response is ResponseType => {
32
- return isResponseOf( response, responseTypes.SUCCESS );
33
- };
34
-
35
- export const isErrorResponse = (
36
- response: unknown
37
- ): response is ResponseType => {
38
- return isResponseOf( response, responseTypes.ERROR );
39
- };
40
-
41
- export const isFailResponse = (
42
- response: unknown
43
- ): response is ResponseType => {
44
- return isResponseOf( response, responseTypes.FAIL );
45
- };
46
-
47
- export const shouldRetry = ( response: unknown ): boolean => {
48
- return (
49
- ! isObject( response ) ||
50
- typeof response.retry === 'undefined' ||
51
- response.retry === true
52
- );
53
- };
54
-
55
- /**
56
- * A custom hook exposing response utilities for emitters.
57
- */
58
- export const useEmitResponse = () =>
59
- ( {
60
- responseTypes,
61
- noticeContexts,
62
- shouldRetry,
63
- isSuccessResponse,
64
- isErrorResponse,
65
- isFailResponse,
66
- } as const );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/use-store-events.ts DELETED
@@ -1,66 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { doAction } from '@wordpress/hooks';
5
- import { useCallback, useRef, useEffect } from '@wordpress/element';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import { useStoreCart } from './cart/use-store-cart';
11
-
12
- type StoreEvent = (
13
- eventName: string,
14
- eventParams?: Partial< Record< string, unknown > >
15
- ) => void;
16
-
17
- /**
18
- * Abstraction on top of @wordpress/hooks for dispatching events via doAction for 3rd parties to hook into.
19
- */
20
- export const useStoreEvents = (): {
21
- dispatchStoreEvent: StoreEvent;
22
- dispatchCheckoutEvent: StoreEvent;
23
- } => {
24
- const storeCart = useStoreCart();
25
- const currentStoreCart = useRef( storeCart );
26
-
27
- // Track the latest version of the cart so we can use the current value in our callback function below without triggering
28
- // other useEffect hooks using dispatchCheckoutEvent as a dependency.
29
- useEffect( () => {
30
- currentStoreCart.current = storeCart;
31
- }, [ storeCart ] );
32
-
33
- const dispatchStoreEvent = useCallback( ( eventName, eventParams = {} ) => {
34
- try {
35
- doAction(
36
- `experimental__woocommerce_blocks-${ eventName }`,
37
- eventParams
38
- );
39
- } catch ( e ) {
40
- // We don't handle thrown errors but just console.log for troubleshooting.
41
- // eslint-disable-next-line no-console
42
- console.error( e );
43
- }
44
- }, [] );
45
-
46
- const dispatchCheckoutEvent = useCallback(
47
- ( eventName, eventParams = {} ) => {
48
- try {
49
- doAction(
50
- `experimental__woocommerce_blocks-checkout-${ eventName }`,
51
- {
52
- ...eventParams,
53
- storeCart: currentStoreCart.current,
54
- }
55
- );
56
- } catch ( e ) {
57
- // We don't handle thrown errors but just console.log for troubleshooting.
58
- // eslint-disable-next-line no-console
59
- console.error( e );
60
- }
61
- },
62
- []
63
- );
64
-
65
- return { dispatchStoreEvent, dispatchCheckoutEvent };
66
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/use-store-snackbar-notices.js DELETED
@@ -1,52 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { useMemo, useRef, useEffect } from '@wordpress/element';
5
- import { useStoreSnackbarNoticesContext } from '@woocommerce/base-context/providers';
6
-
7
- export const useStoreSnackbarNotices = () => {
8
- const {
9
- notices,
10
- createSnackbarNotice,
11
- removeSnackbarNotice,
12
- setIsSuppressed,
13
- } = useStoreSnackbarNoticesContext();
14
- // Added to a ref so the surface for notices doesn't change frequently
15
- // and thus can be used as dependencies on effects.
16
- const currentNotices = useRef( notices );
17
-
18
- // Update notices ref whenever they change
19
- useEffect( () => {
20
- currentNotices.current = notices;
21
- }, [ notices ] );
22
-
23
- const noticesApi = useMemo(
24
- () => ( {
25
- removeNotices: ( status = null ) => {
26
- currentNotices.current.forEach( ( notice ) => {
27
- if ( status === null || notice.status === status ) {
28
- removeSnackbarNotice( notice.id );
29
- }
30
- } );
31
- },
32
- removeSnackbarNotice,
33
- } ),
34
- [ removeSnackbarNotice ]
35
- );
36
-
37
- const noticeCreators = useMemo(
38
- () => ( {
39
- addSnackbarNotice: ( text, noticeProps = {} ) => {
40
- createSnackbarNotice( text, noticeProps );
41
- },
42
- } ),
43
- [ createSnackbarNotice ]
44
- );
45
-
46
- return {
47
- notices,
48
- ...noticesApi,
49
- ...noticeCreators,
50
- setIsSuppressed,
51
- };
52
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/index.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ export * from './cart-checkout';
2
+ export * from './container-width-context';
3
+ export * from './query-state-context';
4
+ export * from './store-notices-context';
5
+ export * from './editor';
6
+ export * from './add-to-cart-form';
7
+ export * from './shared';
assets/js/base/context/index.ts DELETED
@@ -1,3 +0,0 @@
1
- export * from './event-emit';
2
- export * from './hooks';
3
- export * from './providers';
 
 
 
assets/js/base/context/providers/cart-checkout/checkout-state/actions.ts DELETED
@@ -1,110 +0,0 @@
1
- /**
2
- * Internal dependencies
3
- */
4
- import type { PaymentResultDataType } from './types';
5
-
6
- export enum ACTION {
7
- SET_IDLE = 'set_idle',
8
- SET_PRISTINE = 'set_pristine',
9
- SET_REDIRECT_URL = 'set_redirect_url',
10
- SET_COMPLETE = 'set_checkout_complete',
11
- SET_BEFORE_PROCESSING = 'set_before_processing',
12
- SET_AFTER_PROCESSING = 'set_after_processing',
13
- SET_PROCESSING_RESPONSE = 'set_processing_response',
14
- SET_PROCESSING = 'set_checkout_is_processing',
15
- SET_HAS_ERROR = 'set_checkout_has_error',
16
- SET_NO_ERROR = 'set_checkout_no_error',
17
- SET_CUSTOMER_ID = 'set_checkout_customer_id',
18
- SET_ORDER_ID = 'set_checkout_order_id',
19
- SET_ORDER_NOTES = 'set_checkout_order_notes',
20
- INCREMENT_CALCULATING = 'increment_calculating',
21
- DECREMENT_CALCULATING = 'decrement_calculating',
22
- SET_SHOULD_CREATE_ACCOUNT = 'set_should_create_account',
23
- }
24
-
25
- export interface ActionType {
26
- type: ACTION;
27
- data?:
28
- | Record< string, unknown >
29
- | Record< string, never >
30
- | PaymentResultDataType;
31
- url?: string;
32
- customerId?: number;
33
- orderId?: number;
34
- shouldCreateAccount?: boolean;
35
- hasError?: boolean;
36
- orderNotes?: string;
37
- }
38
-
39
- /**
40
- * All the actions that can be dispatched for the checkout.
41
- */
42
- export const actions = {
43
- setPristine: () =>
44
- ( {
45
- type: ACTION.SET_PRISTINE,
46
- } as const ),
47
- setIdle: () =>
48
- ( {
49
- type: ACTION.SET_IDLE,
50
- } as const ),
51
- setProcessing: () =>
52
- ( {
53
- type: ACTION.SET_PROCESSING,
54
- } as const ),
55
- setRedirectUrl: ( url: string ) =>
56
- ( {
57
- type: ACTION.SET_REDIRECT_URL,
58
- url,
59
- } as const ),
60
- setProcessingResponse: ( data: PaymentResultDataType ) =>
61
- ( {
62
- type: ACTION.SET_PROCESSING_RESPONSE,
63
- data,
64
- } as const ),
65
- setComplete: ( data: Record< string, unknown > = {} ) =>
66
- ( {
67
- type: ACTION.SET_COMPLETE,
68
- data,
69
- } as const ),
70
- setBeforeProcessing: () =>
71
- ( {
72
- type: ACTION.SET_BEFORE_PROCESSING,
73
- } as const ),
74
- setAfterProcessing: () =>
75
- ( {
76
- type: ACTION.SET_AFTER_PROCESSING,
77
- } as const ),
78
- setHasError: ( hasError = true ) =>
79
- ( {
80
- type: hasError ? ACTION.SET_HAS_ERROR : ACTION.SET_NO_ERROR,
81
- } as const ),
82
- incrementCalculating: () =>
83
- ( {
84
- type: ACTION.INCREMENT_CALCULATING,
85
- } as const ),
86
- decrementCalculating: () =>
87
- ( {
88
- type: ACTION.DECREMENT_CALCULATING,
89
- } as const ),
90
- setCustomerId: ( customerId: number ) =>
91
- ( {
92
- type: ACTION.SET_CUSTOMER_ID,
93
- customerId,
94
- } as const ),
95
- setOrderId: ( orderId: number ) =>
96
- ( {
97
- type: ACTION.SET_ORDER_ID,
98
- orderId,
99
- } as const ),
100
- setShouldCreateAccount: ( shouldCreateAccount: boolean ) =>
101
- ( {
102
- type: ACTION.SET_SHOULD_CREATE_ACCOUNT,
103
- shouldCreateAccount,
104
- } as const ),
105
- setOrderNotes: ( orderNotes: string ) =>
106
- ( {
107
- type: ACTION.SET_ORDER_NOTES,
108
- orderNotes,
109
- } as const ),
110
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/providers/cart-checkout/checkout-state/constants.ts DELETED
@@ -1,84 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { getSetting } from '@woocommerce/settings';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import type {
10
- CheckoutStateContextType,
11
- CheckoutStateContextState,
12
- } from './types';
13
-
14
- export enum STATUS {
15
- // Checkout is in it's initialized state.
16
- PRISTINE = 'pristine',
17
- // When checkout state has changed but there is no activity happening.
18
- IDLE = 'idle',
19
- // After BEFORE_PROCESSING status emitters have finished successfully. Payment processing is started on this checkout status.
20
- PROCESSING = 'processing',
21
- // After the AFTER_PROCESSING event emitters have completed. This status triggers the checkout redirect.
22
- COMPLETE = 'complete',
23
- // This is the state before checkout processing begins after the checkout button has been pressed/submitted.
24
- BEFORE_PROCESSING = 'before_processing',
25
- // After server side checkout processing is completed this status is set
26
- AFTER_PROCESSING = 'after_processing',
27
- }
28
-
29
- const preloadedApiRequests = getSetting( 'preloadedApiRequests', {} ) as Record<
30
- string,
31
- { body: Record< string, unknown > }
32
- >;
33
-
34
- const checkoutData = {
35
- order_id: 0,
36
- customer_id: 0,
37
- ...( preloadedApiRequests[ '/wc/store/checkout' ]?.body || {} ),
38
- };
39
-
40
- export const DEFAULT_CHECKOUT_STATE_DATA: CheckoutStateContextType = {
41
- dispatchActions: {
42
- resetCheckout: () => void null,
43
- setRedirectUrl: ( url ) => void url,
44
- setHasError: ( hasError ) => void hasError,
45
- setAfterProcessing: ( response ) => void response,
46
- incrementCalculating: () => void null,
47
- decrementCalculating: () => void null,
48
- setCustomerId: ( id ) => void id,
49
- setOrderId: ( id ) => void id,
50
- setOrderNotes: ( orderNotes ) => void orderNotes,
51
- },
52
- onSubmit: () => void null,
53
- isComplete: false,
54
- isIdle: false,
55
- isCalculating: false,
56
- isProcessing: false,
57
- isBeforeProcessing: false,
58
- isAfterProcessing: false,
59
- hasError: false,
60
- redirectUrl: '',
61
- orderId: 0,
62
- orderNotes: '',
63
- customerId: 0,
64
- onCheckoutAfterProcessingWithSuccess: () => () => void null,
65
- onCheckoutAfterProcessingWithError: () => () => void null,
66
- onCheckoutBeforeProcessing: () => () => void null, // deprecated for onCheckoutValidationBeforeProcessing
67
- onCheckoutValidationBeforeProcessing: () => () => void null,
68
- hasOrder: false,
69
- isCart: false,
70
- shouldCreateAccount: false,
71
- setShouldCreateAccount: ( value ) => void value,
72
- };
73
-
74
- export const DEFAULT_STATE: CheckoutStateContextState = {
75
- redirectUrl: '',
76
- status: STATUS.PRISTINE,
77
- hasError: false,
78
- calculatingCount: 0,
79
- orderId: checkoutData.order_id,
80
- orderNotes: '',
81
- customerId: checkoutData.customer_id,
82
- shouldCreateAccount: false,
83
- processingResponse: null,
84
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/providers/cart-checkout/checkout-state/event-emit.ts DELETED
@@ -1,62 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { useMemo } from '@wordpress/element';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import {
10
- emitterCallback,
11
- reducer,
12
- emitEvent,
13
- emitEventWithAbort,
14
- ActionType,
15
- } from '../../../event-emit';
16
-
17
- const EMIT_TYPES = {
18
- CHECKOUT_VALIDATION_BEFORE_PROCESSING:
19
- 'checkout_validation_before_processing',
20
- CHECKOUT_AFTER_PROCESSING_WITH_SUCCESS:
21
- 'checkout_after_processing_with_success',
22
- CHECKOUT_AFTER_PROCESSING_WITH_ERROR:
23
- 'checkout_after_processing_with_error',
24
- };
25
-
26
- type EventEmittersType = Record< string, ReturnType< typeof emitterCallback > >;
27
-
28
- /**
29
- * Receives a reducer dispatcher and returns an object with the
30
- * various event emitters for the payment processing events.
31
- *
32
- * Calling the event registration function with the callback will register it
33
- * for the event emitter and will return a dispatcher for removing the
34
- * registered callback (useful for implementation in `useEffect`).
35
- *
36
- * @param {Function} observerDispatch The emitter reducer dispatcher.
37
- * @return {Object} An object with the various payment event emitter registration functions
38
- */
39
- const useEventEmitters = (
40
- observerDispatch: React.Dispatch< ActionType >
41
- ): EventEmittersType => {
42
- const eventEmitters = useMemo(
43
- () => ( {
44
- onCheckoutAfterProcessingWithSuccess: emitterCallback(
45
- EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_SUCCESS,
46
- observerDispatch
47
- ),
48
- onCheckoutAfterProcessingWithError: emitterCallback(
49
- EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_ERROR,
50
- observerDispatch
51
- ),
52
- onCheckoutValidationBeforeProcessing: emitterCallback(
53
- EMIT_TYPES.CHECKOUT_VALIDATION_BEFORE_PROCESSING,
54
- observerDispatch
55
- ),
56
- } ),
57
- [ observerDispatch ]
58
- );
59
- return eventEmitters;
60
- };
61
-
62
- export { EMIT_TYPES, useEventEmitters, reducer, emitEvent, emitEventWithAbort };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/providers/cart-checkout/checkout-state/reducer.ts DELETED
@@ -1,197 +0,0 @@
1
- /**
2
- * Internal dependencies
3
- */
4
- import { DEFAULT_STATE, STATUS } from './constants';
5
- import { ActionType, ACTION } from './actions';
6
- import type { CheckoutStateContextState, PaymentResultDataType } from './types';
7
-
8
- /**
9
- * Reducer for the checkout state
10
- *
11
- * @param {Object} state Current state.
12
- * @param {Object} action Incoming action object.
13
- * @param {string} action.url URL passed in.
14
- * @param {string} action.type Type of action.
15
- * @param {string} action.customerId Customer ID.
16
- * @param {string} action.orderId Order ID.
17
- * @param {Array} action.orderNotes Order notes.
18
- * @param {boolean} action.shouldCreateAccount True if shopper has requested a user account (sign-up checkbox).
19
- * @param {Object} action.data Other action payload.
20
- */
21
- export const reducer = (
22
- state = DEFAULT_STATE,
23
- {
24
- url,
25
- type,
26
- customerId,
27
- orderId,
28
- orderNotes,
29
- shouldCreateAccount,
30
- data,
31
- }: ActionType
32
- ): CheckoutStateContextState => {
33
- let newState = state;
34
- switch ( type ) {
35
- case ACTION.SET_PRISTINE:
36
- newState = DEFAULT_STATE;
37
- break;
38
- case ACTION.SET_IDLE:
39
- newState =
40
- state.status !== STATUS.IDLE
41
- ? {
42
- ...state,
43
- status: STATUS.IDLE,
44
- }
45
- : state;
46
- break;
47
- case ACTION.SET_REDIRECT_URL:
48
- newState =
49
- url !== undefined && url !== state.redirectUrl
50
- ? {
51
- ...state,
52
- redirectUrl: url,
53
- }
54
- : state;
55
- break;
56
- case ACTION.SET_PROCESSING_RESPONSE:
57
- newState = {
58
- ...state,
59
- processingResponse: data as PaymentResultDataType,
60
- };
61
- break;
62
-
63
- case ACTION.SET_COMPLETE:
64
- newState =
65
- state.status !== STATUS.COMPLETE
66
- ? {
67
- ...state,
68
- status: STATUS.COMPLETE,
69
- // @todo Investigate why redirectURL could be non-truthy and whether this would cause a bug if multiple gateways were used for payment e.g. 1st set the redirect URL but failed, and then the 2nd did not provide a redirect URL and succeeded.
70
- redirectUrl:
71
- data !== undefined &&
72
- typeof data.redirectUrl === 'string' &&
73
- data.redirectUrl
74
- ? data.redirectUrl
75
- : state.redirectUrl,
76
- }
77
- : state;
78
- break;
79
- case ACTION.SET_PROCESSING:
80
- newState =
81
- state.status !== STATUS.PROCESSING
82
- ? {
83
- ...state,
84
- status: STATUS.PROCESSING,
85
- hasError: false,
86
- }
87
- : state;
88
- // clear any error state.
89
- newState =
90
- newState.hasError === false
91
- ? newState
92
- : { ...newState, hasError: false };
93
- break;
94
- case ACTION.SET_BEFORE_PROCESSING:
95
- newState =
96
- state.status !== STATUS.BEFORE_PROCESSING
97
- ? {
98
- ...state,
99
- status: STATUS.BEFORE_PROCESSING,
100
- hasError: false,
101
- }
102
- : state;
103
- break;
104
- case ACTION.SET_AFTER_PROCESSING:
105
- newState =
106
- state.status !== STATUS.AFTER_PROCESSING
107
- ? {
108
- ...state,
109
- status: STATUS.AFTER_PROCESSING,
110
- }
111
- : state;
112
- break;
113
- case ACTION.SET_HAS_ERROR:
114
- newState = state.hasError
115
- ? state
116
- : {
117
- ...state,
118
- hasError: true,
119
- };
120
- newState =
121
- state.status === STATUS.PROCESSING ||
122
- state.status === STATUS.BEFORE_PROCESSING
123
- ? {
124
- ...newState,
125
- status: STATUS.IDLE,
126
- }
127
- : newState;
128
- break;
129
- case ACTION.SET_NO_ERROR:
130
- newState = state.hasError
131
- ? {
132
- ...state,
133
- hasError: false,
134
- }
135
- : state;
136
- break;
137
- case ACTION.INCREMENT_CALCULATING:
138
- newState = {
139
- ...state,
140
- calculatingCount: state.calculatingCount + 1,
141
- };
142
- break;
143
- case ACTION.DECREMENT_CALCULATING:
144
- newState = {
145
- ...state,
146
- calculatingCount: Math.max( 0, state.calculatingCount - 1 ),
147
- };
148
- break;
149
- case ACTION.SET_CUSTOMER_ID:
150
- newState =
151
- customerId !== undefined
152
- ? {
153
- ...state,
154
- customerId,
155
- }
156
- : state;
157
- break;
158
- case ACTION.SET_ORDER_ID:
159
- newState =
160
- orderId !== undefined
161
- ? {
162
- ...state,
163
- orderId,
164
- }
165
- : state;
166
- break;
167
- case ACTION.SET_SHOULD_CREATE_ACCOUNT:
168
- if (
169
- shouldCreateAccount !== undefined &&
170
- shouldCreateAccount !== state.shouldCreateAccount
171
- ) {
172
- newState = {
173
- ...state,
174
- shouldCreateAccount,
175
- };
176
- }
177
- break;
178
- case ACTION.SET_ORDER_NOTES:
179
- if ( orderNotes !== undefined && state.orderNotes !== orderNotes ) {
180
- newState = {
181
- ...state,
182
- orderNotes,
183
- };
184
- }
185
- break;
186
- }
187
- // automatically update state to idle from pristine as soon as it
188
- // initially changes.
189
- if (
190
- newState !== state &&
191
- type !== ACTION.SET_PRISTINE &&
192
- newState.status === STATUS.PRISTINE
193
- ) {
194
- newState.status = STATUS.IDLE;
195
- }
196
- return newState;
197
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/providers/cart-checkout/checkout-state/types.ts DELETED
@@ -1,103 +0,0 @@
1
- /**
2
- * Internal dependencies
3
- */
4
- import { STATUS } from './constants';
5
- import type { emitterCallback } from '../../../event-emit';
6
-
7
- export interface CheckoutResponseError {
8
- code: string;
9
- message: string;
10
- data: {
11
- status: number;
12
- };
13
- }
14
-
15
- export interface CheckoutResponseSuccess {
16
- // eslint-disable-next-line camelcase
17
- payment_result: {
18
- // eslint-disable-next-line camelcase
19
- payment_status: 'success' | 'failure' | 'pending' | 'error';
20
- // eslint-disable-next-line camelcase
21
- payment_details: Record< string, string > | Record< string, never >;
22
- // eslint-disable-next-line camelcase
23
- redirect_url: string;
24
- };
25
- }
26
-
27
- export type CheckoutResponse = CheckoutResponseSuccess | CheckoutResponseError;
28
-
29
- export interface PaymentResultDataType {
30
- message: string;
31
- paymentStatus: string;
32
- paymentDetails: Record< string, string > | Record< string, never >;
33
- redirectUrl: string;
34
- }
35
-
36
- export type CheckoutStateContextState = {
37
- redirectUrl: string;
38
- status: STATUS;
39
- hasError: boolean;
40
- calculatingCount: number;
41
- orderId: number;
42
- orderNotes: string;
43
- customerId: number;
44
- shouldCreateAccount: boolean;
45
- processingResponse: PaymentResultDataType | null;
46
- };
47
-
48
- export type CheckoutStateDispatchActions = {
49
- resetCheckout: () => void;
50
- setRedirectUrl: ( url: string ) => void;
51
- setHasError: ( hasError: boolean ) => void;
52
- setAfterProcessing: ( response: CheckoutResponse ) => void;
53
- incrementCalculating: () => void;
54
- decrementCalculating: () => void;
55
- setCustomerId: ( id: number ) => void;
56
- setOrderId: ( id: number ) => void;
57
- setOrderNotes: ( orderNotes: string ) => void;
58
- };
59
-
60
- export type CheckoutStateContextType = {
61
- // Dispatch actions to the checkout provider.
62
- dispatchActions: CheckoutStateDispatchActions;
63
- // Submits the checkout and begins processing.
64
- onSubmit: () => void;
65
- // True when checkout is complete and ready for redirect.
66
- isComplete: boolean;
67
- // True when the checkout state has changed and checkout has no activity.
68
- isIdle: boolean;
69
- // True when something in the checkout is resulting in totals being calculated.
70
- isCalculating: boolean;
71
- // True when checkout has been submitted and is being processed. Note, payment related processing happens during this state. When payment status is success, processing happens on the server.
72
- isProcessing: boolean;
73
- // True during any observers executing logic before checkout processing (eg. validation).
74
- isBeforeProcessing: boolean;
75
- // True when checkout status is AFTER_PROCESSING.
76
- isAfterProcessing: boolean;
77
- // True when the checkout is in an error state. Whatever caused the error (validation/payment method) will likely have triggered a notice.
78
- hasError: boolean;
79
- // This is the url that checkout will redirect to when it's ready.
80
- redirectUrl: string;
81
- // This is the ID for the draft order if one exists.
82
- orderId: number;
83
- // Order notes introduced by the user in the checkout form.
84
- orderNotes: string;
85
- // This is the ID of the customer the draft order belongs to.
86
- customerId: number;
87
- // Used to register a callback that will fire after checkout has been processed and there are no errors.
88
- onCheckoutAfterProcessingWithSuccess: ReturnType< typeof emitterCallback >;
89
- // Used to register a callback that will fire when the checkout has been processed and has an error.
90
- onCheckoutAfterProcessingWithError: ReturnType< typeof emitterCallback >;
91
- // Deprecated in favour of onCheckoutValidationBeforeProcessing.
92
- onCheckoutBeforeProcessing: ReturnType< typeof emitterCallback >;
93
- // Used to register a callback that will fire when the checkout has been submitted before being sent off to the server.
94
- onCheckoutValidationBeforeProcessing: ReturnType< typeof emitterCallback >;
95
- // True when the checkout has a draft order from the API.
96
- hasOrder: boolean;
97
- // When true, means the provider is providing data for the cart.
98
- isCart: boolean;
99
- // Should a user account be created?
100
- shouldCreateAccount: boolean;
101
- // Set if user account should be created.
102
- setShouldCreateAccount: ( shouldCreateAccount: boolean ) => void;
103
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/providers/cart-checkout/checkout-state/utils.ts DELETED
@@ -1,63 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __ } from '@wordpress/i18n';
5
- import { decodeEntities } from '@wordpress/html-entities';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import type { PaymentResultDataType, CheckoutResponse } from './types';
11
-
12
- /**
13
- * Prepares the payment_result data from the server checkout endpoint response.
14
- */
15
- export const getPaymentResultFromCheckoutResponse = (
16
- response: CheckoutResponse
17
- ): PaymentResultDataType => {
18
- const paymentResult = {
19
- message: '',
20
- paymentStatus: '',
21
- redirectUrl: '',
22
- paymentDetails: {},
23
- } as PaymentResultDataType;
24
-
25
- // payment_result is present in successful responses.
26
- if ( 'payment_result' in response ) {
27
- paymentResult.paymentStatus = response.payment_result.payment_status;
28
- paymentResult.redirectUrl = response.payment_result.redirect_url;
29
-
30
- if (
31
- response.payment_result.hasOwnProperty( 'payment_details' ) &&
32
- Array.isArray( response.payment_result.payment_details )
33
- ) {
34
- response.payment_result.payment_details.forEach(
35
- ( { key, value }: { key: string; value: string } ) => {
36
- paymentResult.paymentDetails[ key ] = decodeEntities(
37
- value
38
- );
39
- }
40
- );
41
- }
42
- }
43
-
44
- // message is present in error responses.
45
- if ( 'message' in response ) {
46
- paymentResult.message = decodeEntities( response.message );
47
- }
48
-
49
- // If there was an error code but no message, set a default message.
50
- if (
51
- ! paymentResult.message &&
52
- 'data' in response &&
53
- 'status' in response.data &&
54
- response.data.status > 299
55
- ) {
56
- paymentResult.message = __(
57
- 'Something went wrong. Please contact us to get assistance.',
58
- 'woo-gutenberg-products-block'
59
- );
60
- }
61
-
62
- return paymentResult;
63
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/providers/cart-checkout/payment-methods/actions.ts DELETED
@@ -1,78 +0,0 @@
1
- /**
2
- * Internal dependencies
3
- */
4
- import { ACTION, STATUS } from './constants';
5
- import type { PaymentMethods, ExpressPaymentMethods } from './types';
6
-
7
- export interface ActionType {
8
- type: ACTION | STATUS;
9
- errorMessage?: string;
10
- paymentMethodData?: Record< string, unknown >;
11
- paymentMethods?: PaymentMethods | ExpressPaymentMethods;
12
- shouldSavePaymentMethod?: boolean;
13
- }
14
-
15
- /**
16
- * All the actions that can be dispatched for payment methods.
17
- */
18
- export const actions = {
19
- statusOnly: ( type: STATUS ): { type: STATUS } => ( { type } as const ),
20
- error: ( errorMessage: string ): ActionType =>
21
- ( {
22
- type: STATUS.ERROR,
23
- errorMessage,
24
- } as const ),
25
- failed: ( {
26
- errorMessage,
27
- paymentMethodData,
28
- }: {
29
- errorMessage: string;
30
- paymentMethodData: Record< string, unknown >;
31
- } ): ActionType =>
32
- ( {
33
- type: STATUS.FAILED,
34
- errorMessage,
35
- paymentMethodData,
36
- } as const ),
37
- success: ( {
38
- paymentMethodData,
39
- }: {
40
- paymentMethodData?: Record< string, unknown >;
41
- } ): ActionType =>
42
- ( {
43
- type: STATUS.SUCCESS,
44
- paymentMethodData,
45
- } as const ),
46
- started: ( {
47
- paymentMethodData,
48
- }: {
49
- paymentMethodData?: Record< string, unknown >;
50
- } ): ActionType =>
51
- ( {
52
- type: STATUS.STARTED,
53
- paymentMethodData,
54
- } as const ),
55
- setRegisteredPaymentMethods: (
56
- paymentMethods: PaymentMethods
57
- ): ActionType =>
58
- ( {
59
- type: ACTION.SET_REGISTERED_PAYMENT_METHODS,
60
- paymentMethods,
61
- } as const ),
62
- setRegisteredExpressPaymentMethods: (
63
- paymentMethods: ExpressPaymentMethods
64
- ): ActionType =>
65
- ( {
66
- type: ACTION.SET_REGISTERED_EXPRESS_PAYMENT_METHODS,
67
- paymentMethods,
68
- } as const ),
69
- setShouldSavePaymentMethod: (
70
- shouldSavePaymentMethod: boolean
71
- ): ActionType =>
72
- ( {
73
- type: ACTION.SET_SHOULD_SAVE_PAYMENT_METHOD,
74
- shouldSavePaymentMethod,
75
- } as const ),
76
- };
77
-
78
- export default actions;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/providers/cart-checkout/payment-methods/constants.ts DELETED
@@ -1,77 +0,0 @@
1
- /**
2
- * Internal dependencies
3
- */
4
- import type {
5
- PaymentMethodDataContextType,
6
- PaymentMethodDataContextState,
7
- } from './types';
8
-
9
- export enum STATUS {
10
- PRISTINE = 'pristine',
11
- STARTED = 'started',
12
- PROCESSING = 'processing',
13
- ERROR = 'has_error',
14
- FAILED = 'failed',
15
- SUCCESS = 'success',
16
- COMPLETE = 'complete',
17
- }
18
-
19
- export enum ACTION {
20
- SET_REGISTERED_PAYMENT_METHODS = 'set_registered_payment_methods',
21
- SET_REGISTERED_EXPRESS_PAYMENT_METHODS = 'set_registered_express_payment_methods',
22
- SET_SHOULD_SAVE_PAYMENT_METHOD = 'set_should_save_payment_method',
23
- }
24
-
25
- // Note - if fields are added/shape is changed, you may want to update PRISTINE reducer clause to preserve your new field.
26
- export const DEFAULT_PAYMENT_DATA_CONTEXT_STATE: PaymentMethodDataContextState = {
27
- currentStatus: STATUS.PRISTINE,
28
- shouldSavePaymentMethod: false,
29
- paymentMethodData: {
30
- payment_method: '',
31
- },
32
- hasSavedToken: false,
33
- errorMessage: '',
34
- paymentMethods: {},
35
- expressPaymentMethods: {},
36
- };
37
-
38
- export const DEFAULT_PAYMENT_METHOD_DATA: PaymentMethodDataContextType = {
39
- setPaymentStatus: () => ( {
40
- pristine: () => void null,
41
- started: () => void null,
42
- processing: () => void null,
43
- completed: () => void null,
44
- error: ( errorMessage: string ) => void errorMessage,
45
- failed: ( errorMessage, paymentMethodData ) =>
46
- void [ errorMessage, paymentMethodData ],
47
- success: ( paymentMethodData, billingData ) =>
48
- void [ paymentMethodData, billingData ],
49
- } ),
50
- currentStatus: {
51
- isPristine: true,
52
- isStarted: false,
53
- isProcessing: false,
54
- isFinished: false,
55
- hasError: false,
56
- hasFailed: false,
57
- isSuccessful: false,
58
- isDoingExpressPayment: false,
59
- },
60
- paymentStatuses: STATUS,
61
- paymentMethodData: {},
62
- errorMessage: '',
63
- activePaymentMethod: '',
64
- setActivePaymentMethod: () => void null,
65
- activeSavedToken: '',
66
- setActiveSavedToken: () => void null,
67
- customerPaymentMethods: {},
68
- paymentMethods: {},
69
- expressPaymentMethods: {},
70
- paymentMethodsInitialized: false,
71
- expressPaymentMethodsInitialized: false,
72
- onPaymentProcessing: () => () => () => void null,
73
- setExpressPaymentError: () => void null,
74
- isExpressPaymentMethodActive: false,
75
- setShouldSavePayment: () => void null,
76
- shouldSavePayment: false,
77
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/providers/cart-checkout/payment-methods/event-emit.ts DELETED
@@ -1,49 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { useMemo } from '@wordpress/element';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import {
10
- reducer,
11
- emitEvent,
12
- emitEventWithAbort,
13
- emitterCallback,
14
- ActionType,
15
- } from '../../../event-emit';
16
-
17
- const EMIT_TYPES = {
18
- PAYMENT_PROCESSING: 'payment_processing',
19
- };
20
-
21
- type EventEmittersType = Record< string, ReturnType< typeof emitterCallback > >;
22
-
23
- /**
24
- * Receives a reducer dispatcher and returns an object with the
25
- * various event emitters for the payment processing events.
26
- *
27
- * Calling the event registration function with the callback will register it
28
- * for the event emitter and will return a dispatcher for removing the
29
- * registered callback (useful for implementation in `useEffect`).
30
- *
31
- * @param {Function} observerDispatch The emitter reducer dispatcher.
32
- * @return {Object} An object with the various payment event emitter registration functions
33
- */
34
- const useEventEmitters = (
35
- observerDispatch: React.Dispatch< ActionType >
36
- ): EventEmittersType => {
37
- const eventEmitters = useMemo(
38
- () => ( {
39
- onPaymentProcessing: emitterCallback(
40
- EMIT_TYPES.PAYMENT_PROCESSING,
41
- observerDispatch
42
- ),
43
- } ),
44
- [ observerDispatch ]
45
- );
46
- return eventEmitters;
47
- };
48
-
49
- export { EMIT_TYPES, useEventEmitters, reducer, emitEvent, emitEventWithAbort };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/providers/cart-checkout/payment-methods/payment-method-data-context.tsx DELETED
@@ -1,355 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import {
5
- createContext,
6
- useContext,
7
- useReducer,
8
- useCallback,
9
- useRef,
10
- useEffect,
11
- useMemo,
12
- } from '@wordpress/element';
13
-
14
- /**
15
- * Internal dependencies
16
- */
17
- import type {
18
- CustomerPaymentMethods,
19
- PaymentMethodDataContextType,
20
- } from './types';
21
- import {
22
- STATUS,
23
- DEFAULT_PAYMENT_DATA_CONTEXT_STATE,
24
- DEFAULT_PAYMENT_METHOD_DATA,
25
- } from './constants';
26
- import reducer from './reducer';
27
- import {
28
- usePaymentMethods,
29
- useExpressPaymentMethods,
30
- } from './use-payment-method-registration';
31
- import { usePaymentMethodDataDispatchers } from './use-payment-method-dispatchers';
32
- import { useActivePaymentMethod } from './use-active-payment-method';
33
- import { useCheckoutContext } from '../checkout-state';
34
- import { useEditorContext } from '../../editor-context';
35
- import {
36
- EMIT_TYPES,
37
- useEventEmitters,
38
- emitEventWithAbort,
39
- reducer as emitReducer,
40
- } from './event-emit';
41
- import { useValidationContext } from '../../validation';
42
- import { useStoreNotices } from '../../../hooks/use-store-notices';
43
- import { useEmitResponse } from '../../../hooks/use-emit-response';
44
- import { getCustomerPaymentMethods } from './utils';
45
-
46
- const PaymentMethodDataContext = createContext( DEFAULT_PAYMENT_METHOD_DATA );
47
-
48
- export const usePaymentMethodDataContext = (): PaymentMethodDataContextType => {
49
- return useContext( PaymentMethodDataContext );
50
- };
51
-
52
- /**
53
- * PaymentMethodDataProvider is automatically included in the CheckoutDataProvider.
54
- *
55
- * This provides the api interface (via the context hook) for payment method status and data.
56
- *
57
- * @param {Object} props Incoming props for provider
58
- * @param {Object} props.children The wrapped components in this provider.
59
- */
60
- export const PaymentMethodDataProvider = ( {
61
- children,
62
- }: {
63
- children: React.ReactChildren;
64
- } ): JSX.Element => {
65
- const {
66
- isProcessing: checkoutIsProcessing,
67
- isIdle: checkoutIsIdle,
68
- isCalculating: checkoutIsCalculating,
69
- hasError: checkoutHasError,
70
- } = useCheckoutContext();
71
- const { isEditor, getPreviewData } = useEditorContext();
72
- const { setValidationErrors } = useValidationContext();
73
- const { addErrorNotice, removeNotice } = useStoreNotices();
74
- const {
75
- isSuccessResponse,
76
- isErrorResponse,
77
- isFailResponse,
78
- noticeContexts,
79
- } = useEmitResponse();
80
- const [ observers, observerDispatch ] = useReducer( emitReducer, {} );
81
- const { onPaymentProcessing } = useEventEmitters( observerDispatch );
82
- const currentObservers = useRef( observers );
83
-
84
- // ensure observers are always current.
85
- useEffect( () => {
86
- currentObservers.current = observers;
87
- }, [ observers ] );
88
-
89
- const [ paymentData, dispatch ] = useReducer(
90
- reducer,
91
- DEFAULT_PAYMENT_DATA_CONTEXT_STATE
92
- );
93
- const {
94
- dispatchActions,
95
- setPaymentStatus,
96
- } = usePaymentMethodDataDispatchers( dispatch );
97
-
98
- const paymentMethodsInitialized = usePaymentMethods(
99
- dispatchActions.setRegisteredPaymentMethods
100
- );
101
-
102
- const expressPaymentMethodsInitialized = useExpressPaymentMethods(
103
- dispatchActions.setRegisteredExpressPaymentMethods
104
- );
105
-
106
- const {
107
- activePaymentMethod,
108
- activeSavedToken,
109
- setActivePaymentMethod,
110
- setActiveSavedToken,
111
- } = useActivePaymentMethod();
112
-
113
- const customerPaymentMethods = useMemo( (): CustomerPaymentMethods => {
114
- if ( isEditor ) {
115
- return getPreviewData(
116
- 'previewSavedPaymentMethods'
117
- ) as CustomerPaymentMethods;
118
- }
119
- return paymentMethodsInitialized
120
- ? getCustomerPaymentMethods( paymentData.paymentMethods )
121
- : {};
122
- }, [
123
- isEditor,
124
- getPreviewData,
125
- paymentMethodsInitialized,
126
- paymentData.paymentMethods,
127
- ] );
128
-
129
- const setExpressPaymentError = useCallback(
130
- ( message ) => {
131
- if ( message ) {
132
- addErrorNotice( message, {
133
- id: 'wc-express-payment-error',
134
- context: noticeContexts.EXPRESS_PAYMENTS,
135
- } );
136
- } else {
137
- removeNotice(
138
- 'wc-express-payment-error',
139
- noticeContexts.EXPRESS_PAYMENTS
140
- );
141
- }
142
- },
143
- [ addErrorNotice, noticeContexts.EXPRESS_PAYMENTS, removeNotice ]
144
- );
145
-
146
- const isExpressPaymentMethodActive = Object.keys(
147
- paymentData.expressPaymentMethods
148
- ).includes( activePaymentMethod );
149
-
150
- const currentStatus = useMemo(
151
- () => ( {
152
- isPristine: paymentData.currentStatus === STATUS.PRISTINE,
153
- isStarted: paymentData.currentStatus === STATUS.STARTED,
154
- isProcessing: paymentData.currentStatus === STATUS.PROCESSING,
155
- isFinished: [
156
- STATUS.ERROR,
157
- STATUS.FAILED,
158
- STATUS.SUCCESS,
159
- ].includes( paymentData.currentStatus ),
160
- hasError: paymentData.currentStatus === STATUS.ERROR,
161
- hasFailed: paymentData.currentStatus === STATUS.FAILED,
162
- isSuccessful: paymentData.currentStatus === STATUS.SUCCESS,
163
- isDoingExpressPayment:
164
- paymentData.currentStatus !== STATUS.PRISTINE &&
165
- isExpressPaymentMethodActive,
166
- } ),
167
- [ paymentData.currentStatus, isExpressPaymentMethodActive ]
168
- );
169
-
170
- // Update the active (selected) payment method when it is empty, or invalid.
171
- useEffect( () => {
172
- const paymentMethodKeys = Object.keys( paymentData.paymentMethods );
173
- const allPaymentMethodKeys = [
174
- ...paymentMethodKeys,
175
- ...Object.keys( paymentData.expressPaymentMethods ),
176
- ];
177
- if ( ! paymentMethodsInitialized || ! paymentMethodKeys.length ) {
178
- return;
179
- }
180
-
181
- setActivePaymentMethod( ( currentActivePaymentMethod ) => {
182
- // If there's no active payment method, or the active payment method has
183
- // been removed (e.g. COD vs shipping methods), set one as active.
184
- // Note: It's possible that the active payment method might be an
185
- // express payment method. So registered express payment methods are
186
- // included in the check here.
187
- if (
188
- ! currentActivePaymentMethod ||
189
- ! allPaymentMethodKeys.includes( currentActivePaymentMethod )
190
- ) {
191
- setPaymentStatus().pristine();
192
- return Object.keys( paymentData.paymentMethods )[ 0 ];
193
- }
194
- return currentActivePaymentMethod;
195
- } );
196
- }, [
197
- paymentMethodsInitialized,
198
- paymentData.paymentMethods,
199
- paymentData.expressPaymentMethods,
200
- setActivePaymentMethod,
201
- setPaymentStatus,
202
- ] );
203
-
204
- // flip payment to processing if checkout processing is complete, there are no errors, and payment status is started.
205
- useEffect( () => {
206
- if (
207
- checkoutIsProcessing &&
208
- ! checkoutHasError &&
209
- ! checkoutIsCalculating &&
210
- ! currentStatus.isFinished
211
- ) {
212
- setPaymentStatus().processing();
213
- }
214
- }, [
215
- checkoutIsProcessing,
216
- checkoutHasError,
217
- checkoutIsCalculating,
218
- currentStatus.isFinished,
219
- setPaymentStatus,
220
- ] );
221
-
222
- // When checkout is returned to idle, set payment status to pristine but only if payment status is already not finished.
223
- useEffect( () => {
224
- if ( checkoutIsIdle && ! currentStatus.isSuccessful ) {
225
- setPaymentStatus().pristine();
226
- }
227
- }, [ checkoutIsIdle, currentStatus.isSuccessful, setPaymentStatus ] );
228
-
229
- // if checkout has an error and payment is not being made with a saved token and payment status is success, then let's sync payment status back to pristine.
230
- useEffect( () => {
231
- if (
232
- checkoutHasError &&
233
- currentStatus.isSuccessful &&
234
- ! paymentData.hasSavedToken
235
- ) {
236
- setPaymentStatus().pristine();
237
- }
238
- }, [
239
- checkoutHasError,
240
- currentStatus.isSuccessful,
241
- paymentData.hasSavedToken,
242
- setPaymentStatus,
243
- ] );
244
-
245
- useEffect( () => {
246
- // Note: the nature of this event emitter is that it will bail on any
247
- // observer that returns a response that !== true. However, this still
248
- // allows for other observers that return true for continuing through
249
- // to the next observer (or bailing if there's a problem).
250
- if ( currentStatus.isProcessing ) {
251
- removeNotice( 'wc-payment-error', noticeContexts.PAYMENTS );
252
- emitEventWithAbort(
253
- currentObservers.current,
254
- EMIT_TYPES.PAYMENT_PROCESSING,
255
- {}
256
- ).then( ( observerResponses ) => {
257
- let successResponse, errorResponse;
258
- observerResponses.forEach( ( response ) => {
259
- if ( isSuccessResponse( response ) ) {
260
- // the last observer response always "wins" for success.
261
- successResponse = response;
262
- }
263
- if (
264
- isErrorResponse( response ) ||
265
- isFailResponse( response )
266
- ) {
267
- errorResponse = response;
268
- }
269
- } );
270
- if ( successResponse && ! errorResponse ) {
271
- setPaymentStatus().success(
272
- successResponse?.meta?.paymentMethodData,
273
- successResponse?.meta?.billingData,
274
- successResponse?.meta?.shippingData
275
- );
276
- } else if ( errorResponse && isFailResponse( errorResponse ) ) {
277
- if (
278
- errorResponse.message &&
279
- errorResponse.message.length
280
- ) {
281
- addErrorNotice( errorResponse.message, {
282
- id: 'wc-payment-error',
283
- isDismissible: false,
284
- context:
285
- errorResponse?.messageContext ||
286
- noticeContexts.PAYMENTS,
287
- } );
288
- }
289
- setPaymentStatus().failed(
290
- errorResponse?.message,
291
- errorResponse?.meta?.paymentMethodData,
292
- errorResponse?.meta?.billingData
293
- );
294
- } else if ( errorResponse ) {
295
- if (
296
- errorResponse.message &&
297
- errorResponse.message.length
298
- ) {
299
- addErrorNotice( errorResponse.message, {
300
- id: 'wc-payment-error',
301
- isDismissible: false,
302
- context:
303
- errorResponse?.messageContext ||
304
- noticeContexts.PAYMENTS,
305
- } );
306
- }
307
- setPaymentStatus().error( errorResponse.message );
308
- setValidationErrors( errorResponse?.validationErrors );
309
- } else {
310
- // otherwise there are no payment methods doing anything so
311
- // just consider success
312
- setPaymentStatus().success();
313
- }
314
- } );
315
- }
316
- }, [
317
- currentStatus.isProcessing,
318
- setValidationErrors,
319
- setPaymentStatus,
320
- removeNotice,
321
- noticeContexts.PAYMENTS,
322
- isSuccessResponse,
323
- isFailResponse,
324
- isErrorResponse,
325
- addErrorNotice,
326
- ] );
327
-
328
- const paymentContextData: PaymentMethodDataContextType = {
329
- setPaymentStatus,
330
- currentStatus,
331
- paymentStatuses: STATUS,
332
- paymentMethodData: paymentData.paymentMethodData,
333
- errorMessage: paymentData.errorMessage,
334
- activePaymentMethod,
335
- setActivePaymentMethod,
336
- activeSavedToken,
337
- setActiveSavedToken,
338
- onPaymentProcessing,
339
- customerPaymentMethods,
340
- paymentMethods: paymentData.paymentMethods,
341
- expressPaymentMethods: paymentData.expressPaymentMethods,
342
- paymentMethodsInitialized,
343
- expressPaymentMethodsInitialized,
344
- setExpressPaymentError,
345
- isExpressPaymentMethodActive,
346
- shouldSavePayment: paymentData.shouldSavePaymentMethod,
347
- setShouldSavePayment: dispatchActions.setShouldSavePayment,
348
- };
349
-
350
- return (
351
- <PaymentMethodDataContext.Provider value={ paymentContextData }>
352
- { children }
353
- </PaymentMethodDataContext.Provider>
354
- );
355
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/providers/cart-checkout/payment-methods/reducer.ts DELETED
@@ -1,120 +0,0 @@
1
- /**
2
- * Internal dependencies
3
- */
4
- import {
5
- ACTION,
6
- STATUS,
7
- DEFAULT_PAYMENT_DATA_CONTEXT_STATE,
8
- } from './constants';
9
- import type { PaymentMethodDataContextState } from './types';
10
- import type { ActionType } from './actions';
11
-
12
- const hasSavedPaymentToken = (
13
- paymentMethodData: Record< string, unknown > | undefined
14
- ): boolean => {
15
- return !! (
16
- typeof paymentMethodData === 'object' && paymentMethodData.isSavedToken
17
- );
18
- };
19
-
20
- /**
21
- * Reducer for payment data state
22
- */
23
- const reducer = (
24
- state = DEFAULT_PAYMENT_DATA_CONTEXT_STATE,
25
- {
26
- type,
27
- paymentMethodData,
28
- shouldSavePaymentMethod = false,
29
- errorMessage = '',
30
- paymentMethods = {},
31
- }: ActionType
32
- ): PaymentMethodDataContextState => {
33
- switch ( type ) {
34
- case STATUS.STARTED:
35
- return {
36
- ...state,
37
- currentStatus: STATUS.STARTED,
38
- paymentMethodData: paymentMethodData || state.paymentMethodData,
39
- hasSavedToken: hasSavedPaymentToken(
40
- paymentMethodData || state.paymentMethodData
41
- ),
42
- };
43
- case STATUS.ERROR:
44
- return state.currentStatus !== STATUS.ERROR
45
- ? {
46
- ...state,
47
- currentStatus: STATUS.ERROR,
48
- errorMessage: errorMessage || state.errorMessage,
49
- }
50
- : state;
51
- case STATUS.FAILED:
52
- return state.currentStatus !== STATUS.FAILED
53
- ? {
54
- ...state,
55
- currentStatus: STATUS.FAILED,
56
- paymentMethodData:
57
- paymentMethodData || state.paymentMethodData,
58
- errorMessage: errorMessage || state.errorMessage,
59
- }
60
- : state;
61
- case STATUS.SUCCESS:
62
- return state.currentStatus !== STATUS.SUCCESS
63
- ? {
64
- ...state,
65
- currentStatus: STATUS.SUCCESS,
66
- paymentMethodData:
67
- paymentMethodData || state.paymentMethodData,
68
- hasSavedToken: hasSavedPaymentToken(
69
- paymentMethodData || state.paymentMethodData
70
- ),
71
- }
72
- : state;
73
- case STATUS.PROCESSING:
74
- return state.currentStatus !== STATUS.PROCESSING
75
- ? {
76
- ...state,
77
- currentStatus: STATUS.PROCESSING,
78
- errorMessage: '',
79
- }
80
- : state;
81
- case STATUS.COMPLETE:
82
- return state.currentStatus !== STATUS.COMPLETE
83
- ? {
84
- ...state,
85
- currentStatus: STATUS.COMPLETE,
86
- }
87
- : state;
88
-
89
- case STATUS.PRISTINE:
90
- return {
91
- ...DEFAULT_PAYMENT_DATA_CONTEXT_STATE,
92
- currentStatus: STATUS.PRISTINE,
93
- // keep payment method registration state
94
- paymentMethods: {
95
- ...state.paymentMethods,
96
- },
97
- expressPaymentMethods: {
98
- ...state.expressPaymentMethods,
99
- },
100
- shouldSavePaymentMethod: state.shouldSavePaymentMethod,
101
- };
102
- case ACTION.SET_REGISTERED_PAYMENT_METHODS:
103
- return {
104
- ...state,
105
- paymentMethods,
106
- };
107
- case ACTION.SET_REGISTERED_EXPRESS_PAYMENT_METHODS:
108
- return {
109
- ...state,
110
- expressPaymentMethods: paymentMethods,
111
- };
112
- case ACTION.SET_SHOULD_SAVE_PAYMENT_METHOD:
113
- return {
114
- ...state,
115
- shouldSavePaymentMethod,
116
- };
117
- }
118
- };
119
-
120
- export default reducer;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/providers/cart-checkout/payment-methods/types.ts DELETED
@@ -1,161 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import type { ReactNode } from 'react';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import type { emitterCallback } from '../../../event-emit';
10
- import { STATUS } from './constants';
11
-
12
- type ObjectType = Record< string, unknown >;
13
- type EmptyObjectType = Record< string, never >;
14
-
15
- export interface PaymentMethodConfig {
16
- // A unique string to identify the payment method client side.
17
- name: string;
18
- // A react node for your payment method UI.
19
- content: ReactNode;
20
- // A react node to display a preview of your payment method in the editor.
21
- edit: ReactNode;
22
- // A callback to determine whether the payment method should be shown in the checkout.
23
- canMakePayment: (
24
- cartData: ObjectType
25
- ) => Promise< boolean | { error: { message: string } } >;
26
- // A unique string to represent the payment method server side. If not provided, defaults to name.
27
- paymentMethodId?: string;
28
- // Object that describes various features provided by the payment method.
29
- supports: ObjectType;
30
- // Array of card types (brands) supported by the payment method. (See stripe/credit-card for example.)
31
- icons: ObjectType;
32
- // A react node that will be used as a label for the payment method in the checkout.
33
- label: ReactNode;
34
- // An accessibility label. Screen readers will output this label when the payment method is selected.
35
- ariaLabel: string;
36
- // Optionally customize the label text for the checkout submit (`Place Order`) button.
37
- placeOrderButtonLabel?: string;
38
- }
39
-
40
- export type ExpressPaymentMethodConfig = Omit<
41
- PaymentMethodConfig,
42
- 'icons' | 'label' | 'ariaLabel' | 'placeOrderButtonLabel'
43
- >;
44
-
45
- export type PaymentMethods =
46
- | Record< string, PaymentMethodConfig >
47
- | EmptyObjectType;
48
-
49
- export type ExpressPaymentMethods =
50
- | Record< string, ExpressPaymentMethodConfig >
51
- | EmptyObjectType;
52
-
53
- export interface CustomerPaymentMethod {
54
- method: PaymentMethodConfig;
55
- expires: string;
56
- // eslint-disable-next-line camelcase
57
- is_default: boolean;
58
- tokenId: number;
59
- actions: ObjectType;
60
- }
61
- export type CustomerPaymentMethods =
62
- | Record< string, CustomerPaymentMethod >
63
- | EmptyObjectType;
64
-
65
- export type PaymentMethodDispatchers = {
66
- setRegisteredPaymentMethods: ( paymentMethods: PaymentMethods ) => void;
67
- setRegisteredExpressPaymentMethods: (
68
- paymentMethods: ExpressPaymentMethods
69
- ) => void;
70
- setShouldSavePayment: ( shouldSave: boolean ) => void;
71
- };
72
-
73
- export interface PaymentStatusDispatchers {
74
- pristine: () => void;
75
- started: ( paymentMethodData?: ObjectType | EmptyObjectType ) => void;
76
- processing: () => void;
77
- completed: () => void;
78
- error: ( error: string ) => void;
79
- failed: (
80
- error?: string,
81
- paymentMethodData?: ObjectType | EmptyObjectType,
82
- billingData?: ObjectType | EmptyObjectType
83
- ) => void;
84
- success: (
85
- paymentMethodData?: ObjectType | EmptyObjectType,
86
- billingData?: ObjectType | EmptyObjectType,
87
- shippingData?: ObjectType | EmptyObjectType
88
- ) => void;
89
- }
90
-
91
- export interface PaymentMethodDataContextState {
92
- currentStatus: STATUS;
93
- shouldSavePaymentMethod: boolean;
94
- paymentMethodData: ObjectType | EmptyObjectType;
95
- hasSavedToken: boolean;
96
- errorMessage: string;
97
- paymentMethods: PaymentMethods;
98
- expressPaymentMethods: ExpressPaymentMethods;
99
- }
100
-
101
- export type PaymentMethodCurrentStatusType = {
102
- // If true then the payment method state in checkout is pristine.
103
- isPristine: boolean;
104
- // If true then the payment method has been initialized and has started.
105
- isStarted: boolean;
106
- // If true then the payment method is processing payment.
107
- isProcessing: boolean;
108
- // If true then the payment method is in a finished state (which may mean it's status is either error, failed, or success).
109
- isFinished: boolean;
110
- // If true then the payment method is in an error state.
111
- hasError: boolean;
112
- // If true then the payment method has failed (usually indicates a problem with the payment method used, not logic error).
113
- hasFailed: boolean;
114
- // If true then the payment method has completed it's processing successfully.
115
- isSuccessful: boolean;
116
- // If true, an express payment is in progress.
117
- isDoingExpressPayment: boolean;
118
- };
119
-
120
- export type PaymentMethodDataContextType = {
121
- // Sets the payment status for the payment method.
122
- setPaymentStatus: () => PaymentStatusDispatchers;
123
- // The current payment status.
124
- currentStatus: PaymentMethodCurrentStatusType;
125
- // An object of payment status constants.
126
- paymentStatuses: ObjectType;
127
- // Arbitrary data to be passed along for processing by the payment method on the server.
128
- paymentMethodData: ObjectType | EmptyObjectType;
129
- // An error message provided by the payment method if there is an error.
130
- errorMessage: string;
131
- // The active payment method slug.
132
- activePaymentMethod: string;
133
- // A function for setting the active payment method.
134
- setActivePaymentMethod: ( paymentMethod: string ) => void;
135
- // Current active token.
136
- activeSavedToken: string;
137
- // A function for setting the active payment method token.
138
- setActiveSavedToken: ( activeSavedToken: string ) => void;
139
- // Returns the customer payment for the customer if it exists.
140
- customerPaymentMethods:
141
- | Record< string, CustomerPaymentMethod >
142
- | EmptyObjectType;
143
- // Registered payment methods.
144
- paymentMethods: PaymentMethods;
145
- // Registered express payment methods.
146
- expressPaymentMethods: ExpressPaymentMethods;
147
- // True when all registered payment methods have been initialized.
148
- paymentMethodsInitialized: boolean;
149
- // True when all registered express payment methods have been initialized.
150
- expressPaymentMethodsInitialized: boolean;
151
- // Event registration callback for registering observers for the payment processing event.
152
- onPaymentProcessing: ReturnType< typeof emitterCallback >;
153
- // A function used by express payment methods to indicate an error for checkout to handle. It receives an error message string. Does not change payment status.
154
- setExpressPaymentError: ( error: string ) => void;
155
- // True if an express payment method is active.
156
- isExpressPaymentMethodActive: boolean;
157
- // A function used to set the shouldSavePayment value.
158
- setShouldSavePayment: ( shouldSavePayment: boolean ) => void;
159
- // True means that the configured payment method option is saved for the customer.
160
- shouldSavePayment: boolean;
161
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/providers/cart-checkout/payment-methods/use-active-payment-method.ts DELETED
@@ -1,38 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { useState, useEffect } from '@wordpress/element';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import { useStoreEvents } from '../../../hooks/use-store-events';
10
-
11
- export const useActivePaymentMethod = (): {
12
- activePaymentMethod: string;
13
- activeSavedToken: string;
14
- setActivePaymentMethod: React.Dispatch< React.SetStateAction< string > >;
15
- setActiveSavedToken: ( token: string ) => void;
16
- } => {
17
- const { dispatchCheckoutEvent } = useStoreEvents();
18
-
19
- // The active payment method - e.g. Stripe CC or BACS.
20
- const [ activePaymentMethod, setActivePaymentMethod ] = useState( '' );
21
-
22
- // If a previously saved payment method is active, the token for that method. For example, a for a Stripe CC card saved to user account.
23
- const [ activeSavedToken, setActiveSavedToken ] = useState( '' );
24
-
25
- // Trigger event on change.
26
- useEffect( () => {
27
- dispatchCheckoutEvent( 'set-active-payment-method', {
28
- activePaymentMethod,
29
- } );
30
- }, [ dispatchCheckoutEvent, activePaymentMethod ] );
31
-
32
- return {
33
- activePaymentMethod,
34
- activeSavedToken,
35
- setActivePaymentMethod,
36
- setActiveSavedToken,
37
- };
38
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/providers/cart-checkout/payment-methods/use-payment-method-dispatchers.ts DELETED
@@ -1,105 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { useCallback, useMemo } from '@wordpress/element';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import { actions, ActionType } from './actions';
10
- import { STATUS } from './constants';
11
- import { useCustomerDataContext } from '../customer';
12
- import { useShippingDataContext } from '../shipping';
13
- import type {
14
- PaymentStatusDispatchers,
15
- PaymentMethodDispatchers,
16
- } from './types';
17
-
18
- export const usePaymentMethodDataDispatchers = (
19
- dispatch: React.Dispatch< ActionType >
20
- ): {
21
- dispatchActions: PaymentMethodDispatchers;
22
- setPaymentStatus: () => PaymentStatusDispatchers;
23
- } => {
24
- const { setBillingData } = useCustomerDataContext();
25
- const { setShippingAddress } = useShippingDataContext();
26
-
27
- const dispatchActions = useMemo(
28
- (): PaymentMethodDispatchers => ( {
29
- setRegisteredPaymentMethods: ( paymentMethods ) =>
30
- void dispatch(
31
- actions.setRegisteredPaymentMethods( paymentMethods )
32
- ),
33
- setRegisteredExpressPaymentMethods: ( paymentMethods ) =>
34
- void dispatch(
35
- actions.setRegisteredExpressPaymentMethods( paymentMethods )
36
- ),
37
- setShouldSavePayment: ( shouldSave ) =>
38
- void dispatch(
39
- actions.setShouldSavePaymentMethod( shouldSave )
40
- ),
41
- } ),
42
- [ dispatch ]
43
- );
44
-
45
- const setPaymentStatus = useCallback(
46
- (): PaymentStatusDispatchers => ( {
47
- pristine: () => dispatch( actions.statusOnly( STATUS.PRISTINE ) ),
48
- started: ( paymentMethodData ) => {
49
- dispatch(
50
- actions.started( {
51
- paymentMethodData,
52
- } )
53
- );
54
- },
55
- processing: () =>
56
- dispatch( actions.statusOnly( STATUS.PROCESSING ) ),
57
- completed: () => dispatch( actions.statusOnly( STATUS.COMPLETE ) ),
58
- error: ( errorMessage ) =>
59
- dispatch( actions.error( errorMessage ) ),
60
- failed: (
61
- errorMessage,
62
- paymentMethodData,
63
- billingData = undefined
64
- ) => {
65
- if ( billingData ) {
66
- setBillingData( billingData );
67
- }
68
- dispatch(
69
- actions.failed( {
70
- errorMessage: errorMessage || '',
71
- paymentMethodData: paymentMethodData || {},
72
- } )
73
- );
74
- },
75
- success: (
76
- paymentMethodData,
77
- billingData = undefined,
78
- shippingData = undefined
79
- ) => {
80
- if ( billingData ) {
81
- setBillingData( billingData );
82
- }
83
- if (
84
- typeof shippingData !== undefined &&
85
- shippingData?.address
86
- ) {
87
- setShippingAddress(
88
- shippingData.address as Record< string, unknown >
89
- );
90
- }
91
- dispatch(
92
- actions.success( {
93
- paymentMethodData,
94
- } )
95
- );
96
- },
97
- } ),
98
- [ dispatch, setBillingData, setShippingAddress ]
99
- );
100
-
101
- return {
102
- dispatchActions,
103
- setPaymentStatus,
104
- };
105
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/providers/cart-checkout/payment-methods/utils.ts DELETED
@@ -1,43 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { getSetting } from '@woocommerce/settings';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import type { PaymentMethods, CustomerPaymentMethod } from './types';
10
-
11
- /**
12
- * Gets the payment methods saved for the current user after filtering out disabled ones.
13
- */
14
- export const getCustomerPaymentMethods = (
15
- availablePaymentMethods: PaymentMethods = {}
16
- ): Record< string, CustomerPaymentMethod > => {
17
- if ( Object.keys( availablePaymentMethods ).length === 0 ) {
18
- return {};
19
- }
20
- const customerPaymentMethods = getSetting( 'customerPaymentMethods', {} );
21
- const paymentMethodKeys = Object.keys( customerPaymentMethods );
22
- const enabledCustomerPaymentMethods = {} as Record<
23
- string,
24
- CustomerPaymentMethod
25
- >;
26
- paymentMethodKeys.forEach( ( type ) => {
27
- const methods = customerPaymentMethods[ type ].filter(
28
- ( {
29
- method: { gateway },
30
- }: {
31
- method: {
32
- gateway: string;
33
- };
34
- } ) =>
35
- gateway in availablePaymentMethods &&
36
- availablePaymentMethods[ gateway ].supports?.showSavedCards
37
- );
38
- if ( methods.length ) {
39
- enabledCustomerPaymentMethods[ type ] = methods;
40
- }
41
- } );
42
- return enabledCustomerPaymentMethods;
43
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/providers/cart-checkout/shipping/reducers.js DELETED
@@ -1,18 +0,0 @@
1
- /**
2
- * Internal dependencies
3
- */
4
- import { ERROR_TYPES } from './constants';
5
-
6
- /**
7
- * Reducer for shipping status state
8
- *
9
- * @param {string} state The current status.
10
- * @param {Object} action The incoming action.
11
- * @param {string} action.type The type of action.
12
- */
13
- export const errorStatusReducer = ( state, { type } ) => {
14
- if ( Object.values( ERROR_TYPES ).includes( type ) ) {
15
- return type;
16
- }
17
- return state;
18
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/providers/cart-checkout/shipping/utils.js DELETED
@@ -1,16 +0,0 @@
1
- /**
2
- * Internal dependencies
3
- */
4
- import { shippingErrorCodes } from './constants';
5
-
6
- export const hasInvalidShippingAddress = ( errors ) => {
7
- return errors.some( ( error ) => {
8
- if (
9
- error.code &&
10
- Object.values( shippingErrorCodes ).includes( error.code )
11
- ) {
12
- return true;
13
- }
14
- return false;
15
- } );
16
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/providers/index.js DELETED
@@ -1,9 +0,0 @@
1
- export * from './editor-context';
2
- export * from './add-to-cart-form';
3
- export * from './cart-checkout';
4
- export * from './store-notices';
5
- export * from './store-snackbar-notices';
6
- export * from './validation';
7
- export * from './container-width-context';
8
- export * from './editor-context';
9
- export * from './query-state-context';
 
 
 
 
 
 
 
 
 
assets/js/base/context/providers/store-notices/index.js DELETED
@@ -1,2 +0,0 @@
1
- export * from './components/store-notices-container';
2
- export * from './context';
 
 
assets/js/base/context/providers/store-snackbar-notices/components/snackbar-notices-container.js DELETED
@@ -1,41 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { SnackbarList } from 'wordpress-components';
5
- import classnames from 'classnames';
6
- import { __experimentalApplyCheckoutFilter } from '@woocommerce/blocks-checkout';
7
-
8
- const SnackbarNoticesContainer = ( {
9
- className,
10
- notices,
11
- removeNotice,
12
- isEditor,
13
- } ) => {
14
- if ( isEditor ) {
15
- return null;
16
- }
17
-
18
- const snackbarNotices = notices.filter(
19
- ( notice ) => notice.type === 'snackbar'
20
- );
21
-
22
- const filteredNotices = __experimentalApplyCheckoutFilter( {
23
- filterName: 'snackbarNotices',
24
- defaultValue: snackbarNotices,
25
- } );
26
-
27
- const wrapperClass = classnames(
28
- className,
29
- 'wc-block-components-notices__snackbar'
30
- );
31
-
32
- return (
33
- <SnackbarList
34
- notices={ filteredNotices }
35
- className={ wrapperClass }
36
- onRemove={ removeNotice