@internetarchive/ia-topnav 1.4.0 → 1.4.1-alpha-webdev8259.1

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/eslint.config.mjs CHANGED
@@ -1,53 +1,53 @@
1
- import typescriptEslint from '@typescript-eslint/eslint-plugin';
2
- import html from 'eslint-plugin-html';
3
- import tsParser from '@typescript-eslint/parser';
4
- import path from 'node:path';
5
- import { fileURLToPath } from 'node:url';
6
- import js from '@eslint/js';
7
- import { FlatCompat } from '@eslint/eslintrc';
8
-
9
- const __filename = fileURLToPath(import.meta.url);
10
- const __dirname = path.dirname(__filename);
11
- const compat = new FlatCompat({
12
- baseDirectory: __dirname,
13
- recommendedConfig: js.configs.recommended,
14
- allConfig: js.configs.all,
15
- });
16
-
17
- export default [
18
- ...compat.extends('plugin:@typescript-eslint/recommended'),
19
- {
20
- plugins: {
21
- '@typescript-eslint': typescriptEslint,
22
- html,
23
- },
24
-
25
- languageOptions: {
26
- parser: tsParser,
27
- },
28
-
29
- settings: {
30
- 'import/resolver': {
31
- node: {
32
- extensions: ['.ts', '.tsx'],
33
- moduleDirectory: ['node_modules', 'src', 'demo'],
34
- },
35
- },
36
- },
37
-
38
- rules: {
39
- '@typescript-eslint/no-unsafe-function-type': 'warn',
40
- '@typescript-eslint/no-unused-vars': 'warn',
41
- '@typescript-eslint/no-explicit-any': 'warn',
42
- },
43
- },
44
- {
45
- ignores: ['**/*.js', '**/*.mjs'],
46
- },
47
- {
48
- files: ['**/*.test.ts'],
49
- rules: {
50
- '@typescript-eslint/no-unused-expressions': 'off',
51
- },
52
- },
53
- ];
1
+ import typescriptEslint from '@typescript-eslint/eslint-plugin';
2
+ import html from 'eslint-plugin-html';
3
+ import tsParser from '@typescript-eslint/parser';
4
+ import path from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import js from '@eslint/js';
7
+ import { FlatCompat } from '@eslint/eslintrc';
8
+
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = path.dirname(__filename);
11
+ const compat = new FlatCompat({
12
+ baseDirectory: __dirname,
13
+ recommendedConfig: js.configs.recommended,
14
+ allConfig: js.configs.all,
15
+ });
16
+
17
+ export default [
18
+ ...compat.extends('plugin:@typescript-eslint/recommended'),
19
+ {
20
+ plugins: {
21
+ '@typescript-eslint': typescriptEslint,
22
+ html,
23
+ },
24
+
25
+ languageOptions: {
26
+ parser: tsParser,
27
+ },
28
+
29
+ settings: {
30
+ 'import/resolver': {
31
+ node: {
32
+ extensions: ['.ts', '.tsx'],
33
+ moduleDirectory: ['node_modules', 'src', 'demo'],
34
+ },
35
+ },
36
+ },
37
+
38
+ rules: {
39
+ '@typescript-eslint/no-unsafe-function-type': 'warn',
40
+ '@typescript-eslint/no-unused-vars': 'warn',
41
+ '@typescript-eslint/no-explicit-any': 'warn',
42
+ },
43
+ },
44
+ {
45
+ ignores: ['**/*.js', '**/*.mjs'],
46
+ },
47
+ {
48
+ files: ['**/*.test.ts'],
49
+ rules: {
50
+ '@typescript-eslint/no-unused-expressions': 'off',
51
+ },
52
+ },
53
+ ];
package/package.json CHANGED
@@ -1,72 +1,72 @@
1
- {
2
- "name": "@internetarchive/ia-topnav",
3
- "version": "1.4.0",
4
- "description": "Top nav for Internet Archive",
5
- "license": "AGPL-3.0-only",
6
- "main": "dist/index.js",
7
- "module": "dist/index.js",
8
- "types": "dist/index.d.ts",
9
- "type": "module",
10
- "publishConfig": {
11
- "access": "public"
12
- },
13
- "scripts": {
14
- "start": "tsc && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"wds\"",
15
- "prepare": "rimraf dist && tsc && husky install",
16
- "build": "tsc",
17
- "lint": "eslint . && prettier \"**/*.ts\" --check",
18
- "format": "eslint . --fix && prettier \"**/*.ts\" --write",
19
- "circular": "madge --circular --extensions ts .",
20
- "test": "tsc && npm run lint && npm run circular && wtr --coverage",
21
- "test:watch": "tsc && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"wtr --watch\"",
22
- "ghpages:build": "rimraf ghpages && npm run prepare && vite build",
23
- "ghpages:publish": "npm run ghpages:prepare -e $(git branch --show-current)",
24
- "ghpages:prepare": "npm run ghpages:build && touch ghpages/.nojekyll && npm run ghpages:generate",
25
- "ghpages:generate": "gh-pages -t -d ghpages -m \"Build for $(git log --pretty=format:\"%h %an %ai %s\" -n1) [skip ci]\""
26
- },
27
- "dependencies": {
28
- "@internetarchive/ia-styles": "^1.0.0",
29
- "@internetarchive/ia-wayback-search": "^1.0.4",
30
- "lit": "^2.8.0"
31
- },
32
- "devDependencies": {
33
- "@open-wc/eslint-config": "^12.0.3",
34
- "@open-wc/testing": "^4.0.0",
35
- "@types/mocha": "^10.0.10",
36
- "@typescript-eslint/eslint-plugin": "^8.19.1",
37
- "@typescript-eslint/parser": "^8.19.1",
38
- "@web/dev-server": "^0.4.6",
39
- "@web/test-runner": "^0.20.0",
40
- "concurrently": "^9.1.2",
41
- "eslint": "^9.24.0",
42
- "eslint-config-prettier": "^10.1.1",
43
- "eslint-plugin-html": "^8.1.2",
44
- "eslint-plugin-import": "^2.31.0",
45
- "eslint-plugin-lit": "^2.0.0",
46
- "eslint-plugin-lit-a11y": "^4.1.4",
47
- "eslint-plugin-no-only-tests": "^3.3.0",
48
- "eslint-plugin-wc": "^3.0.0",
49
- "gh-pages": "^6.3.0",
50
- "husky": "^9.1.7",
51
- "madge": "^8.0.0",
52
- "prettier": "^3.4.2",
53
- "rimraf": "^6.0.1",
54
- "sinon": "^20.0.0",
55
- "ts-lit-plugin": "^2.0.2",
56
- "tslib": "^2.8.1",
57
- "typescript": "^5.7.2",
58
- "vite": "^6.0.7"
59
- },
60
- "husky": {
61
- "hooks": {
62
- "pre-commit": "lint-staged"
63
- }
64
- },
65
- "lint-staged": {
66
- "*.ts": [
67
- "eslint --fix",
68
- "prettier --write",
69
- "git add"
70
- ]
71
- }
72
- }
1
+ {
2
+ "name": "@internetarchive/ia-topnav",
3
+ "version": "1.4.1-alpha-webdev8259.1",
4
+ "description": "Top nav for Internet Archive",
5
+ "license": "AGPL-3.0-only",
6
+ "main": "dist/index.js",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "type": "module",
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
13
+ "scripts": {
14
+ "start": "tsc && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"wds\"",
15
+ "prepare": "rimraf dist && tsc && husky install",
16
+ "build": "tsc",
17
+ "lint": "eslint . && prettier \"**/*.ts\" --check",
18
+ "format": "eslint . --fix && prettier \"**/*.ts\" --write",
19
+ "circular": "madge --circular --extensions ts .",
20
+ "test": "tsc && npm run lint && npm run circular && wtr --coverage",
21
+ "test:watch": "tsc && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"wtr --watch\"",
22
+ "ghpages:build": "rimraf ghpages && npm run prepare && vite build",
23
+ "ghpages:publish": "npm run ghpages:prepare -e $(git branch --show-current)",
24
+ "ghpages:prepare": "npm run ghpages:build && touch ghpages/.nojekyll && npm run ghpages:generate",
25
+ "ghpages:generate": "gh-pages -t -d ghpages -m \"Build for $(git log --pretty=format:\"%h %an %ai %s\" -n1) [skip ci]\""
26
+ },
27
+ "dependencies": {
28
+ "@internetarchive/ia-styles": "^1.0.0",
29
+ "@internetarchive/ia-wayback-search": "^1.0.4",
30
+ "lit": "^2.8.0"
31
+ },
32
+ "devDependencies": {
33
+ "@open-wc/eslint-config": "^12.0.3",
34
+ "@open-wc/testing": "^4.0.0",
35
+ "@types/mocha": "^10.0.10",
36
+ "@typescript-eslint/eslint-plugin": "^8.19.1",
37
+ "@typescript-eslint/parser": "^8.19.1",
38
+ "@web/dev-server": "^0.4.6",
39
+ "@web/test-runner": "^0.20.0",
40
+ "concurrently": "^9.1.2",
41
+ "eslint": "^9.24.0",
42
+ "eslint-config-prettier": "^10.1.1",
43
+ "eslint-plugin-html": "^8.1.2",
44
+ "eslint-plugin-import": "^2.31.0",
45
+ "eslint-plugin-lit": "^2.0.0",
46
+ "eslint-plugin-lit-a11y": "^4.1.4",
47
+ "eslint-plugin-no-only-tests": "^3.3.0",
48
+ "eslint-plugin-wc": "^3.0.0",
49
+ "gh-pages": "^6.3.0",
50
+ "husky": "^9.1.7",
51
+ "madge": "^8.0.0",
52
+ "prettier": "^3.4.2",
53
+ "rimraf": "^6.0.1",
54
+ "sinon": "^20.0.0",
55
+ "ts-lit-plugin": "^2.0.2",
56
+ "tslib": "^2.8.1",
57
+ "typescript": "^5.7.2",
58
+ "vite": "^6.0.7"
59
+ },
60
+ "husky": {
61
+ "hooks": {
62
+ "pre-commit": "lint-staged"
63
+ }
64
+ },
65
+ "lint-staged": {
66
+ "*.ts": [
67
+ "eslint --fix",
68
+ "prettier --write",
69
+ "git add"
70
+ ]
71
+ }
72
+ }
@@ -1,9 +1,9 @@
1
- /**
2
- * @see https://prettier.io/docs/configuration
3
- * @type {import("prettier").Config}
4
- */
5
- const config = {
6
- singleQuote: true,
7
- };
8
-
9
- export default config;
1
+ /**
2
+ * @see https://prettier.io/docs/configuration
3
+ * @type {import("prettier").Config}
4
+ */
5
+ const config = {
6
+ singleQuote: true,
7
+ };
8
+
9
+ export default config;
package/src/ia-topnav.ts CHANGED
@@ -11,11 +11,9 @@ import {
11
11
  IATopNavSecondIdentitySlotMode,
12
12
  } from './models';
13
13
  import './primary-nav';
14
- import './search-menu';
15
14
  import './signed-out-dropdown';
16
15
  import iaTopNavCSS from './styles/ia-topnav';
17
16
  import './user-menu';
18
- import KeyboardNavigation from './lib/keyboard-navigation';
19
17
 
20
18
  @customElement('ia-topnav')
21
19
  export class IATopNav extends LitElement {
@@ -43,10 +41,6 @@ export class IATopNav extends LitElement {
43
41
 
44
42
  @property({ type: String }) screenName: string = '';
45
43
 
46
- @property({ type: String }) searchIn = '';
47
-
48
- @property({ type: String }) searchQuery = '';
49
-
50
44
  @property({ type: String }) selectedMenuOption = '';
51
45
 
52
46
  @property({ type: String }) username: string = '';
@@ -63,10 +57,6 @@ export class IATopNav extends LitElement {
63
57
  };
64
58
 
65
59
  @state() private menus: IATopNavMenuConfig = buildTopNavMenus();
66
- private previousKeydownListener: // eslint-disable-next-line @typescript-eslint/no-explicit-any
67
- ((this: HTMLElement, ev: KeyboardEvent) => any) | undefined;
68
-
69
- private keyboardNavigation?: KeyboardNavigation;
70
60
 
71
61
  private get normalizedBaseHost() {
72
62
  return !this.localLinks ? this.baseHost : '';
@@ -86,23 +76,6 @@ export class IATopNav extends LitElement {
86
76
  ) {
87
77
  this.menuSetup();
88
78
  }
89
-
90
- if (this.openMenu === 'search') {
91
- const targetElement =
92
- this.renderRoot.querySelector('search-menu')?.shadowRoot;
93
- if (targetElement) {
94
- this.keyboardNavigation = new KeyboardNavigation(
95
- targetElement as unknown as HTMLElement,
96
- this.openMenu,
97
- );
98
-
99
- if (this.previousKeydownListener) {
100
- this.removeEventListener('keydown', this.previousKeydownListener);
101
- }
102
- this.addEventListener('keydown', this.keyboardNavigation.handleKeyDown);
103
- this.previousKeydownListener = this.keyboardNavigation.handleKeyDown;
104
- }
105
- }
106
79
  }
107
80
 
108
81
  firstUpdated() {
@@ -139,23 +112,6 @@ export class IATopNav extends LitElement {
139
112
  this.closeMediaSlider();
140
113
  }
141
114
 
142
- navSearchBlurEvent(e: CustomEvent) {
143
- if (this.previousKeydownListener) {
144
- this.removeEventListener('keydown', this.previousKeydownListener);
145
- }
146
-
147
- const isUploadButton = e.detail?.isUploadButton;
148
- if (!isUploadButton) {
149
- const searchMenu = this.renderRoot.querySelector(
150
- 'search-menu',
151
- ) as HTMLElement;
152
- const elements = this.keyboardNavigation?.getFocusableElements();
153
- if (searchMenu && elements?.length) {
154
- elements[0].focus();
155
- }
156
- }
157
- }
158
-
159
115
  openMediaSlider() {
160
116
  this.mediaSliderOpen = true;
161
117
  }
@@ -170,10 +126,6 @@ export class IATopNav extends LitElement {
170
126
  this.closeMediaSlider();
171
127
  }
172
128
 
173
- searchInChanged(e: CustomEvent) {
174
- this.searchIn = e.detail.searchIn;
175
- }
176
-
177
129
  trackClick(e: CustomEvent) {
178
130
  this.dispatchEvent(
179
131
  new CustomEvent('analyticsClick', {
@@ -203,10 +155,6 @@ export class IATopNav extends LitElement {
203
155
  this.openMediaSlider();
204
156
  }
205
157
 
206
- get searchMenuOpened() {
207
- return this.openMenu === 'search';
208
- }
209
-
210
158
  get signedOutOpened() {
211
159
  return this.openMenu === 'login';
212
160
  }
@@ -215,10 +163,6 @@ export class IATopNav extends LitElement {
215
163
  return this.openMenu === 'user';
216
164
  }
217
165
 
218
- get searchMenuTabIndex() {
219
- return this.searchMenuOpened ? '' : '-1';
220
- }
221
-
222
166
  get userMenuTabIndex() {
223
167
  return this.userMenuOpened ? '' : '-1';
224
168
  }
@@ -291,6 +235,10 @@ export class IATopNav extends LitElement {
291
235
  return this.secondIdentitySlotMode === 'allow';
292
236
  }
293
237
 
238
+ get searchSlot() {
239
+ return html`<slot name="custom-search" slot="custom-search"></slot>`;
240
+ }
241
+
294
242
  get secondLogoSlot() {
295
243
  return this.allowSecondaryIcon
296
244
  ? html`
@@ -313,8 +261,6 @@ export class IATopNav extends LitElement {
313
261
  .config=${this.config}
314
262
  .openMenu=${this.openMenu}
315
263
  .screenName=${this.screenName}
316
- .searchIn=${this.searchIn}
317
- .searchQuery=${this.searchQuery}
318
264
  .secondIdentitySlotMode=${this.secondIdentitySlotMode}
319
265
  .selectedMenuOption=${this.selectedMenuOption}
320
266
  .username=${this.username}
@@ -325,9 +271,8 @@ export class IATopNav extends LitElement {
325
271
  @trackClick=${this.trackClick}
326
272
  @trackSubmit=${this.trackSubmit}
327
273
  @menuToggled=${this.menuToggled}
328
- @navSearchBlur=${this.navSearchBlurEvent}
329
274
  >
330
- ${this.secondLogoSlot}
275
+ ${this.secondLogoSlot} ${this.searchSlot}
331
276
  </primary-nav>
332
277
  <media-slider
333
278
  .baseHost=${this.normalizedBaseHost}
@@ -341,16 +286,6 @@ export class IATopNav extends LitElement {
341
286
  ></media-slider>
342
287
  </div>
343
288
  ${this.username ? this.userMenu : this.signedOutDropdown}
344
- <search-menu
345
- .baseHost=${this.normalizedBaseHost}
346
- .config=${this.config}
347
- .openMenu=${this.openMenu}
348
- tabindex="${this.searchMenuTabIndex}"
349
- ?hideSearch=${this.hideSearch}
350
- @searchInChanged=${this.searchInChanged}
351
- @trackClick=${this.trackClick}
352
- @trackSubmit=${this.trackSubmit}
353
- ></search-menu>
354
289
  <desktop-subnav
355
290
  .baseHost=${this.normalizedBaseHost}
356
291
  .menuItems=${this.menus.more.links}
@@ -3,11 +3,9 @@ import TrackedElement from './tracked-element';
3
3
  import icons from './assets/img/icons';
4
4
  import './assets/img/hamburger';
5
5
  import './login-button';
6
- import './nav-search';
7
6
  import './media-menu';
8
7
  import logoWordmarkStacked from './assets/img/wordmark-stacked';
9
8
  import primaryNavCSS from './styles/primary-nav';
10
- import locationHandler from './lib/location-handler';
11
9
  import formatUrl from './lib/format-url';
12
10
  import { customElement, property } from 'lit/decorators.js';
13
11
  import { IATopNavConfig, IATopNavSecondIdentitySlotMode } from './models';
@@ -21,8 +19,6 @@ export class PrimaryNav extends TrackedElement {
21
19
  @property({ type: Object }) config: IATopNavConfig = defaultTopNavConfig;
22
20
  @property({ type: String }) openMenu = '';
23
21
  @property({ type: String }) screenName = '';
24
- @property({ type: String }) searchIn = '';
25
- @property({ type: String }) searchQuery = '';
26
22
  @property({ type: String })
27
23
  secondIdentitySlotMode: IATopNavSecondIdentitySlotMode = '';
28
24
  @property({ type: String }) selectedMenuOption = '';
@@ -166,6 +162,19 @@ export class PrimaryNav extends TrackedElement {
166
162
  return this.secondIdentitySlotMode === 'allow';
167
163
  }
168
164
 
165
+ /**
166
+ * The search slot container, rendered between media-menu and
167
+ * right-side-section so it sits left of the Upload button on desktop.
168
+ */
169
+ get searchSlotContainer() {
170
+ if (this.hideSearch) return nothing;
171
+ return html`
172
+ <div class="custom-search-container ${this.searchMenuOpen ? 'open' : ''}">
173
+ <slot name="custom-search"></slot>
174
+ </div>
175
+ `;
176
+ }
177
+
169
178
  get searchMenu() {
170
179
  if (this.hideSearch) return nothing;
171
180
 
@@ -177,38 +186,9 @@ export class PrimaryNav extends TrackedElement {
177
186
  >
178
187
  ${icons.search}
179
188
  </button>
180
- <nav-search
181
- .baseHost=${this.baseHost}
182
- .config=${this.config}
183
- .locationHandler=${locationHandler}
184
- .open=${this.searchMenuOpen}
185
- .openMenu=${this.openMenu}
186
- .searchIn=${this.searchIn}
187
- .searchQuery=${this.searchQuery}
188
- @blur=${this.emitNavSearchBlurEvent}
189
- ></nav-search>
190
189
  `;
191
190
  }
192
191
 
193
- private emitNavSearchBlurEvent(e: FocusEvent) {
194
- const relatedTarget = e.relatedTarget as HTMLElement;
195
- const isUploadButton = relatedTarget?.classList.contains('upload');
196
-
197
- if (isUploadButton) {
198
- (this.shadowRoot?.querySelector('a.upload') as HTMLElement).focus();
199
- }
200
-
201
- this.dispatchEvent(
202
- new CustomEvent('navSearchBlur', {
203
- detail: {
204
- isUploadButton: !!isUploadButton,
205
- },
206
- bubbles: true,
207
- composed: true,
208
- }),
209
- );
210
- }
211
-
212
192
  get mobileDonateHeart() {
213
193
  return html`
214
194
  <a
@@ -286,6 +266,7 @@ export class PrimaryNav extends TrackedElement {
286
266
  .openMenu=${this.openMenu}
287
267
  .currentTab=${this.currentTab}
288
268
  ></media-menu>
269
+ ${this.searchSlotContainer}
289
270
  <div class="right-side-section">
290
271
  ${this.mobileDonateHeart} ${this.userStateTemplate}
291
272
  ${this.uploadButtonTemplate} ${this.searchMenu}
@@ -128,6 +128,34 @@ export default css`
128
128
  z-index: 3;
129
129
  }
130
130
 
131
+ .custom-search-container {
132
+ display: none;
133
+ }
134
+
135
+ .custom-search-container.open {
136
+ display: flex;
137
+ position: absolute;
138
+ top: 0;
139
+ right: 4rem;
140
+ bottom: 0;
141
+ left: 4rem;
142
+ z-index: 3;
143
+ padding: 0.5rem 0.2rem;
144
+ border-radius: 1rem 1rem 0 0;
145
+ background: var(--searchActiveBg);
146
+ align-items: center;
147
+ animation: fade-in 0.2s forwards;
148
+ }
149
+
150
+ @keyframes fade-in {
151
+ 0% {
152
+ opacity: 0;
153
+ }
154
+ 100% {
155
+ opacity: 1;
156
+ }
157
+ }
158
+
131
159
  .upload {
132
160
  display: none;
133
161
  }
@@ -292,6 +320,13 @@ export default css`
292
320
  float: right;
293
321
  margin-left: 1rem;
294
322
  }
323
+
324
+ .custom-search-container {
325
+ display: flex;
326
+ flex: 1;
327
+ align-items: center;
328
+ padding: 0 1rem;
329
+ }
295
330
  }
296
331
 
297
332
  @media (min-width: 990px) {
package/ssl/server.key CHANGED
@@ -1,28 +1,28 @@
1
- -----BEGIN PRIVATE KEY-----
2
- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDZqbS9hNS38Atc
3
- A7Uszq7EA7RavuHc8AcpbURa6Y7NORs0SmfDD0oLptQ7DX5pSuHyOeDHzQ3UXRCU
4
- DAhAD1XlaYQ6PPdiJPRAe4ACELzgDzepxVz3pdKPcfXd5/mHV3ghUZya2XW5DSF1
5
- CRYUX2j10a+JORJIG4bhvTg4HxTJZZDuaNfBMC6ZSn7d9YLQoAf1MLLJm43Ycj1W
6
- lOnyG4DHxNEqEk260BlbBywJH+SJA6GA0GR2bnzYZaDnZ0wqea0Zamx8ijpdJxBU
7
- xYOqLfzs2KREVkkGOmsFEu82W6G3D4bKsY1UNaWXb/jcl3UkXIJJij6CdbbMQkUJ
8
- c8dow3sVAgMBAAECggEANgLpITAhcuVDhFk9L3m4H1bF/dCpDmCXfl2pXR/guicm
9
- C4M9HUeheaOzvVWbXThiOe/HyfylpmFTmFEmCPNlPrDAyYzQXE/MNmYO/TQ3Eihk
10
- iSG68I764XKHbsG+Byoa2rW8NSaqEjniZ/7Rtkt4qasXMmdxlGgUP9bq6O45g8HV
11
- kHxneFlA2KbrvmWnBi7NTea9+tp61NWiq5n97UgHacQR6KkYIpbxd7uNSnCSdmXt
12
- pcwzO4ZPabJ2/DKRjePhU5OggPh+9AhJ3jsBo99GwYPgSZDh8E3vh2OWOtLBMUH3
13
- rmAYwlRT2aZ5hy5yi+4QD98WoUQtsr+9n757F8V6MQKBgQDzZycdgaKwWd5d34NN
14
- 0TkFtPQPwxxJTCCs3I3q02uWcS3svQzBK0cWb4nISO04TnJ3MnXo83dgGhCMF+uZ
15
- FCXxAA53z8F92iZo+ELlXFDFwNeNYih/afDA42tWZ6TlVsDnZ4zQgRjHS7jEF/JV
16
- 0ZgwGpw5725JQt64dic8wTOcDQKBgQDk7YYACQcWTnmjDhZQ3PZSX4fcTtzPZKZj
17
- fa1GrXEaUH1hSyc9VmY6qJpUmXexpvtr194nXE+O5wbThOHcBjVlo2Qv+vswmUX3
18
- WEcVzTVN4/fODCLCqFcMNIr+BzwZfwpT+p0u8g9FxDy1gGmvkxwIu8DCpnUT12Xj
19
- hm2wO+UxKQKBgFxCSDBF9+2SUtgQJYv0dwGzwiLLWMhro6MCAoT02D3w7nBihBgg
20
- GFTnuDkDc285ROfrZ4gB6MizeHwxgOrIGU2NMO62/+d9LbvyBiE76Z3bZ5i+kQ0i
21
- kc/7I69fn8ASLxJHTLenh0XbbNBfJ0riJCZvn7HSEGKShysyFdNQhAhtAoGAFYVi
22
- 0IQIv4cXFkYPwQBUw7+pVQOw7GpI3heFf5x0goXIk6nuAW0q5R7Oi192CiRphGTh
23
- xI+ABy4ezSmz1exbfreShpQwowv1sOACpsEI3s6skBlB90y+Ci6yVlk1xCvWO7jW
24
- qAAngWaGUoXE6bWJsCR+ZY4ieYAJWw9bJnMrA6kCgYAzV4Xeoh5ofENZM21wKW3W
25
- iCzRibPObv6Vb/j9A9yT57yzI3BdfvsX5zmuSvOJm1DimgGY9nCJUzUEYG0a1Dhh
26
- /rqObPoVIFGesmvwflVYFktmVHk7ycEDVreSTz23cvmraPz1fnpdKeuEs4sRQJV7
27
- iJhLoxX5SJlJc0RXMhgHGQ==
28
- -----END PRIVATE KEY-----
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDZqbS9hNS38Atc
3
+ A7Uszq7EA7RavuHc8AcpbURa6Y7NORs0SmfDD0oLptQ7DX5pSuHyOeDHzQ3UXRCU
4
+ DAhAD1XlaYQ6PPdiJPRAe4ACELzgDzepxVz3pdKPcfXd5/mHV3ghUZya2XW5DSF1
5
+ CRYUX2j10a+JORJIG4bhvTg4HxTJZZDuaNfBMC6ZSn7d9YLQoAf1MLLJm43Ycj1W
6
+ lOnyG4DHxNEqEk260BlbBywJH+SJA6GA0GR2bnzYZaDnZ0wqea0Zamx8ijpdJxBU
7
+ xYOqLfzs2KREVkkGOmsFEu82W6G3D4bKsY1UNaWXb/jcl3UkXIJJij6CdbbMQkUJ
8
+ c8dow3sVAgMBAAECggEANgLpITAhcuVDhFk9L3m4H1bF/dCpDmCXfl2pXR/guicm
9
+ C4M9HUeheaOzvVWbXThiOe/HyfylpmFTmFEmCPNlPrDAyYzQXE/MNmYO/TQ3Eihk
10
+ iSG68I764XKHbsG+Byoa2rW8NSaqEjniZ/7Rtkt4qasXMmdxlGgUP9bq6O45g8HV
11
+ kHxneFlA2KbrvmWnBi7NTea9+tp61NWiq5n97UgHacQR6KkYIpbxd7uNSnCSdmXt
12
+ pcwzO4ZPabJ2/DKRjePhU5OggPh+9AhJ3jsBo99GwYPgSZDh8E3vh2OWOtLBMUH3
13
+ rmAYwlRT2aZ5hy5yi+4QD98WoUQtsr+9n757F8V6MQKBgQDzZycdgaKwWd5d34NN
14
+ 0TkFtPQPwxxJTCCs3I3q02uWcS3svQzBK0cWb4nISO04TnJ3MnXo83dgGhCMF+uZ
15
+ FCXxAA53z8F92iZo+ELlXFDFwNeNYih/afDA42tWZ6TlVsDnZ4zQgRjHS7jEF/JV
16
+ 0ZgwGpw5725JQt64dic8wTOcDQKBgQDk7YYACQcWTnmjDhZQ3PZSX4fcTtzPZKZj
17
+ fa1GrXEaUH1hSyc9VmY6qJpUmXexpvtr194nXE+O5wbThOHcBjVlo2Qv+vswmUX3
18
+ WEcVzTVN4/fODCLCqFcMNIr+BzwZfwpT+p0u8g9FxDy1gGmvkxwIu8DCpnUT12Xj
19
+ hm2wO+UxKQKBgFxCSDBF9+2SUtgQJYv0dwGzwiLLWMhro6MCAoT02D3w7nBihBgg
20
+ GFTnuDkDc285ROfrZ4gB6MizeHwxgOrIGU2NMO62/+d9LbvyBiE76Z3bZ5i+kQ0i
21
+ kc/7I69fn8ASLxJHTLenh0XbbNBfJ0riJCZvn7HSEGKShysyFdNQhAhtAoGAFYVi
22
+ 0IQIv4cXFkYPwQBUw7+pVQOw7GpI3heFf5x0goXIk6nuAW0q5R7Oi192CiRphGTh
23
+ xI+ABy4ezSmz1exbfreShpQwowv1sOACpsEI3s6skBlB90y+Ci6yVlk1xCvWO7jW
24
+ qAAngWaGUoXE6bWJsCR+ZY4ieYAJWw9bJnMrA6kCgYAzV4Xeoh5ofENZM21wKW3W
25
+ iCzRibPObv6Vb/j9A9yT57yzI3BdfvsX5zmuSvOJm1DimgGY9nCJUzUEYG0a1Dhh
26
+ /rqObPoVIFGesmvwflVYFktmVHk7ycEDVreSTz23cvmraPz1fnpdKeuEs4sRQJV7
27
+ iJhLoxX5SJlJc0RXMhgHGQ==
28
+ -----END PRIVATE KEY-----