@hanseltime/template-repo-sync 2.2.1 → 2.4.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.
- package/CHANGELOG.md +43 -45
- package/dist/cjs/checkout-drivers/git-checkout.js +37 -0
- package/dist/cjs/checkout-drivers/git-checkout.spec.js +60 -0
- package/dist/cjs/checkout-drivers/index.js +21 -0
- package/dist/cjs/checkout-drivers/types.js +11 -0
- package/dist/cjs/clone-drivers/git-clone.js +25 -0
- package/dist/cjs/clone-drivers/index.js +21 -0
- package/dist/cjs/clone-drivers/types.js +8 -0
- package/dist/cjs/diff-drivers/git-diff.js +30 -0
- package/dist/cjs/diff-drivers/git-diff.spec.js +138 -0
- package/dist/cjs/diff-drivers/index.js +21 -0
- package/dist/cjs/diff-drivers/types.js +6 -0
- package/dist/cjs/formatting/index.js +21 -0
- package/dist/cjs/formatting/infer-json-indent.js +26 -0
- package/dist/cjs/formatting/infer-json-indent.spec.js +50 -0
- package/dist/cjs/formatting/sync-results-to-md.js +62 -0
- package/dist/cjs/formatting/sync-results-to-md.spec.js +45 -0
- package/dist/cjs/index.js +22 -0
- package/dist/cjs/load-plugin.js +44 -0
- package/dist/cjs/match.js +51 -0
- package/dist/cjs/match.spec.js +75 -0
- package/dist/cjs/merge-file.js +91 -0
- package/dist/cjs/merge-file.spec.js +508 -0
- package/dist/cjs/plugins/index.js +20 -0
- package/dist/cjs/plugins/json-merge.js +228 -0
- package/dist/cjs/plugins/json-merge.spec.js +514 -0
- package/dist/cjs/ref-drivers/git-current-ref.js +18 -0
- package/dist/cjs/ref-drivers/git-current-ref.spec.js +15 -0
- package/dist/cjs/ref-drivers/index.js +20 -0
- package/dist/cjs/ref-drivers/types.js +11 -0
- package/dist/cjs/template-sync.js +236 -0
- package/dist/cjs/template-sync.spec.js +521 -0
- package/dist/cjs/test-utils/index.js +26 -0
- package/dist/cjs/types.js +12 -0
- package/dist/esm/checkout-drivers/git-checkout.mjs +27 -0
- package/dist/esm/checkout-drivers/git-checkout.spec.mjs +56 -0
- package/dist/esm/checkout-drivers/index.mjs +4 -0
- package/dist/esm/checkout-drivers/types.mjs +8 -0
- package/dist/esm/clone-drivers/git-clone.mjs +15 -0
- package/dist/esm/clone-drivers/index.mjs +4 -0
- package/dist/esm/clone-drivers/types.mjs +8 -0
- package/dist/esm/diff-drivers/git-diff.mjs +26 -0
- package/dist/esm/diff-drivers/git-diff.spec.mjs +93 -0
- package/dist/esm/diff-drivers/index.mjs +4 -0
- package/dist/esm/diff-drivers/types.mjs +6 -0
- package/dist/esm/formatting/index.mjs +4 -0
- package/dist/esm/formatting/infer-json-indent.mjs +16 -0
- package/dist/esm/formatting/infer-json-indent.spec.mjs +46 -0
- package/dist/esm/formatting/sync-results-to-md.mjs +52 -0
- package/dist/esm/formatting/sync-results-to-md.spec.mjs +41 -0
- package/dist/esm/index.mjs +5 -0
- package/dist/esm/load-plugin.mjs +40 -0
- package/dist/esm/match.mjs +40 -0
- package/dist/esm/match.spec.mjs +71 -0
- package/dist/esm/merge-file.mjs +88 -0
- package/dist/esm/merge-file.spec.mjs +504 -0
- package/dist/esm/plugins/index.mjs +10 -0
- package/dist/esm/plugins/json-merge.mjs +164 -0
- package/dist/esm/plugins/json-merge.spec.mjs +469 -0
- package/dist/esm/ref-drivers/git-current-ref.mjs +8 -0
- package/dist/esm/ref-drivers/git-current-ref.spec.mjs +11 -0
- package/dist/esm/ref-drivers/index.mjs +3 -0
- package/dist/esm/ref-drivers/types.mjs +8 -0
- package/dist/esm/template-sync.mjs +174 -0
- package/dist/esm/template-sync.spec.mjs +517 -0
- package/dist/esm/test-utils/index.mjs +10 -0
- package/dist/esm/types.mjs +9 -0
- package/{lib/cjs → dist/types}/checkout-drivers/git-checkout.d.ts +1 -0
- package/dist/types/checkout-drivers/git-checkout.d.ts.map +1 -0
- package/dist/types/checkout-drivers/git-checkout.spec.d.ts +2 -0
- package/dist/types/checkout-drivers/git-checkout.spec.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/checkout-drivers/index.d.ts +1 -0
- package/dist/types/checkout-drivers/index.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/checkout-drivers/types.d.ts +1 -0
- package/dist/types/checkout-drivers/types.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/clone-drivers/git-clone.d.ts +2 -1
- package/dist/types/clone-drivers/git-clone.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/clone-drivers/index.d.ts +2 -1
- package/dist/types/clone-drivers/index.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/clone-drivers/types.d.ts +1 -0
- package/dist/types/clone-drivers/types.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/diff-drivers/git-diff.d.ts +1 -0
- package/dist/types/diff-drivers/git-diff.d.ts.map +1 -0
- package/dist/types/diff-drivers/git-diff.spec.d.ts +2 -0
- package/dist/types/diff-drivers/git-diff.spec.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/diff-drivers/index.d.ts +2 -1
- package/dist/types/diff-drivers/index.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/diff-drivers/types.d.ts +1 -0
- package/dist/types/diff-drivers/types.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/formatting/index.d.ts +2 -1
- package/dist/types/formatting/index.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/formatting/infer-json-indent.d.ts +1 -0
- package/dist/types/formatting/infer-json-indent.d.ts.map +1 -0
- package/dist/types/formatting/infer-json-indent.spec.d.ts +2 -0
- package/dist/types/formatting/infer-json-indent.spec.d.ts.map +1 -0
- package/dist/types/formatting/sync-results-to-md.d.ts +3 -0
- package/dist/types/formatting/sync-results-to-md.d.ts.map +1 -0
- package/dist/types/formatting/sync-results-to-md.spec.d.ts +2 -0
- package/dist/types/formatting/sync-results-to-md.spec.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/index.d.ts +3 -2
- package/dist/types/index.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/load-plugin.d.ts +2 -1
- package/dist/types/load-plugin.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/match.d.ts +1 -0
- package/dist/types/match.d.ts.map +1 -0
- package/dist/types/match.spec.d.ts +2 -0
- package/dist/types/match.spec.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/merge-file.d.ts +3 -2
- package/dist/types/merge-file.d.ts.map +1 -0
- package/dist/types/merge-file.spec.d.ts +2 -0
- package/dist/types/merge-file.spec.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/plugins/index.d.ts +2 -1
- package/dist/types/plugins/index.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/plugins/json-merge.d.ts +2 -1
- package/dist/types/plugins/json-merge.d.ts.map +1 -0
- package/dist/types/plugins/json-merge.spec.d.ts +2 -0
- package/dist/types/plugins/json-merge.spec.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/ref-drivers/git-current-ref.d.ts +1 -0
- package/dist/types/ref-drivers/git-current-ref.d.ts.map +1 -0
- package/dist/types/ref-drivers/git-current-ref.spec.d.ts +2 -0
- package/dist/types/ref-drivers/git-current-ref.spec.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/ref-drivers/index.d.ts +1 -0
- package/dist/types/ref-drivers/index.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/ref-drivers/types.d.ts +1 -0
- package/dist/types/ref-drivers/types.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/template-sync.d.ts +6 -5
- package/dist/types/template-sync.d.ts.map +1 -0
- package/dist/types/template-sync.spec.d.ts +2 -0
- package/dist/types/template-sync.spec.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/test-utils/index.d.ts +1 -0
- package/dist/types/test-utils/index.d.ts.map +1 -0
- package/{lib/cjs → dist/types}/types.d.ts +1 -0
- package/dist/types/types.d.ts.map +1 -0
- package/package.json +26 -23
- package/.eslintrc.js +0 -10
- package/.github/CODEOWNERS +0 -6
- package/.github/workflows/pr-checks.yaml +0 -12
- package/.github/workflows/release.yaml +0 -47
- package/.github/workflows/test-flow.yaml +0 -63
- package/.husky/commit-msg +0 -4
- package/.prettierignore +0 -1
- package/.prettierrc +0 -1
- package/action.yml +0 -13
- package/commitlint.config.js +0 -3
- package/docs/merge-plugins/CURRENT_PLUGINS.md +0 -168
- package/docs/merge-plugins/PLUGIN_DEVELOPMENT.md +0 -122
- package/docs/merge-plugins/README.md +0 -75
- package/jest.config.js +0 -19
- package/lib/cjs/checkout-drivers/git-checkout.js +0 -29
- package/lib/cjs/checkout-drivers/index.js +0 -18
- package/lib/cjs/checkout-drivers/types.js +0 -2
- package/lib/cjs/clone-drivers/git-clone.js +0 -17
- package/lib/cjs/clone-drivers/index.js +0 -18
- package/lib/cjs/clone-drivers/types.js +0 -2
- package/lib/cjs/diff-drivers/git-diff.js +0 -41
- package/lib/cjs/diff-drivers/index.js +0 -18
- package/lib/cjs/diff-drivers/types.js +0 -2
- package/lib/cjs/formatting/index.js +0 -18
- package/lib/cjs/formatting/infer-json-indent.js +0 -18
- package/lib/cjs/formatting/sync-results-to-md.d.ts +0 -2
- package/lib/cjs/formatting/sync-results-to-md.js +0 -57
- package/lib/cjs/index.js +0 -19
- package/lib/cjs/load-plugin.js +0 -69
- package/lib/cjs/match.js +0 -45
- package/lib/cjs/merge-file.js +0 -98
- package/lib/cjs/plugins/index.js +0 -11
- package/lib/cjs/plugins/json-merge.js +0 -208
- package/lib/cjs/ref-drivers/git-current-ref.js +0 -12
- package/lib/cjs/ref-drivers/index.js +0 -17
- package/lib/cjs/ref-drivers/types.js +0 -2
- package/lib/cjs/template-sync.js +0 -163
- package/lib/cjs/test-utils/index.js +0 -10
- package/lib/cjs/types.js +0 -2
- package/lib/esm/checkout-drivers/git-checkout.js +0 -29
- package/lib/esm/checkout-drivers/index.js +0 -18
- package/lib/esm/checkout-drivers/types.js +0 -2
- package/lib/esm/clone-drivers/git-clone.js +0 -17
- package/lib/esm/clone-drivers/index.js +0 -18
- package/lib/esm/clone-drivers/types.js +0 -2
- package/lib/esm/diff-drivers/git-diff.js +0 -41
- package/lib/esm/diff-drivers/index.js +0 -18
- package/lib/esm/diff-drivers/types.js +0 -2
- package/lib/esm/formatting/index.js +0 -18
- package/lib/esm/formatting/infer-json-indent.js +0 -18
- package/lib/esm/formatting/sync-results-to-md.js +0 -57
- package/lib/esm/index.js +0 -19
- package/lib/esm/load-plugin.js +0 -46
- package/lib/esm/match.js +0 -45
- package/lib/esm/merge-file.js +0 -98
- package/lib/esm/plugins/index.js +0 -11
- package/lib/esm/plugins/json-merge.js +0 -208
- package/lib/esm/ref-drivers/git-current-ref.js +0 -12
- package/lib/esm/ref-drivers/index.js +0 -17
- package/lib/esm/ref-drivers/types.js +0 -2
- package/lib/esm/template-sync.js +0 -163
- package/lib/esm/test-utils/index.js +0 -10
- package/lib/esm/types.js +0 -2
- package/release.config.js +0 -40
- package/src/checkout-drivers/git-checkout.spec.ts +0 -69
- package/src/checkout-drivers/git-checkout.ts +0 -38
- package/src/checkout-drivers/index.ts +0 -2
- package/src/checkout-drivers/types.ts +0 -14
- package/src/clone-drivers/git-clone.ts +0 -20
- package/src/clone-drivers/index.ts +0 -2
- package/src/clone-drivers/types.ts +0 -20
- package/src/diff-drivers/git-diff.spec.ts +0 -73
- package/src/diff-drivers/git-diff.ts +0 -39
- package/src/diff-drivers/index.ts +0 -2
- package/src/diff-drivers/types.ts +0 -14
- package/src/formatting/__snapshots__/sync-results-to-md.spec.ts.snap +0 -39
- package/src/formatting/index.ts +0 -2
- package/src/formatting/infer-json-indent.spec.ts +0 -49
- package/src/formatting/infer-json-indent.ts +0 -16
- package/src/formatting/sync-results-to-md.spec.ts +0 -31
- package/src/formatting/sync-results-to-md.ts +0 -63
- package/src/index.ts +0 -3
- package/src/load-plugin.ts +0 -51
- package/src/match.spec.ts +0 -68
- package/src/match.ts +0 -52
- package/src/merge-file.spec.ts +0 -506
- package/src/merge-file.ts +0 -154
- package/src/plugins/index.ts +0 -12
- package/src/plugins/json-merge.spec.ts +0 -436
- package/src/plugins/json-merge.ts +0 -215
- package/src/ref-drivers/git-current-ref.spec.ts +0 -12
- package/src/ref-drivers/git-current-ref.ts +0 -9
- package/src/ref-drivers/index.ts +0 -1
- package/src/ref-drivers/types.ts +0 -10
- package/src/template-sync.spec.ts +0 -509
- package/src/template-sync.ts +0 -256
- package/src/test-utils/index.ts +0 -13
- package/src/types.ts +0 -129
- package/templatesync.local.json +0 -15
- package/test-fixtures/downstream/README.md +0 -3
- package/test-fixtures/downstream/package.json +0 -18
- package/test-fixtures/downstream/plugins/custom-plugin.js +0 -11
- package/test-fixtures/downstream/src/index.js +0 -2
- package/test-fixtures/downstream/src/index.ts +0 -1
- package/test-fixtures/downstream/src/templated.js +0 -2
- package/test-fixtures/downstream/src/templated.ts +0 -1
- package/test-fixtures/downstream/templatesync.json +0 -16
- package/test-fixtures/downstream/templatesync.local.json +0 -10
- package/test-fixtures/dummy-plugin.js +0 -8
- package/test-fixtures/glob-test/folder1/something.js +0 -1
- package/test-fixtures/glob-test/folder1/something.ts +0 -0
- package/test-fixtures/glob-test/toplevel.js +0 -0
- package/test-fixtures/glob-test/toplevel.txt +0 -0
- package/test-fixtures/template/custom-bin/something.txt +0 -1
- package/test-fixtures/template/package.json +0 -17
- package/test-fixtures/template/src/index.js +0 -2
- package/test-fixtures/template/src/index.ts +0 -1
- package/test-fixtures/template/src/templated.js +0 -2
- package/test-fixtures/template/src/templated.ts +0 -1
- package/test-fixtures/template/templatesync.json +0 -16
- package/test-fixtures/testGitRepo/README.md +0 -17
- package/test-fixtures/testGitRepo/gitDir/COMMIT_EDITMSG +0 -14
- package/test-fixtures/testGitRepo/gitDir/HEAD +0 -1
- package/test-fixtures/testGitRepo/gitDir/config +0 -7
- package/test-fixtures/testGitRepo/gitDir/description +0 -1
- package/test-fixtures/testGitRepo/gitDir/hooks/applypatch-msg.sample +0 -15
- package/test-fixtures/testGitRepo/gitDir/hooks/commit-msg.sample +0 -24
- package/test-fixtures/testGitRepo/gitDir/hooks/fsmonitor-watchman.sample +0 -174
- package/test-fixtures/testGitRepo/gitDir/hooks/post-update.sample +0 -8
- package/test-fixtures/testGitRepo/gitDir/hooks/pre-applypatch.sample +0 -14
- package/test-fixtures/testGitRepo/gitDir/hooks/pre-commit.sample +0 -49
- package/test-fixtures/testGitRepo/gitDir/hooks/pre-merge-commit.sample +0 -13
- package/test-fixtures/testGitRepo/gitDir/hooks/pre-push.sample +0 -53
- package/test-fixtures/testGitRepo/gitDir/hooks/pre-rebase.sample +0 -169
- package/test-fixtures/testGitRepo/gitDir/hooks/pre-receive.sample +0 -24
- package/test-fixtures/testGitRepo/gitDir/hooks/prepare-commit-msg.sample +0 -42
- package/test-fixtures/testGitRepo/gitDir/hooks/push-to-checkout.sample +0 -78
- package/test-fixtures/testGitRepo/gitDir/hooks/sendemail-validate.sample +0 -77
- package/test-fixtures/testGitRepo/gitDir/hooks/update.sample +0 -128
- package/test-fixtures/testGitRepo/gitDir/index +0 -0
- package/test-fixtures/testGitRepo/gitDir/info/exclude +0 -6
- package/test-fixtures/testGitRepo/gitDir/logs/HEAD +0 -5
- package/test-fixtures/testGitRepo/gitDir/logs/refs/heads/master +0 -2
- package/test-fixtures/testGitRepo/gitDir/logs/refs/heads/test-branch +0 -2
- package/test-fixtures/testGitRepo/gitDir/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 +0 -0
- package/test-fixtures/testGitRepo/gitDir/objects/6e/187bee8d02f39d0a1be8331dd8fe6a00c9b613 +0 -0
- package/test-fixtures/testGitRepo/gitDir/objects/73/185f1f3f5a6345e087d9f46dc4af77cc59449f +0 -2
- package/test-fixtures/testGitRepo/gitDir/objects/90/e7ea1089f939840e9649fd617584c1ad117159 +0 -3
- package/test-fixtures/testGitRepo/gitDir/objects/ba/99a452b9097047e9bfa8d5a08b3e452fcb364a +0 -0
- package/test-fixtures/testGitRepo/gitDir/objects/c5/8d400177cd5180b8566f82a127fafc5bf394b7 +0 -0
- package/test-fixtures/testGitRepo/gitDir/objects/e2/e668265db019249a7e8296d85f79000e3d71cf +0 -0
- package/test-fixtures/testGitRepo/gitDir/objects/e4/243e430c1ab69f3e344249f5b1859e90abc883 +0 -1
- package/test-fixtures/testGitRepo/gitDir/objects/ec/6c1cb72312605282ac61858cf1eaf1ea9f1d02 +0 -0
- package/test-fixtures/testGitRepo/gitDir/objects/fc/89cecc4ac0b5b075bd7d0ce9e09b2f50598b82 +0 -0
- package/test-fixtures/testGitRepo/gitDir/refs/heads/master +0 -1
- package/test-fixtures/testGitRepo/gitDir/refs/heads/test-branch +0 -1
- package/tsconfig.cjs.json +0 -12
- package/tsconfig.esm.json +0 -10
- package/tsconfig.json +0 -22
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: all[name]
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
TEMPLATE_SYNC_CONFIG: function() {
|
|
13
|
+
return TEMPLATE_SYNC_CONFIG;
|
|
14
|
+
},
|
|
15
|
+
TEMPLATE_SYNC_LOCAL_CONFIG: function() {
|
|
16
|
+
return TEMPLATE_SYNC_LOCAL_CONFIG;
|
|
17
|
+
},
|
|
18
|
+
templateSync: function() {
|
|
19
|
+
return templateSync;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
const _commentjson = /*#__PURE__*/ _interop_require_wildcard(require("comment-json"));
|
|
23
|
+
const _fs = require("fs");
|
|
24
|
+
const _micromatch = require("micromatch");
|
|
25
|
+
const _path = require("path");
|
|
26
|
+
const _checkoutdrivers = require("./checkout-drivers");
|
|
27
|
+
const _gitclone = require("./clone-drivers/git-clone");
|
|
28
|
+
const _diffdrivers = require("./diff-drivers");
|
|
29
|
+
const _formatting = require("./formatting");
|
|
30
|
+
const _loadplugin = require("./load-plugin");
|
|
31
|
+
const _match = require("./match");
|
|
32
|
+
const _mergefile = require("./merge-file");
|
|
33
|
+
const _refdrivers = require("./ref-drivers");
|
|
34
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
35
|
+
if (typeof WeakMap !== "function") return null;
|
|
36
|
+
var cacheBabelInterop = new WeakMap();
|
|
37
|
+
var cacheNodeInterop = new WeakMap();
|
|
38
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
39
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
40
|
+
})(nodeInterop);
|
|
41
|
+
}
|
|
42
|
+
function _interop_require_wildcard(obj, nodeInterop) {
|
|
43
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
44
|
+
return obj;
|
|
45
|
+
}
|
|
46
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
47
|
+
return {
|
|
48
|
+
default: obj
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
52
|
+
if (cache && cache.has(obj)) {
|
|
53
|
+
return cache.get(obj);
|
|
54
|
+
}
|
|
55
|
+
var newObj = {
|
|
56
|
+
__proto__: null
|
|
57
|
+
};
|
|
58
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
59
|
+
for(var key in obj){
|
|
60
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
61
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
62
|
+
if (desc && (desc.get || desc.set)) {
|
|
63
|
+
Object.defineProperty(newObj, key, desc);
|
|
64
|
+
} else {
|
|
65
|
+
newObj[key] = obj[key];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
newObj.default = obj;
|
|
70
|
+
if (cache) {
|
|
71
|
+
cache.set(obj, newObj);
|
|
72
|
+
}
|
|
73
|
+
return newObj;
|
|
74
|
+
}
|
|
75
|
+
const TEMPLATE_SYNC_CONFIG = "templatesync";
|
|
76
|
+
const TEMPLATE_SYNC_LOCAL_CONFIG = "templatesync.local";
|
|
77
|
+
async function templateSync(options) {
|
|
78
|
+
const cloneDriver = options.cloneDriver ?? _gitclone.gitClone;
|
|
79
|
+
const diffDriver = options.diffDriver ?? _diffdrivers.gitDiff;
|
|
80
|
+
const currentRefDriver = options.currentRefDriver ?? _refdrivers.gitCurrentRef;
|
|
81
|
+
const checkoutDriver = options.checkoutDriver ?? _checkoutdrivers.gitCheckout;
|
|
82
|
+
const cloneReturn = await cloneDriver(options.tmpCloneDir, options.repoUrl);
|
|
83
|
+
const { dir: tempCloneDir, remoteName } = typeof cloneReturn === "string" ? {
|
|
84
|
+
dir: cloneReturn,
|
|
85
|
+
remoteName: "origin"
|
|
86
|
+
} : cloneReturn;
|
|
87
|
+
if (options.branch) {
|
|
88
|
+
await checkoutDriver({
|
|
89
|
+
tmpDir: tempCloneDir,
|
|
90
|
+
remoteName,
|
|
91
|
+
branch: options.branch
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
// Get the clone Config
|
|
95
|
+
const cloneConfigPath = (0, _path.join)(tempCloneDir, `${TEMPLATE_SYNC_CONFIG}.json`);
|
|
96
|
+
const templateSyncConfig = (0, _fs.existsSync)(cloneConfigPath) ? _commentjson.parse((0, _fs.readFileSync)(cloneConfigPath).toString()) : {
|
|
97
|
+
ignore: []
|
|
98
|
+
};
|
|
99
|
+
const localConfigFile = `${TEMPLATE_SYNC_LOCAL_CONFIG}.json`;
|
|
100
|
+
const localConfigPath = (0, _path.join)(options.repoDir, localConfigFile);
|
|
101
|
+
const localTemplateSyncConfig = (0, _fs.existsSync)(localConfigPath) ? _commentjson.parse((0, _fs.readFileSync)(localConfigPath).toString()) : {
|
|
102
|
+
ignore: []
|
|
103
|
+
};
|
|
104
|
+
let filesToSync;
|
|
105
|
+
const ref = await currentRefDriver({
|
|
106
|
+
rootDir: tempCloneDir
|
|
107
|
+
});
|
|
108
|
+
if (localTemplateSyncConfig.afterRef) {
|
|
109
|
+
if (ref === localTemplateSyncConfig.afterRef) {
|
|
110
|
+
// short circuit if the refs match
|
|
111
|
+
return {
|
|
112
|
+
localSkipFiles: [],
|
|
113
|
+
localFileChanges: {},
|
|
114
|
+
modifiedFiles: {
|
|
115
|
+
added: [],
|
|
116
|
+
modified: [],
|
|
117
|
+
deleted: [],
|
|
118
|
+
total: 0
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
filesToSync = await diffDriver(tempCloneDir, localTemplateSyncConfig.afterRef);
|
|
123
|
+
} else {
|
|
124
|
+
filesToSync = {
|
|
125
|
+
added: (0, _match.getAllFilesInDir)(tempCloneDir, [
|
|
126
|
+
...templateSyncConfig.ignore,
|
|
127
|
+
".git/**"
|
|
128
|
+
]),
|
|
129
|
+
deleted: [],
|
|
130
|
+
modified: []
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
// Pre-load plugins and make sure the sync file is respected
|
|
134
|
+
// Synchronous since grpc servers take a second
|
|
135
|
+
const localValidateErrors = {};
|
|
136
|
+
const validateErrors = {};
|
|
137
|
+
for (const config of localTemplateSyncConfig.merge ?? []){
|
|
138
|
+
const plugin = await (0, _loadplugin.loadPlugin)(config, options.repoDir);
|
|
139
|
+
const errors = plugin.validate(config.options ?? {});
|
|
140
|
+
if (errors && errors.length > 0) {
|
|
141
|
+
localValidateErrors[config.plugin] = errors;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
for (const config of templateSyncConfig.merge ?? []){
|
|
145
|
+
const plugin = await (0, _loadplugin.loadPlugin)(config, tempCloneDir);
|
|
146
|
+
const errors = plugin.validate(config.options ?? {});
|
|
147
|
+
if (errors && errors.length > 0) {
|
|
148
|
+
validateErrors[config.plugin] = errors;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
let errorStr = "";
|
|
152
|
+
if (Object.keys(validateErrors).length > 0) {
|
|
153
|
+
errorStr = `${errorStr}templatesync.json plugin option errors:\n`;
|
|
154
|
+
for(const plugin in validateErrors){
|
|
155
|
+
errorStr = `${errorStr}\tPlugin (${plugin}):\n`;
|
|
156
|
+
validateErrors[plugin].forEach((err)=>{
|
|
157
|
+
errorStr = `${errorStr}\t\t${err}\n`;
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (Object.keys(localValidateErrors).length > 0) {
|
|
162
|
+
errorStr = `${errorStr}templatesync.local.json plugin option errors:\n`;
|
|
163
|
+
for(const plugin in localValidateErrors){
|
|
164
|
+
errorStr = `${errorStr}\tPlugin (${plugin}):\n`;
|
|
165
|
+
localValidateErrors[plugin].forEach((err)=>{
|
|
166
|
+
errorStr = `${errorStr}\t\t${err}\n`;
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (errorStr !== "") {
|
|
171
|
+
throw Error(errorStr);
|
|
172
|
+
}
|
|
173
|
+
// Apply ignore filters
|
|
174
|
+
filesToSync.added = filesToSync.added.filter((f)=>!(0, _micromatch.some)(f, templateSyncConfig.ignore));
|
|
175
|
+
filesToSync.modified = filesToSync.modified.filter((f)=>!(0, _micromatch.some)(f, templateSyncConfig.ignore));
|
|
176
|
+
filesToSync.deleted = filesToSync.deleted.filter((f)=>!(0, _micromatch.some)(f, templateSyncConfig.ignore));
|
|
177
|
+
const localSkipFiles = new Set();
|
|
178
|
+
const localFileChanges = {};
|
|
179
|
+
const fileSyncFactory = (op)=>{
|
|
180
|
+
return async (f)=>{
|
|
181
|
+
const result = await (0, _mergefile.mergeFile)(f, {
|
|
182
|
+
localTemplateSyncConfig,
|
|
183
|
+
templateSyncConfig,
|
|
184
|
+
tempCloneDir,
|
|
185
|
+
cwd: options.repoDir,
|
|
186
|
+
fileOperation: op
|
|
187
|
+
});
|
|
188
|
+
if (result.ignoredDueToLocal) {
|
|
189
|
+
localSkipFiles.add(f);
|
|
190
|
+
} else if (result?.localChanges && result.localChanges.length > 0) {
|
|
191
|
+
localFileChanges[f] = result.localChanges;
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
};
|
|
195
|
+
// Added and modified have the same setup for now
|
|
196
|
+
await Promise.all(filesToSync.added.map(fileSyncFactory("added")));
|
|
197
|
+
await Promise.all(filesToSync.modified.map(fileSyncFactory("modified")));
|
|
198
|
+
await Promise.all(filesToSync.deleted.map(fileSyncFactory("deleted")));
|
|
199
|
+
// Report the files that changed in general
|
|
200
|
+
const actualAdded = filesToSync.added.filter((f)=>!localSkipFiles.has(f));
|
|
201
|
+
const actualModified = filesToSync.modified.filter((f)=>!localSkipFiles.has(f));
|
|
202
|
+
const actualDeleted = filesToSync.deleted.filter((f)=>!localSkipFiles.has(f));
|
|
203
|
+
const modifiedFiles = {
|
|
204
|
+
added: actualAdded,
|
|
205
|
+
modified: actualModified,
|
|
206
|
+
deleted: actualDeleted
|
|
207
|
+
};
|
|
208
|
+
// apply after ref
|
|
209
|
+
if (options.updateAfterRef) {
|
|
210
|
+
const _ref = await currentRefDriver({
|
|
211
|
+
rootDir: tempCloneDir
|
|
212
|
+
});
|
|
213
|
+
if ((0, _fs.existsSync)(localConfigPath)) {
|
|
214
|
+
const configStr = (0, _fs.readFileSync)(localConfigPath).toString();
|
|
215
|
+
const config = _commentjson.parse(configStr);
|
|
216
|
+
config.afterRef = _ref;
|
|
217
|
+
(0, _fs.writeFileSync)(localConfigPath, _commentjson.stringify(config, null, (0, _formatting.inferJSONIndent)(configStr)));
|
|
218
|
+
modifiedFiles.modified.push(localConfigFile);
|
|
219
|
+
} else {
|
|
220
|
+
(0, _fs.writeFileSync)(localConfigPath, _commentjson.stringify({
|
|
221
|
+
afterRef: _ref
|
|
222
|
+
}, null, 4));
|
|
223
|
+
modifiedFiles.added.push(localConfigFile);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return {
|
|
227
|
+
localSkipFiles: Array.from(localSkipFiles),
|
|
228
|
+
localFileChanges,
|
|
229
|
+
modifiedFiles: {
|
|
230
|
+
...modifiedFiles,
|
|
231
|
+
total: modifiedFiles.added.length + modifiedFiles.deleted.length + modifiedFiles.modified.length
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS1zeW5jLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNvbW1lbnRKU09OIGZyb20gXCJjb21tZW50LWpzb25cIjtcbmltcG9ydCB0eXBlIHsgQ2hhbmdlIH0gZnJvbSBcImRpZmZcIjtcbmltcG9ydCB7IGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgc29tZSB9IGZyb20gXCJtaWNyb21hdGNoXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGVDaGVja291dERyaXZlckZuIH0gZnJvbSBcIi4vY2hlY2tvdXQtZHJpdmVyc1wiO1xuaW1wb3J0IHsgZ2l0Q2hlY2tvdXQgfSBmcm9tIFwiLi9jaGVja291dC1kcml2ZXJzXCI7XG5pbXBvcnQgdHlwZSB7IFRlbXBsYXRlQ2xvbmVEcml2ZXJGbiB9IGZyb20gXCIuL2Nsb25lLWRyaXZlcnNcIjtcbmltcG9ydCB7IGdpdENsb25lIH0gZnJvbSBcIi4vY2xvbmUtZHJpdmVycy9naXQtY2xvbmVcIjtcbmltcG9ydCB0eXBlIHsgRGlmZlJlc3VsdCwgVGVtcGxhdGVEaWZmRHJpdmVyRm4gfSBmcm9tIFwiLi9kaWZmLWRyaXZlcnNcIjtcbmltcG9ydCB7IGdpdERpZmYgfSBmcm9tIFwiLi9kaWZmLWRyaXZlcnNcIjtcbmltcG9ydCB7IGluZmVySlNPTkluZGVudCB9IGZyb20gXCIuL2Zvcm1hdHRpbmdcIjtcbmltcG9ydCB7IGxvYWRQbHVnaW4gfSBmcm9tIFwiLi9sb2FkLXBsdWdpblwiO1xuaW1wb3J0IHsgZ2V0QWxsRmlsZXNJbkRpciB9IGZyb20gXCIuL21hdGNoXCI7XG5pbXBvcnQgeyBtZXJnZUZpbGUgfSBmcm9tIFwiLi9tZXJnZS1maWxlXCI7XG5pbXBvcnQgeyBnaXRDdXJyZW50UmVmIH0gZnJvbSBcIi4vcmVmLWRyaXZlcnNcIjtcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGVSZWZEcml2ZXJGbiB9IGZyb20gXCIuL3JlZi1kcml2ZXJzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IENvbmZpZywgRmlsZU9wZXJhdGlvbiwgTG9jYWxDb25maWcgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlU3luY09wdGlvbnMge1xuXHQvKipcblx0ICogVGhpcyBpcyB0aGUgdXJsIG9mIHRoZSB0ZW1wbGF0ZSByZXBvXG5cdCAqL1xuXHRyZXBvVXJsOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIE9wdGlvbmFsIEJyYW5jaCB0byBjaGVjayBvdXQgLSBpZiBub3Qgc3BlY2lmaWVkLCB0aGlzIGNoZWNrcyBvdXQgdGhlXG5cdCAqIGRlZmF1bHQgYnJhbmNoIG9mIHRoZSB0ZW1wbGF0ZSByZXBvXG5cdCAqL1xuXHRicmFuY2g/OiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRoZSBkaXJlY3RvcnkgZm9yIGNsb25pbmcgb3VyIHRlbXBsYXRlIHJlcG8gaW50byB2aWEgdGhlIGNsb25lRHJpdmVyXG5cdCAqL1xuXHR0bXBDbG9uZURpcjogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBUaGUgcmVwbyBkaXJlY3RvcnkgcGF0aCB0aGF0IHdlIGFyZSBnb2luZyB0byBtZXJnZSB0b3dhcmRcblx0ICovXG5cdHJlcG9EaXI6IHN0cmluZztcblxuXHQvKipcblx0ICogSWYgc2V0IHRvIHRydWUsIHRlbXBsYXRlIHN5bmMgd2lsbCBhcHBseSB0aGUgY3VycmVudCByZWZcblx0ICogb2YgdGhlIHRlbXBsYXRlIHJlcG8gdG8gYWZ0ZXJSZWZcblx0ICovXG5cdHVwZGF0ZUFmdGVyUmVmPzogYm9vbGVhbjtcblxuXHQvKipcblx0ICogRGVmYXVsdHMgdG8gdXNpbmcgZ2l0IGNsb25lXG5cdCAqL1xuXHRjbG9uZURyaXZlcj86IFRlbXBsYXRlQ2xvbmVEcml2ZXJGbjtcblxuXHQvKipcblx0ICogRGVmYXVsdHMgdG8gdXNpbmcgZ2l0IGRpZmZcblx0ICovXG5cdGRpZmZEcml2ZXI/OiBUZW1wbGF0ZURpZmZEcml2ZXJGbjtcblxuXHQvKipcblx0ICogRGVmYXVsdHMgdG8gdXNpbmcgZ2l0IGN1cnJlbnQgcmVmXG5cdCAqL1xuXHRjdXJyZW50UmVmRHJpdmVyPzogVGVtcGxhdGVSZWZEcml2ZXJGbjtcblxuXHQvKipcblx0ICogRGVmYXVsdHMgdG8gdXNpbmcgZ2l0IGNoZWNrb3V0IGRyaXZlclxuXHQgKi9cblx0Y2hlY2tvdXREcml2ZXI/OiBUZW1wbGF0ZUNoZWNrb3V0RHJpdmVyRm47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVTeW5jUmV0dXJuIHtcblx0LyoqXG5cdCAqIEFuIGFycmF5IG9mIGZpbGVzIHRoYXQgd2VyZSBza2lwcGVkIG91dHJpZ2h0IGR1ZSB0byBhIHRlbXBsYXRlc3luYy5sb2NhbCBpZ25vcmUgZ2xvYlxuXHQgKi9cblx0bG9jYWxTa2lwRmlsZXM6IHN0cmluZ1tdO1xuXHQvKipcblx0ICogQW4gb2JqZWN0IG1hcHBpbmcgYWxsIGZpbGUgcGF0aHMgdG8gYW55IG1lcmdlIHJ1bGVzIHRoYXQgd291bGQndmUgb3ZlcnJpZGRlbiB0aGUgbWVyZ2UgcnVsZXNcblx0ICogb2YgdGhlIHRlbXBsYXRlIHN5bmMgZmlsZS5cblx0ICpcblx0ICogTm90ZTogcmlnaHQgbm93LCB0aGlzIHNob3dzIG5vbi1jaGFuZ2VkIGRpZmZzIGFzIHdlbGwgc28geW91IGhhdmUgdG8gbG9vayBmb3IgYWRkZWQgb3IgcmVtb3ZlZFxuXHQgKi9cblx0bG9jYWxGaWxlQ2hhbmdlczoge1xuXHRcdFtmaWxlUGF0aDogc3RyaW5nXTogQ2hhbmdlW107XG5cdH07XG5cdC8qKlxuXHQgKiBBIGxpc3Qgb2YgYWxsIGZpbGVzIHRoYXQgYXJlIG1vZGlmaWVkIGJ5IHRoaXMgb3BlcmF0aW9uLiAgWW91IGNhbiB1c2UgdG90YWwgdG8gcXVpY2tseSBjaGVjayBpZlxuXHQgKiB0aGVyZSB3YXMgYW4gYWN0dWFsIG1lYW5pbmdmdWwgY2hhbmdlLlxuXHQgKlxuXHQgKiBQbGVhc2Ugbm90ZSwgdGhlciBtYXkgYmUgbG9jYWxTa2lwZmlsZXMgYW5kIHRvdGFsOiAwLCB3aGljaCBpbmRpY2F0ZXMgdGhlcmUgd2VyZSBjaGFuZ2VzIEJVVCB0aGUgbG9jYWwgdGVtcGxhdGVcblx0ICogc3luYyBmaWxlIHJlbmRlcmVkIHRoZW0gbWVhbmluZ2xlc3MuXG5cdCAqL1xuXHRtb2RpZmllZEZpbGVzOiBEaWZmUmVzdWx0ICYge1xuXHRcdHRvdGFsOiBudW1iZXI7XG5cdH07XG59XG5cbmV4cG9ydCBjb25zdCBURU1QTEFURV9TWU5DX0NPTkZJRyA9IFwidGVtcGxhdGVzeW5jXCI7XG5leHBvcnQgY29uc3QgVEVNUExBVEVfU1lOQ19MT0NBTF9DT05GSUcgPSBcInRlbXBsYXRlc3luYy5sb2NhbFwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVtcGxhdGVTeW5jKFxuXHRvcHRpb25zOiBUZW1wbGF0ZVN5bmNPcHRpb25zLFxuKTogUHJvbWlzZTxUZW1wbGF0ZVN5bmNSZXR1cm4+IHtcblx0Y29uc3QgY2xvbmVEcml2ZXIgPSBvcHRpb25zLmNsb25lRHJpdmVyID8/IGdpdENsb25lO1xuXHRjb25zdCBkaWZmRHJpdmVyID0gb3B0aW9ucy5kaWZmRHJpdmVyID8/IGdpdERpZmY7XG5cdGNvbnN0IGN1cnJlbnRSZWZEcml2ZXIgPSBvcHRpb25zLmN1cnJlbnRSZWZEcml2ZXIgPz8gZ2l0Q3VycmVudFJlZjtcblx0Y29uc3QgY2hlY2tvdXREcml2ZXIgPSBvcHRpb25zLmNoZWNrb3V0RHJpdmVyID8/IGdpdENoZWNrb3V0O1xuXHRjb25zdCBjbG9uZVJldHVybiA9IGF3YWl0IGNsb25lRHJpdmVyKG9wdGlvbnMudG1wQ2xvbmVEaXIsIG9wdGlvbnMucmVwb1VybCk7XG5cblx0Y29uc3QgeyBkaXI6IHRlbXBDbG9uZURpciwgcmVtb3RlTmFtZSB9ID1cblx0XHR0eXBlb2YgY2xvbmVSZXR1cm4gPT09IFwic3RyaW5nXCJcblx0XHRcdD8ge1xuXHRcdFx0XHRcdGRpcjogY2xvbmVSZXR1cm4sXG5cdFx0XHRcdFx0cmVtb3RlTmFtZTogXCJvcmlnaW5cIiwgLy8gRGVmYXVsdCB0byB0aGlzXG5cdFx0XHRcdH1cblx0XHRcdDogY2xvbmVSZXR1cm47XG5cblx0aWYgKG9wdGlvbnMuYnJhbmNoKSB7XG5cdFx0YXdhaXQgY2hlY2tvdXREcml2ZXIoe1xuXHRcdFx0dG1wRGlyOiB0ZW1wQ2xvbmVEaXIsXG5cdFx0XHRyZW1vdGVOYW1lLFxuXHRcdFx0YnJhbmNoOiBvcHRpb25zLmJyYW5jaCxcblx0XHR9KTtcblx0fVxuXG5cdC8vIEdldCB0aGUgY2xvbmUgQ29uZmlnXG5cdGNvbnN0IGNsb25lQ29uZmlnUGF0aCA9IGpvaW4odGVtcENsb25lRGlyLCBgJHtURU1QTEFURV9TWU5DX0NPTkZJR30uanNvbmApO1xuXHRjb25zdCB0ZW1wbGF0ZVN5bmNDb25maWc6IENvbmZpZyA9IGV4aXN0c1N5bmMoY2xvbmVDb25maWdQYXRoKVxuXHRcdD8gKGNvbW1lbnRKU09OLnBhcnNlKFxuXHRcdFx0XHRyZWFkRmlsZVN5bmMoY2xvbmVDb25maWdQYXRoKS50b1N0cmluZygpLFxuXHRcdFx0KSBhcyB1bmtub3duIGFzIENvbmZpZylcblx0XHQ6IHsgaWdub3JlOiBbXSB9O1xuXG5cdGNvbnN0IGxvY2FsQ29uZmlnRmlsZSA9IGAke1RFTVBMQVRFX1NZTkNfTE9DQUxfQ09ORklHfS5qc29uYDtcblx0Y29uc3QgbG9jYWxDb25maWdQYXRoID0gam9pbihvcHRpb25zLnJlcG9EaXIsIGxvY2FsQ29uZmlnRmlsZSk7XG5cdGNvbnN0IGxvY2FsVGVtcGxhdGVTeW5jQ29uZmlnOiBMb2NhbENvbmZpZyA9IGV4aXN0c1N5bmMobG9jYWxDb25maWdQYXRoKVxuXHRcdD8gKGNvbW1lbnRKU09OLnBhcnNlKFxuXHRcdFx0XHRyZWFkRmlsZVN5bmMobG9jYWxDb25maWdQYXRoKS50b1N0cmluZygpLFxuXHRcdFx0KSBhcyB1bmtub3duIGFzIExvY2FsQ29uZmlnKVxuXHRcdDogeyBpZ25vcmU6IFtdIH07XG5cblx0bGV0IGZpbGVzVG9TeW5jOiBEaWZmUmVzdWx0O1xuXHRjb25zdCByZWYgPSBhd2FpdCBjdXJyZW50UmVmRHJpdmVyKHtcblx0XHRyb290RGlyOiB0ZW1wQ2xvbmVEaXIsXG5cdH0pO1xuXHRpZiAobG9jYWxUZW1wbGF0ZVN5bmNDb25maWcuYWZ0ZXJSZWYpIHtcblx0XHRpZiAocmVmID09PSBsb2NhbFRlbXBsYXRlU3luY0NvbmZpZy5hZnRlclJlZikge1xuXHRcdFx0Ly8gc2hvcnQgY2lyY3VpdCBpZiB0aGUgcmVmcyBtYXRjaFxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bG9jYWxTa2lwRmlsZXM6IFtdLFxuXHRcdFx0XHRsb2NhbEZpbGVDaGFuZ2VzOiB7fSxcblx0XHRcdFx0bW9kaWZpZWRGaWxlczoge1xuXHRcdFx0XHRcdGFkZGVkOiBbXSxcblx0XHRcdFx0XHRtb2RpZmllZDogW10sXG5cdFx0XHRcdFx0ZGVsZXRlZDogW10sXG5cdFx0XHRcdFx0dG90YWw6IDAsXG5cdFx0XHRcdH0sXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRmaWxlc1RvU3luYyA9IGF3YWl0IGRpZmZEcml2ZXIoXG5cdFx0XHR0ZW1wQ2xvbmVEaXIsXG5cdFx0XHRsb2NhbFRlbXBsYXRlU3luY0NvbmZpZy5hZnRlclJlZixcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdGZpbGVzVG9TeW5jID0ge1xuXHRcdFx0YWRkZWQ6IGdldEFsbEZpbGVzSW5EaXIodGVtcENsb25lRGlyLCBbXG5cdFx0XHRcdC4uLnRlbXBsYXRlU3luY0NvbmZpZy5pZ25vcmUsXG5cdFx0XHRcdFwiLmdpdC8qKlwiLFxuXHRcdFx0XSksXG5cdFx0XHRkZWxldGVkOiBbXSxcblx0XHRcdG1vZGlmaWVkOiBbXSxcblx0XHR9O1xuXHR9XG5cblx0Ly8gUHJlLWxvYWQgcGx1Z2lucyBhbmQgbWFrZSBzdXJlIHRoZSBzeW5jIGZpbGUgaXMgcmVzcGVjdGVkXG5cdC8vIFN5bmNocm9ub3VzIHNpbmNlIGdycGMgc2VydmVycyB0YWtlIGEgc2Vjb25kXG5cdGNvbnN0IGxvY2FsVmFsaWRhdGVFcnJvcnM6IHtcblx0XHRbazogc3RyaW5nXTogc3RyaW5nW107XG5cdH0gPSB7fTtcblx0Y29uc3QgdmFsaWRhdGVFcnJvcnM6IHtcblx0XHRbazogc3RyaW5nXTogc3RyaW5nW107XG5cdH0gPSB7fTtcblx0Zm9yIChjb25zdCBjb25maWcgb2YgbG9jYWxUZW1wbGF0ZVN5bmNDb25maWcubWVyZ2UgPz8gW10pIHtcblx0XHRjb25zdCBwbHVnaW4gPSBhd2FpdCBsb2FkUGx1Z2luKGNvbmZpZywgb3B0aW9ucy5yZXBvRGlyKTtcblx0XHRjb25zdCBlcnJvcnMgPSBwbHVnaW4udmFsaWRhdGUoY29uZmlnLm9wdGlvbnMgPz8ge30pO1xuXHRcdGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcblx0XHRcdGxvY2FsVmFsaWRhdGVFcnJvcnNbY29uZmlnLnBsdWdpbl0gPSBlcnJvcnM7XG5cdFx0fVxuXHR9XG5cdGZvciAoY29uc3QgY29uZmlnIG9mIHRlbXBsYXRlU3luY0NvbmZpZy5tZXJnZSA/PyBbXSkge1xuXHRcdGNvbnN0IHBsdWdpbiA9IGF3YWl0IGxvYWRQbHVnaW4oY29uZmlnLCB0ZW1wQ2xvbmVEaXIpO1xuXHRcdGNvbnN0IGVycm9ycyA9IHBsdWdpbi52YWxpZGF0ZShjb25maWcub3B0aW9ucyA/PyB7fSk7XG5cdFx0aWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0dmFsaWRhdGVFcnJvcnNbY29uZmlnLnBsdWdpbl0gPSBlcnJvcnM7XG5cdFx0fVxuXHR9XG5cblx0bGV0IGVycm9yU3RyID0gXCJcIjtcblx0aWYgKE9iamVjdC5rZXlzKHZhbGlkYXRlRXJyb3JzKS5sZW5ndGggPiAwKSB7XG5cdFx0ZXJyb3JTdHIgPSBgJHtlcnJvclN0cn10ZW1wbGF0ZXN5bmMuanNvbiBwbHVnaW4gb3B0aW9uIGVycm9yczpcXG5gO1xuXHRcdGZvciAoY29uc3QgcGx1Z2luIGluIHZhbGlkYXRlRXJyb3JzKSB7XG5cdFx0XHRlcnJvclN0ciA9IGAke2Vycm9yU3RyfVxcdFBsdWdpbiAoJHtwbHVnaW59KTpcXG5gO1xuXHRcdFx0dmFsaWRhdGVFcnJvcnNbcGx1Z2luXS5mb3JFYWNoKChlcnIpID0+IHtcblx0XHRcdFx0ZXJyb3JTdHIgPSBgJHtlcnJvclN0cn1cXHRcXHQke2Vycn1cXG5gO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cdGlmIChPYmplY3Qua2V5cyhsb2NhbFZhbGlkYXRlRXJyb3JzKS5sZW5ndGggPiAwKSB7XG5cdFx0ZXJyb3JTdHIgPSBgJHtlcnJvclN0cn10ZW1wbGF0ZXN5bmMubG9jYWwuanNvbiBwbHVnaW4gb3B0aW9uIGVycm9yczpcXG5gO1xuXHRcdGZvciAoY29uc3QgcGx1Z2luIGluIGxvY2FsVmFsaWRhdGVFcnJvcnMpIHtcblx0XHRcdGVycm9yU3RyID0gYCR7ZXJyb3JTdHJ9XFx0UGx1Z2luICgke3BsdWdpbn0pOlxcbmA7XG5cdFx0XHRsb2NhbFZhbGlkYXRlRXJyb3JzW3BsdWdpbl0uZm9yRWFjaCgoZXJyKSA9PiB7XG5cdFx0XHRcdGVycm9yU3RyID0gYCR7ZXJyb3JTdHJ9XFx0XFx0JHtlcnJ9XFxuYDtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdGlmIChlcnJvclN0ciAhPT0gXCJcIikge1xuXHRcdHRocm93IEVycm9yKGVycm9yU3RyKTtcblx0fVxuXG5cdC8vIEFwcGx5IGlnbm9yZSBmaWx0ZXJzXG5cdGZpbGVzVG9TeW5jLmFkZGVkID0gZmlsZXNUb1N5bmMuYWRkZWQuZmlsdGVyKFxuXHRcdChmKSA9PiAhc29tZShmLCB0ZW1wbGF0ZVN5bmNDb25maWcuaWdub3JlKSxcblx0KTtcblx0ZmlsZXNUb1N5bmMubW9kaWZpZWQgPSBmaWxlc1RvU3luYy5tb2RpZmllZC5maWx0ZXIoXG5cdFx0KGYpID0+ICFzb21lKGYsIHRlbXBsYXRlU3luY0NvbmZpZy5pZ25vcmUpLFxuXHQpO1xuXHRmaWxlc1RvU3luYy5kZWxldGVkID0gZmlsZXNUb1N5bmMuZGVsZXRlZC5maWx0ZXIoXG5cdFx0KGYpID0+ICFzb21lKGYsIHRlbXBsYXRlU3luY0NvbmZpZy5pZ25vcmUpLFxuXHQpO1xuXG5cdGNvbnN0IGxvY2FsU2tpcEZpbGVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblx0Y29uc3QgbG9jYWxGaWxlQ2hhbmdlczoge1xuXHRcdFtmaWxlUGF0aDogc3RyaW5nXTogQ2hhbmdlW107XG5cdH0gPSB7fTtcblxuXHRjb25zdCBmaWxlU3luY0ZhY3RvcnkgPSAob3A6IEZpbGVPcGVyYXRpb24pID0+IHtcblx0XHRyZXR1cm4gYXN5bmMgKGY6IHN0cmluZykgPT4ge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgbWVyZ2VGaWxlKGYsIHtcblx0XHRcdFx0bG9jYWxUZW1wbGF0ZVN5bmNDb25maWcsXG5cdFx0XHRcdHRlbXBsYXRlU3luY0NvbmZpZyxcblx0XHRcdFx0dGVtcENsb25lRGlyLFxuXHRcdFx0XHRjd2Q6IG9wdGlvbnMucmVwb0Rpcixcblx0XHRcdFx0ZmlsZU9wZXJhdGlvbjogb3AsXG5cdFx0XHR9KTtcblx0XHRcdGlmIChyZXN1bHQuaWdub3JlZER1ZVRvTG9jYWwpIHtcblx0XHRcdFx0bG9jYWxTa2lwRmlsZXMuYWRkKGYpO1xuXHRcdFx0fSBlbHNlIGlmIChyZXN1bHQ/LmxvY2FsQ2hhbmdlcyAmJiByZXN1bHQubG9jYWxDaGFuZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bG9jYWxGaWxlQ2hhbmdlc1tmXSA9IHJlc3VsdC5sb2NhbENoYW5nZXM7XG5cdFx0XHR9XG5cdFx0fTtcblx0fTtcblxuXHQvLyBBZGRlZCBhbmQgbW9kaWZpZWQgaGF2ZSB0aGUgc2FtZSBzZXR1cCBmb3Igbm93XG5cdGF3YWl0IFByb21pc2UuYWxsKGZpbGVzVG9TeW5jLmFkZGVkLm1hcChmaWxlU3luY0ZhY3RvcnkoXCJhZGRlZFwiKSkpO1xuXHRhd2FpdCBQcm9taXNlLmFsbChmaWxlc1RvU3luYy5tb2RpZmllZC5tYXAoZmlsZVN5bmNGYWN0b3J5KFwibW9kaWZpZWRcIikpKTtcblx0YXdhaXQgUHJvbWlzZS5hbGwoZmlsZXNUb1N5bmMuZGVsZXRlZC5tYXAoZmlsZVN5bmNGYWN0b3J5KFwiZGVsZXRlZFwiKSkpO1xuXG5cdC8vIFJlcG9ydCB0aGUgZmlsZXMgdGhhdCBjaGFuZ2VkIGluIGdlbmVyYWxcblx0Y29uc3QgYWN0dWFsQWRkZWQgPSBmaWxlc1RvU3luYy5hZGRlZC5maWx0ZXIoKGYpID0+ICFsb2NhbFNraXBGaWxlcy5oYXMoZikpO1xuXHRjb25zdCBhY3R1YWxNb2RpZmllZCA9IGZpbGVzVG9TeW5jLm1vZGlmaWVkLmZpbHRlcihcblx0XHQoZikgPT4gIWxvY2FsU2tpcEZpbGVzLmhhcyhmKSxcblx0KTtcblx0Y29uc3QgYWN0dWFsRGVsZXRlZCA9IGZpbGVzVG9TeW5jLmRlbGV0ZWQuZmlsdGVyKFxuXHRcdChmKSA9PiAhbG9jYWxTa2lwRmlsZXMuaGFzKGYpLFxuXHQpO1xuXHRjb25zdCBtb2RpZmllZEZpbGVzID0ge1xuXHRcdGFkZGVkOiBhY3R1YWxBZGRlZCxcblx0XHRtb2RpZmllZDogYWN0dWFsTW9kaWZpZWQsXG5cdFx0ZGVsZXRlZDogYWN0dWFsRGVsZXRlZCxcblx0fTtcblxuXHQvLyBhcHBseSBhZnRlciByZWZcblx0aWYgKG9wdGlvbnMudXBkYXRlQWZ0ZXJSZWYpIHtcblx0XHRjb25zdCBfcmVmID0gYXdhaXQgY3VycmVudFJlZkRyaXZlcih7XG5cdFx0XHRyb290RGlyOiB0ZW1wQ2xvbmVEaXIsXG5cdFx0fSk7XG5cblx0XHRpZiAoZXhpc3RzU3luYyhsb2NhbENvbmZpZ1BhdGgpKSB7XG5cdFx0XHRjb25zdCBjb25maWdTdHIgPSByZWFkRmlsZVN5bmMobG9jYWxDb25maWdQYXRoKS50b1N0cmluZygpO1xuXHRcdFx0Y29uc3QgY29uZmlnID0gY29tbWVudEpTT04ucGFyc2UoY29uZmlnU3RyKSBhcyB1bmtub3duIGFzIExvY2FsQ29uZmlnO1xuXHRcdFx0Y29uZmlnLmFmdGVyUmVmID0gX3JlZjtcblx0XHRcdHdyaXRlRmlsZVN5bmMoXG5cdFx0XHRcdGxvY2FsQ29uZmlnUGF0aCxcblx0XHRcdFx0Y29tbWVudEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgaW5mZXJKU09OSW5kZW50KGNvbmZpZ1N0cikpLFxuXHRcdFx0KTtcblx0XHRcdG1vZGlmaWVkRmlsZXMubW9kaWZpZWQucHVzaChsb2NhbENvbmZpZ0ZpbGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR3cml0ZUZpbGVTeW5jKFxuXHRcdFx0XHRsb2NhbENvbmZpZ1BhdGgsXG5cdFx0XHRcdGNvbW1lbnRKU09OLnN0cmluZ2lmeSh7IGFmdGVyUmVmOiBfcmVmIH0sIG51bGwsIDQpLFxuXHRcdFx0KTtcblx0XHRcdG1vZGlmaWVkRmlsZXMuYWRkZWQucHVzaChsb2NhbENvbmZpZ0ZpbGUpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0bG9jYWxTa2lwRmlsZXM6IEFycmF5LmZyb20obG9jYWxTa2lwRmlsZXMpLFxuXHRcdGxvY2FsRmlsZUNoYW5nZXMsXG5cdFx0bW9kaWZpZWRGaWxlczoge1xuXHRcdFx0Li4ubW9kaWZpZWRGaWxlcyxcblx0XHRcdHRvdGFsOlxuXHRcdFx0XHRtb2RpZmllZEZpbGVzLmFkZGVkLmxlbmd0aCArXG5cdFx0XHRcdG1vZGlmaWVkRmlsZXMuZGVsZXRlZC5sZW5ndGggK1xuXHRcdFx0XHRtb2RpZmllZEZpbGVzLm1vZGlmaWVkLmxlbmd0aCxcblx0XHR9LFxuXHR9O1xufVxuIl0sIm5hbWVzIjpbIlRFTVBMQVRFX1NZTkNfQ09ORklHIiwiVEVNUExBVEVfU1lOQ19MT0NBTF9DT05GSUciLCJ0ZW1wbGF0ZVN5bmMiLCJvcHRpb25zIiwiY2xvbmVEcml2ZXIiLCJnaXRDbG9uZSIsImRpZmZEcml2ZXIiLCJnaXREaWZmIiwiY3VycmVudFJlZkRyaXZlciIsImdpdEN1cnJlbnRSZWYiLCJjaGVja291dERyaXZlciIsImdpdENoZWNrb3V0IiwiY2xvbmVSZXR1cm4iLCJ0bXBDbG9uZURpciIsInJlcG9VcmwiLCJkaXIiLCJ0ZW1wQ2xvbmVEaXIiLCJyZW1vdGVOYW1lIiwiYnJhbmNoIiwidG1wRGlyIiwiY2xvbmVDb25maWdQYXRoIiwiam9pbiIsInRlbXBsYXRlU3luY0NvbmZpZyIsImV4aXN0c1N5bmMiLCJjb21tZW50SlNPTiIsInBhcnNlIiwicmVhZEZpbGVTeW5jIiwidG9TdHJpbmciLCJpZ25vcmUiLCJsb2NhbENvbmZpZ0ZpbGUiLCJsb2NhbENvbmZpZ1BhdGgiLCJyZXBvRGlyIiwibG9jYWxUZW1wbGF0ZVN5bmNDb25maWciLCJmaWxlc1RvU3luYyIsInJlZiIsInJvb3REaXIiLCJhZnRlclJlZiIsImxvY2FsU2tpcEZpbGVzIiwibG9jYWxGaWxlQ2hhbmdlcyIsIm1vZGlmaWVkRmlsZXMiLCJhZGRlZCIsIm1vZGlmaWVkIiwiZGVsZXRlZCIsInRvdGFsIiwiZ2V0QWxsRmlsZXNJbkRpciIsImxvY2FsVmFsaWRhdGVFcnJvcnMiLCJ2YWxpZGF0ZUVycm9ycyIsImNvbmZpZyIsIm1lcmdlIiwicGx1Z2luIiwibG9hZFBsdWdpbiIsImVycm9ycyIsInZhbGlkYXRlIiwibGVuZ3RoIiwiZXJyb3JTdHIiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImVyciIsIkVycm9yIiwiZmlsdGVyIiwiZiIsInNvbWUiLCJTZXQiLCJmaWxlU3luY0ZhY3RvcnkiLCJvcCIsInJlc3VsdCIsIm1lcmdlRmlsZSIsImN3ZCIsImZpbGVPcGVyYXRpb24iLCJpZ25vcmVkRHVlVG9Mb2NhbCIsImFkZCIsImxvY2FsQ2hhbmdlcyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJhY3R1YWxBZGRlZCIsImhhcyIsImFjdHVhbE1vZGlmaWVkIiwiYWN0dWFsRGVsZXRlZCIsInVwZGF0ZUFmdGVyUmVmIiwiX3JlZiIsImNvbmZpZ1N0ciIsIndyaXRlRmlsZVN5bmMiLCJzdHJpbmdpZnkiLCJpbmZlckpTT05JbmRlbnQiLCJwdXNoIiwiQXJyYXkiLCJmcm9tIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztJQThGYUEsb0JBQW9CO2VBQXBCQTs7SUFDQUMsMEJBQTBCO2VBQTFCQTs7SUFFU0MsWUFBWTtlQUFaQTs7O3FFQWpHTztvQkFFMkI7NEJBQ25DO3NCQUNBO2lDQUVPOzBCQUVIOzZCQUVEOzRCQUNROzRCQUNMO3VCQUNNOzJCQUNQOzRCQUNJOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErRXZCLE1BQU1GLHVCQUF1QjtBQUM3QixNQUFNQyw2QkFBNkI7QUFFbkMsZUFBZUMsYUFDckJDLE9BQTRCO0lBRTVCLE1BQU1DLGNBQWNELFFBQVFDLFdBQVcsSUFBSUMsa0JBQVE7SUFDbkQsTUFBTUMsYUFBYUgsUUFBUUcsVUFBVSxJQUFJQyxvQkFBTztJQUNoRCxNQUFNQyxtQkFBbUJMLFFBQVFLLGdCQUFnQixJQUFJQyx5QkFBYTtJQUNsRSxNQUFNQyxpQkFBaUJQLFFBQVFPLGNBQWMsSUFBSUMsNEJBQVc7SUFDNUQsTUFBTUMsY0FBYyxNQUFNUixZQUFZRCxRQUFRVSxXQUFXLEVBQUVWLFFBQVFXLE9BQU87SUFFMUUsTUFBTSxFQUFFQyxLQUFLQyxZQUFZLEVBQUVDLFVBQVUsRUFBRSxHQUN0QyxPQUFPTCxnQkFBZ0IsV0FDcEI7UUFDQUcsS0FBS0g7UUFDTEssWUFBWTtJQUNiLElBQ0NMO0lBRUosSUFBSVQsUUFBUWUsTUFBTSxFQUFFO1FBQ25CLE1BQU1SLGVBQWU7WUFDcEJTLFFBQVFIO1lBQ1JDO1lBQ0FDLFFBQVFmLFFBQVFlLE1BQU07UUFDdkI7SUFDRDtJQUVBLHVCQUF1QjtJQUN2QixNQUFNRSxrQkFBa0JDLElBQUFBLFVBQUksRUFBQ0wsY0FBYyxHQUFHaEIscUJBQXFCLEtBQUssQ0FBQztJQUN6RSxNQUFNc0IscUJBQTZCQyxJQUFBQSxjQUFVLEVBQUNILG1CQUMxQ0ksYUFBWUMsS0FBSyxDQUNsQkMsSUFBQUEsZ0JBQVksRUFBQ04saUJBQWlCTyxRQUFRLE1BRXRDO1FBQUVDLFFBQVEsRUFBRTtJQUFDO0lBRWhCLE1BQU1DLGtCQUFrQixHQUFHNUIsMkJBQTJCLEtBQUssQ0FBQztJQUM1RCxNQUFNNkIsa0JBQWtCVCxJQUFBQSxVQUFJLEVBQUNsQixRQUFRNEIsT0FBTyxFQUFFRjtJQUM5QyxNQUFNRywwQkFBdUNULElBQUFBLGNBQVUsRUFBQ08sbUJBQ3BETixhQUFZQyxLQUFLLENBQ2xCQyxJQUFBQSxnQkFBWSxFQUFDSSxpQkFBaUJILFFBQVEsTUFFdEM7UUFBRUMsUUFBUSxFQUFFO0lBQUM7SUFFaEIsSUFBSUs7SUFDSixNQUFNQyxNQUFNLE1BQU0xQixpQkFBaUI7UUFDbEMyQixTQUFTbkI7SUFDVjtJQUNBLElBQUlnQix3QkFBd0JJLFFBQVEsRUFBRTtRQUNyQyxJQUFJRixRQUFRRix3QkFBd0JJLFFBQVEsRUFBRTtZQUM3QyxrQ0FBa0M7WUFDbEMsT0FBTztnQkFDTkMsZ0JBQWdCLEVBQUU7Z0JBQ2xCQyxrQkFBa0IsQ0FBQztnQkFDbkJDLGVBQWU7b0JBQ2RDLE9BQU8sRUFBRTtvQkFDVEMsVUFBVSxFQUFFO29CQUNaQyxTQUFTLEVBQUU7b0JBQ1hDLE9BQU87Z0JBQ1I7WUFDRDtRQUNEO1FBQ0FWLGNBQWMsTUFBTTNCLFdBQ25CVSxjQUNBZ0Isd0JBQXdCSSxRQUFRO0lBRWxDLE9BQU87UUFDTkgsY0FBYztZQUNiTyxPQUFPSSxJQUFBQSx1QkFBZ0IsRUFBQzVCLGNBQWM7bUJBQ2xDTSxtQkFBbUJNLE1BQU07Z0JBQzVCO2FBQ0E7WUFDRGMsU0FBUyxFQUFFO1lBQ1hELFVBQVUsRUFBRTtRQUNiO0lBQ0Q7SUFFQSw0REFBNEQ7SUFDNUQsK0NBQStDO0lBQy9DLE1BQU1JLHNCQUVGLENBQUM7SUFDTCxNQUFNQyxpQkFFRixDQUFDO0lBQ0wsS0FBSyxNQUFNQyxVQUFVZix3QkFBd0JnQixLQUFLLElBQUksRUFBRSxDQUFFO1FBQ3pELE1BQU1DLFNBQVMsTUFBTUMsSUFBQUEsc0JBQVUsRUFBQ0gsUUFBUTVDLFFBQVE0QixPQUFPO1FBQ3ZELE1BQU1vQixTQUFTRixPQUFPRyxRQUFRLENBQUNMLE9BQU81QyxPQUFPLElBQUksQ0FBQztRQUNsRCxJQUFJZ0QsVUFBVUEsT0FBT0UsTUFBTSxHQUFHLEdBQUc7WUFDaENSLG1CQUFtQixDQUFDRSxPQUFPRSxNQUFNLENBQUMsR0FBR0U7UUFDdEM7SUFDRDtJQUNBLEtBQUssTUFBTUosVUFBVXpCLG1CQUFtQjBCLEtBQUssSUFBSSxFQUFFLENBQUU7UUFDcEQsTUFBTUMsU0FBUyxNQUFNQyxJQUFBQSxzQkFBVSxFQUFDSCxRQUFRL0I7UUFDeEMsTUFBTW1DLFNBQVNGLE9BQU9HLFFBQVEsQ0FBQ0wsT0FBTzVDLE9BQU8sSUFBSSxDQUFDO1FBQ2xELElBQUlnRCxVQUFVQSxPQUFPRSxNQUFNLEdBQUcsR0FBRztZQUNoQ1AsY0FBYyxDQUFDQyxPQUFPRSxNQUFNLENBQUMsR0FBR0U7UUFDakM7SUFDRDtJQUVBLElBQUlHLFdBQVc7SUFDZixJQUFJQyxPQUFPQyxJQUFJLENBQUNWLGdCQUFnQk8sTUFBTSxHQUFHLEdBQUc7UUFDM0NDLFdBQVcsR0FBR0EsU0FBUyx5Q0FBeUMsQ0FBQztRQUNqRSxJQUFLLE1BQU1MLFVBQVVILGVBQWdCO1lBQ3BDUSxXQUFXLEdBQUdBLFNBQVMsVUFBVSxFQUFFTCxPQUFPLElBQUksQ0FBQztZQUMvQ0gsY0FBYyxDQUFDRyxPQUFPLENBQUNRLE9BQU8sQ0FBQyxDQUFDQztnQkFDL0JKLFdBQVcsR0FBR0EsU0FBUyxJQUFJLEVBQUVJLElBQUksRUFBRSxDQUFDO1lBQ3JDO1FBQ0Q7SUFDRDtJQUNBLElBQUlILE9BQU9DLElBQUksQ0FBQ1gscUJBQXFCUSxNQUFNLEdBQUcsR0FBRztRQUNoREMsV0FBVyxHQUFHQSxTQUFTLCtDQUErQyxDQUFDO1FBQ3ZFLElBQUssTUFBTUwsVUFBVUosb0JBQXFCO1lBQ3pDUyxXQUFXLEdBQUdBLFNBQVMsVUFBVSxFQUFFTCxPQUFPLElBQUksQ0FBQztZQUMvQ0osbUJBQW1CLENBQUNJLE9BQU8sQ0FBQ1EsT0FBTyxDQUFDLENBQUNDO2dCQUNwQ0osV0FBVyxHQUFHQSxTQUFTLElBQUksRUFBRUksSUFBSSxFQUFFLENBQUM7WUFDckM7UUFDRDtJQUNEO0lBRUEsSUFBSUosYUFBYSxJQUFJO1FBQ3BCLE1BQU1LLE1BQU1MO0lBQ2I7SUFFQSx1QkFBdUI7SUFDdkJyQixZQUFZTyxLQUFLLEdBQUdQLFlBQVlPLEtBQUssQ0FBQ29CLE1BQU0sQ0FDM0MsQ0FBQ0MsSUFBTSxDQUFDQyxJQUFBQSxnQkFBSSxFQUFDRCxHQUFHdkMsbUJBQW1CTSxNQUFNO0lBRTFDSyxZQUFZUSxRQUFRLEdBQUdSLFlBQVlRLFFBQVEsQ0FBQ21CLE1BQU0sQ0FDakQsQ0FBQ0MsSUFBTSxDQUFDQyxJQUFBQSxnQkFBSSxFQUFDRCxHQUFHdkMsbUJBQW1CTSxNQUFNO0lBRTFDSyxZQUFZUyxPQUFPLEdBQUdULFlBQVlTLE9BQU8sQ0FBQ2tCLE1BQU0sQ0FDL0MsQ0FBQ0MsSUFBTSxDQUFDQyxJQUFBQSxnQkFBSSxFQUFDRCxHQUFHdkMsbUJBQW1CTSxNQUFNO0lBRzFDLE1BQU1TLGlCQUE4QixJQUFJMEI7SUFDeEMsTUFBTXpCLG1CQUVGLENBQUM7SUFFTCxNQUFNMEIsa0JBQWtCLENBQUNDO1FBQ3hCLE9BQU8sT0FBT0o7WUFDYixNQUFNSyxTQUFTLE1BQU1DLElBQUFBLG9CQUFTLEVBQUNOLEdBQUc7Z0JBQ2pDN0I7Z0JBQ0FWO2dCQUNBTjtnQkFDQW9ELEtBQUtqRSxRQUFRNEIsT0FBTztnQkFDcEJzQyxlQUFlSjtZQUNoQjtZQUNBLElBQUlDLE9BQU9JLGlCQUFpQixFQUFFO2dCQUM3QmpDLGVBQWVrQyxHQUFHLENBQUNWO1lBQ3BCLE9BQU8sSUFBSUssUUFBUU0sZ0JBQWdCTixPQUFPTSxZQUFZLENBQUNuQixNQUFNLEdBQUcsR0FBRztnQkFDbEVmLGdCQUFnQixDQUFDdUIsRUFBRSxHQUFHSyxPQUFPTSxZQUFZO1lBQzFDO1FBQ0Q7SUFDRDtJQUVBLGlEQUFpRDtJQUNqRCxNQUFNQyxRQUFRQyxHQUFHLENBQUN6QyxZQUFZTyxLQUFLLENBQUNtQyxHQUFHLENBQUNYLGdCQUFnQjtJQUN4RCxNQUFNUyxRQUFRQyxHQUFHLENBQUN6QyxZQUFZUSxRQUFRLENBQUNrQyxHQUFHLENBQUNYLGdCQUFnQjtJQUMzRCxNQUFNUyxRQUFRQyxHQUFHLENBQUN6QyxZQUFZUyxPQUFPLENBQUNpQyxHQUFHLENBQUNYLGdCQUFnQjtJQUUxRCwyQ0FBMkM7SUFDM0MsTUFBTVksY0FBYzNDLFlBQVlPLEtBQUssQ0FBQ29CLE1BQU0sQ0FBQyxDQUFDQyxJQUFNLENBQUN4QixlQUFld0MsR0FBRyxDQUFDaEI7SUFDeEUsTUFBTWlCLGlCQUFpQjdDLFlBQVlRLFFBQVEsQ0FBQ21CLE1BQU0sQ0FDakQsQ0FBQ0MsSUFBTSxDQUFDeEIsZUFBZXdDLEdBQUcsQ0FBQ2hCO0lBRTVCLE1BQU1rQixnQkFBZ0I5QyxZQUFZUyxPQUFPLENBQUNrQixNQUFNLENBQy9DLENBQUNDLElBQU0sQ0FBQ3hCLGVBQWV3QyxHQUFHLENBQUNoQjtJQUU1QixNQUFNdEIsZ0JBQWdCO1FBQ3JCQyxPQUFPb0M7UUFDUG5DLFVBQVVxQztRQUNWcEMsU0FBU3FDO0lBQ1Y7SUFFQSxrQkFBa0I7SUFDbEIsSUFBSTVFLFFBQVE2RSxjQUFjLEVBQUU7UUFDM0IsTUFBTUMsT0FBTyxNQUFNekUsaUJBQWlCO1lBQ25DMkIsU0FBU25CO1FBQ1Y7UUFFQSxJQUFJTyxJQUFBQSxjQUFVLEVBQUNPLGtCQUFrQjtZQUNoQyxNQUFNb0QsWUFBWXhELElBQUFBLGdCQUFZLEVBQUNJLGlCQUFpQkgsUUFBUTtZQUN4RCxNQUFNb0IsU0FBU3ZCLGFBQVlDLEtBQUssQ0FBQ3lEO1lBQ2pDbkMsT0FBT1gsUUFBUSxHQUFHNkM7WUFDbEJFLElBQUFBLGlCQUFhLEVBQ1pyRCxpQkFDQU4sYUFBWTRELFNBQVMsQ0FBQ3JDLFFBQVEsTUFBTXNDLElBQUFBLDJCQUFlLEVBQUNIO1lBRXJEM0MsY0FBY0UsUUFBUSxDQUFDNkMsSUFBSSxDQUFDekQ7UUFDN0IsT0FBTztZQUNOc0QsSUFBQUEsaUJBQWEsRUFDWnJELGlCQUNBTixhQUFZNEQsU0FBUyxDQUFDO2dCQUFFaEQsVUFBVTZDO1lBQUssR0FBRyxNQUFNO1lBRWpEMUMsY0FBY0MsS0FBSyxDQUFDOEMsSUFBSSxDQUFDekQ7UUFDMUI7SUFDRDtJQUVBLE9BQU87UUFDTlEsZ0JBQWdCa0QsTUFBTUMsSUFBSSxDQUFDbkQ7UUFDM0JDO1FBQ0FDLGVBQWU7WUFDZCxHQUFHQSxhQUFhO1lBQ2hCSSxPQUNDSixjQUFjQyxLQUFLLENBQUNhLE1BQU0sR0FDMUJkLGNBQWNHLE9BQU8sQ0FBQ1csTUFBTSxHQUM1QmQsY0FBY0UsUUFBUSxDQUFDWSxNQUFNO1FBQy9CO0lBQ0Q7QUFDRCJ9
|