surgio 2.25.2 → 3.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/bin/dev +17 -0
  2. package/bin/dev.cmd +3 -0
  3. package/bin/run +8 -0
  4. package/bin/run.cmd +3 -0
  5. package/build/base-command.d.ts +18 -0
  6. package/build/base-command.js +74 -0
  7. package/build/commands/check.d.ts +10 -0
  8. package/build/commands/check.js +88 -0
  9. package/build/commands/clean-cache.d.ts +6 -0
  10. package/build/commands/clean-cache.js +29 -0
  11. package/build/commands/doctor.d.ts +6 -0
  12. package/build/commands/doctor.js +21 -0
  13. package/build/commands/generate.d.ts +7 -0
  14. package/build/commands/generate.js +93 -0
  15. package/build/commands/lint.d.ts +6 -0
  16. package/build/commands/lint.js +36 -0
  17. package/build/commands/new.d.ts +6 -0
  18. package/build/commands/new.js +36 -0
  19. package/build/commands/subscriptions.d.ts +7 -0
  20. package/build/commands/subscriptions.js +96 -0
  21. package/build/commands/upload.d.ts +6 -0
  22. package/build/commands/upload.js +87 -0
  23. package/build/config.d.ts +6 -0
  24. package/build/config.js +151 -0
  25. package/build/constant/constant.d.ts +17 -16
  26. package/build/constant/constant.js +3 -2
  27. package/build/constant/env.js +1 -1
  28. package/build/constant/error.js +1 -1
  29. package/build/constant/index.js +1 -1
  30. package/build/generate.d.ts +0 -1
  31. package/build/generate.js +3 -65
  32. package/build/generator/artifact.d.ts +299 -64
  33. package/build/generator/artifact.js +90 -92
  34. package/build/generator/index.d.ts +2 -0
  35. package/build/generator/index.js +19 -0
  36. package/build/generator/template.js +2 -6
  37. package/build/hooks/init.d.ts +3 -0
  38. package/build/hooks/init.js +32 -0
  39. package/build/index.d.ts +55 -53
  40. package/build/index.js +13 -51
  41. package/build/internal.d.ts +4 -0
  42. package/build/internal.js +21 -0
  43. package/build/misc/deprecation.d.ts +1 -6
  44. package/build/misc/deprecation.js +1 -8
  45. package/build/misc/flag_cn.js +1 -1
  46. package/build/provider/BlackSSLProvider.d.ts +4 -3
  47. package/build/provider/BlackSSLProvider.js +24 -16
  48. package/build/provider/ClashProvider.d.ts +7 -10
  49. package/build/provider/ClashProvider.js +165 -76
  50. package/build/provider/CustomProvider.d.ts +4 -3
  51. package/build/provider/CustomProvider.js +81 -50
  52. package/build/provider/Provider.d.ts +9 -22
  53. package/build/provider/Provider.js +31 -69
  54. package/build/provider/ShadowsocksJsonSubscribeProvider.d.ts +4 -5
  55. package/build/provider/ShadowsocksJsonSubscribeProvider.js +27 -21
  56. package/build/provider/ShadowsocksSubscribeProvider.d.ts +5 -8
  57. package/build/provider/ShadowsocksSubscribeProvider.js +30 -27
  58. package/build/provider/ShadowsocksrSubscribeProvider.d.ts +5 -8
  59. package/build/provider/ShadowsocksrSubscribeProvider.js +30 -23
  60. package/build/provider/SsdProvider.d.ts +5 -8
  61. package/build/provider/SsdProvider.js +56 -39
  62. package/build/provider/TrojanProvider.d.ts +5 -8
  63. package/build/provider/TrojanProvider.js +37 -30
  64. package/build/provider/V2rayNSubscribeProvider.d.ts +4 -5
  65. package/build/provider/V2rayNSubscribeProvider.js +61 -33
  66. package/build/provider/index.d.ts +16 -2
  67. package/build/provider/index.js +12 -5
  68. package/build/provider/types.d.ts +10 -1
  69. package/build/provider/types.js +1 -1
  70. package/build/redis.js +1 -1
  71. package/build/types.d.ts +45 -236
  72. package/build/types.js +2 -1
  73. package/build/utils/cache.js +29 -27
  74. package/build/utils/clash.d.ts +204 -3
  75. package/build/utils/clash.js +247 -106
  76. package/build/utils/configurables.d.ts +71 -0
  77. package/build/utils/configurables.js +8 -0
  78. package/build/utils/constant.js +1 -1
  79. package/build/utils/dns.js +1 -1
  80. package/build/utils/doctor.d.ts +2 -0
  81. package/build/utils/doctor.js +38 -0
  82. package/build/utils/env-flag.js +2 -2
  83. package/build/utils/error-helper.d.ts +2 -2
  84. package/build/utils/error-helper.js +30 -16
  85. package/build/utils/filter.d.ts +46 -43
  86. package/build/utils/filter.js +51 -30
  87. package/build/utils/flag.js +1 -1
  88. package/build/utils/http-client.js +38 -5
  89. package/build/utils/index.d.ts +13 -21
  90. package/build/utils/index.js +98 -117
  91. package/build/utils/linter.js +5 -2
  92. package/build/utils/loon.d.ts +3 -2
  93. package/build/utils/loon.js +67 -5
  94. package/build/utils/quantumult.d.ts +3 -3
  95. package/build/utils/quantumult.js +190 -258
  96. package/build/utils/relayable-url.js +1 -1
  97. package/build/utils/remote-snippet.js +3 -4
  98. package/build/utils/ss.js +27 -17
  99. package/build/utils/ssr.js +3 -4
  100. package/build/utils/subscription.js +7 -7
  101. package/build/utils/surfboard.d.ts +3 -2
  102. package/build/utils/surfboard.js +142 -126
  103. package/build/utils/surge.d.ts +4 -2
  104. package/build/utils/surge.js +328 -300
  105. package/build/utils/time.d.ts +1 -0
  106. package/build/utils/time.js +6 -0
  107. package/build/utils/tmp-helper.js +8 -1
  108. package/build/utils/trojan.js +19 -11
  109. package/build/utils/v2ray.js +2 -2
  110. package/build/validators/artifact.d.ts +35 -0
  111. package/build/validators/artifact.js +17 -0
  112. package/build/validators/common.d.ts +121 -0
  113. package/build/validators/common.js +52 -0
  114. package/build/validators/filter.d.ts +10 -0
  115. package/build/validators/filter.js +15 -0
  116. package/build/validators/hooks.d.ts +7 -0
  117. package/build/validators/hooks.js +8 -0
  118. package/build/validators/http.d.ts +137 -0
  119. package/build/validators/http.js +19 -0
  120. package/build/validators/index.d.ts +15 -0
  121. package/build/validators/index.js +32 -0
  122. package/build/validators/provider.d.ts +109 -0
  123. package/build/validators/provider.js +41 -0
  124. package/build/validators/shadowsocks.d.ts +86 -0
  125. package/build/validators/shadowsocks.js +29 -0
  126. package/build/validators/shadowsocksr.d.ts +77 -0
  127. package/build/validators/shadowsocksr.js +19 -0
  128. package/build/validators/snell.d.ts +71 -0
  129. package/build/validators/snell.js +20 -0
  130. package/build/validators/socks5.d.ts +77 -0
  131. package/build/validators/socks5.js +19 -0
  132. package/build/validators/surgio-config.d.ts +307 -0
  133. package/build/validators/surgio-config.js +95 -0
  134. package/build/validators/trojan.d.ts +86 -0
  135. package/build/validators/trojan.js +15 -0
  136. package/build/validators/tuic.d.ts +301 -0
  137. package/build/validators/tuic.js +21 -0
  138. package/build/validators/vmess.d.ts +92 -0
  139. package/build/validators/vmess.js +29 -0
  140. package/build/validators/wireguard.d.ts +123 -0
  141. package/build/validators/wireguard.js +26 -0
  142. package/config.d.ts +1 -0
  143. package/config.js +1 -0
  144. package/constant.d.ts +1 -0
  145. package/constant.js +1 -0
  146. package/generator.d.ts +1 -0
  147. package/generator.js +1 -0
  148. package/hygen-template/artifact/new/index.js +15 -15
  149. package/hygen-template/provider/new/index.js +8 -7
  150. package/hygen-template/template/new/index.js +3 -3
  151. package/index.d.ts +1 -0
  152. package/index.js +1 -0
  153. package/internal.d.ts +1 -0
  154. package/internal.js +1 -0
  155. package/package.json +112 -75
  156. package/provider.d.ts +1 -0
  157. package/provider.js +1 -0
  158. package/utils.d.ts +1 -0
  159. package/utils.js +1 -0
  160. package/bin/surgio.js +0 -8
  161. package/build/command/check.d.ts +0 -9
  162. package/build/command/check.js +0 -79
  163. package/build/command/clean-cache.d.ts +0 -8
  164. package/build/command/clean-cache.js +0 -43
  165. package/build/command/doctor.d.ts +0 -9
  166. package/build/command/doctor.js +0 -63
  167. package/build/command/generate.d.ts +0 -8
  168. package/build/command/generate.js +0 -64
  169. package/build/command/lint.d.ts +0 -7
  170. package/build/command/lint.js +0 -42
  171. package/build/command/new.d.ts +0 -7
  172. package/build/command/new.js +0 -44
  173. package/build/command/subscriptions.d.ts +0 -10
  174. package/build/command/subscriptions.js +0 -87
  175. package/build/command/upload.d.ts +0 -9
  176. package/build/command/upload.js +0 -101
  177. package/build/utils/command.d.ts +0 -2
  178. package/build/utils/command.js +0 -23
  179. package/build/utils/config.d.ts +0 -6
  180. package/build/utils/config.js +0 -245
  181. package/build/utils/patch-proxy.d.ts +0 -1
  182. package/build/utils/patch-proxy.js +0 -19
@@ -3,80 +3,115 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getSurgeNodes = exports.getSurgeExtendHeaders = void 0;
6
+ exports.getSurgeNodeNames = exports.getSurgeWireguardNodes = exports.getSurgeNodes = exports.getSurgeExtendHeaders = void 0;
7
7
  const logger_1 = require("@surgio/logger");
8
- const fs_extra_1 = __importDefault(require("fs-extra"));
9
8
  const lodash_1 = __importDefault(require("lodash"));
10
- const os_1 = __importDefault(require("os"));
11
- const path_1 = require("path");
12
9
  const constant_1 = require("../constant");
13
10
  const types_1 = require("../types");
14
- const index_1 = require("./index");
11
+ const _1 = require("./");
15
12
  const filter_1 = require("./filter");
16
13
  const logger = (0, logger_1.createLogger)({ service: 'surgio:utils:surge' });
17
14
  const getSurgeExtendHeaders = (wsHeaders) => {
18
15
  return Object.keys(wsHeaders)
19
- .map((headerKey) => `${headerKey}:${wsHeaders[headerKey]}`)
16
+ .map((headerKey) => `${headerKey.toLowerCase()}:${wsHeaders[headerKey]}`)
20
17
  .join('|');
21
18
  };
22
19
  exports.getSurgeExtendHeaders = getSurgeExtendHeaders;
23
20
  /**
24
21
  * @see https://manual.nssurge.com/policy/proxy.html
25
22
  */
26
- const getSurgeNodes = function (list, filter) {
27
- // istanbul ignore next
28
- if (arguments.length === 2 && typeof filter === 'undefined') {
29
- throw new Error(constant_1.ERR_INVALID_FILTER);
30
- }
31
- const result = (0, filter_1.applyFilter)(list, filter)
23
+ const getSurgeNodes = function (nodeList, filter) {
24
+ const result = (0, filter_1.applyFilter)(nodeList, filter)
25
+ .map(nodeListMapper)
26
+ .filter((item) => item !== undefined)
27
+ .map((item) => item[1]);
28
+ return result.join('\n');
29
+ };
30
+ exports.getSurgeNodes = getSurgeNodes;
31
+ const getSurgeWireguardNodes = (nodeList) => {
32
+ const result = nodeList
32
33
  .map((nodeConfig) => {
33
- var _a, _b, _c, _d, _e;
34
- switch (nodeConfig.type) {
35
- case types_1.NodeTypeEnum.Shadowsocks: {
36
- const config = nodeConfig;
37
- if (config.obfs && ['ws', 'wss'].includes(config.obfs)) {
38
- logger.warn(`不支持为 Surge 生成 v2ray-plugin 的 Shadowsocks 节点,节点 ${nodeConfig.nodeName} 会被省略`);
39
- return void 0;
40
- }
41
- // Native support for Shadowsocks
42
- if (((_a = nodeConfig === null || nodeConfig === void 0 ? void 0 : nodeConfig.surgeConfig) === null || _a === void 0 ? void 0 : _a.shadowsocksFormat) === 'ss') {
43
- return [
44
- config.nodeName,
45
- [
46
- 'ss',
47
- config.hostname,
48
- config.port,
49
- 'encrypt-method=' + config.method,
50
- ...(0, index_1.pickAndFormatStringList)(config, [
51
- 'password',
52
- 'udp-relay',
53
- 'obfs',
54
- 'obfs-host',
55
- 'tfo',
56
- 'mptcp',
57
- 'testUrl',
58
- 'underlyingProxy',
59
- ], {
60
- keyFormat: 'kebabCase',
61
- }),
62
- ...parseShadowTlsConfig(nodeConfig),
63
- ].join(', '),
64
- ].join(' = ');
34
+ if (nodeConfig.type !== types_1.NodeTypeEnum.Wireguard ||
35
+ nodeConfig.enable === false) {
36
+ return undefined;
37
+ }
38
+ const nodeConfigSection = [
39
+ `[WireGuard ${nodeConfig.nodeName}]`,
40
+ `self-ip=${nodeConfig.selfIp}`,
41
+ `private-key=${nodeConfig.privateKey}`,
42
+ ];
43
+ const optionalKeys = [
44
+ 'mtu',
45
+ 'preferIpv6',
46
+ 'selfIpV6',
47
+ ];
48
+ for (const key of optionalKeys) {
49
+ if (nodeConfig[key] !== undefined) {
50
+ nodeConfigSection.push(...(0, _1.pickAndFormatStringList)(nodeConfig, [key], {
51
+ keyFormat: 'kebabCase',
52
+ }));
53
+ }
54
+ }
55
+ if (nodeConfig.dnsServers) {
56
+ nodeConfigSection.push(`dns-server=${nodeConfig.dnsServers.join(', ')}`);
57
+ }
58
+ for (const peer of nodeConfig.peers) {
59
+ const peerConfig = [
60
+ `endpoint=${peer.endpoint}`,
61
+ `public-key=${peer.publicKey}`,
62
+ ];
63
+ const optionalPeerConfigKeys = [
64
+ 'presharedKey',
65
+ 'allowedIps',
66
+ 'keepalive',
67
+ ];
68
+ for (const key of optionalPeerConfigKeys) {
69
+ if (peer[key] !== undefined) {
70
+ peerConfig.push(...(0, _1.pickAndFormatStringList)(peer, [key], {
71
+ keyFormat: 'kebabCase',
72
+ }));
65
73
  }
66
- // Using custom format
67
- return [
68
- config.nodeName,
74
+ }
75
+ if (peer.reservedBits) {
76
+ peerConfig.push(`client-id=${peer.reservedBits.join('/')}`);
77
+ }
78
+ nodeConfigSection.push(`peer=(${peerConfig.join(', ')})`);
79
+ }
80
+ return nodeConfigSection.join('\n');
81
+ })
82
+ .filter((item) => item !== undefined);
83
+ return result.join('\n\n');
84
+ };
85
+ exports.getSurgeWireguardNodes = getSurgeWireguardNodes;
86
+ const getSurgeNodeNames = function (nodeList, filter) {
87
+ const result = (0, filter_1.applyFilter)(nodeList, filter)
88
+ .map(nodeListMapper)
89
+ .filter((item) => item !== undefined)
90
+ .map((item) => item[0]);
91
+ return result.join(', ');
92
+ };
93
+ exports.getSurgeNodeNames = getSurgeNodeNames;
94
+ function nodeListMapper(nodeConfig) {
95
+ switch (nodeConfig.type) {
96
+ case types_1.NodeTypeEnum.Shadowsocks: {
97
+ if (nodeConfig.obfs && ['ws', 'wss'].includes(nodeConfig.obfs)) {
98
+ logger.warn(`不支持为 Surge 生成 v2ray-plugin 的 Shadowsocks 节点,节点 ${nodeConfig.nodeName} 会被省略`);
99
+ return void 0;
100
+ }
101
+ return [
102
+ nodeConfig.nodeName,
103
+ [
104
+ nodeConfig.nodeName,
69
105
  [
70
- 'custom',
71
- config.hostname,
72
- config.port,
73
- config.method,
74
- config.password,
75
- 'https://raw.githubusercontent.com/ConnersHua/SSEncrypt/master/SSEncrypt.module',
76
- ...(0, index_1.pickAndFormatStringList)(config, [
77
- 'udp-relay',
106
+ 'ss',
107
+ nodeConfig.hostname,
108
+ nodeConfig.port,
109
+ 'encrypt-method=' + nodeConfig.method,
110
+ ...(0, _1.pickAndFormatStringList)(nodeConfig, [
111
+ 'password',
112
+ 'udpRelay',
78
113
  'obfs',
79
- 'obfs-host',
114
+ 'obfsHost',
80
115
  'tfo',
81
116
  'mptcp',
82
117
  'testUrl',
@@ -86,19 +121,21 @@ const getSurgeNodes = function (list, filter) {
86
121
  }),
87
122
  ...parseShadowTlsConfig(nodeConfig),
88
123
  ].join(', '),
89
- ].join(' = ');
90
- }
91
- case types_1.NodeTypeEnum.HTTPS: {
92
- const config = nodeConfig;
93
- return [
94
- config.nodeName,
124
+ ].join(' = '),
125
+ ];
126
+ }
127
+ case types_1.NodeTypeEnum.HTTPS: {
128
+ return [
129
+ nodeConfig.nodeName,
130
+ [
131
+ nodeConfig.nodeName,
95
132
  [
96
133
  'https',
97
- config.hostname,
98
- config.port,
99
- config.username,
100
- config.password,
101
- ...(0, index_1.pickAndFormatStringList)(config, [
134
+ nodeConfig.hostname,
135
+ nodeConfig.port,
136
+ nodeConfig.username,
137
+ nodeConfig.password,
138
+ ...(0, _1.pickAndFormatStringList)(nodeConfig, [
102
139
  'sni',
103
140
  'tfo',
104
141
  'mptcp',
@@ -112,37 +149,41 @@ const getSurgeNodes = function (list, filter) {
112
149
  }),
113
150
  ...parseShadowTlsConfig(nodeConfig),
114
151
  ].join(', '),
115
- ].join(' = ');
116
- }
117
- case types_1.NodeTypeEnum.HTTP: {
118
- const config = nodeConfig;
119
- return [
120
- config.nodeName,
152
+ ].join(' = '),
153
+ ];
154
+ }
155
+ case types_1.NodeTypeEnum.HTTP: {
156
+ return [
157
+ nodeConfig.nodeName,
158
+ [
159
+ nodeConfig.nodeName,
121
160
  [
122
161
  'http',
123
- config.hostname,
124
- config.port,
125
- config.username,
126
- config.password,
127
- ...(0, index_1.pickAndFormatStringList)(config, ['tfo', 'mptcp', 'underlyingProxy', 'testUrl'], {
162
+ nodeConfig.hostname,
163
+ nodeConfig.port,
164
+ nodeConfig.username,
165
+ nodeConfig.password,
166
+ ...(0, _1.pickAndFormatStringList)(nodeConfig, ['tfo', 'mptcp', 'underlyingProxy', 'testUrl'], {
128
167
  keyFormat: 'kebabCase',
129
168
  }),
130
169
  ...parseShadowTlsConfig(nodeConfig),
131
170
  ].join(', '),
132
- ].join(' = ');
133
- }
134
- case types_1.NodeTypeEnum.Snell: {
135
- const config = nodeConfig;
136
- return [
137
- config.nodeName,
171
+ ].join(' = '),
172
+ ];
173
+ }
174
+ case types_1.NodeTypeEnum.Snell: {
175
+ return [
176
+ nodeConfig.nodeName,
177
+ [
178
+ nodeConfig.nodeName,
138
179
  [
139
180
  'snell',
140
- config.hostname,
141
- config.port,
142
- ...(0, index_1.pickAndFormatStringList)(config, [
181
+ nodeConfig.hostname,
182
+ nodeConfig.port,
183
+ ...(0, _1.pickAndFormatStringList)(nodeConfig, [
143
184
  'psk',
144
185
  'obfs',
145
- 'obfs-host',
186
+ 'obfsHost',
146
187
  'version',
147
188
  'reuse',
148
189
  'tfo',
@@ -154,228 +195,215 @@ const getSurgeNodes = function (list, filter) {
154
195
  }),
155
196
  ...parseShadowTlsConfig(nodeConfig),
156
197
  ].join(', '),
157
- ].join(' = ');
198
+ ].join(' = '),
199
+ ];
200
+ }
201
+ case types_1.NodeTypeEnum.Shadowsocksr: {
202
+ // istanbul ignore next
203
+ if (!nodeConfig.binPath) {
204
+ throw new Error('请按照文档 https://url.royli.dev/vdGh2 添加 Shadowsocksr 二进制文件路径');
158
205
  }
159
- case types_1.NodeTypeEnum.Shadowsocksr: {
160
- const config = nodeConfig;
161
- // istanbul ignore next
162
- if (!config.binPath) {
163
- throw new Error('请按照文档 https://url.royli.dev/vdGh2 添加 Shadowsocksr 二进制文件路径');
164
- }
165
- const args = [
166
- '-s',
167
- config.hostname,
168
- '-p',
169
- `${config.port}`,
170
- '-m',
171
- config.method,
172
- '-o',
173
- config.obfs,
174
- '-O',
175
- config.protocol,
176
- '-k',
177
- config.password,
178
- '-l',
179
- `${config.localPort}`,
180
- '-b',
181
- '127.0.0.1',
182
- ];
183
- if (config.protoparam) {
184
- args.push('-G', config.protoparam);
185
- }
186
- if (config.obfsparam) {
187
- args.push('-g', config.obfsparam);
188
- }
189
- const configString = [
190
- 'external',
191
- `exec = ${JSON.stringify(config.binPath)}`,
192
- ...args.map((arg) => `args = ${JSON.stringify(arg)}`),
193
- `local-port = ${config.localPort}`,
194
- ];
195
- if (config.localPort === 0) {
196
- throw new Error(`为 Surge 生成 SSR 配置时必须为 Provider ${(_b = config.provider) === null || _b === void 0 ? void 0 : _b.name} 设置 startPort,参考 https://url.royli.dev/bWcpe`);
197
- }
198
- if (config.hostnameIp && config.hostnameIp.length) {
199
- configString.push(...config.hostnameIp.map((item) => `addresses = ${item}`));
200
- }
201
- if ((0, index_1.isIp)(config.hostname)) {
202
- configString.push(`addresses = ${config.hostname}`);
203
- }
204
- return [config.nodeName, configString.join(', ')].join(' = ');
206
+ const args = [
207
+ '-s',
208
+ nodeConfig.hostname,
209
+ '-p',
210
+ `${nodeConfig.port}`,
211
+ '-m',
212
+ nodeConfig.method,
213
+ '-o',
214
+ nodeConfig.obfs,
215
+ '-O',
216
+ nodeConfig.protocol,
217
+ '-k',
218
+ nodeConfig.password,
219
+ '-l',
220
+ `${nodeConfig.localPort}`,
221
+ '-b',
222
+ '127.0.0.1',
223
+ ];
224
+ if (nodeConfig.protoparam) {
225
+ args.push('-G', nodeConfig.protoparam);
205
226
  }
206
- case types_1.NodeTypeEnum.Vmess: {
207
- const config = nodeConfig;
208
- if (((_c = nodeConfig === null || nodeConfig === void 0 ? void 0 : nodeConfig.surgeConfig) === null || _c === void 0 ? void 0 : _c.v2ray) === 'native') {
209
- // Native support for vmess
210
- const configList = [
211
- 'vmess',
212
- config.hostname,
213
- config.port,
214
- `username=${config.uuid}`,
215
- ];
216
- if (['chacha20-ietf-poly1305', 'aes-128-gcm'].includes(config.method)) {
217
- configList.push(`encrypt-method=${config.method}`);
218
- }
219
- if (config.network === 'ws') {
220
- configList.push('ws=true');
221
- configList.push(`ws-path=${config.path}`);
222
- configList.push('ws-headers=' +
223
- JSON.stringify((0, exports.getSurgeExtendHeaders)(Object.assign({ host: config.host || config.hostname, 'user-agent': constant_1.OBFS_UA }, lodash_1.default.omit(config.wsHeaders, ['host'])))));
224
- }
225
- if (config.tls) {
226
- configList.push('tls=true', ...(0, index_1.pickAndFormatStringList)(config, ['tls13', 'skipCertVerify', 'serverCertFingerprintSha256'], {
227
- keyFormat: 'kebabCase',
228
- }), ...(config.host ? [`sni=${config.host}`] : []));
229
- }
230
- configList.push(...(0, index_1.pickAndFormatStringList)(config, ['tfo', 'mptcp', 'underlyingProxy', 'testUrl'], {
231
- keyFormat: 'kebabCase',
232
- }));
233
- if ((_d = nodeConfig === null || nodeConfig === void 0 ? void 0 : nodeConfig.surgeConfig) === null || _d === void 0 ? void 0 : _d.vmessAEAD) {
234
- configList.push('vmess-aead=true');
235
- }
236
- else {
237
- configList.push('vmess-aead=false');
238
- }
239
- configList.push(...parseShadowTlsConfig(nodeConfig));
240
- return [config.nodeName, configList.join(', ')].join(' = ');
241
- }
242
- else {
243
- // Using external provider
244
- // istanbul ignore next
245
- if (!config.binPath) {
246
- throw new Error('请按照文档 https://url.royli.dev/vdGh2 添加 V2Ray 二进制文件路径');
247
- }
248
- if (config.localPort === 0) {
249
- throw new Error(`为 Surge 生成 Vmess 配置时必须为 Provider ${(_e = config.provider) === null || _e === void 0 ? void 0 : _e.name} 设置 startPort,参考 https://url.royli.dev/bWcpe`);
250
- }
251
- const jsonFileName = `v2ray_${config.localPort}_${config.hostname}_${config.port}.json`;
252
- const jsonFilePath = (0, path_1.join)((0, index_1.ensureConfigFolder)(), jsonFileName);
253
- const jsonFile = (0, index_1.formatV2rayConfig)(config.localPort, nodeConfig);
254
- const args = [
255
- '--config',
256
- jsonFilePath.replace(os_1.default.homedir(), '$HOME'),
257
- ];
258
- const configString = [
259
- 'external',
260
- `exec = ${JSON.stringify(config.binPath)}`,
261
- ...args.map((arg) => `args = ${JSON.stringify(arg)}`),
262
- `local-port = ${config.localPort}`,
263
- ];
264
- if (config.hostnameIp && config.hostnameIp.length) {
265
- configString.push(...config.hostnameIp.map((item) => `addresses = ${item}`));
266
- }
267
- if ((0, index_1.isIp)(config.hostname)) {
268
- configString.push(`addresses = ${config.hostname}`);
269
- }
270
- // istanbul ignore next
271
- if (process.env.NODE_ENV !== 'test') {
272
- fs_extra_1.default.writeJSONSync(jsonFilePath, jsonFile);
273
- }
274
- return [config.nodeName, configString.join(', ')].join(' = ');
275
- }
227
+ if (nodeConfig.obfsparam) {
228
+ args.push('-g', nodeConfig.obfsparam);
276
229
  }
277
- case types_1.NodeTypeEnum.Trojan: {
278
- const configList = [
279
- 'trojan',
280
- nodeConfig.hostname,
281
- `${nodeConfig.port}`,
282
- `password=${nodeConfig.password}`,
283
- ...(0, index_1.pickAndFormatStringList)(nodeConfig, [
284
- 'tfo',
285
- 'mptcp',
286
- 'sni',
287
- 'tls13',
288
- 'testUrl',
289
- 'underlyingProxy',
290
- 'skipCertVerify',
291
- 'serverCertFingerprintSha256',
292
- ], {
293
- keyFormat: 'kebabCase',
294
- }),
295
- ...parseShadowTlsConfig(nodeConfig),
296
- ];
297
- if (nodeConfig.network === 'ws') {
298
- configList.push('ws=true');
299
- configList.push(`ws-path=${nodeConfig.wsPath}`);
300
- if (nodeConfig.wsHeaders) {
301
- configList.push('ws-headers=' +
302
- JSON.stringify((0, exports.getSurgeExtendHeaders)(nodeConfig.wsHeaders)));
303
- }
304
- }
305
- return [nodeConfig.nodeName, configList.join(', ')].join(' = ');
230
+ const nodeConfigString = [
231
+ 'external',
232
+ `exec = ${JSON.stringify(nodeConfig.binPath)}`,
233
+ ...args.map((arg) => `args = ${JSON.stringify(arg)}`),
234
+ `local-port = ${nodeConfig.localPort}`,
235
+ ];
236
+ if (nodeConfig.localPort === 0) {
237
+ throw new Error(`为 Surge 生成 SSR 配置时必须为 Provider ${nodeConfig.provider?.name} 设置 startPort,参考 https://url.royli.dev/bWcpe`);
306
238
  }
307
- case types_1.NodeTypeEnum.Socks5: {
308
- const config = [
309
- nodeConfig.tls === true ? 'socks5-tls' : 'socks5',
310
- nodeConfig.hostname,
311
- nodeConfig.port,
312
- ...(0, index_1.pickAndFormatStringList)(nodeConfig, [
313
- 'username',
314
- 'password',
315
- 'sni',
316
- 'tfo',
317
- 'mptcp',
318
- 'tls13',
319
- 'udpRelay',
320
- 'testUrl',
321
- 'underlyingProxy',
322
- 'serverCertFingerprintSha256',
323
- ], {
324
- keyFormat: 'kebabCase',
325
- }),
326
- ...parseShadowTlsConfig(nodeConfig),
327
- ];
328
- if (nodeConfig.tls === true) {
329
- config.push(...(typeof nodeConfig.skipCertVerify === 'boolean'
330
- ? [`skip-cert-verify=${nodeConfig.skipCertVerify}`]
331
- : []), ...(typeof nodeConfig.clientCert === 'string'
332
- ? [`client-cert=${nodeConfig.clientCert}`]
333
- : []));
239
+ if (nodeConfig.hostnameIp && nodeConfig.hostnameIp.length) {
240
+ nodeConfigString.push(...nodeConfig.hostnameIp.map((item) => `addresses = ${item}`));
241
+ }
242
+ if ((0, _1.isIp)(nodeConfig.hostname)) {
243
+ nodeConfigString.push(`addresses = ${nodeConfig.hostname}`);
244
+ }
245
+ return [
246
+ nodeConfig.nodeName,
247
+ [nodeConfig.nodeName, nodeConfigString.join(', ')].join(' = '),
248
+ ];
249
+ }
250
+ case types_1.NodeTypeEnum.Vmess: {
251
+ const result = [
252
+ 'vmess',
253
+ nodeConfig.hostname,
254
+ nodeConfig.port,
255
+ `username=${nodeConfig.uuid}`,
256
+ ];
257
+ if (['chacha20-ietf-poly1305', 'aes-128-gcm'].includes(nodeConfig.method)) {
258
+ result.push(`encrypt-method=${nodeConfig.method}`);
259
+ }
260
+ if (nodeConfig.network === 'ws') {
261
+ result.push('ws=true');
262
+ result.push(`ws-path=${nodeConfig.path}`);
263
+ result.push('ws-headers=' +
264
+ JSON.stringify((0, exports.getSurgeExtendHeaders)({
265
+ host: nodeConfig.host || nodeConfig.hostname,
266
+ 'user-agent': constant_1.OBFS_UA,
267
+ ...lodash_1.default.omit(nodeConfig.wsHeaders, ['host']), // host 本质上是一个头信息,所以可能存在冲突的情况。以 host 属性为准。
268
+ })));
269
+ }
270
+ if (nodeConfig.tls) {
271
+ result.push('tls=true', ...(0, _1.pickAndFormatStringList)(nodeConfig, ['tls13', 'skipCertVerify', 'serverCertFingerprintSha256'], {
272
+ keyFormat: 'kebabCase',
273
+ }), ...(nodeConfig.host ? [`sni=${nodeConfig.host}`] : []));
274
+ }
275
+ result.push(...(0, _1.pickAndFormatStringList)(nodeConfig, ['tfo', 'mptcp', 'underlyingProxy', 'testUrl'], {
276
+ keyFormat: 'kebabCase',
277
+ }));
278
+ if (nodeConfig?.surgeConfig?.vmessAEAD) {
279
+ result.push('vmess-aead=true');
280
+ }
281
+ else {
282
+ result.push('vmess-aead=false');
283
+ }
284
+ result.push(...parseShadowTlsConfig(nodeConfig));
285
+ return [
286
+ nodeConfig.nodeName,
287
+ [nodeConfig.nodeName, result.join(', ')].join(' = '),
288
+ ];
289
+ }
290
+ case types_1.NodeTypeEnum.Trojan: {
291
+ const result = [
292
+ 'trojan',
293
+ nodeConfig.hostname,
294
+ `${nodeConfig.port}`,
295
+ `password=${nodeConfig.password}`,
296
+ ...(0, _1.pickAndFormatStringList)(nodeConfig, [
297
+ 'tfo',
298
+ 'mptcp',
299
+ 'sni',
300
+ 'tls13',
301
+ 'testUrl',
302
+ 'underlyingProxy',
303
+ 'skipCertVerify',
304
+ 'serverCertFingerprintSha256',
305
+ ], {
306
+ keyFormat: 'kebabCase',
307
+ }),
308
+ ...parseShadowTlsConfig(nodeConfig),
309
+ ];
310
+ if (nodeConfig.network === 'ws') {
311
+ result.push('ws=true');
312
+ result.push(`ws-path=${nodeConfig.wsPath}`);
313
+ if (nodeConfig.wsHeaders) {
314
+ result.push('ws-headers=' +
315
+ JSON.stringify((0, exports.getSurgeExtendHeaders)(nodeConfig.wsHeaders)));
334
316
  }
335
- return [nodeConfig.nodeName, config.join(', ')].join(' = ');
336
317
  }
337
- case types_1.NodeTypeEnum.Tuic: {
338
- const config = [
339
- 'tuic',
340
- nodeConfig.hostname,
341
- nodeConfig.port,
342
- ...(0, index_1.pickAndFormatStringList)(nodeConfig, [
343
- 'token',
344
- 'sni',
345
- 'underlyingProxy',
346
- 'testUrl',
347
- 'skipCertVerify',
348
- 'serverCertFingerprintSha256',
349
- ], {
350
- keyFormat: 'kebabCase',
351
- }),
352
- ...(Array.isArray(nodeConfig.alpn)
353
- ? [`alpn=${nodeConfig.alpn.join(',')}`]
354
- : []),
355
- ];
356
- return [nodeConfig.nodeName, config.join(', ')].join(' = ');
318
+ return [
319
+ nodeConfig.nodeName,
320
+ [nodeConfig.nodeName, result.join(', ')].join(' = '),
321
+ ];
322
+ }
323
+ case types_1.NodeTypeEnum.Socks5: {
324
+ const result = [
325
+ nodeConfig.tls === true ? 'socks5-tls' : 'socks5',
326
+ nodeConfig.hostname,
327
+ nodeConfig.port,
328
+ ...(0, _1.pickAndFormatStringList)(nodeConfig, [
329
+ 'username',
330
+ 'password',
331
+ 'sni',
332
+ 'tfo',
333
+ 'mptcp',
334
+ 'tls13',
335
+ 'udpRelay',
336
+ 'testUrl',
337
+ 'underlyingProxy',
338
+ 'serverCertFingerprintSha256',
339
+ ], {
340
+ keyFormat: 'kebabCase',
341
+ }),
342
+ ...parseShadowTlsConfig(nodeConfig),
343
+ ];
344
+ if (nodeConfig.tls === true) {
345
+ result.push(...(typeof nodeConfig.skipCertVerify === 'boolean'
346
+ ? [`skip-cert-verify=${nodeConfig.skipCertVerify}`]
347
+ : []), ...(typeof nodeConfig.clientCert === 'string'
348
+ ? [`client-cert=${nodeConfig.clientCert}`]
349
+ : []));
357
350
  }
358
- // istanbul ignore next
359
- default:
360
- logger.warn(`不支持为 Surge 生成 ${nodeConfig.type} 的节点,节点 ${nodeConfig.nodeName} 会被省略`);
361
- return void 0;
351
+ return [
352
+ nodeConfig.nodeName,
353
+ [nodeConfig.nodeName, result.join(', ')].join(' = '),
354
+ ];
362
355
  }
363
- })
364
- .filter((item) => item !== undefined);
365
- return result.join('\n');
366
- };
367
- exports.getSurgeNodes = getSurgeNodes;
368
- function parseShadowTlsConfig(config) {
369
- const result = [];
370
- if (config.shadowTls) {
371
- result.push(`shadow-tls-password=${config.shadowTls.password}`);
372
- if (config.shadowTls.sni) {
373
- result.push(`shadow-tls-sni=${config.shadowTls.sni}`);
356
+ case types_1.NodeTypeEnum.Tuic: {
357
+ const result = [
358
+ 'tuic',
359
+ nodeConfig.hostname,
360
+ nodeConfig.port,
361
+ ...(0, _1.pickAndFormatStringList)(nodeConfig, [
362
+ 'token',
363
+ 'password',
364
+ 'uuid',
365
+ 'sni',
366
+ 'underlyingProxy',
367
+ 'testUrl',
368
+ 'skipCertVerify',
369
+ 'serverCertFingerprintSha256',
370
+ 'version',
371
+ ], {
372
+ keyFormat: 'kebabCase',
373
+ }),
374
+ ...(Array.isArray(nodeConfig.alpn)
375
+ ? [`alpn=${nodeConfig.alpn.join(',')}`]
376
+ : []),
377
+ ];
378
+ return [
379
+ nodeConfig.nodeName,
380
+ [nodeConfig.nodeName, result.join(', ')].join(' = '),
381
+ ];
374
382
  }
375
- if (config.shadowTls.version) {
376
- result.push(`shadow-tls-version=${config.shadowTls.version}`);
383
+ case types_1.NodeTypeEnum.Wireguard:
384
+ logger.info('请配合使用 getSurgeWireguardNodes 生成 Wireguard 节点配置');
385
+ return [
386
+ nodeConfig.nodeName,
387
+ [
388
+ nodeConfig.nodeName,
389
+ ' = wireguard, section-name = ',
390
+ nodeConfig.nodeName,
391
+ ].join(''),
392
+ ];
393
+ // istanbul ignore next
394
+ default:
395
+ logger.warn(`不支持为 Surge 生成 ${nodeConfig.type} 的节点,节点 ${nodeConfig.nodeName} 会被省略`);
396
+ return undefined;
397
+ }
398
+ }
399
+ function parseShadowTlsConfig(nodeConfig) {
400
+ const result = [];
401
+ if (nodeConfig.shadowTls) {
402
+ result.push(`shadow-tls-password=${nodeConfig.shadowTls.password}`, `shadow-tls-sni=${nodeConfig.shadowTls.sni}`);
403
+ if (nodeConfig.shadowTls.version) {
404
+ result.push(`shadow-tls-version=${nodeConfig.shadowTls.version}`);
377
405
  }
378
406
  }
379
407
  return result;
380
408
  }
381
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VyZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdXRpbHMvc3VyZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMkNBQThDO0FBQzlDLHdEQUEwQjtBQUMxQixvREFBdUI7QUFDdkIsNENBQW9CO0FBQ3BCLCtCQUE0QjtBQUU1QiwwQ0FBMEQ7QUFDMUQsb0NBV2tCO0FBQ2xCLG1DQUtpQjtBQUNqQixxQ0FBdUM7QUFFdkMsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxFQUFDLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLENBQUMsQ0FBQztBQUV4RCxNQUFNLHFCQUFxQixHQUFHLENBQ25DLFNBQWlDLEVBQ3pCLEVBQUU7SUFDVixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQzFCLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsR0FBRyxTQUFTLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7U0FDMUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsQ0FBQyxDQUFDO0FBTlcsUUFBQSxxQkFBcUIseUJBTWhDO0FBRUY7O0dBRUc7QUFDSSxNQUFNLGFBQWEsR0FBRyxVQUMzQixJQUEyQyxFQUMzQyxNQUFrRDtJQUVsRCx1QkFBdUI7SUFDdkIsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUU7UUFDM0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBa0IsQ0FBQyxDQUFDO0tBQ3JDO0lBRUQsTUFBTSxNQUFNLEdBQWEsSUFBQSxvQkFBVyxFQUFDLElBQUksRUFBRSxNQUFNLENBQUM7U0FDL0MsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFzQixFQUFFOztRQUN0QyxRQUFRLFVBQVUsQ0FBQyxJQUFJLEVBQUU7WUFDdkIsS0FBSyxvQkFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUM3QixN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
409
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VyZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvc3VyZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMkNBQTZDO0FBQzdDLG9EQUFzQjtBQUV0QiwwQ0FBcUM7QUFDckMsb0NBS2lCO0FBQ2pCLHlCQUFrRDtBQUNsRCxxQ0FBc0M7QUFFdEMsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxFQUFDLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLENBQUMsQ0FBQTtBQUV2RCxNQUFNLHFCQUFxQixHQUFHLENBQ25DLFNBQWlDLEVBQ3pCLEVBQUU7SUFDVixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQzFCLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsV0FBVyxFQUFFLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7U0FDeEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ2QsQ0FBQyxDQUFBO0FBTlksUUFBQSxxQkFBcUIseUJBTWpDO0FBRUQ7O0dBRUc7QUFDSSxNQUFNLGFBQWEsR0FBRyxVQUMzQixRQUErQyxFQUMvQyxNQUE4QztJQUU5QyxNQUFNLE1BQU0sR0FBYSxJQUFBLG9CQUFXLEVBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztTQUNuRCxHQUFHLENBQUMsY0FBYyxDQUFDO1NBQ25CLE1BQU0sQ0FDTCxDQUFDLElBQUksRUFBMEQsRUFBRSxDQUMvRCxJQUFJLEtBQUssU0FBUyxDQUNyQjtTQUNBLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFekIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQzFCLENBQUMsQ0FBQTtBQWJZLFFBQUEsYUFBYSxpQkFhekI7QUFFTSxNQUFNLHNCQUFzQixHQUFHLENBQ3BDLFFBQStDLEVBQ3ZDLEVBQUU7SUFDVixNQUFNLE1BQU0sR0FBRyxRQUFRO1NBQ3BCLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO1FBQ2xCLElBQ0UsVUFBVSxDQUFDLElBQUksS0FBSyxvQkFBWSxDQUFDLFNBQVM7WUFDMUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxLQUFLLEVBQzNCO1lBQ0EsT0FBTyxTQUFTLENBQUE7U0FDakI7UUFFRCxNQUFNLGlCQUFpQixHQUFhO1lBQ2xDLGNBQWMsVUFBVSxDQUFDLFFBQVEsR0FBRztZQUNwQyxXQUFXLFVBQVUsQ0FBQyxNQUFNLEVBQUU7WUFDOUIsZUFBZSxVQUFVLENBQUMsVUFBVSxFQUFFO1NBQ3ZDLENBQUE7UUFDRCxNQUFNLFlBQVksR0FBbUM7WUFDbkQsS0FBSztZQUNMLFlBQVk7WUFDWixVQUFVO1NBQ1gsQ0FBQTtRQUVELEtBQUssTUFBTSxHQUFHLElBQUksWUFBWSxFQUFFO1lBQzlCLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDakMsaUJBQWlCLENBQUMsSUFBSSxDQUNwQixHQUFHLElBQUEsMEJBQXVCLEVBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQzVDLFNBQVMsRUFBRSxXQUFXO2lCQUN2QixDQUFDLENBQ0gsQ0FBQTthQUNGO1NBQ0Y7UUFFRCxJQUFJLFVBQVUsQ0FBQyxVQUFVLEVBQUU7WUFDekIsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGNBQWMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1NBQ3pFO1FBRUQsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFO1lBQ25DLE1BQU0sVUFBVSxHQUFhO2dCQUMzQixZQUFZLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQzNCLGNBQWMsSUFBSSxDQUFDLFNBQVMsRUFBRTthQUMvQixDQUFBO1lBQ0QsTUFBTSxzQkFBc0IsR0FBNkI7Z0JBQ3ZELGNBQWM7Z0JBQ2QsWUFBWTtnQkFDWixXQUFXO2FBQ1osQ0FBQTtZQUVELEtBQUssTUFBTSxHQUFHLElBQUksc0JBQXNCLEVBQUU7Z0JBQ3hDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsRUFBRTtvQkFDM0IsVUFBVSxDQUFDLElBQUksQ0FDYixHQUFHLElBQUEsMEJBQXVCLEVBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQ3RDLFNBQVMsRUFBRSxXQUFXO3FCQUN2QixDQUFDLENBQ0gsQ0FBQTtpQkFDRjthQUNGO1lBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNyQixVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO2FBQzVEO1lBRUQsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFNBQVMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7U0FDMUQ7UUFFRCxPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNyQyxDQUFDLENBQUM7U0FDRCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQWtCLEVBQUUsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUE7SUFFdkQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQzVCLENBQUMsQ0FBQTtBQXRFWSxRQUFBLHNCQUFzQiwwQkFzRWxDO0FBRU0sTUFBTSxpQkFBaUIsR0FBRyxVQUMvQixRQUErQyxFQUMvQyxNQUE4QztJQUU5QyxNQUFNLE1BQU0sR0FBYSxJQUFBLG9CQUFXLEVBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztTQUNuRCxHQUFHLENBQUMsY0FBYyxDQUFDO1NBQ25CLE1BQU0sQ0FDTCxDQUFDLElBQUksRUFBMEQsRUFBRSxDQUMvRCxJQUFJLEtBQUssU0FBUyxDQUNyQjtTQUNBLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFekIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQzFCLENBQUMsQ0FBQTtBQWJZLFFBQUEsaUJBQWlCLHFCQWE3QjtBQUVELFNBQVMsY0FBYyxDQUNyQixVQUFrQztJQUVsQyxRQUFRLFVBQVUsQ0FBQyxJQUFJLEVBQUU7UUFDdkIsS0FBSyxvQkFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzdCLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUM5RCxNQUFNLENBQUMsSUFBSSxDQUNULGtEQUFrRCxVQUFVLENBQUMsUUFBUSxPQUFPLENBQzdFLENBQUE7Z0JBQ0QsT0FBTyxLQUFLLENBQUMsQ0FBQTthQUNkO1lBRUQsT0FBTztnQkFDTCxVQUFVLENBQUMsUUFBUTtnQkFDbkI7b0JBQ0UsVUFBVSxDQUFDLFFBQVE7b0JBQ25CO3dCQUNFLElBQUk7d0JBQ0osVUFBVSxDQUFDLFFBQVE7d0JBQ25CLFVBQVUsQ0FBQyxJQUFJO3dCQUNmLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxNQUFNO3dCQUNyQyxHQUFHLElBQUEsMEJBQXVCLEVBQ3hCLFVBQVUsRUFDVjs0QkFDRSxVQUFVOzRCQUNWLFVBQVU7NEJBQ1YsTUFBTTs0QkFDTixVQUFVOzRCQUNWLEtBQUs7NEJBQ0wsT0FBTzs0QkFDUCxTQUFTOzRCQUNULGlCQUFpQjt5QkFDbEIsRUFDRDs0QkFDRSxTQUFTLEVBQUUsV0FBVzt5QkFDdkIsQ0FDRjt3QkFDRCxHQUFHLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztxQkFDcEMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2lCQUNiLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUNkLENBQUE7U0FDRjtRQUVELEtBQUssb0JBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QixPQUFPO2dCQUNMLFVBQVUsQ0FBQyxRQUFRO2dCQUNuQjtvQkFDRSxVQUFVLENBQUMsUUFBUTtvQkFDbkI7d0JBQ0UsT0FBTzt3QkFDUCxVQUFVLENBQUMsUUFBUTt3QkFDbkIsVUFBVSxDQUFDLElBQUk7d0JBQ2YsVUFBVSxDQUFDLFFBQVE7d0JBQ25CLFVBQVUsQ0FBQyxRQUFRO3dCQUNuQixHQUFHLElBQUEsMEJBQXVCLEVBQ3hCLFVBQVUsRUFDVjs0QkFDRSxLQUFLOzRCQUNMLEtBQUs7NEJBQ0wsT0FBTzs0QkFDUCxPQUFPOzRCQUNQLFNBQVM7NEJBQ1QsZ0JBQWdCOzRCQUNoQixpQkFBaUI7NEJBQ2pCLDZCQUE2Qjt5QkFDOUIsRUFDRDs0QkFDRSxTQUFTLEVBQUUsV0FBVzt5QkFDdkIsQ0FDRjt3QkFDRCxHQUFHLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztxQkFDcEMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2lCQUNiLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUNkLENBQUE7U0FDRjtRQUVELEtBQUssb0JBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QixPQUFPO2dCQUNMLFVBQVUsQ0FBQyxRQUFRO2dCQUNuQjtvQkFDRSxVQUFVLENBQUMsUUFBUTtvQkFDbkI7d0JBQ0UsTUFBTTt3QkFDTixVQUFVLENBQUMsUUFBUTt3QkFDbkIsVUFBVSxDQUFDLElBQUk7d0JBQ2YsVUFBVSxDQUFDLFFBQVE7d0JBQ25CLFVBQVUsQ0FBQyxRQUFRO3dCQUNuQixHQUFHLElBQUEsMEJBQXVCLEVBQ3hCLFVBQVUsRUFDVixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLEVBQzlDOzRCQUNFLFNBQVMsRUFBRSxXQUFXO3lCQUN2QixDQUNGO3dCQUNELEdBQUcsb0JBQW9CLENBQUMsVUFBVSxDQUFDO3FCQUNwQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7aUJBQ2IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO2FBQ2QsQ0FBQTtTQUNGO1FBRUQsS0FBSyxvQkFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZCLE9BQU87Z0JBQ0wsVUFBVSxDQUFDLFFBQVE7Z0JBQ25CO29CQUNFLFVBQVUsQ0FBQyxRQUFRO29CQUNuQjt3QkFDRSxPQUFPO3dCQUNQLFVBQVUsQ0FBQyxRQUFRO3dCQUNuQixVQUFVLENBQUMsSUFBSTt3QkFDZixHQUFHLElBQUEsMEJBQXVCLEVBQ3hCLFVBQVUsRUFDVjs0QkFDRSxLQUFLOzRCQUNMLE1BQU07NEJBQ04sVUFBVTs0QkFDVixTQUFTOzRCQUNULE9BQU87NEJBQ1AsS0FBSzs0QkFDTCxPQUFPOzRCQUNQLFNBQVM7NEJBQ1QsaUJBQWlCO3lCQUNsQixFQUNEOzRCQUNFLFNBQVMsRUFBRSxXQUFXO3lCQUN2QixDQUNGO3dCQUNELEdBQUcsb0JBQW9CLENBQUMsVUFBVSxDQUFDO3FCQUNwQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7aUJBQ2IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO2FBQ2QsQ0FBQTtTQUNGO1FBRUQsS0FBSyxvQkFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzlCLHVCQUF1QjtZQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRTtnQkFDdkIsTUFBTSxJQUFJLEtBQUssQ0FDYiwyREFBMkQsQ0FDNUQsQ0FBQTthQUNGO1lBRUQsTUFBTSxJQUFJLEdBQUc7Z0JBQ1gsSUFBSTtnQkFDSixVQUFVLENBQUMsUUFBUTtnQkFDbkIsSUFBSTtnQkFDSixHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUU7Z0JBQ3BCLElBQUk7Z0JBQ0osVUFBVSxDQUFDLE1BQU07Z0JBQ2pCLElBQUk7Z0JBQ0osVUFBVSxDQUFDLElBQUk7Z0JBQ2YsSUFBSTtnQkFDSixVQUFVLENBQUMsUUFBUTtnQkFDbkIsSUFBSTtnQkFDSixVQUFVLENBQUMsUUFBUTtnQkFDbkIsSUFBSTtnQkFDSixHQUFHLFVBQVUsQ0FBQyxTQUFTLEVBQUU7Z0JBQ3pCLElBQUk7Z0JBQ0osV0FBVzthQUNaLENBQUE7WUFFRCxJQUFJLFVBQVUsQ0FBQyxVQUFVLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQTthQUN2QztZQUNELElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFBO2FBQ3RDO1lBRUQsTUFBTSxnQkFBZ0IsR0FBRztnQkFDdkIsVUFBVTtnQkFDVixVQUFVLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUM5QyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFVBQVUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNyRCxnQkFBZ0IsVUFBVSxDQUFDLFNBQVMsRUFBRTthQUN2QyxDQUFBO1lBRUQsSUFBSSxVQUFVLENBQUMsU0FBUyxLQUFLLENBQUMsRUFBRTtnQkFDOUIsTUFBTSxJQUFJLEtBQUssQ0FDYixrQ0FBa0MsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLDhDQUE4QyxDQUMxRyxDQUFBO2FBQ0Y7WUFFRCxJQUFJLFVBQVUsQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3pELGdCQUFnQixDQUFDLElBQUksQ0FDbkIsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQyxDQUM5RCxDQUFBO2FBQ0Y7WUFFRCxJQUFJLElBQUEsT0FBSSxFQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDN0IsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGVBQWUsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7YUFDNUQ7WUFFRCxPQUFPO2dCQUNMLFVBQVUsQ0FBQyxRQUFRO2dCQUNuQixDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUMvRCxDQUFBO1NBQ0Y7UUFFRCxLQUFLLG9CQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkIsTUFBTSxNQUFNLEdBQUc7Z0JBQ2IsT0FBTztnQkFDUCxVQUFVLENBQUMsUUFBUTtnQkFDbkIsVUFBVSxDQUFDLElBQUk7Z0JBQ2YsWUFBWSxVQUFVLENBQUMsSUFBSSxFQUFFO2FBQzlCLENBQUE7WUFFRCxJQUNFLENBQUMsd0JBQXdCLEVBQUUsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFDckU7Z0JBQ0EsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7YUFDbkQ7WUFFRCxJQUFJLFVBQVUsQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFO2dCQUMvQixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO2dCQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7Z0JBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQ1QsYUFBYTtvQkFDWCxJQUFJLENBQUMsU0FBUyxDQUNaLElBQUEsNkJBQXFCLEVBQUM7d0JBQ3BCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxJQUFJLFVBQVUsQ0FBQyxRQUFRO3dCQUM1QyxZQUFZLEVBQUUsa0JBQU87d0JBQ3JCLEdBQUcsZ0JBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsMENBQTBDO3FCQUN0RixDQUFDLENBQ0gsQ0FDSixDQUFBO2FBQ0Y7WUFFRCxJQUFJLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2xCLE1BQU0sQ0FBQyxJQUFJLENBQ1QsVUFBVSxFQUNWLEdBQUcsSUFBQSwwQkFBdUIsRUFDeEIsVUFBVSxFQUNWLENBQUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLDZCQUE2QixDQUFDLEVBQzFEO29CQUNFLFNBQVMsRUFBRSxXQUFXO2lCQUN2QixDQUNGLEVBQ0QsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQ3ZELENBQUE7YUFDRjtZQUVELE1BQU0sQ0FBQyxJQUFJLENBQ1QsR0FBRyxJQUFBLDBCQUF1QixFQUN4QixVQUFVLEVBQ1YsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxFQUM5QztnQkFDRSxTQUFTLEVBQUUsV0FBVzthQUN2QixDQUNGLENBQ0YsQ0FBQTtZQUVELElBQUksVUFBVSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUU7Z0JBQ3RDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQTthQUMvQjtpQkFBTTtnQkFDTCxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUE7YUFDaEM7WUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtZQUVoRCxPQUFPO2dCQUNMLFVBQVUsQ0FBQyxRQUFRO2dCQUNuQixDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7YUFDckQsQ0FBQTtTQUNGO1FBRUQsS0FBSyxvQkFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hCLE1BQU0sTUFBTSxHQUFhO2dCQUN2QixRQUFRO2dCQUNSLFVBQVUsQ0FBQyxRQUFRO2dCQUNuQixHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUU7Z0JBQ3BCLFlBQVksVUFBVSxDQUFDLFFBQVEsRUFBRTtnQkFDakMsR0FBRyxJQUFBLDBCQUF1QixFQUN4QixVQUFVLEVBQ1Y7b0JBQ0UsS0FBSztvQkFDTCxPQUFPO29CQUNQLEtBQUs7b0JBQ0wsT0FBTztvQkFDUCxTQUFTO29CQUNULGlCQUFpQjtvQkFDakIsZ0JBQWdCO29CQUNoQiw2QkFBNkI7aUJBQzlCLEVBQ0Q7b0JBQ0UsU0FBUyxFQUFFLFdBQVc7aUJBQ3ZCLENBQ0Y7Z0JBQ0QsR0FBRyxvQkFBb0IsQ0FBQyxVQUFVLENBQUM7YUFDcEMsQ0FBQTtZQUVELElBQUksVUFBVSxDQUFDLE9BQU8sS0FBSyxJQUFJLEVBQUU7Z0JBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtnQkFFM0MsSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFO29CQUN4QixNQUFNLENBQUMsSUFBSSxDQUNULGFBQWE7d0JBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFBLDZCQUFxQixFQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUM5RCxDQUFBO2lCQUNGO2FBQ0Y7WUFFRCxPQUFPO2dCQUNMLFVBQVUsQ0FBQyxRQUFRO2dCQUNuQixDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7YUFDckQsQ0FBQTtTQUNGO1FBRUQsS0FBSyxvQkFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hCLE1BQU0sTUFBTSxHQUFHO2dCQUNiLFVBQVUsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVE7Z0JBQ2pELFVBQVUsQ0FBQyxRQUFRO2dCQUNuQixVQUFVLENBQUMsSUFBSTtnQkFDZixHQUFHLElBQUEsMEJBQXVCLEVBQ3hCLFVBQVUsRUFDVjtvQkFDRSxVQUFVO29CQUNWLFVBQVU7b0JBQ1YsS0FBSztvQkFDTCxLQUFLO29CQUNMLE9BQU87b0JBQ1AsT0FBTztvQkFDUCxVQUFVO29CQUNWLFNBQVM7b0JBQ1QsaUJBQWlCO29CQUNqQiw2QkFBNkI7aUJBQzlCLEVBQ0Q7b0JBQ0UsU0FBUyxFQUFFLFdBQVc7aUJBQ3ZCLENBQ0Y7Z0JBQ0QsR0FBRyxvQkFBb0IsQ0FBQyxVQUFVLENBQUM7YUFDcEMsQ0FBQTtZQUVELElBQUksVUFBVSxDQUFDLEdBQUcsS0FBSyxJQUFJLEVBQUU7Z0JBQzNCLE1BQU0sQ0FBQyxJQUFJLENBQ1QsR0FBRyxDQUFDLE9BQU8sVUFBVSxDQUFDLGNBQWMsS0FBSyxTQUFTO29CQUNoRCxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsVUFBVSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUNuRCxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQ1AsR0FBRyxDQUFDLE9BQU8sVUFBVSxDQUFDLFVBQVUsS0FBSyxRQUFRO29CQUMzQyxDQUFDLENBQUMsQ0FBQyxlQUFlLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDMUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUNSLENBQUE7YUFDRjtZQUVELE9BQU87Z0JBQ0wsVUFBVSxDQUFDLFFBQVE7Z0JBQ25CLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUNyRCxDQUFBO1NBQ0Y7UUFFRCxLQUFLLG9CQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEIsTUFBTSxNQUFNLEdBQUc7Z0JBQ2IsTUFBTTtnQkFDTixVQUFVLENBQUMsUUFBUTtnQkFDbkIsVUFBVSxDQUFDLElBQUk7Z0JBQ2YsR0FBRyxJQUFBLDBCQUF1QixFQUN4QixVQUFVLEVBQ1Y7b0JBQ0UsT0FBTztvQkFDUCxVQUFVO29CQUNWLE1BQU07b0JBQ04sS0FBSztvQkFDTCxpQkFBaUI7b0JBQ2pCLFNBQVM7b0JBQ1QsZ0JBQWdCO29CQUNoQiw2QkFBNkI7b0JBQzdCLFNBQVM7aUJBQ1YsRUFDRDtvQkFDRSxTQUFTLEVBQUUsV0FBVztpQkFDdkIsQ0FDRjtnQkFDRCxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO29CQUNoQyxDQUFDLENBQUMsQ0FBQyxRQUFRLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3ZDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDUixDQUFBO1lBRUQsT0FBTztnQkFDTCxVQUFVLENBQUMsUUFBUTtnQkFDbkIsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO2FBQ3JELENBQUE7U0FDRjtRQUVELEtBQUssb0JBQVksQ0FBQyxTQUFTO1lBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0RBQWdELENBQUMsQ0FBQTtZQUU3RCxPQUFPO2dCQUNMLFVBQVUsQ0FBQyxRQUFRO2dCQUNuQjtvQkFDRSxVQUFVLENBQUMsUUFBUTtvQkFDbkIsK0JBQStCO29CQUMvQixVQUFVLENBQUMsUUFBUTtpQkFDcEIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2FBQ1gsQ0FBQTtRQUVILHVCQUF1QjtRQUN2QjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQ1QsaUJBQWtCLFVBQWtCLENBQUMsSUFBSSxXQUN0QyxVQUFrQixDQUFDLFFBQ3RCLE9BQU8sQ0FDUixDQUFBO1lBQ0QsT0FBTyxTQUFTLENBQUE7S0FDbkI7QUFDSCxDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxVQUFrQztJQUM5RCxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUE7SUFFM0IsSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQ1QsdUJBQXVCLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEVBQ3RELGtCQUFrQixVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUM3QyxDQUFBO1FBRUQsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRTtZQUNoQyxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixVQUFVLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7U0FDbEU7S0FDRjtJQUVELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQyJ9