@ragemp-mango/core 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -108,12 +108,20 @@ declare class App {
108
108
  private runPluginMethods;
109
109
  }
110
110
 
111
+ interface AppBuilderConfig {
112
+ enviroment: AppEnviroment;
113
+ internalAppContainer: Container;
114
+ multiplayerService: MultiplayerService;
115
+ plugins: Newable<MangoPlugin>[];
116
+ }
117
+
111
118
  declare class AppBuilder<G extends Guard = Guard, I extends Interceptor = Interceptor, EF extends ErrorFilter = ErrorFilter> {
112
- protected readonly enviroment: string;
119
+ protected readonly enviroment: AppEnviroment;
113
120
  protected readonly internalAppContainer: Container;
114
121
  protected readonly multiplayerService: MultiplayerService;
115
122
  protected readonly plugins: Newable<MangoPlugin>[];
116
123
  private globalContainerOptions;
124
+ constructor(config: AppBuilderConfig);
117
125
  useGlobalGuards(...guards: (Newable<G> | G)[]): this;
118
126
  useGlobalInterceptors(...interceptors: (Newable<I> | I)[]): this;
119
127
  useGlobalPipes(...pipes: (Newable<Pipe> | Pipe)[]): this;
@@ -127,7 +135,7 @@ declare class AppBuilder<G extends Guard = Guard, I extends Interceptor = Interc
127
135
  declare function createAppBuilder<T extends AppBuilder>({ enviroment, plugins, appBuilderInherit, multiplayerService, }: {
128
136
  enviroment: AppEnviroment;
129
137
  plugins: Newable<MangoPlugin>[];
130
- appBuilderInherit: Newable<T>;
138
+ appBuilderInherit: new (config: AppBuilderConfig) => T;
131
139
  multiplayerService?: MultiplayerService;
132
140
  }): Promise<T>;
133
141
 
package/dist/app/index.js CHANGED
@@ -10,7 +10,7 @@ import {
10
10
  RageMPTimer,
11
11
  RageMPTimers,
12
12
  createAppBuilder
13
- } from "../chunk-UEGF22IW.js";
13
+ } from "../chunk-BQFJLVDO.js";
14
14
  import {
15
15
  Module,
16
16
  ModuleContainer,
@@ -2,7 +2,7 @@ import {
2
2
  AppRuntime,
3
3
  ModuleDependencyBinder,
4
4
  ModuleTreeScanner
5
- } from "../../chunk-UEGF22IW.js";
5
+ } from "../../chunk-BQFJLVDO.js";
6
6
  import "../../chunk-73LIJA6X.js";
7
7
  import "../../chunk-AO6BXG54.js";
8
8
  import "../../chunk-2ADQZWQE.js";
@@ -0,0 +1,170 @@
1
+ import {
2
+ RPC_RESULT_HANDLER_NOT_FOUND,
3
+ RPC_RESULT_TIMEOUT,
4
+ RPC_RESULT_UNKNOWN
5
+ } from "./chunk-HK7QTFPA.js";
6
+ import {
7
+ MangoError
8
+ } from "./chunk-6YEWPMZJ.js";
9
+ import {
10
+ ErrorMessage,
11
+ RPCResultStatus
12
+ } from "./chunk-DXPVUDXD.js";
13
+ import {
14
+ LOGGER_SERVICE
15
+ } from "./chunk-DJZCOYB3.js";
16
+ import {
17
+ __name
18
+ } from "./chunk-7QVYU63E.js";
19
+
20
+ // src/app/services/base-event.service.ts
21
+ import { injectable } from "inversify";
22
+ function _ts_decorate(decorators, target, key, desc) {
23
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
24
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
25
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
26
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
27
+ }
28
+ __name(_ts_decorate, "_ts_decorate");
29
+ function _ts_metadata(k, v) {
30
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
31
+ }
32
+ __name(_ts_metadata, "_ts_metadata");
33
+ var BaseEventService = class {
34
+ static {
35
+ __name(this, "BaseEventService");
36
+ }
37
+ $eventEmmiter;
38
+ $localHandlers = /* @__PURE__ */ new Set();
39
+ $internalHandlers = /* @__PURE__ */ new Set();
40
+ $remoteHandlers = /* @__PURE__ */ new Set();
41
+ $internalEventNames = /* @__PURE__ */ new Set();
42
+ constructor($eventEmmiter) {
43
+ this.$eventEmmiter = $eventEmmiter;
44
+ }
45
+ on(eventName, callback) {
46
+ const wrapper = /* @__PURE__ */ __name((...args) => callback(args[0]), "wrapper");
47
+ const eventHandler = this.$eventEmmiter.on(eventName, wrapper);
48
+ this.$localHandlers.add(eventHandler);
49
+ return eventHandler;
50
+ }
51
+ once(eventName, callback) {
52
+ const wrapper = /* @__PURE__ */ __name((...args) => callback(args[0]), "wrapper");
53
+ const eventHandler = this.$eventEmmiter.once(eventName, wrapper);
54
+ this.$localHandlers.add(eventHandler);
55
+ return eventHandler;
56
+ }
57
+ emit(eventName, body) {
58
+ this.$eventEmmiter.emit(eventName, body);
59
+ }
60
+ $onInternal(eventName, handler) {
61
+ if (!this.$internalEventNames.has(eventName)) {
62
+ throw new Error(ErrorMessage.InvalidInternalEventName);
63
+ }
64
+ const eventHandler = this.$eventEmmiter.on(eventName, handler);
65
+ this.$internalHandlers.add(eventHandler);
66
+ return eventHandler;
67
+ }
68
+ $onceInternal(eventName, handler) {
69
+ if (!this.$internalEventNames.has(eventName)) {
70
+ throw new Error(ErrorMessage.InvalidInternalEventName);
71
+ }
72
+ const eventHandler = this.$eventEmmiter.once(eventName, handler);
73
+ this.$internalHandlers.add(eventHandler);
74
+ return eventHandler;
75
+ }
76
+ };
77
+ BaseEventService = _ts_decorate([
78
+ injectable(),
79
+ _ts_metadata("design:type", Function),
80
+ _ts_metadata("design:paramtypes", [
81
+ typeof EventEmmiter === "undefined" ? Object : EventEmmiter
82
+ ])
83
+ ], BaseEventService);
84
+
85
+ // src/app/services/base-rpc.service.ts
86
+ import { inject, injectable as injectable2 } from "inversify";
87
+ function _ts_decorate2(decorators, target, key, desc) {
88
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
89
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
90
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
91
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
92
+ }
93
+ __name(_ts_decorate2, "_ts_decorate");
94
+ function _ts_metadata2(k, v) {
95
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
96
+ }
97
+ __name(_ts_metadata2, "_ts_metadata");
98
+ var BaseRPCService = class {
99
+ static {
100
+ __name(this, "BaseRPCService");
101
+ }
102
+ $loggerService;
103
+ $TIMEOUT = 2e3;
104
+ $localHandlers = /* @__PURE__ */ new Map();
105
+ async call(rpcName, body, options = {
106
+ timeout: this.$TIMEOUT
107
+ }) {
108
+ return new Promise(async (resolve) => {
109
+ const handler = this.$localHandlers.get(rpcName)?.handler;
110
+ if (!handler) {
111
+ return resolve(RPC_RESULT_HANDLER_NOT_FOUND);
112
+ }
113
+ const timeoutId = setTimeout(() => {
114
+ resolve(RPC_RESULT_TIMEOUT);
115
+ }, options.timeout ?? this.$TIMEOUT);
116
+ try {
117
+ const result = await handler(body);
118
+ clearTimeout(timeoutId);
119
+ resolve({
120
+ success: true,
121
+ status: RPCResultStatus.Success,
122
+ body: result
123
+ });
124
+ } catch (error) {
125
+ clearTimeout(timeoutId);
126
+ if (error instanceof MangoError) {
127
+ return resolve({
128
+ success: false,
129
+ status: error.status,
130
+ error: {
131
+ message: error.message,
132
+ details: error.details
133
+ }
134
+ });
135
+ }
136
+ resolve(RPC_RESULT_UNKNOWN);
137
+ }
138
+ });
139
+ }
140
+ onRequest(rpcName, handler) {
141
+ if (this.$localHandlers.has(rpcName)) {
142
+ this.$loggerService.error("An error occurred while trying to register RPC.");
143
+ throw new Error(ErrorMessage.RPCHandlerAlreadyExists);
144
+ }
145
+ const rpcHandler = {
146
+ destroy: /* @__PURE__ */ __name(() => {
147
+ rpcHandler.valid = false;
148
+ this.$localHandlers.delete(rpcName);
149
+ }, "destroy"),
150
+ rpcName,
151
+ handler,
152
+ valid: true
153
+ };
154
+ this.$localHandlers.set(rpcName, rpcHandler);
155
+ return rpcHandler;
156
+ }
157
+ };
158
+ _ts_decorate2([
159
+ inject(LOGGER_SERVICE),
160
+ _ts_metadata2("design:type", typeof LoggerService === "undefined" ? Object : LoggerService)
161
+ ], BaseRPCService.prototype, "$loggerService", void 0);
162
+ BaseRPCService = _ts_decorate2([
163
+ injectable2()
164
+ ], BaseRPCService);
165
+
166
+ export {
167
+ BaseEventService,
168
+ BaseRPCService
169
+ };
170
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2FwcC9zZXJ2aWNlcy9iYXNlLWV2ZW50LnNlcnZpY2UudHMiLCAiLi4vc3JjL2FwcC9zZXJ2aWNlcy9iYXNlLXJwYy5zZXJ2aWNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB0eXBlIHsgRXZlbnRFbW1pdGVyLCBTY3JpcHRFdmVudEhhbmRsZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgRXZlbnRIYW5kbGVyIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRXZlbnRTZXJ2aWNlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5ICRsb2NhbEhhbmRsZXJzOiBTZXQ8U2NyaXB0RXZlbnRIYW5kbGVyPiA9IG5ldyBTZXQoKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgJGludGVybmFsSGFuZGxlcnM6IFNldDxTY3JpcHRFdmVudEhhbmRsZXI+ID0gbmV3IFNldCgpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSAkcmVtb3RlSGFuZGxlcnM6IFNldDxTY3JpcHRFdmVudEhhbmRsZXI+ID0gbmV3IFNldCgpO1xuICAgIHByb3RlY3RlZCAkaW50ZXJuYWxFdmVudE5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkICRldmVudEVtbWl0ZXI6IEV2ZW50RW1taXRlcikge31cblxuICAgIHB1YmxpYyBvbjxFIGV4dGVuZHMga2V5b2YgVD4oZXZlbnROYW1lOiBFLCBjYWxsYmFjazogKGJvZHk6IFBhcmFtZXRlcnM8VFtFXT5bMF0pID0+IFJldHVyblR5cGU8VFtFXT4pOiBTY3JpcHRFdmVudEhhbmRsZXI7XG4gICAgcHVibGljIG9uPEUgZXh0ZW5kcyBzdHJpbmc+KGV2ZW50TmFtZTogRXhjbHVkZTxFLCBrZXlvZiBUPiwgY2FsbGJhY2s6IChib2R5OiB1bmtub3duKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPik6IFNjcmlwdEV2ZW50SGFuZGxlcjtcbiAgICBwdWJsaWMgb248RSBleHRlbmRzIHN0cmluZz4oZXZlbnROYW1lOiBFeGNsdWRlPEUsIGtleW9mIFQ+LCBjYWxsYmFjazogKGJvZHk6IHVua25vd24pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+KSB7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSAoLi4uYXJnczogYW55W10pID0+IGNhbGxiYWNrKGFyZ3NbMF0pO1xuICAgICAgICBjb25zdCBldmVudEhhbmRsZXIgPSA8U2NyaXB0RXZlbnRIYW5kbGVyPnRoaXMuJGV2ZW50RW1taXRlci5vbihldmVudE5hbWUsIHdyYXBwZXIpO1xuICAgICAgICB0aGlzLiRsb2NhbEhhbmRsZXJzLmFkZChldmVudEhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gZXZlbnRIYW5kbGVyO1xuICAgIH1cbiAgICBwdWJsaWMgb25jZTxFIGV4dGVuZHMga2V5b2YgVD4oZXZlbnROYW1lOiBFLCBjYWxsYmFjazogKGJvZHk6IFBhcmFtZXRlcnM8VFtFXT5bMF0pID0+IFJldHVyblR5cGU8VFtFXT4pOiBTY3JpcHRFdmVudEhhbmRsZXI7XG4gICAgcHVibGljIG9uY2U8RSBleHRlbmRzIHN0cmluZz4oZXZlbnROYW1lOiBFeGNsdWRlPEUsIGtleW9mIFQ+LCBjYWxsYmFjazogKGJvZHk6IHVua25vd24pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+KTogU2NyaXB0RXZlbnRIYW5kbGVyO1xuICAgIHB1YmxpYyBvbmNlPEUgZXh0ZW5kcyBzdHJpbmc+KGV2ZW50TmFtZTogRXhjbHVkZTxFLCBrZXlvZiBUPiwgY2FsbGJhY2s6IChib2R5OiB1bmtub3duKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikge1xuICAgICAgICBjb25zdCB3cmFwcGVyID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBjYWxsYmFjayhhcmdzWzBdKTtcbiAgICAgICAgY29uc3QgZXZlbnRIYW5kbGVyID0gPFNjcmlwdEV2ZW50SGFuZGxlcj50aGlzLiRldmVudEVtbWl0ZXIub25jZShldmVudE5hbWUsIHdyYXBwZXIpO1xuICAgICAgICB0aGlzLiRsb2NhbEhhbmRsZXJzLmFkZChldmVudEhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gZXZlbnRIYW5kbGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbWl0PEUgZXh0ZW5kcyBrZXlvZiBUPihldmVudE5hbWU6IEUsIGJvZHk/OiBUW0VdKTogdm9pZDtcbiAgICBwdWJsaWMgZW1pdDxFIGV4dGVuZHMgc3RyaW5nPihldmVudE5hbWU6IEUsIGJvZHk/OiB1bmtub3duKTogdm9pZDtcbiAgICBwdWJsaWMgZW1pdDxFIGV4dGVuZHMgc3RyaW5nPihldmVudE5hbWU6IEUsIGJvZHk/OiB1bmtub3duKSB7XG4gICAgICAgIHRoaXMuJGV2ZW50RW1taXRlci5lbWl0KGV2ZW50TmFtZSwgYm9keSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkICRvbkludGVybmFsKGV2ZW50TmFtZTogc3RyaW5nLCBoYW5kbGVyOiAoYm9keTogdW5rbm93bikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHtcbiAgICAgICAgaWYgKCF0aGlzLiRpbnRlcm5hbEV2ZW50TmFtZXMuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuSW52YWxpZEludGVybmFsRXZlbnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudEhhbmRsZXIgPSA8RXZlbnRIYW5kbGVyPnRoaXMuJGV2ZW50RW1taXRlci5vbihldmVudE5hbWUsIGhhbmRsZXIpO1xuICAgICAgICB0aGlzLiRpbnRlcm5hbEhhbmRsZXJzLmFkZChldmVudEhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gZXZlbnRIYW5kbGVyO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCAkb25jZUludGVybmFsKGV2ZW50TmFtZTogc3RyaW5nLCBoYW5kbGVyOiAoYm9keTogdW5rbm93bikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHtcbiAgICAgICAgaWYgKCF0aGlzLiRpbnRlcm5hbEV2ZW50TmFtZXMuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuSW52YWxpZEludGVybmFsRXZlbnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudEhhbmRsZXIgPSA8U2NyaXB0RXZlbnRIYW5kbGVyPnRoaXMuJGV2ZW50RW1taXRlci5vbmNlKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgICAgIHRoaXMuJGludGVybmFsSGFuZGxlcnMuYWRkKGV2ZW50SGFuZGxlcik7XG4gICAgICAgIHJldHVybiBldmVudEhhbmRsZXI7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgdHlwZSB7IFJQQ1Jlc3VsdCwgUlBDQ2FsbE9wdGlvbnMsIFNjcmlwdFJQQ0hhbmRsZXIsIExvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFJQQ19SRVNVTFRfSEFORExFUl9OT1RfRk9VTkQsIFJQQ19SRVNVTFRfVElNRU9VVCwgUlBDX1JFU1VMVF9VTktOT1dOIH0gZnJvbSAnLi4vLi4vYXBwL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2UsIFJQQ1Jlc3VsdFN0YXR1cyB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IE1hbmdvRXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvcnMnO1xuaW1wb3J0IHsgTE9HR0VSX1NFUlZJQ0UgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQmFzZVJQQ1NlcnZpY2U8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBAaW5qZWN0KExPR0dFUl9TRVJWSUNFKSBwcm90ZWN0ZWQgcmVhZG9ubHkgJGxvZ2dlclNlcnZpY2U6IExvZ2dlclNlcnZpY2U7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5ICRUSU1FT1VUID0gMjAwMDtcbiAgICBwcml2YXRlIHJlYWRvbmx5ICRsb2NhbEhhbmRsZXJzID0gbmV3IE1hcDxzdHJpbmcsIFNjcmlwdFJQQ0hhbmRsZXI+KCk7XG5cbiAgICBwdWJsaWMgYXN5bmMgY2FsbDxFIGV4dGVuZHMga2V5b2YgVD4oXG4gICAgICAgIHJwY05hbWU6IEUsXG4gICAgICAgIGJvZHk/OiBQYXJhbWV0ZXJzPFRbRV0+WzBdLFxuICAgICAgICBvcHRpb25zPzogUlBDQ2FsbE9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxSUENSZXN1bHQ8UmV0dXJuVHlwZTxUW0VdPj4+O1xuICAgIHB1YmxpYyBhc3luYyBjYWxsPEUgZXh0ZW5kcyBzdHJpbmc+KHJwY05hbWU6IEUsIGJvZHk/OiB1bmtub3duLCBvcHRpb25zPzogUlBDQ2FsbE9wdGlvbnMpOiBQcm9taXNlPFJQQ1Jlc3VsdDx1bmtub3duPj47XG4gICAgcHVibGljIGFzeW5jIGNhbGw8RSBleHRlbmRzIHN0cmluZz4ocnBjTmFtZTogRSwgYm9keT86IHVua25vd24sIG9wdGlvbnM6IFJQQ0NhbGxPcHRpb25zID0geyB0aW1lb3V0OiB0aGlzLiRUSU1FT1VUIH0pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy4kbG9jYWxIYW5kbGVycy5nZXQoPHN0cmluZz5ycGNOYW1lKT8uaGFuZGxlcjtcbiAgICAgICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFJQQ19SRVNVTFRfSEFORExFUl9OT1RfRk9VTkQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKFJQQ19SRVNVTFRfVElNRU9VVCk7XG4gICAgICAgICAgICB9LCBvcHRpb25zLnRpbWVvdXQgPz8gdGhpcy4kVElNRU9VVCk7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlcihib2R5KTtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogdHJ1ZSwgc3RhdHVzOiBSUENSZXN1bHRTdGF0dXMuU3VjY2VzcywgYm9keTogcmVzdWx0IH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcblxuICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE1hbmdvRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IGVycm9yLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiB7IG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsIGRldGFpbHM6IGVycm9yLmRldGFpbHMgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShSUENfUkVTVUxUX1VOS05PV04pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIG9uUmVxdWVzdDxFIGV4dGVuZHMga2V5b2YgVD4ocnBjTmFtZTogRSwgaGFuZGxlcjogKGJvZHk6IFBhcmFtZXRlcnM8VFtFXT5bMF0pID0+IFJldHVyblR5cGU8VFtFXT4pOiBTY3JpcHRSUENIYW5kbGVyO1xuICAgIHB1YmxpYyBvblJlcXVlc3Q8RSBleHRlbmRzIHN0cmluZz4ocnBjTmFtZTogRSwgaGFuZGxlcjogKGJvZHk6IHVua25vd24pID0+IHVua25vd24gfCBQcm9taXNlPHVua25vd24+KTogU2NyaXB0UlBDSGFuZGxlcjtcbiAgICBwdWJsaWMgb25SZXF1ZXN0PEUgZXh0ZW5kcyBzdHJpbmc+KHJwY05hbWU6IEUsIGhhbmRsZXI6IChib2R5OiB1bmtub3duKSA9PiB1bmtub3duIHwgUHJvbWlzZTx1bmtub3duPikge1xuICAgICAgICBpZiAodGhpcy4kbG9jYWxIYW5kbGVycy5oYXMocnBjTmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuJGxvZ2dlclNlcnZpY2UuZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byByZWdpc3RlciBSUEMuJyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLlJQQ0hhbmRsZXJBbHJlYWR5RXhpc3RzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJwY0hhbmRsZXI6IFNjcmlwdFJQQ0hhbmRsZXIgPSB7XG4gICAgICAgICAgICBkZXN0cm95OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHJwY0hhbmRsZXIudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLiRsb2NhbEhhbmRsZXJzLmRlbGV0ZShycGNOYW1lKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBycGNOYW1lOiBycGNOYW1lLFxuICAgICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuJGxvY2FsSGFuZGxlcnMuc2V0KHJwY05hbWUsIHJwY0hhbmRs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O2NBQUVFLFNBQVNGLE1BQU1FO2NBQVNDLFNBQVNILE1BQU1HO1lBQVE7VUFDNUQsQ0FBQTtRQUNKO0FBRUFoQixnQkFBUWlCLGtCQUFBQTtNQUNaO0lBQ0osQ0FBQTtFQUNKO0VBR09DLFVBQTRCdkIsU0FBWU0sU0FBd0Q7QUFDbkcsUUFBSSxLQUFLVCxlQUFlMkIsSUFBSXhCLE9BQUFBLEdBQVU7QUFDbEMsV0FBS0wsZUFBZXVCLE1BQU0saURBQUE7QUFDMUIsWUFBTSxJQUFJTyxNQUFNQyxhQUFhQyx1QkFBdUI7SUFDeEQ7QUFFQSxVQUFNQyxhQUErQjtNQUNqQ0MsU0FBUyw2QkFBQTtBQUVMRCxtQkFBV0UsUUFBUTtBQUNuQixhQUFLakMsZUFBZWtDLE9BQU8vQixPQUFBQTtNQUMvQixHQUpTO01BS1RBO01BQ0FNO01BQ0F3QixPQUFPO0lBQ1g7QUFFQSxTQUFLakMsZUFBZW1DLElBQUloQyxTQUFTNEIsVUFBQUE7QUFFakMsV0FBT0E7RUFDWDtBQUNKOzs7Ozs7OzsiLAogICJuYW1lcyI6IFsiaW5qZWN0YWJsZSIsICJCYXNlRXZlbnRTZXJ2aWNlIiwgIiRsb2NhbEhhbmRsZXJzIiwgIlNldCIsICIkaW50ZXJuYWxIYW5kbGVycyIsICIkcmVtb3RlSGFuZGxlcnMiLCAiJGludGVybmFsRXZlbnROYW1lcyIsICIkZXZlbnRFbW1pdGVyIiwgIm9uIiwgImV2ZW50TmFtZSIsICJjYWxsYmFjayIsICJ3cmFwcGVyIiwgImFyZ3MiLCAiZXZlbnRIYW5kbGVyIiwgImFkZCIsICJvbmNlIiwgImVtaXQiLCAiYm9keSIsICIkb25JbnRlcm5hbCIsICJoYW5kbGVyIiwgImhhcyIsICJFcnJvciIsICJFcnJvck1lc3NhZ2UiLCAiSW52YWxpZEludGVybmFsRXZlbnROYW1lIiwgIiRvbmNlSW50ZXJuYWwiLCAiaW5qZWN0IiwgImluamVjdGFibGUiLCAiQmFzZVJQQ1NlcnZpY2UiLCAiJGxvZ2dlclNlcnZpY2UiLCAiJFRJTUVPVVQiLCAiJGxvY2FsSGFuZGxlcnMiLCAiTWFwIiwgImNhbGwiLCAicnBjTmFtZSIsICJib2R5IiwgIm9wdGlvbnMiLCAidGltZW91dCIsICJQcm9taXNlIiwgInJlc29sdmUiLCAiaGFuZGxlciIsICJnZXQiLCAiUlBDX1JFU1VMVF9IQU5ETEVSX05PVF9GT1VORCIsICJ0aW1lb3V0SWQiLCAic2V0VGltZW91dCIsICJSUENfUkVTVUxUX1RJTUVPVVQiLCAicmVzdWx0IiwgImNsZWFyVGltZW91dCIsICJzdWNjZXNzIiwgInN0YXR1cyIsICJSUENSZXN1bHRTdGF0dXMiLCAiU3VjY2VzcyIsICJlcnJvciIsICJNYW5nb0Vycm9yIiwgIm1lc3NhZ2UiLCAiZGV0YWlscyIsICJSUENfUkVTVUxUX1VOS05PV04iLCAib25SZXF1ZXN0IiwgImhhcyIsICJFcnJvciIsICJFcnJvck1lc3NhZ2UiLCAiUlBDSGFuZGxlckFscmVhZHlFeGlzdHMiLCAicnBjSGFuZGxlciIsICJkZXN0cm95IiwgInZhbGlkIiwgImRlbGV0ZSIsICJzZXQiXQp9Cg==