@autofleet/rabbit 3.2.20-beta.0 → 3.2.21-beta.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.
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ import { EventEmitter } from 'events';
3
3
  import { AmqpConnectionManager, ChannelWrapper, CreateChannelOpts } from 'amqp-connection-manager';
4
4
  import { ConfirmChannel, ConsumeMessage, Options, Replies } from 'amqplib';
5
5
  import { RedisConfig } from './lib/redis';
6
- import { CallbackFunction, ConsumeMessageOrNull, ConsumeOptions, CustomMessageHeaders, QueuesCache, RedisLockType, ExchangesCache, QueueSetupPromisesDictionary, AssertExchangePromisesDictionary } from './lib/types';
6
+ import { CallbackFunction, ConsumeMessageOrNull, ConsumeOptions, CustomMessageHeaders, QueuesCache, RedisLockType, ExchangesCache, QueueSetupPromisesDictionary } from './lib/types';
7
7
  export interface IAfRabbitMq {
8
8
  ack: any;
9
9
  nack: any;
@@ -66,7 +66,6 @@ declare class RabbitMq implements IAfRabbitMq {
66
66
  exchanges: ExchangesCache;
67
67
  queues: QueuesCache;
68
68
  queueSetupPromises: QueueSetupPromisesDictionary;
69
- assertExchangePromises: AssertExchangePromisesDictionary;
70
69
  options: AfRabbitOptions | undefined;
71
70
  redisClient: any;
72
71
  redisLock?: RedisLockType;
package/dist/index.js CHANGED
@@ -6,6 +6,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  const events_1 = require("events");
8
8
  const util_1 = require("util");
9
+ const lodash_1 = __importDefault(require("lodash"));
9
10
  const moment_1 = __importDefault(require("moment"));
10
11
  const redis_lock_1 = __importDefault(require("redis-lock"));
11
12
  const amqp_connection_manager_1 = require("amqp-connection-manager");
@@ -123,7 +124,6 @@ class RabbitMq {
123
124
  this.exchanges = {};
124
125
  this.queues = {};
125
126
  this.queueSetupPromises = {};
126
- this.assertExchangePromises = {};
127
127
  this.consumers = [];
128
128
  this.options = options;
129
129
  this.redisClient = redisConfig && (0, redis_1.default)(redisConfig);
@@ -199,7 +199,6 @@ class RabbitMq {
199
199
  }
200
200
  });
201
201
  this.connection.on('disconnect', ({ err }) => {
202
- // this.channel = null;
203
202
  this.consumersTags = [];
204
203
  debug('rabbit: connection closed');
205
204
  if (this.options?.disableReconnect) {
@@ -267,15 +266,11 @@ class RabbitMq {
267
266
  async assertExchange(exchangeName, options) {
268
267
  const channel = await this.assertChannel();
269
268
  if (this.exchanges[exchangeName]) {
270
- delete this.assertExchangePromises[exchangeName];
271
269
  return this.exchanges[exchangeName];
272
270
  }
273
- if (this.assertExchangePromises[exchangeName]) {
274
- return this.assertExchangePromises[exchangeName];
275
- }
276
- this.assertExchangePromises[exchangeName] = (0, utils_1.assertExchangeFanout)(channel, exchangeName);
277
- this.exchanges[exchangeName] = await this.assertExchangePromises[exchangeName];
278
- return this.exchanges[exchangeName];
271
+ const exchange = await (0, utils_1.assertExchangeFanout)(channel, exchangeName);
272
+ this.exchanges[exchangeName] = exchange;
273
+ return exchange;
279
274
  }
280
275
  async getQueueLength(queue) {
281
276
  RabbitMq.validateName('queue', queue);
@@ -382,6 +377,7 @@ class RabbitMq {
382
377
  return channel.addSetup(async (confirmChannel) => {
383
378
  await confirmChannel.assertQueue(queue, options ? { messageTtl: options.messageTtl } : undefined);
384
379
  await confirmChannel.prefetch(limit, true);
380
+ const channelConsumerOptions = optionsWithDefaults.channelConsumeOptions ? lodash_1.default.merge(types_1.CONSUMER_DEFAULT_OPTIONS, optionsWithDefaults.channelConsumeOptions) : types_1.CONSUMER_DEFAULT_OPTIONS;
385
381
  const { consumerTag } = await confirmChannel.consume(queue, async (msg) => {
386
382
  if (!msg) {
387
383
  return null;
@@ -442,7 +438,7 @@ class RabbitMq {
442
438
  catch (e) {
443
439
  await localNack(msg);
444
440
  }
445
- }, types_1.CONSUMER_DEFAULT_OPTIONS);
441
+ }, channelConsumerOptions);
446
442
  if (!consumerTag) {
447
443
  logger_1.default.error(`rabbit: failed to consume from queue ${queue}`);
448
444
  }
@@ -8,9 +8,6 @@ export interface QueuesCache {
8
8
  export interface QueueSetupPromisesDictionary {
9
9
  [key: string]: Promise<Replies.AssertQueue> | undefined;
10
10
  }
11
- export interface AssertExchangePromisesDictionary {
12
- [key: string]: Promise<Replies.AssertExchange> | undefined;
13
- }
14
11
  export type CustomMessageHeaders = {
15
12
  redisTimestampValidationKey?: string;
16
13
  };
@@ -25,6 +22,7 @@ export interface ConsumeOptions {
25
22
  useConsumeWithLock?: boolean;
26
23
  auditContext?: any;
27
24
  enableRabbitTrace?: boolean;
25
+ channelConsumeOptions?: Options.Consume;
28
26
  }
29
27
  export type CallbackFunction = (msg: ConsumeMessage, ack: any, nack: any) => Promise<any>;
30
28
  export type newChannelOpts = {
@@ -1,5 +1,5 @@
1
1
  import { ChannelWrapper } from 'amqp-connection-manager';
2
- import { ConfirmChannel, Replies } from 'amqplib';
3
- export declare const assertExchangeFanout: (c: ChannelWrapper | ConfirmChannel, exchangeName: string) => Promise<Replies.AssertExchange>;
2
+ import { ConfirmChannel } from 'amqplib';
3
+ export declare const assertExchangeFanout: (c: ChannelWrapper | ConfirmChannel, exchangeName: string) => Promise<import("amqplib").Replies.AssertExchange>;
4
4
  export declare const wrapSetImmediate: (callback: () => any) => Promise<any>;
5
5
  export declare const rand: () => number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autofleet/rabbit",
3
- "version": "3.2.20-beta.0",
3
+ "version": "3.2.21-beta.0",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -19,6 +19,7 @@
19
19
  "amqp-connection-manager": "4.1.9",
20
20
  "amqplib": "0.10.3",
21
21
  "bluebird": "^3.7.2",
22
+ "lodash": "^4.17.21",
22
23
  "moment": "^2.29.1",
23
24
  "redis": "^3.1.2",
24
25
  "redis-lock": "^0.1.4"
@@ -30,6 +31,7 @@
30
31
  "@autofleet/logger": "4.0.6",
31
32
  "@types/amqplib": "0.8.2",
32
33
  "@types/jest": "^29.5.12",
34
+ "@types/lodash": "^4.17.12",
33
35
  "@types/node": "^20.14.11",
34
36
  "@typescript-eslint/eslint-plugin": "^4.8.1",
35
37
  "eslint": "^7.13.0",
@@ -43,4 +45,4 @@
43
45
  },
44
46
  "author": "",
45
47
  "license": "ISC"
46
- }
48
+ }
package/src/index.ts CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { EventEmitter, once } from 'events';
4
4
  import { promisify } from 'util';
5
+ import _ from 'lodash';
5
6
  import moment from 'moment';
6
7
  import RedisLock from 'redis-lock';
7
8
  import {
@@ -35,10 +36,7 @@ import {
35
36
  CustomMessageHeaders,
36
37
  QueuesCache,
37
38
  RedisLockType,
38
- ExchangesCache,
39
- CONSUMER_DEFAULT_OPTIONS,
40
- QueueSetupPromisesDictionary,
41
- AssertExchangePromisesDictionary,
39
+ ExchangesCache, CONSUMER_DEFAULT_OPTIONS, QueueSetupPromisesDictionary,
42
40
  } from './lib/types';
43
41
 
44
42
  // const debug = nodeDebug('af-rabbitmq')
@@ -160,8 +158,6 @@ class RabbitMq implements IAfRabbitMq {
160
158
 
161
159
  queueSetupPromises: QueueSetupPromisesDictionary;
162
160
 
163
- assertExchangePromises: AssertExchangePromisesDictionary;
164
-
165
161
  options: AfRabbitOptions | undefined;
166
162
 
167
163
  redisClient: any;
@@ -182,7 +178,6 @@ class RabbitMq implements IAfRabbitMq {
182
178
  this.exchanges = {};
183
179
  this.queues = {};
184
180
  this.queueSetupPromises = {};
185
- this.assertExchangePromises = {};
186
181
  this.consumers = [];
187
182
  this.options = options;
188
183
  this.redisClient = redisConfig && getRedisInstance(redisConfig);
@@ -341,7 +336,6 @@ class RabbitMq implements IAfRabbitMq {
341
336
  });
342
337
 
343
338
  this.connection.on('disconnect', ({ err }) => {
344
- // this.channel = null;
345
339
  this.consumersTags = [];
346
340
  debug('rabbit: connection closed');
347
341
  if (this.options?.disableReconnect) {
@@ -351,7 +345,6 @@ class RabbitMq implements IAfRabbitMq {
351
345
  logger.error(`${this.RECONNECT_MSG}${err && ` - ${err}`}`);
352
346
  }
353
347
  });
354
-
355
348
  this.connection.once('connect', async () => {
356
349
  debug('rabbit: connection established');
357
350
  this.creatingConnection = false;
@@ -409,19 +402,12 @@ class RabbitMq implements IAfRabbitMq {
409
402
 
410
403
  async assertExchange(exchangeName: string, options?: any) {
411
404
  const channel: ChannelWrapper = await this.assertChannel();
412
-
413
405
  if (this.exchanges[exchangeName]) {
414
- delete this.assertExchangePromises[exchangeName];
415
406
  return this.exchanges[exchangeName];
416
407
  }
417
-
418
- if (this.assertExchangePromises[exchangeName]) {
419
- return this.assertExchangePromises[exchangeName];
420
- }
421
-
422
- this.assertExchangePromises[exchangeName] = assertExchangeFanout(channel, exchangeName);
423
- this.exchanges[exchangeName] = await this.assertExchangePromises[exchangeName];
424
- return this.exchanges[exchangeName];
408
+ const exchange = await assertExchangeFanout(channel, exchangeName);
409
+ this.exchanges[exchangeName] = exchange;
410
+ return exchange;
425
411
  }
426
412
 
427
413
  async getQueueLength(queue: string) {
@@ -546,6 +532,7 @@ class RabbitMq implements IAfRabbitMq {
546
532
  return channel.addSetup(async (confirmChannel: ConfirmChannel) => {
547
533
  await confirmChannel.assertQueue(queue, options ? { messageTtl: options.messageTtl } : undefined);
548
534
  await confirmChannel.prefetch(limit, true);
535
+ const channelConsumerOptions = optionsWithDefaults.channelConsumeOptions ? _.merge(CONSUMER_DEFAULT_OPTIONS, optionsWithDefaults.channelConsumeOptions) : CONSUMER_DEFAULT_OPTIONS;
549
536
  const { consumerTag } = await confirmChannel.consume(
550
537
  queue,
551
538
  async (msg: ConsumeMessageOrNull) => {
@@ -617,7 +604,8 @@ class RabbitMq implements IAfRabbitMq {
617
604
  } catch (e) {
618
605
  await localNack(msg);
619
606
  }
620
- }, CONSUMER_DEFAULT_OPTIONS,
607
+ },
608
+ channelConsumerOptions,
621
609
  );
622
610
  if (!consumerTag) {
623
611
  logger.error(`rabbit: failed to consume from queue ${queue}`);
package/src/lib/types.ts CHANGED
@@ -12,10 +12,6 @@ export interface QueueSetupPromisesDictionary {
12
12
  [key: string]: Promise<Replies.AssertQueue> | undefined
13
13
  }
14
14
 
15
- export interface AssertExchangePromisesDictionary {
16
- [key: string]: Promise<Replies.AssertExchange> | undefined
17
- }
18
-
19
15
  export type CustomMessageHeaders = {
20
16
  redisTimestampValidationKey?: string;
21
17
  }
@@ -31,6 +27,7 @@ export interface ConsumeOptions {
31
27
  useConsumeWithLock?: boolean;
32
28
  auditContext?: any;
33
29
  enableRabbitTrace?: boolean;
30
+ channelConsumeOptions?: Options.Consume;
34
31
  }
35
32
 
36
33
  export type CallbackFunction = (msg: ConsumeMessage, ack: any, nack: any) => Promise<any>
package/src/lib/utils.ts CHANGED
@@ -1,9 +1,7 @@
1
1
  import { ChannelWrapper } from 'amqp-connection-manager';
2
- import { ConfirmChannel, Replies } from 'amqplib';
3
-
4
- export const assertExchangeFanout = async (c: ChannelWrapper | ConfirmChannel, exchangeName: string): Promise<Replies.AssertExchange> =>
5
- c.assertExchange(exchangeName, 'fanout');
2
+ import { ConfirmChannel } from 'amqplib';
6
3
 
4
+ export const assertExchangeFanout = async (c: ChannelWrapper | ConfirmChannel, exchangeName: string) => c.assertExchange(exchangeName, 'fanout');
7
5
  export const wrapSetImmediate = (callback: () => any) => new Promise<any>((resolve, reject) => {
8
6
  setImmediate(async () => {
9
7
  try {
@@ -1,7 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <coverage generated="1675584950929" clover="3.2.0">
3
- <project timestamp="1675584950929" name="All files">
4
- <metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0" elements="0" coveredelements="0" complexity="0" loc="0" ncloc="0" packages="0" files="0" classes="0">
5
- </metrics>
6
- </project>
7
- </coverage>
@@ -1 +0,0 @@
1
- {}
@@ -1,212 +0,0 @@
1
- body, html {
2
- margin:0; padding: 0;
3
- height: 100%;
4
- }
5
- body {
6
- font-family: Helvetica Neue, Helvetica, Arial;
7
- font-size: 14px;
8
- color:#333;
9
- }
10
- .small { font-size: 12px; }
11
- *, *:after, *:before {
12
- -webkit-box-sizing:border-box;
13
- -moz-box-sizing:border-box;
14
- box-sizing:border-box;
15
- }
16
- h1 { font-size: 20px; margin: 0;}
17
- h2 { font-size: 14px; }
18
- pre {
19
- font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
20
- margin: 0;
21
- padding: 0;
22
- -moz-tab-size: 2;
23
- -o-tab-size: 2;
24
- tab-size: 2;
25
- }
26
- a { color:#0074D9; text-decoration:none; }
27
- a:hover { text-decoration:underline; }
28
- .strong { font-weight: bold; }
29
- .space-top1 { padding: 10px 0 0 0; }
30
- .pad2y { padding: 20px 0; }
31
- .pad1y { padding: 10px 0; }
32
- .pad2x { padding: 0 20px; }
33
- .pad2 { padding: 20px; }
34
- .pad1 { padding: 10px; }
35
- .space-left2 { padding-left:55px; }
36
- .space-right2 { padding-right:20px; }
37
- .center { text-align:center; }
38
- .clearfix { display:block; }
39
- .clearfix:after {
40
- content:'';
41
- display:block;
42
- height:0;
43
- clear:both;
44
- visibility:hidden;
45
- }
46
- .fl { float: left; }
47
- @media only screen and (max-width:640px) {
48
- .col3 { width:100%; max-width:100%; }
49
- .hide-mobile { display:none!important; }
50
- }
51
-
52
- .quiet {
53
- color: #7f7f7f;
54
- color: rgba(0,0,0,0.5);
55
- }
56
- .quiet a { opacity: 0.7; }
57
-
58
- .fraction {
59
- font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
60
- font-size: 10px;
61
- color: #555;
62
- background: #E8E8E8;
63
- padding: 4px 5px;
64
- border-radius: 3px;
65
- vertical-align: middle;
66
- }
67
-
68
- div.path a:link, div.path a:visited { color: #333; }
69
- table.coverage {
70
- border-collapse: collapse;
71
- margin: 10px 0 0 0;
72
- padding: 0;
73
- }
74
-
75
- table.coverage td {
76
- margin: 0;
77
- padding: 0;
78
- vertical-align: top;
79
- }
80
- table.coverage td.line-count {
81
- text-align: right;
82
- padding: 0 5px 0 20px;
83
- }
84
- table.coverage td.line-coverage {
85
- text-align: right;
86
- padding-right: 10px;
87
- min-width:20px;
88
- }
89
-
90
- table.coverage td span.cline-any {
91
- display: inline-block;
92
- padding: 0 5px;
93
- width: 100%;
94
- }
95
- .missing-if-branch {
96
- display: inline-block;
97
- margin-right: 5px;
98
- border-radius: 3px;
99
- position: relative;
100
- padding: 0 4px;
101
- background: #333;
102
- color: yellow;
103
- }
104
-
105
- .skip-if-branch {
106
- display: none;
107
- margin-right: 10px;
108
- position: relative;
109
- padding: 0 4px;
110
- background: #ccc;
111
- color: white;
112
- }
113
- .missing-if-branch .typ, .skip-if-branch .typ {
114
- color: inherit !important;
115
- }
116
- .coverage-summary {
117
- border-collapse: collapse;
118
- width: 100%;
119
- }
120
- .coverage-summary tr { border-bottom: 1px solid #bbb; }
121
- .keyline-all { border: 1px solid #ddd; }
122
- .coverage-summary td, .coverage-summary th { padding: 10px; }
123
- .coverage-summary tbody { border: 1px solid #bbb; }
124
- .coverage-summary td { border-right: 1px solid #bbb; }
125
- .coverage-summary td:last-child { border-right: none; }
126
- .coverage-summary th {
127
- text-align: left;
128
- font-weight: normal;
129
- white-space: nowrap;
130
- }
131
- .coverage-summary th.file { border-right: none !important; }
132
- .coverage-summary th.pct { }
133
- .coverage-summary th.pic,
134
- .coverage-summary th.abs,
135
- .coverage-summary td.pct,
136
- .coverage-summary td.abs { text-align: right; }
137
- .coverage-summary td.file { white-space: nowrap; }
138
- .coverage-summary td.pic { min-width: 120px !important; }
139
- .coverage-summary tfoot td { }
140
-
141
- .coverage-summary .sorter {
142
- height: 10px;
143
- width: 7px;
144
- display: inline-block;
145
- margin-left: 0.5em;
146
- background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
147
- }
148
- .coverage-summary .sorted .sorter {
149
- background-position: 0 -20px;
150
- }
151
- .coverage-summary .sorted-desc .sorter {
152
- background-position: 0 -10px;
153
- }
154
- .status-line { height: 10px; }
155
- /* dark red */
156
- .red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
157
- .low .chart { border:1px solid #C21F39 }
158
- /* medium red */
159
- .cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
160
- /* light red */
161
- .low, .cline-no { background:#FCE1E5 }
162
- /* light green */
163
- .high, .cline-yes { background:rgb(230,245,208) }
164
- /* medium green */
165
- .cstat-yes { background:rgb(161,215,106) }
166
- /* dark green */
167
- .status-line.high, .high .cover-fill { background:rgb(77,146,33) }
168
- .high .chart { border:1px solid rgb(77,146,33) }
169
-
170
-
171
- .medium .chart { border:1px solid #666; }
172
- .medium .cover-fill { background: #666; }
173
-
174
- .cbranch-no { background: yellow !important; color: #111; }
175
-
176
- .cstat-skip { background: #ddd; color: #111; }
177
- .fstat-skip { background: #ddd; color: #111 !important; }
178
- .cbranch-skip { background: #ddd !important; color: #111; }
179
-
180
- span.cline-neutral { background: #eaeaea; }
181
- .medium { background: #eaeaea; }
182
-
183
- .cover-fill, .cover-empty {
184
- display:inline-block;
185
- height: 12px;
186
- }
187
- .chart {
188
- line-height: 0;
189
- }
190
- .cover-empty {
191
- background: white;
192
- }
193
- .cover-full {
194
- border-right: none !important;
195
- }
196
- pre.prettyprint {
197
- border: none !important;
198
- padding: 0 !important;
199
- margin: 0 !important;
200
- }
201
- .com { color: #999 !important; }
202
- .ignore-none { color: #999; font-weight: normal; }
203
-
204
- .wrapper {
205
- min-height: 100%;
206
- height: auto !important;
207
- height: 100%;
208
- margin: 0 auto -48px;
209
- }
210
- .footer, .push {
211
- height: 48px;
212
- }
@@ -1,60 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <title>Code coverage report for All files</title>
5
- <meta charset="utf-8" />
6
- <link rel="stylesheet" href="prettify.css" />
7
- <link rel="stylesheet" href="base.css" />
8
- <meta name="viewport" content="width=device-width, initial-scale=1">
9
- <style type='text/css'>
10
- .coverage-summary .sorter {
11
- background-image: url(sort-arrow-sprite.png);
12
- }
13
- </style>
14
- </head>
15
- <body>
16
- <div class='wrapper'>
17
- <div class='pad1'>
18
- <h1>
19
- All files
20
- </h1>
21
- <div class='clearfix'>
22
- </div>
23
- </div>
24
- <div class='status-line medium'></div>
25
- <div class="pad1">
26
- <table class="coverage-summary">
27
- <thead>
28
- <tr>
29
- <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
30
- <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
31
- <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
32
- <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
33
- <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
34
- <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
35
- <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
36
- <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
37
- <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
38
- <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
39
- </tr>
40
- </thead>
41
- <tbody></tbody>
42
- </table>
43
- </div><div class='push'></div><!-- for sticky footer -->
44
- </div><!-- /wrapper -->
45
- <div class='footer quiet pad2 space-top1 center small'>
46
- Code coverage
47
- generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Sun Feb 05 2023 10:15:50 GMT+0200 (Israel Standard Time)
48
- </div>
49
- </div>
50
- <script src="prettify.js"></script>
51
- <script>
52
- window.onload = function () {
53
- if (typeof prettyPrint === 'function') {
54
- prettyPrint();
55
- }
56
- };
57
- </script>
58
- <script src="sorter.js"></script>
59
- </body>
60
- </html>
@@ -1 +0,0 @@
1
- .pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
@@ -1 +0,0 @@
1
- window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.ignoreCase){ac=true}else{if(/[a-z]/i.test(ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){S=true;ac=false;break}}}var Y={b:8,t:9,n:10,v:11,f:12,r:13};function ab(ah){var ag=ah.charCodeAt(0);if(ag!==92){return ag}var af=ah.charAt(1);ag=Y[af];if(ag){return ag}else{if("0"<=af&&af<="7"){return parseInt(ah.substring(1),8)}else{if(af==="u"||af==="x"){return parseInt(ah.substring(2),16)}else{return ah.charCodeAt(1)}}}}function T(af){if(af<32){return(af<16?"\\x0":"\\x")+af.toString(16)}var ag=String.fromCharCode(af);if(ag==="\\"||ag==="-"||ag==="["||ag==="]"){ag="\\"+ag}return ag}function X(am){var aq=am.substring(1,am.length-1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));var ak=[];var af=[];var ao=aq[0]==="^";for(var ar=ao?1:0,aj=aq.length;ar<aj;++ar){var ah=aq[ar];if(/\\[bdsw]/i.test(ah)){ak.push(ah)}else{var ag=ab(ah);var al;if(ar+2<aj&&"-"===aq[ar+1]){al=ab(aq[ar+2]);ar+=2}else{al=ag}af.push([ag,al]);if(!(al<65||ag>122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;ar<af.length;++ar){var at=af[ar];if(at[0]<=ap[1]+1){ap[1]=Math.max(ap[1],at[1])}else{ai.push(ap=at)}}var an=["["];if(ao){an.push("^")}an.push.apply(an,ak);for(var ar=0;ar<ai.length;++ar){var at=ai[ar];an.push(T(at[0]));if(at[1]>at[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){an[af]=-1}}}}for(var ak=1;ak<an.length;++ak){if(-1===an[ak]){an[ak]=++ad}}for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am;if(an[am]===undefined){aj[ak]="(?:"}}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){aj[ak]="\\"+an[am]}}}}for(var ak=0,am=0;ak<ah;++ak){if("^"===aj[ak]&&"^"!==aj[ak+1]){aj[ak]=""}}if(al.ignoreCase&&S){for(var ak=0;ak<ah;++ak){var ag=aj[ak];var ai=ag.charAt(0);if(ag.length>=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.global||ae.multiline){throw new Error(""+ae)}aa.push("(?:"+W(ae)+")")}return new RegExp(aa.join("|"),ac?"gi":"g")}function a(V){var U=/(?:^|\s)nocode(?:\s|$)/;var X=[];var T=0;var Z=[];var W=0;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=document.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Y=S&&"pre"===S.substring(0,3);function aa(ab){switch(ab.nodeType){case 1:if(U.test(ab.className)){return}for(var ae=ab.firstChild;ae;ae=ae.nextSibling){aa(ae)}var ad=ab.nodeName;if("BR"===ad||"LI"===ad){X[W]="\n";Z[W<<1]=T++;Z[(W++<<1)|1]=ab}break;case 3:case 4:var ac=ab.nodeValue;if(ac.length){if(!Y){ac=ac.replace(/[ \t\r\n]+/g," ")}else{ac=ac.replace(/\r\n?/g,"\n")}X[W]=ac;Z[W<<1]=T;T+=ac.length;Z[(W++<<1)|1]=ab}break}}aa(V);return{sourceCode:X.join("").replace(/\n$/,""),spans:Z}}function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T.push.apply(T,V.decorations)}var v=/\S/;function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){var T=U.nodeType;V=(T===1)?(V?S:U):(T===3)?(v.test(U.nodeValue)?S:V):V}return V===S?undefined:V}function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];var ag={};for(var ab=0,Z=ad.length;ab<Z;++ab){var Y=ad[ab];var ac=Y[3];if(ac){for(var ae=ac.length;--ae>=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae<aq;++ae){var ag=an[ae];var ap=aj[ag];var ai=void 0;var am;if(typeof ap==="string"){am=false}else{var aa=S[ag.charAt(0)];if(aa){ai=ag.match(aa[1]);ap=aa[0]}else{for(var ao=0;ao<X;++ao){aa=T[ao];ai=ag.match(aa[1]);if(ai){ap=aa[0];break}}if(!ai){ap=F}}am=ap.length>=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y<W.length;++Y){ae(W[Y])}if(ag===(ag|0)){W[0].setAttribute("value",ag)}var aa=ac.createElement("OL");aa.className="linenums";var X=Math.max(0,((ag-1))|0)||0;for(var Y=0,T=W.length;Y<T;++Y){af=W[Y];af.className="L"+((Y+X)%10);if(!af.firstChild){af.appendChild(ac.createTextNode("\xA0"))}aa.appendChild(af)}V.appendChild(aa)}function D(ac){var aj=/\bMSIE\b/.test(navigator.userAgent);var am=/\n/g;var al=ac.sourceCode;var an=al.length;var V=0;var aa=ac.spans;var T=aa.length;var ah=0;var X=ac.decorations;var Y=X.length;var Z=0;X[Y]=an;var ar,aq;for(aq=ar=0;aq<Y;){if(X[aq]!==X[aq+2]){X[ar++]=X[aq++];X[ar++]=X[aq++]}else{aq+=2}}Y=ar;for(aq=ar=0;aq<Y;){var at=X[aq];var ab=X[aq+1];var W=aq+2;while(W+2<=Y&&X[W+1]===ab){W+=2}X[ar++]=at;X[ar++]=ab;aq=W}Y=X.length=ar;var ae=null;while(ah<T){var af=aa[ah];var S=aa[ah+2]||an;var ag=X[Z];var ap=X[Z+2]||an;var W=Math.min(S,ap);var ak=aa[ah+1];var U;if(ak.nodeType!==1&&(U=al.substring(V,W))){if(aj){U=U.replace(am,"\r")}ak.nodeValue=U;var ai=ak.ownerDocument;var ao=ai.createElement("SPAN");ao.className=X[Z+1];var ad=ak.parentNode;ad.replaceChild(ao,ak);ao.appendChild(ak);if(V<S){aa[ah+1]=ak=ai.createTextNode(al.substring(W,S));ad.insertBefore(ak,ao.nextSibling)}}V=W;if(V>=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*</.test(S)?"default-markup":"default-code"}return t[T]}c(K,["default-code"]);c(g([],[[F,/^[^<?]+/],[E,/^<!\w[^>]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa<ac.length;++aa){for(var Z=0,V=ac[aa].length;Z<V;++Z){T.push(ac[aa][Z])}}ac=null;var W=Date;if(!W.now){W={now:function(){return +(new Date)}}}var X=0;var S;var ab=/\blang(?:uage)?-([\w.]+)(?!\S)/;var ae=/\bprettyprint\b/;function U(){var ag=(window.PR_SHOULD_USE_CONTINUATION?W.now()+250:Infinity);for(;X<T.length&&W.now()<ag;X++){var aj=T[X];var ai=aj.className;if(ai.indexOf("prettyprint")>=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X<T.length){setTimeout(U,250)}else{if(ad){ad()}}}U()}window.prettyPrintOne=y;window.prettyPrint=b;window.PR={createSimpleLexer:g,registerLangHandler:c,sourceDecorator:i,PR_ATTRIB_NAME:P,PR_ATTRIB_VALUE:n,PR_COMMENT:j,PR_DECLARATION:E,PR_KEYWORD:z,PR_LITERAL:G,PR_NOCODE:N,PR_PLAIN:F,PR_PUNCTUATION:L,PR_SOURCE:J,PR_STRING:C,PR_TAG:m,PR_TYPE:O}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]);
@@ -1,158 +0,0 @@
1
- var addSorting = (function () {
2
- "use strict";
3
- var cols,
4
- currentSort = {
5
- index: 0,
6
- desc: false
7
- };
8
-
9
- // returns the summary table element
10
- function getTable() { return document.querySelector('.coverage-summary'); }
11
- // returns the thead element of the summary table
12
- function getTableHeader() { return getTable().querySelector('thead tr'); }
13
- // returns the tbody element of the summary table
14
- function getTableBody() { return getTable().querySelector('tbody'); }
15
- // returns the th element for nth column
16
- function getNthColumn(n) { return getTableHeader().querySelectorAll('th')[n]; }
17
-
18
- // loads all columns
19
- function loadColumns() {
20
- var colNodes = getTableHeader().querySelectorAll('th'),
21
- colNode,
22
- cols = [],
23
- col,
24
- i;
25
-
26
- for (i = 0; i < colNodes.length; i += 1) {
27
- colNode = colNodes[i];
28
- col = {
29
- key: colNode.getAttribute('data-col'),
30
- sortable: !colNode.getAttribute('data-nosort'),
31
- type: colNode.getAttribute('data-type') || 'string'
32
- };
33
- cols.push(col);
34
- if (col.sortable) {
35
- col.defaultDescSort = col.type === 'number';
36
- colNode.innerHTML = colNode.innerHTML + '<span class="sorter"></span>';
37
- }
38
- }
39
- return cols;
40
- }
41
- // attaches a data attribute to every tr element with an object
42
- // of data values keyed by column name
43
- function loadRowData(tableRow) {
44
- var tableCols = tableRow.querySelectorAll('td'),
45
- colNode,
46
- col,
47
- data = {},
48
- i,
49
- val;
50
- for (i = 0; i < tableCols.length; i += 1) {
51
- colNode = tableCols[i];
52
- col = cols[i];
53
- val = colNode.getAttribute('data-value');
54
- if (col.type === 'number') {
55
- val = Number(val);
56
- }
57
- data[col.key] = val;
58
- }
59
- return data;
60
- }
61
- // loads all row data
62
- function loadData() {
63
- var rows = getTableBody().querySelectorAll('tr'),
64
- i;
65
-
66
- for (i = 0; i < rows.length; i += 1) {
67
- rows[i].data = loadRowData(rows[i]);
68
- }
69
- }
70
- // sorts the table using the data for the ith column
71
- function sortByIndex(index, desc) {
72
- var key = cols[index].key,
73
- sorter = function (a, b) {
74
- a = a.data[key];
75
- b = b.data[key];
76
- return a < b ? -1 : a > b ? 1 : 0;
77
- },
78
- finalSorter = sorter,
79
- tableBody = document.querySelector('.coverage-summary tbody'),
80
- rowNodes = tableBody.querySelectorAll('tr'),
81
- rows = [],
82
- i;
83
-
84
- if (desc) {
85
- finalSorter = function (a, b) {
86
- return -1 * sorter(a, b);
87
- };
88
- }
89
-
90
- for (i = 0; i < rowNodes.length; i += 1) {
91
- rows.push(rowNodes[i]);
92
- tableBody.removeChild(rowNodes[i]);
93
- }
94
-
95
- rows.sort(finalSorter);
96
-
97
- for (i = 0; i < rows.length; i += 1) {
98
- tableBody.appendChild(rows[i]);
99
- }
100
- }
101
- // removes sort indicators for current column being sorted
102
- function removeSortIndicators() {
103
- var col = getNthColumn(currentSort.index),
104
- cls = col.className;
105
-
106
- cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
107
- col.className = cls;
108
- }
109
- // adds sort indicators for current column being sorted
110
- function addSortIndicators() {
111
- getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted';
112
- }
113
- // adds event listeners for all sorter widgets
114
- function enableUI() {
115
- var i,
116
- el,
117
- ithSorter = function ithSorter(i) {
118
- var col = cols[i];
119
-
120
- return function () {
121
- var desc = col.defaultDescSort;
122
-
123
- if (currentSort.index === i) {
124
- desc = !currentSort.desc;
125
- }
126
- sortByIndex(i, desc);
127
- removeSortIndicators();
128
- currentSort.index = i;
129
- currentSort.desc = desc;
130
- addSortIndicators();
131
- };
132
- };
133
- for (i =0 ; i < cols.length; i += 1) {
134
- if (cols[i].sortable) {
135
- // add the click event handler on the th so users
136
- // dont have to click on those tiny arrows
137
- el = getNthColumn(i).querySelector('.sorter').parentElement;
138
- if (el.addEventListener) {
139
- el.addEventListener('click', ithSorter(i));
140
- } else {
141
- el.attachEvent('onclick', ithSorter(i));
142
- }
143
- }
144
- }
145
- }
146
- // adds sorting functionality to the UI
147
- return function () {
148
- if (!getTable()) {
149
- return;
150
- }
151
- cols = loadColumns();
152
- loadData(cols);
153
- addSortIndicators();
154
- enableUI();
155
- };
156
- })();
157
-
158
- window.addEventListener('load', addSorting);
File without changes